praetorian-inc/Sulla

GitHub: praetorian-inc/Sulla

Sulla 是一款面向 Active Directory 环境的 SMB 共享敏感信息扫描工具,自动发现域内文件共享并检测其中泄露的密钥与凭证。

Stars: 6 | Forks: 0

# Sulla

image

一款命令行工具,利用 [Titus](https://github.com/praetorian-inc/titus) 扫描 SMB 共享中的敏感数据。 你可以: * 自动发现并扫描加入 AD 的主机上的 SMB 共享 * 在不执行发现的情况下扫描单个目标共享 * 使用正则表达式过滤排除共享名称、目录或文件类型 * 将输出保存为 txt、json、jsonl 或 sarif 格式 ![demo](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/f7da7906d4023022.gif) ## 安装 从 [Releases](https://github.com/praetorian-inc/Sulla/releases) 下载适合你平台的 Sulla 二进制文件: ``` # Linux x86_64 wget -O sulla https://github.com/praetorian-inc/Sulla/releases/latest/download/sulla-linux-amd64 # Linux ARM64 wget -O sulla https://github.com/praetorian-inc/Sulla/releases/latest/download/sulla-linux-arm64 ``` ### Docker 或者,通过 Docker 运行 Sulla,无需安装依赖项: ``` docker pull ghcr.io/praetorian-inc/sulla:latest ``` Docker 用法: ``` docker run --rm --privileged --network=host \ -v $(pwd):/sulla_output -w /sulla_output \ ghcr.io/praetorian-inc/sulla:latest \ -u admin -p secret123 -d corp.local -o results -of txt,json ``` ## 用法 ### 域内共享发现 自动发现并扫描整个 Active Directory 域内所有可访问的 SMB 共享: ``` # 自动发现所有可访问的共享并将结果写入 txt 和 json 文件 sulla -u admin -p secret123 -d corp.local -o results/ -of txt,json ``` ### 仅发现模式 仅发现可访问的共享而不运行 Titus 扫描。输出可供审查、过滤并稍后与 `--target-file` 配合使用的 UNC 路径: ``` # 发现可访问的共享而不进行密钥扫描 sulla -u admin -p secret123 -d corp.local -do -o ``` 适用场景: - 你需要在扫描前审查完整的共享列表 - 你想在不使用排除标志的情况下手动排除特定共享 ### 从目标文件批量扫描 扫描预定义的共享列表: ``` # 从文件扫描目标 sulla -tf corp_local_discovered_smb_shares.txt -u admin -p secret123 -d corp.local -o results/ ``` 目标文件格式(每行一个): ``` fileserver.domain.tld,backup # CSV format, or \\fileserver.domain.tld\backup$ # UNC path ``` ### 单目标扫描 扫描特定的共享: ``` # 基本扫描,匿名 sulla -h 192.168.1.100 -s public # 使用域凭据 + 保存输出 sulla -h fileserver.corp.local -s SYSVOL -u admin -p secret123 -d corp.local -o results/ ``` ## 选项 ### 目标选择 | 标志 | 描述 | |------|-------------| | `-d` 不带 `-h`/`-s`/`-tf` | 自动发现域控制器,自动发现所有可读共享并进行扫描 | | `--domain-controller`, `-dc` | 显式指定域控制器(可选) | | `--target-file`, `-tf` | 包含要扫描的 SMB 共享的文件(CSV 或 UNC 路径) | | `--host`, `-h` | 目标 IP 地址或主机名 | | `--share`, `-s` | SMB 共享名称(与 `--host` 一起使用时必填) | ### 身份验证 | 标志 | 描述 | |------|-------------| | `--username`, `-u` | 用于身份验证的用户名 | | `--password`, `-p` | 用于身份验证的密码 | | `--domain`, `-d` | 用于身份验证的完全限定域名 | ### 发现选项 | 标志 | 描述 | |------|-------------| | `--ldaps` | 使用 LDAPS 代替 LDAP | | `--channel-binding` | 在 LDAPS 上要求带有 RFC 5929 channel binding 的 NTLMv2 | | `--dns-server`, `-dns` | 用于主机名解析的自定义 DNS 服务器 IP | | `--discovery-only`, `-do` | 仅发现:以 UNC 格式输出共享而不进行扫描 | | `--no-dfs` | 禁用 DFS 命名空间感知(跳过 DFS 去重) | ### 过滤 | 标志 | 描述 | |------|-------------| | `--show-default-exclusions` | 显示所有默认排除项并退出 | | `--no-default-exclusions` | 禁用所有默认排除项(扫描所有内容) | | `--exclude-extensions`, `-xe` | 要排除的额外文件扩展名(逗号分隔,支持正则表达式) | | `--exclude-directories`, `-xd` | 要排除的额外目录(逗号分隔,支持正则表达式) | | `--exclude-shares`, `-xs` | 在发现期间要排除的共享名称(逗号分隔,支持正则表达式) | | `--keywords`, `-kw` | 始终包含在扫描中的文件名子字符串,覆盖排除项(逗号分隔) | 自定义排除项始终是在默认项的基础上附加的。使用 `--no-default-exclusions` 可以从零开始配置。 ### 输出 | 标志 | 描述 | |------|-------------| | `--output [path]`, `-o [path]` | 保存报告输出。单目标:文件名(默认:`{host}__{share}.txt`)。批量模式:目录 | | `--output-format`, `-of` | 要保存的输出格式(逗号分隔:`txt`、`json`、`jsonl`、`sarif`、`capability-sdk`)。默认:`txt` | | `--zip`, `-z` | 将 txt/json 输出文件打包为单个压缩包并删除原文件(需要 `-o`) | | `--verbose`, `-v` | 显示每个共享的进度(连接、扫描生命周期) | | `--debug`, `-de` | 显示每个文件的诊断信息(跳过的文件、错误、分块) | | `--timestamp`, `-ts` | 在每行日志前加上时间戳 | | `--version` | 打印版本并退出 | ### 扫描 **快速模式默认开启。** Sulla 仅扫描高价值文件类型(允许列表中的扩展名和文件名),深度为 5,每个共享 15 分钟,每个目录 200 个文件。 **完整模式通过 --full 设置。** 所有文件都将被扫描以查找密钥,但不包含在 Sulla 默认排除列表中的文件。这些默认排除项可以通过 `--no-default-exclusions` 禁用。完整扫描的运行时间将比快速扫描长得多,不建议在扫描多个共享时使用。 | 标志 | 描述 | |------|-------------| | `--extract`, `-x` | 从二进制文件(docx、xlsx、pptx、pdf、归档文件等)中提取并扫描文本 | | `--full`, `-f` | 完整扫描:禁用默认的快速模式允许列表和更严格的限制 | | `--max-scan-size`, `-ms` | 要扫描的最大文件大小,以 MB 为单位(默认:5,0 = 无限制) | | `--max-depth`, `-md` | 最大目录递归深度(默认:快速模式下为 5,使用 `--full` 时 0 = 无限制) | | `--max-share-time`, `-mst` | 每个共享的最长时间,以分钟为单位(默认:快速模式下为 15,使用 `--full` 时为 45;0 = 无限期) | | `--max-files-per-dir`, `-mf` | 每个目录要扫描的最大文件数(默认:快速模式下为 200,使用 `--full` 时 0 = 无限制) | ### 并发 | 标志 | 描述 | |------|-------------| | `--share-workers`, `-jt` | 并行共享 worker(默认:60) | | `--file-workers`, `-jf` | 每个共享的并行文件扫描器(默认:NumCPU) | ## 默认排除项 Sulla 会跳过扫描不太可能包含密钥的文件、文件夹和共享。 **共享:** - `IPC$`, `print$`, `ADMIN$` **文件扩展名:** - exe, dll, so, zip, tar, gz, jpg, png, mp3, mp4, pdf, docx, xlsx, pptx 等等 **目录:** - Program Files, Windows, System32, node_modules, .git, \_\_pycache\_\_, vendor 等等 使用 `--show-default-exclusions` 查看完整列表,或使用 `--no-default-exclusions` 扫描所有内容。 ## 输出格式 | 格式 | 描述 | |--------|-------------| | `txt` | 人类可读的文本格式(默认) | | `json` | 用于编程处理的 JSON 格式 | | `jsonl` | JSON Lines 格式(每行一个发现) | | `sarif` | 用于与安全工具集成的 SARIF 格式 | | `capability-sdk` | 匹配 [capability-sdk](https://github.com/praetorian-inc/capability-sdk) `capmodel` 传输格式的 JSON 文件(仅限发现模式)。写为 `.tabularium`。证据 blob 会从其嵌入的证明内容中隐去匹配值。`tabularium` 被接受为仅限一个版本的弃用别名 | ## 注意事项 - 发现模式会过滤掉已禁用的 AD 账户和不活跃超过 4 个月的机器,类似于 [Snaffler](https://github.com/SnaffCon/Snaffler) - 在发现期间仅报告具有读取权限的共享 - 密钥扫描由 [Titus](https://github.com/praetorian-inc/titus)(NoseyParker 的 Go 移植版)提供支持
标签:Checkov, EVTX分析, SamuraiWTF, SMB协议, StruQ, 安全助手, 敏感信息扫描, 日志审计, 请求拦截