ウェブ脆弱性スキャナーのための強力なブラウザクローラー
英語ドキュメント | 中文文档
crawlergo は、chrome headless モードを使用して URL を収集するブラウザクローラーです。DOM レンダリング段階でウェブページ全体のキーポジションをフックし、自動的にフォームを埋めて送信し、インテリジェントな JS イベントトリガーにより、ウェブサイトが公開するエントリを可能な限り収集します。内蔵の URL 重複排除モジュールは、多数の疑似静的 URL をフィルタリングしながらも、大規模なウェブサイトに対して高速な解析・クロール速度を維持し、最終的に高品質なリクエスト結果のコレクションを取得します。
crawlergo は現在、以下の機能をサポートしています:

インストール・使用前に 免責事項 をよくお読みになり、確認してください。
ビルド
make build
make build_all
Linux システムを使用していて、Chrome が依存関係の欠如を警告する場合は、以下の TroubleShooting を参照してください。
Chromium のインストールディレクトリが /tmp/chromium/ であると仮定し、10 個のタブを同時に開いて testphp.vulnweb.com をクロールします:
bin/crawlergo -c /tmp/chromium/chrome -t 10 http://testphp.vulnweb.com/
頭を使わずに Docker で使用することもできます:
git clone https://github.com/Qianlitp/crawlergo
docker build . -t crawlergo
docker run crawlergo http://testphp.vulnweb.com/
bin/crawlergo -c /tmp/chromium/chrome -t 10 --request-proxy socks5://127.0.0.1:7891 http://testphp.vulnweb.com/
デフォルトでは、crawlergo は結果を直接画面に出力します。次に出力モードを json に設定し、Python を使用して呼び出すサンプルコードを以下に示します:
#!/usr/bin/python3
# coding: utf-8
import simplejson
import subprocess
def main():
target = "http://testphp.vulnweb.com/"
cmd = ["bin/crawlergo", "-c", "/tmp/chromium/chrome", "-o", "json", target]
rsp = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, error = rsp.communicate()
# "--[Mission Complete]--" はタスク終了の区切り文字列です
result = simplejson.loads(output.decode().split("--[Mission Complete]--")[1])
req_list = result["req_list"]
print(req_list[0])
if __name__ == '__main__':
main()
出力モードが json に設定されている場合、JSON デシリアライズ後の返却結果には以下の 4 つの部分が含まれます:
all_req_list:このクロールタスク中に見つかったすべてのリクエスト。他のドメインからのあらゆるリソースタイプを含みます。req_list:このクロールタスクの 現在のドメインの結果 を返します。疑似静的 URL は重複排除され、静的リソースリンクは含まれません。all_req_list のサブセットです。all_domain_list:見つかったすべてのドメインのリスト。sub_domain_list:見つかったサブドメインのリスト。crawlergo は完全なリクエストと URL を返すため、さまざまな方法で使用できます:
他の受動的ウェブ脆弱性スキャナーとの連携
まず、受動的スキャナーを起動し、リスニングアドレスを http://127.0.0.1:1234/ に設定します。
次に、crawlergo がスキャナーと同じマシン上にあると仮定し、crawlergo を起動してパラメータを設定します:
--push-to-proxy http://127.0.0.1:1234/
Host バインディング(高バージョンの Chrome では使用不可) (例)
カスタム Cookie (例)
crawlergo によって生成されたゾンビプロセスの定期的なクリーンアップ (例) 、@ring04h 氏による寄稿
crawlergo はデフォルトでヘッドレスモード検出をバイパスできます。
https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html

'Fetch.enable' が見つからない
Fetch は新しいバージョンの Chrome でサポートされている機能です。このエラーが発生した場合、バージョンが低すぎることを意味しますので、Chrome のバージョンをアップグレードしてください。
Chrome の実行時に xxx.so などの依存関係が不足している
// Ubuntu
apt-get install -yq --no-install-recommends \
libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 \
libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 \
libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libgbm1 \
libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 libnss3
// CentOS 7
sudo yum install pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 \
libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 \
ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc -y
sudo yum update nss -y
実行時に Navigation timeout と表示される / ブラウザが見つからない / 正しい ブラウザの実行可能ファイルパス がわからない
ブラウザの実行可能パスが正しく設定されていることを確認してください。アドレスバーに chrome://version と入力し、実行可能ファイルのパスを確認します:

--chromium-path Path, -c Path Chrome 実行ファイルへのパス。(必須)--custom-headers Headers HTTP ヘッダーをカスタマイズします。JSON シリアライズ後のデータを渡してください。これはグローバルに定義され、すべてのリクエストで使用されます。(デフォルト:null)--post-data PostData, -d PostData POST データ。(デフォルト:null)--max-crawled-count Number, -m Number クローラーの最大タスク数。疑似静的 URL による長いクロール時間を避けるため。(デフォルト:200)--filter-mode Mode, -f Mode フィルタリングモード。simple:静的リソースと重複リクエストのみをフィルタリング。smart:疑似静的 URL をフィルタリングする機能あり。strict:より厳格な疑似静的フィルタリングルール。(デフォルト:smart)--output-mode value, -o value 結果出力モード。console:整形された結果を直接画面に表示。json:すべての結果の JSON シリアライズ文字列を表示。none:出力しない。(デフォルト:console)--output-json filepath 結果を JSON シリアライズ後、指定されたファイルに書き込みます。(デフォルト:null)--fuzz-path 内蔵辞書を使用してパスファジングを行います。(デフォルト:false)--fuzz-path-dict 辞書ファイルのパスを渡してファジングパスをカスタマイズします。例:/home/user/fuzz_dir.txt。ファイルの各行がファジング対象のパスを表します。(デフォルト:null)--robots-path /robots.txt ファイルからパスを解決します。(デフォルト:false)--ignore-url-keywords, -iuk 訪問したくない URL のキーワード。通常、カスタム Cookie 時にログアウトリンクを除外するために使用します。使用方法:-iuk logout -iuk exit。(デフォルト:"logout", "quit", "exit")--form-values, -fv フォーム入力の値をテキストタイプ別にカスタマイズします。定義可能なタイプ:default、mail、code、phone、username、password、qq、id_card、url、date、number。テキストタイプは、input タグの id、name、class、type の 4 つの属性値キーワードで識別されます。例えば、メール入力ボックスを A で自動入力し、パスワード入力ボックスを B で自動入力する場合:-fv mail=A -fv password=B。default はテキストタイプが認識されなかった場合の入力値で、"Crawergo" です。(デフォルト:Crawergo)--form-keyword-values, -fkv キーワードのあいまい一致によりフォーム入力の値をカスタマイズします。キーワードは input タグの id、name、class、 の 4 つの属性値と照合されます。例えば、pass キーワードをあいまい一致させて 123456 を入力し、user キーワードを admin とする場合:。(デフォルト:Crawergo)--max-tab-count Number, -t Number クローラーが同時に開ける最大タブ数。(デフォルト:8)--tab-run-timeout Timeout 単一タブページの最大実行時間。(デフォルト:20s)--wait-dom-content-loaded-timeout Timeout ページの読み込み完了を待つ最大タイムアウト。(デフォルト:5s)--event-trigger-interval Interval イベントが自動トリガーされる間隔。ターゲットのネットワークが遅く、DOM 更新の競合により URL のキャプチャ漏れが発生する場合に使用します。(デフォルト:100ms)--event-trigger-mode Value DOM イベント自動トリガーモード。async と sync があり、DOM 更新の競合による URL キャプチャ漏れに対処します。(デフォルト:async)--before-exit-delay 単一タスクの終了時に Chrome を閉じるのを遅延させます。部分的の DOM 更新や XHR リクエストのキャプチャを待つために使用します。(デフォルト:1s)--push-to-proxy クローラー結果を受信するリスニングアドレス。通常は受動的スキャナーのリスニングアドレスです。(デフォルト:null)--push-pool-max クローラー結果をリスニングアドレスに送信する際の最大同時実行数。(デフォルト:10)--log-level ログレベル。debug、info、warn、error、fatal。(デフォルト:info)--no-headless Chrome のヘッドレスモードをオフにし、クロールプロセスを可視化します。(デフォルト:false)--request-proxy proxyAddresstype-fkv user=admin -fkv pass=123456