sif 是一个侦察与利用扫描器,在一个二进制文件中完成整个链路:子域名枚举、端口扫描、爬虫、nuclei、框架/CVE 检测、JS 密钥提取、Web 漏洞探测(CORS/XSS/重定向)、云与接管检查。25 种以上扫描类型,一条命令完成。
sif -u https://example.com -dnslist -ports -crawl -js -framework -nuclei
nuclei 和 colly 作为库编译进程序,而不是通过子进程调用(代码树中没有 exec.Command),因此是一个静态链接的二进制文件,无运行时依赖,也无需配置连接。
每个扫描器都通过一个共享的 HTTP 客户端和一个工作窃取线程池运行。-proxy、-H、-cookie 和 -rate-limit 一次性应用于整个扫描过程,连接被池化并在扫描中复用(单主机扫描由一次性建立约 50 次连接减少到只需一次连接),而且慢速主机不会拖慢其余部分。这个共享客户端是使用本工具而非将一堆独立工具管道连接起来的实际原因。端口扫描基于 connect(),因此 rustscan 和 nmap 在原始端口扫描方面仍然更快。
它从标准输入读取目标,并在 -silent 模式下每行输出一条发现,因此可以使用管道组合:
subfinder -d example.com | sif -silent -crawl -js -nuclei | notify
-diff 将重新扫描变为监控器,只报告变化的内容;-notify 将结果发送到 Slack/Discord/Telegram/Webhook;运行结果可以导出为 SARIF 和 Markdown。
brew tap vmfunc/sif
brew install sif
使用你偏好的 AUR 助手安装:
yay -S sif
# 或
paru -S sif
# nixpkgs(声明式:添加到 configuration.nix 或 home-manager)
environment.systemPackages = [ pkgs.sif ];
# 或命令式
nix profile install nixpkgs#sif
# 或直接运行而不安装
nix run nixpkgs#sif -- -u https://example.com -headers -sh -framework
仓库中也提供了一个 flake,如果你想从源码构建:
nix run github:vmfunc/sif
curl -1sLf 'https://dl.cloudsmith.io/public/sif/deb/setup.deb.sh' | sudo -E bash
sudo apt-get install sif
从 releases 获取最新的二进制文件。
git clone https://github.com/vmfunc/sif.git
cd sif
make
需要 Go 1.25+
git clone https://aur.archlinux.org/sif.git
cd sif
makepkg -si
# 基础扫描
./sif -u https://example.com
# 目录模糊测试
./sif -u https://example.com -dirlist medium
# 子域名枚举
./sif -u https://example.com -dnslist medium
# 端口扫描
./sif -u https://example.com -ports common
# JavaScript 框架检测 + 云配置错误
./sif -u https://example.com -js -c3
# Shodan 主机情报(需要设置 SHODAN_API_KEY 环境变量)
./sif -u https://example.com -shodan
# SecurityTrails 域名发现(需要设置 SECURITYTRAILS_API_KEY 环境变量)
# 发现子域名及相关域名,然后扫描全部
./sif -u https://example.com -securitytrails -headers
# SQL 侦察 + LFI 扫描
./sif -u https://example.com -sql -lfi
# Web 漏洞探测(CORS、开放重定向、反射型 XSS)
./sif -u https://example.com -cors -redirect -xss
# 框架检测(附带 CVE 查询)
./sif -u https://example.com -framework
# 广泛扫描
./sif -u https://example.com -dirlist small -dnslist small -ports common -headers -sh -cms -framework -git -whois
运行 ./sif -h 查看所有选项。
有几个子命令无需扫描即可运行:
# 打印版本(发布版有版本号;本地构建使用 git describe)
./sif version
# 显示最新发布说明(也可用 -pn)
./sif patchnote
第一次运行新版本时,sif 会打印一次该版本的发布说明。设置 SIF_NO_PATCHNOTES=1 以关闭此功能。
sif 采用模块化架构。模块以 YAML 定义,用户可以扩展。
这些选项适用于所有扫描器的出站请求:
# 通过 socks5 代理扫描,带自定义头部、cookie 和 20 req/s 的限制
./sif -u https://example.com -headers -proxy socks5://127.0.0.1:1080 -H "Authorization: Bearer tok" -cookie "session=abc" -rate-limit 20
如果扫描器明确设置了某个头部(例如 API 密钥),则该设置优先于全局默认值。
将运行结果写入文件,用于 CI/CD 或分类:
# 扫描并同时生成 SARIF 和 Markdown 报告
./sif -u https://example.com -headers -cors -sarif out.sarif -md out.md
SARIF 输出可被 GitHub 代码扫描摄取;Markdown 是每个目标的可读摘要。
-diff 将重新扫描变为监控器:sif 将每个目标的标准化发现快照到 JSON 文件,下一次运行时仅报告相对于该快照的增量(+ new / - gone),然后覆盖快照。首次运行目标时无基线,因此所有内容均为 + new。快照存储在 -store(每个目标一个清理过的文件)中;未设置时使用日志目录,回退到 <用户配置>/sif/state。
# 基线运行,然后稍后重新扫描并仅查看变化
./sif -u https://example.com -sh -cors -diff
./sif -u https://example.com -sh -cors -diff
快照始终被重写,因此每次运行都与上一次运行进行 diff。增量日志输出(在 -silent 模式下通过正常输出槽/stderr),而不是发现流。
将发现发送到聊天/Webhook 接收端,以便持续侦察运行能提醒新发现的内容。每个提供商都通过共享 HTTP 客户端进行一次 POST,因此全局代理/速率限制/头部配置同样适用。
提供商首先通过环境变量配置;YAML 文件(-notify-config)逐字段覆盖。YAML 键与 projectdiscovery/notify 一致,因此现有配置可直接迁移:
# 扫描期间发现 medium 及以上严重级别的发现时提醒 Slack
export SLACK_WEBHOOK_URL=https://hooks.slack.com/services/...
./sif -u https://example.com -cors -xss -notify -notify-severity medium
没有目标地址的提供商将被跳过;如果未配置任何内容,-notify 为静默无操作。Slack/Discord/Telegram 接收固定宽度的发现块;通用 Webhook 接收结构化 JSON({count, findings[]})。
sif 从标准输入读取目标,接受裸主机名,因此可嵌入 Unix 管道。-silent 将所有横幅、旋转器、日志输出路由到 stderr,并将每行输出一个标准化的发现([严重级别] 目标 模块 标题)到 stdout:
# subfinder 提供主机,sif 进行探测,notify 发送发现
subfinder -d example.com | sif -silent -probe | notify
| 标志 | 描述 |
|---|---|
| stdin | 管道输入的目标流(每行一个主机/URL),与 -u/-f 一同读取 |
无 scheme 的主机默认为 https://;显式的 http:///https:// 保留;其他 scheme(ftp://、...)被拒绝。
列出可用模块:
./sif -lm
运行特定模块:
# 按 ID 运行
./sif -u https://example.com -m sqli-error-based,xss-reflected
# 按标签运行
./sif -u https://example.com -mt owasp-top10
# 运行所有模块
./sif -u https://example.com -am
在 ~/.config/sif/modules/ 中创建自己的模块。模块使用类似 nuclei 模板的 YAML 格式:
id: my-custom-check
info:
name: my custom security check
author: you
severity: medium
description: checks for something specific
tags: [custom, recon]
type: http
http:
method: GET
paths:
- "{{BaseURL}}/admin"
- "{{BaseURL}}/login"
matchers:
- type: status
status:
- 200
- type: word
part: body
words:
- "admin panel"
- "login"
condition: or
完整模块格式请参阅 docs/modules.md。
欢迎贡献。请参阅 contributing.md 获取指南。
# 格式化
gofmt -w .
# 检查
go run github.com/golangci/golangci-lint/v2/cmd/[email protected] run
# 测试
go test ./...
加入我们的 Discord 获取支持、功能讨论和渗透测试技巧:
| 标志 | 描述 |
|---|
-dirlist | 目录和文件模糊测试(small/medium/large) |
-mc | dirlist:匹配这些状态码(逗号分隔,例如 200,301) |
-fc | dirlist:过滤掉这些状态码(逗号分隔) |
-fs | dirlist:过滤掉具有这些响应体大小的响应(逗号分隔) |
-fw | dirlist:过滤掉具有这些单词数的响应(逗号分隔) |
-fr | dirlist:过滤掉响应体匹配此正则表达式的响应 |
-ac | 自动校准软 404 通配符基线(dirlist, sql) |
-w | dirlist:自定义单词列表(本地文件或 URL;覆盖 -dirlist 的大小) |
-e | dirlist:追加到每个单词的扩展名(逗号分隔,例如 php,bak,env) |
-dnslist | 子域名枚举(small/medium/large) |
-ports | 端口扫描(common/full) |
-nuclei | 使用 nuclei 模板进行漏洞扫描 |
-dork | 自动化 Google dorking |
-js | JavaScript 分析 + 秘密和端点提取 |
-c3 | 云存储配置错误 |
-headers | HTTP 头部分析 |
-sh | 安全头部分析(缺失/弱头部) |
-st | 子域名接管检测 |
-cms | CMS 检测 |
-whois | Whois 查询 |
-git | 暴露的 Git 仓库检测 |
-shodan | Shodan 查询(需要 SHODAN_API_KEY) |
-securitytrails | 域名发现 + 目标扩展(需要 SECURITYTRAILS_API_KEY) |
-sql | SQL 侦察 |
-lfi | 本地文件包含 |
-jwt | JWT 发现 + 离线弱点分析(alg:none、弱 HMAC、exp、敏感 claims) |
-openapi | OpenAPI/Swagger 规范暴露探测(枚举路径 + 未授权端点) |
-favicon | Favicon 哈希指纹识别(类 Shodan 的 mmh3,技术匹配 + 转向查询) |
-cors | CORS 配置错误探测 |
-redirect | 开放重定向探测 |
-xss | 反射型 XSS 探测 |
-framework | 框架检测 + CVE 查询 |
-crawl | 网络爬虫(抓取同主机链接/脚本/表单) |
-crawl-depth | 最大爬取递归深度(默认 2) |
-passive | 被动子域名/URL 发现(零流量发往目标) |
-probe | 存活主机探测(状态、标题、服务器、重定向链) |
| 标志 | 描述 |
|---|
-proxy | 通过代理路由所有流量(http/https/socks5 URL) |
-H, --header | 发送的自定义头部(可重复或逗号分隔,"Key: Value") |
-cookie | 每次请求发送的 Cookie 头部 |
-rate-limit | 每秒最大请求数(0 = 无限制,默认 0) |
| 标志 | 描述 |
|---|
-sarif | 将 SARIF 2.1.0 报告写入此文件 |
-markdown、-md | 将 Markdown 报告写入此文件 |
-silent | 简洁输出:日志输出到 stderr,每行一条发现到 stdout(适用于管道) |
-diff | 仅显示自上次目标快照以来新增/移除的发现 |
-store | -diff 的快照目录(默认:日志目录,否则为 <用户配置>/sif/state) |
| 标志 | 描述 |
|---|
-notify | 扫描后将发现发送到每个配置的提供商 |
-notify-severity | 要发送的最低严重级别(info/low/medium/high/critical,默认 medium) |
-notify-config | 指向与 notify 兼容的 YAML 配置文件的路径(覆盖环境变量) |
| 环境变量 | YAML 键 | 提供商 |
|---|
SLACK_WEBHOOK_URL | slack_webhook_url | Slack 传入 Webhook |
DISCORD_WEBHOOK_URL | discord_webhook_url | Discord Webhook |
TELEGRAM_BOT_TOKEN | telegram_api_key | Telegram Bot API(也需要聊天 ID) |
TELEGRAM_CHAT_ID | telegram_chat_id | Telegram 目标聊天 |
NOTIFY_WEBHOOK_URL | webhook_url | 通用 JSON Webhook(结构化发现) |
![]() vmfunc 🚧 🧑🏫 📆 🛡️ 💻 | ![]() ProjectDiscovery 📦 | ![]() macdoos 💻 | ![]() Matthieu Witrowiez 🤔 | ![]() tessa 🚇 💬 📓 | ![]() Eva 📝 🖋 🔬 🛡️ ⚠️ 💻 | ![]() Zoa Hickenlooper 💻 |
![]() acxtrilla 📦 |