
pagodoは、インターネット上で潜在的に脆弱なWebページやアプリケーションをGoogle検索する処理を自動化します。手動でGoogleダーク(dorks)検索をWeb GUIブラウザで行う代わりとなります。
2つの部分から構成されます。最初の部分はghdb_scraper.pyで、最新のGoogle dorksを取得します。2番目の部分はpagodo.pyで、ghdb_scraper.pyが収集した情報を活用します。
コアとなるGoogle検索ライブラリは、より柔軟なyagooglesearchに置き換わりました。以前はgooglesearchを使用していました。ライブラリの違いや機能の詳細については、yagooglesearchのREADMEを参照してください。
このバージョンのpagodoは、ネイティブのHTTP(S)およびSOCKS5アプリケーションサポートも備えているため、プロキシサポートが必要な場合にproxychains4のようなツールでラップする必要はありません。複数のプロキシをラウンドロビン方式で使用するには、-pスイッチを使用してプロキシのカンマ区切り文字列を指定します。
Offensive Securityは、Google Hacking Database (GHDB) を管理しています。こちら: https://www.exploit-db.com/google-hacking-database。これは、ダーク(dorks)と呼ばれるGoogle検索のコレクションであり、Googleの検索ボットが収集した潜在的に脆弱なボックスやその他のおいしい情報を見つけるために使用できます。
pagodoの利用規約は、yagooglesearchに記載されているものと同じです。
このコードは現状のまま提供され、その使用方法についてはすべてお客様の責任となります。Google検索結果のスクレイピングは、Googleの利用規約に違反する可能性があります。別のPythonのGoogle検索ライブラリにも、それに関する興味深い情報/議論がありました:
Googleが推奨する方法は、APIを使用することです。
スクリプトはPython 3.6以上で書かれています。gitリポジトリをクローンして、要件をインストールしてください。
git clone https://github.com/opsdisk/pagodo.git
cd pagodo
python3 -m venv .venv # If using a virtual environment.
source .venv/bin/activate # If using a virtual environment.
pip install --upgrade pip setuptools
pip install -r requirements.txt
最初に、pagodo.pyは現在のすべてのGoogle dorksのリストを必要とします。リポジトリには、ghdb_scraper.pyが最後に実行された時点での現在のdorksを含むdorks/ディレクトリがあります。pagodo.pyを実行する前に、ghdb_scraper.pyを実行して最新のデータを取得することをお勧めします。dorks/ディレクトリには以下が含まれます:
all_google_dorks.txtファイル:すべてのGoogle dorksが1行に1つずつ含まれていますall_google_dorks.jsonファイル:GHDBからのJSONレスポンスDorkカテゴリ:
categories = {
1: "Footholds",
2: "File Containing Usernames",
3: "Sensitives Directories",
4: "Web Server Detection",
5: "Vulnerable Files",
6: "Vulnerable Servers",
7: "Error Messages",
8: "File Containing Juicy Info",
9: "File Containing Passwords",
10: "Sensitive Online Shopping Info",
11: "Network or Vulnerability Data",
12: "Pages Containing Login Portals",
13: "Various Online devices",
14: "Advisories and Vulnerabilities",
}
すべてのdorksをall_google_dorks.txt、all_google_dorks.json、および各dorkに関するよりコンテキストデータが必要な場合は個別のカテゴリに書き込みます。
python ghdb_scraper.py -s -j -i
ghdb_scraper.retrieve_google_dorks()関数は、次のデータ構造を持つ辞書を返します:
ghdb_dict = {
"total_dorks": total_dorks,
"extracted_dorks": extracted_dorks,
"category_dict": category_dict,
}
Pythonシェル(pythonやipythonなど)を使用してデータを探索する:
import ghdb_scraper
dorks = ghdb_scraper.retrieve_google_dorks(save_all_dorks_to_file=True)
dorks.keys()
dorks["total_dorks"]
dorks["extracted_dorks"]
dorks["category_dict"].keys()
dorks["category_dict"][1]["category_name"]
python pagodo.py -d example.com -g dorks.txt
pagodo.Pagodo.go()関数は、以下のデータ構造を持つ辞書を返します(使用されるdorksは架空の例です):
{
"dorks": {
"inurl:admin": {
"urls_size": 3,
"urls": [
"https://github.com/marmelab/ng-admin",
"https://github.com/settings/admin",
"https://github.com/akveo/ngx-admin",
],
},
"inurl:gist": {
"urls_size": 3,
"urls": [
"https://gist.github.com/",
"https://gist.github.com/index",
"https://github.com/defunkt/gist",
],
},
},
"initiation_timestamp": "2021-08-27T11:35:30.638705",
"completion_timestamp": "2021-08-27T11:36:42.349035",
}
Pythonシェル(pythonやipythonなど)を使用してデータを探索する:
import pagodo
pg = pagodo.Pagodo(
google_dorks_file="dorks.txt",
domain="github.com",
max_search_result_urls_to_return_per_dork=3,
save_pagodo_results_to_json_file=None, # None = Auto-generate file name, otherwise pass a string for path and filename.
save_urls_to_file=None, # None = Auto-generate file name, otherwise pass a string for path and filename.
verbosity=5,
)
pagodo_results_dict = pg.go()
pagodo_results_dict.keys()
pagodo_results_dict["initiation_timestamp"]
pagodo_results_dict["completion_timestamp"]
for key,value in pagodo_results_dict["dorks"].items():
print(f"dork: {key}")
for url in value["urls"]:
print(url)
-dスイッチを使用すると、結果を特定のドメインに限定でき、Google検索演算子として機能します:
site:github.com
-i - dork検索間の最小遅延(秒)を指定します。小さくしすぎると、IPがすぐにHTTP 429される可能性があります。-x - dork検索間の最大遅延(秒)を指定します。大きすぎると検索に時間がかかります。-iと-xで指定された値は、20個のランダムな待機時間のリストを生成するために使用され、それぞれ異なるGoogle dork検索の間にランダムに選択されます。
-m - Google dorkごとに返す最大検索結果の総数。各Google検索リクエストは最大100件の結果を一度に取得できるため、-m 500を選択した場合、各Google dork検索に対して5回の個別の検索クエリが必要になり、完了までの時間が増加します。
-o [optional/path/to/results.json] - 出力をJSONファイルに保存します。ファイル名を指定しない場合は、日時スタンプ付きのファイル名が生成されます。
-s [optional/path/to/results.txt] - URLをテキストファイルに保存します。ファイル名を指定しない場合は、日時スタンプ付きのファイル名が生成されます。
--log [optional/path/to/file.log] - ログを指定されたファイルに保存します。ファイル名を指定しない場合、デフォルトのファイルpagodo.py.logがpagodoディレクトリのルートに使用されます。
7300以上の検索リクエストをできるだけ高速にGoogleに行うことは、単純に機能しません。Googleはそれをボットとして当然検出し、一定期間IPをブロックします。1つの解決策は、HTTP(S)/SOCKSプロキシのバンクを使用し、それらをpagodoに渡すことです。
-pスイッチを使用して、プロキシのカンマ区切り文字列をpagodoに渡します。
python pagodo.py -g dorks.txt -p http://myproxy:8080,socks5h://127.0.0.1:9050,socks5h://127.0.0.1:9051
異なるプロキシIPを活用するため、-iと-xの値をさらに減らすこともできます。pagodoに渡されたプロキシはラウンドロビンで選択されます。
別の解決策は、proxychains4を使用してルックアップをラウンドロビンすることです。
proxychains4をインストールする
apt install proxychains4 -y
/etc/proxychains4.conf設定ファイルを編集して、異なるプロキシサーバーをラウンドロビンでルックアップするようにします。以下の例では、2つの異なるダイナミックSOCKSプロキシが異なるローカルリスニングポート(9050と9051)で設定されています。
vim /etc/proxychains4.conf
round_robin
chain_len = 1
proxy_dns
remote_dns_subnet 224
tcp_read_time_out 15000
tcp_connect_time_out 8000
[ProxyList]
socks4 127.0.0.1 9050
socks4 127.0.0.1 9051
pagodo.pyスクリプトの前にproxychains4を置くと、各_リクエスト_ルックアップが異なるプロキシ(したがって異なるIP)を経由するようになります。
proxychains4 python pagodo.py -g dorks/all_google_dorks.txt -o [optional/path/to/results.json] -s [optional/path/to/results.txt]
ただし、以下の場合、Googleにとって自然に見えない可能性があります:
google.comへの「ブラウジング」をシミュレートするそのため、組み込みの-pプロキシサポートを使用することが推奨されます。yagooglesearchのドキュメントに記載されているように、「提供されたプロキシは検索のライフサイクル全体で使用され、検索の各部分で異なるプロキシをローテーションするのではなく、より人間らしく見せるためです。」
GNU General Public License v3.0に基づいて配布されています。詳細についてはLICENSEを参照してください。
プロジェクトリンク: https://github.com/opsdisk/pagodo