インストール · 使い方 · モジュール · ドキュメント · 貢献
高速で同時実行可能な偵察からエクスプロイトまでを1つのバイナリで。すべてのスキャナは1つのコネクションプールされたHTTPクライアントを共有します。
sifは、サブドメイン列挙、ポートスキャン、クローラー、nuclei、フレームワーク/CVE検出、JavaScriptシークレット抽出、Web脆弱性プローブ(CORS/XSS/リダイレクト)、クラウドおよび乗っ取りチェックなど、チェーン全体を1つのバイナリで実行する偵察およびエクスプロイトスキャナです。25種類以上のスキャンタイプを1つのコマンドで実行できます。
sif -u https://example.com -dnslist -ports -crawl -js -framework -nuclei
nucleiとcollyは外部コマンドとしてシェルアウトするのではなく、ライブラリとしてコンパイルされています(ツリー内にexec.Commandはありません)。そのため、実行時依存関係がなく、接続の手間も不要な単一の静的バイナリです。
すべてのスキャナは1つの共有HTTPクライアントとワークスティーリングワーカープールを介して実行されます。-proxy、-H、-cookie、-rate-limitは一度に全体の実行に適用され、接続はスキャン全体でプールされ再利用されます(単一ホストの実行では、50回ダイヤルする代わりに1つの接続を約50リクエストで再利用します)。また、遅いホストがあっても他のホストをブロックしません。この共有クライアントこそが、個別のツールをパイプでつなぐよりも実用的である理由です。ポートスキャンはconnect()ベースであるため、生のポートスキャンではrustscanやnmapの方が依然として高速です。
stdinからターゲットを読み取り、-silentでは1行に1つの発見を出力するため、パイプラインでの連携が可能です:
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
最新のバイナリをリリースページから入手してください。
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_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 Code Scanningで取り込めます。Markdownはターゲットごとに可読な要約です。
-diffは再スキャンをモニターに変えます:sifは各ターゲットの正規化された発見をJSONファイルにスナップショットし、次回の実行ではそのスナップショットに対する差分(+ new / - gone)のみを報告し、スナップショットを上書きします。最初の実行時はベースラインがないため、すべてが+ newになります。スナップショットは-storeに保存されます(ターゲットごとにサニタイズされたファイル)。未設定の場合はログディレクトリを再利用し、さらにない場合は<user-config>/sif/stateにフォールバックします。
# ベースライン実行、後で再スキャンして変更のみを確認
./sif -u https://example.com -sh -cors -diff
./sif -u https://example.com -sh -cors -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はstdinからターゲットを読み取り、裸のホスト名を受け入れます。そのため、Unixパイプラインに簡単に組み込めます。-silentはすべてのバナー/スピナー/ログクロームをstderrにルーティングし、1行に1つの正規化された発見([重要度] ターゲット モジュール タイトル)をstdoutに出力します:
# subfinderがホストを提供し、sifがプローブし、notifyが発見結果を送信
subfinder -d example.com | sif -silent -probe | notify
| フラグ | 説明 |
|---|---|
| stdin | パイプされたターゲットストリーム(1行に1つのホスト/URL)は-u/-fとともに読み取られます |
スキームのないホストはデフォルトでhttps://になります。明示的なhttp:///https://は保持されます。その他のスキーム(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、機密性の高いクレーム) |
-openapi | OpenAPI/Swagger仕様公開プローブ(パス+認証不要エンドポイントを列挙) |
-favicon | Faviconハッシュフィンガープリンティング(Shodanスタイルのmmh3、テクノロジーマッチ+ピボットクエリ) |
-cors | CORS設定ミスプローブ |
-redirect | オープンリダイレクトプローブ |
-xss | 反射型XSSプローブ |
-framework | CVEルックアップ付きフレームワーク検出 |
-crawl | Webクローラー(同一ホストのリンク/スクリプト/フォームをスパイダー) |
-crawl-depth | 最大クロール再帰深度(デフォルト2) |
-passive | パッシブサブドメイン/URL発見(ターゲットへのトラフィックなし) |
-probe | ライブホストプローブ(ステータス、タイトル、サーバー、リダイレクトチェーン) |
| フラグ | 説明 |
|---|
-proxy | すべてのトラフィックをプロキシ経由でルーティング(http/https/socks5 URL) |
-H, --header | 送信するカスタムヘッダー(繰り返し可能またはカンマ区切り、"Key: Value") |
-cookie | すべてのリクエストとともに送信するCookieヘッダー |
-rate-limit | 1秒あたりの最大リクエスト数(0 = 無制限、デフォルト0) |
| フラグ | 説明 |
|---|
-sarif | SARIF 2.1.0レポートをこのファイルに書き込む |
-markdown, -md | Markdownレポートをこのファイルに書き込む |
-silent | プレーン出力:クローム(進捗等)はstderrへ、各発見は1行ずつstdoutへ(パイプライン用) |
-diff | 各ターゲットの前回スナップショット以降に追加/削除された発見のみを表示 |
-store | -diff用のスナップショットディレクトリ(デフォルト:ログディレクトリ、なければ <user-config>/sif/state) |
| フラグ | 説明 |
|---|
-notify | スキャン後に設定されたすべてのプロバイダーに発見結果を送信 |
-notify-severity | 送信する最小の重要度(info/low/medium/high/critical、デフォルト medium) |
-notify-config | notify互換のYAML設定ファイルへのパス(環境変数を上書き) |
| 環境変数 | YAMLキー | プロバイダー |
|---|
SLACK_WEBHOOK_URL | slack_webhook_url | Slack Incoming 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 📦 |