
アセット発見および識別ツール Webフィンガープリント情報を迅速に識別し、資産タイプを特定します。レッドチームがターゲットの資産情報を素早く特定するのを支援し、ブルーチームが疑わしい脆弱性を発見するのを支援します。
[中文 Readme]
Dismap はアセットの発見と識別を目的としたツールです。web/tcp/udp などのプロトコルやフィンガープリント情報を迅速に識別し、アセットタイプを特定できます。内部ネットワーク・外部ネットワークの両方に対応しており、レッドチームが潜在的なリスクアセットを素早く特定したり、ブルーチームが脆弱性が疑われるアセットを検出するのに役立ちます。
Dismap は完全なフィンガープリントルールベースを備えており、現在 tcp/udp/tls プロトコルのフィンガープリントと 4500 以上の web フィンガープリントルールを含み、favicon、body、header などを識別できます。ルールベースの紹介は RuleLab にあります。
スキャン結果を直接 vulmap(>=0.8) に送信して脆弱性スキャンを行うことができます。 バージョン 0.3 ではテキスト結果が変更され、json ファイル結果が追加されました。vulmap は >= 1.0 で連携をサポートする予定です。
Dismap は Linux、MacOS、Windows 向けのバイナリファイルです。Release から対応するバージョンをダウンロードして実行してください。
# Linux または MacOS
zhzyker@debian:~$ chmod +x dismap-0.3-linux-amd64
zhzyker@debian:~$ ./dismap-0.3-linux-amd64 -h
# Windows
C:\Users\zhzyker\Desktop> dismap-0.3-windows-amd64.exe -h
-f, --file string 指定ファイルからターゲットを読み込んでバッチ認識
-h, --help ヘルプを表示
-i, --ip string ネットワークセグメント [例: -i 192.168.1.0/24 または -i 192.168.1.1-10]
-j, --json string スキャン結果を json 形式で出力 [例: -j r.json]
-l, --level int ログレベルを指定 (0:Fatal 1:Error 2:Info 3:Warning 4:Debug 5:Verbose) (デフォルト 3)
-m, --mode string プロトコルを指定 [例: -m mysql/-m http]
--nc 文字色を出力しない
--np ICMP/PING を使用して生存ホストを検出しない
-o, --output string スキャン結果を指定ファイルに保存 (デフォルト "output.txt")
-p, --port string カスタムスキャンポート [例: -p 80,443 または -p 1-65535]
--proxy string プロキシを使用してスキャン、http/socks5 プロトコル対応 [例: --proxy socks5://127.0.0.1:1080]
-t, --thread int 同時実行スレッド数 (デフォルト 500)
--timeout int 応答タイムアウト時間、デフォルト 5 秒 (デフォルト 5)
--type string タイプを指定 [例: --type tcp/--type udp]
-u, --uri string ターゲット URI を指定 [例: -u https://example.com]
zhzyker@debian:~$ ./dismap -i 192.168.1.1/24
zhzyker@debian:~$ ./dismap -i 192.168.1.1/24 -o result.txt -j result.json
zhzyker@debian:~$ ./dismap -i 192.168.1.1/24 --np --timeout 10
zhzyker@debian:~$ ./dismap -i 192.168.1.1/24 -t 1000
zhzyker@debian:~$ ./dismap -u https://github.com/zhzyker/dismap
zhzyker@debian:~$ ./dismap -u mysql://192.168.1.1:3306
zhzyker@debian:~$ ./dismap -i 192.168.1.1/24 -p 1-65535
ルールベース全体は rule.go 内の構造体です。 おおまかな形式:
Rule:
Name: name /* ルール名を定義 */
Type: header|body|ico /* 対応する認識タイプ。header、body、ico は任意の論理組み合わせが可能。ico は favicon.ico を個別にリクエストし MD5 を計算 */
Mode: and|or /* タイプ判定ロジック */
Rule
InBody: str /* レスポンスボディに含まれる文字列を指定 */
InHeader: str /* レスポンス Header に含まれる文字列を指定 */
InIcoMd5: str_md5 /* favicon.ico の MD5 */
Http:
ReqMethod: GET|POST /* カスタムリクエストメソッド。現在は GET と POST をサポート */
ReqPath: str /* カスタムリクエストの web パス */
ReqHeader: []str /* Http リクエストのヘッダーをカスタマイズ */
ReqBody: str /* POST リクエストのボディをカスタマイズ */
例1:
レスポンスボディに文字列 <flink-root></flink-root> が存在するかどうか
{"Apahce Flink", "body", "", InStr{"(<flink-root></flink-root>)", "", ""}, ReqHttp{"", "", nil, ""}},
例2:
リクエストパスを /myportal/control/main にカスタマイズし、カスタムリクエストの結果にヘッダー文字列とボディ文字列が存在するかどうかを判定します。
正規表現がすべてサポートされていることがわかります。
{"Apache OFBiz", "body|header", "or", InStr{"(Apache OFBiz|apache.ofbiz)", "(Set-Cookie: OFBiz.Visitor=(.*))", ""}, ReqHttp{"GET", "/myportal/control/main", nil, ""}},
header、body、ico の論理関係は自由に組み合わせ可能ですが、重複して組み合わせることはできません。
可能: "body|header|ico", "or" または "body|header|ico", "or|and" または "body|ico", "and"
不可能: "body|body", "or"
重複した組み合わせはタイプで指定できませんが、InBody で文字を判定することで実現できます: "body", "", InStr{"(str1|str2)"}