swisskyrepo/SMBLoot
GitHub: swisskyrepo/SMBLoot
SMBLoot 是一个基于终端界面的 SMB 共享浏览与文件管理工具,支持认证连接、目录递归浏览、文件预览、上传下载和批量操作。
Stars: 1 | Forks: 0
# SMBLoot
SMBLoot 是一个终端界面工具,用于浏览 SMB 共享、读取远程文件、下载和上传文件,以及递归检查远程目录树。
```
uv run SMBLoot.py --server 10.10.10.10 --username Administrator --password P@ssw0rd
uv run SMBLoot.py --server 10.10.10.10 --username Administrator --hash :E19CCF75EE54E06B06A5907AF13CEF42
```

## SMB 连接选项
每个选项也可以通过环境变量提供。
| 选项 | 环境变量 | 用途 |
|---|---|---|
| `--server` | `SMB_TUI_SERVER` | SMB 服务器地址 |
| `--remote-name` | `SMB_TUI_REMOTE_NAME` | 当 NetBIOS 名称与服务器地址不同时的名称 |
| `--username` | `SMB_TUI_USERNAME` | SMB 用户名 |
| `--password` | `SMB_TUI_PASSWORD` | SMB 密码 |
| `--hash` | `SMB_TUI_HASH` | NT hash 或 `LMHASH:NTHASH`,用于 pass-the-hash 认证 |
| `--domain` | `SMB_TUI_DOMAIN` | 认证域 |
| `--port` | `SMB_TUI_PORT` | SMB 端口;默认为 `445` |
| `--timeout` | `SMB_TUI_TIMEOUT` | 连接超时时间(秒);默认为 `30` |
| `--share` | `SMB_TUI_SHARE` | 启动时打开的共享 |
| `--path` | `SMB_TUI_PATH` | `--share` 内的初始目录 |
| `--loot-dir` | `SMB_TUI_LOOT_DIR` | 本地下载目录;默认为 `./loot` |
| `--auto-loot-preview` | `SMB_TUI_AUTO_LOOT_PREVIEW` | 自动下载成功预览的文件;默认禁用 |
只需一种认证方式:`--password` 或 `--hash`。
这两个选项不能同时使用。同样的规则适用于
`SMB_TUI_PASSWORD` 和 `SMB_TUI_HASH`。
使用 **NT hash** 认证:
```
uv run SMBLoot.py \
--server 10.10.10.10 \
--username Administrator \
--hash 0123456789abcdef0123456789abcdef
```
在预览文件时启用**自动下载(looting)**:
```
uv run SMBLoot.py \
--server 10.10.10.10 \
--username Administrator \
--password P@ssw0rd \
--auto-loot-preview
```
自动下载的文件会在 `--loot-dir` 下保持相同的共享和远程目录结构。现有的本地文件会使用带编号的文件名进行保留。
## 浏览器按键
| 按键 | 操作 |
|---|---|
| `[UP]` 或 `[k]` | 选择上一条目 |
| `[DOWN]` 或 `[j]` | 选择下一条目 |
| `[PAGE UP]` / `[PAGE DOWN]` | 移动一个屏幕 |
| `[HOME]` 或 `[g]` | 选择第一个条目 |
| `[END]` 或 `[G]` | 选择最后一个条目 |
| `[ENTER]` | 打开选定的共享、目录或文件 |
| `[BACKSPACE]` | 返回上一级 |
| `[/]` | 打开命令提示符 |
| `[d]` | 下载选定的文件 |
| `[SUPPR]` | 确认后删除选定的文件 |
| `[h]` | 显示键盘和命令帮助 |
| `[q]` | 退出 |
| `[r]` | 刷新当前列表 |
## 命令提示符
在浏览器或文件查看器中按 `[/]`,然后输入以下命令之一。
| 命令 | 描述 |
|---|---|
| `/get` | 下载选定的文件,或在查看器中使用时下载打开的文件。 |
| `/get ` | 从当前远程目录下载指定名称的文件。 |
| `/put ` | 将本地文件上传到当前远程目录。路径包含空格时请加引号。 |
| `/filter ` | 使用不区分大小写的正则表达式或 glob 过滤当前列表。 |
| `/filter` | 清除当前的列表过滤条件。 |
| `/tree` | 在交互式树视图中递归列出当前共享和目录下的文件。 |
| `/tree_download` | 递归下载当前共享和目录下的文件。 |
| `/rm ` | 确认后从当前目录删除指定名称的文件。 |
| `/help` | 显示键盘快捷键和可用命令。 |
| `/exit` 或 `/quit` | 从任何视图退出 SMBLoot。 |
在输入 `/get` 或 `/put` 时按 `[TAB]` 可补全远程文件名或本地路径。
## 树视图按键
| 按键 | 操作 |
|---|---|
| `[UP]` 或 `[k]` | 选择上一个文件 |
| `[DOWN]` 或 `[j]` | 选择下一个文件 |
| `[PAGE UP]` / `[PAGE DOWN]` | 移动选择一个屏幕 |
| `[HOME]` 或 `[g]` | 选择第一个文件 |
| `[END]` 或 `[G]` | 选择最后一个文件 |
| `[ENTER]` | 打开选定的文件 |
| `[d]` | 下载选定的文件 |
| `[SUPPR]` | 确认后删除选定的文件 |
| `[/]` | 打开命令提示符;`/get` 下载选定的文件 |
| `[h]` | 显示键盘和命令帮助 |
| `[ESC]`、`[BACKSPACE]` 或 `[q]` | 返回浏览器 |
### 过滤示例
glob 示例:
```
/filter *.csv
```
正则表达式示例,显示除了以 `.csv` 或 `.pdf` 结尾之外的条目:
```
/filter (?i)^(?!.*\.(?:csv|pdf)$).*$
```
清除当前过滤器:
```
/filter
```
## 测试
安装运行时依赖,然后运行单元测试套件:
```
uv run --with 'impacket>=0.13.1' python -m unittest discover --start-directory tests --verbose
# 或
python -m pip install --requirement requirements.txt
python -m unittest discover --start-directory tests --verbose
```
GitHub Actions 会在每次推送和拉取请求时运行相同的测试和 Ruff 检查。
标签:SMB, SNMP, 凭据利用, 文件传输, 横向移动, 编程规范, 逆向工具, 错误配置检测