pagodo 自动化 Google 搜索,寻找互联网上可能存在漏洞的网页和应用。它取代了通过 Web GUI 浏览器手动执行 Google 搜索语法的方式。
该工具包含两个部分。第一部分是 ghdb_scraper.py,用于获取最新的 Google 搜索语法;第二部分是 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。这是一个 Google 搜索的集合,称为搜索语法,可用于寻找潜在易受攻击的机器或被 Google 搜索引擎抓取到的其他敏感信息。
pagodo 的条款与条件与 yagooglesearch 中的相同。
本代码按原样提供,你完全负责如何使用它。抓取 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 时的当前搜索语法。建议在运行 pagodo.py 之前先运行 ghdb_scraper.py 以获取最新数据。dorks/ 目录包含:
all_google_dorks.txt 文件,包含所有 Google 搜索语法,每行一个all_google_dorks.json 文件,是来自 GHDB 的 JSON 响应搜索语法类别:
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",
}
将所有搜索语法写入 all_google_dorks.txt、all_google_dorks.json 以及单独的分类文件(如果你希望获得每个搜索语法的更多上下文数据)。
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 shell(如 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": {
"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 shell(如 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 - 指定搜索语法搜索之间的最小延迟(秒)。不要设置得太小,否则你的 IP 会很快收到 HTTP 429 错误。-x - 指定搜索语法搜索之间的最大延迟(秒)。不要设置得太大,否则搜索会花费很长时间。-i 和 -x 提供的值用于生成 20 个随机等待时间列表,这些时间会在不同的 Google 搜索语法搜索之间随机选取。
-m - 每个 Google 搜索语法返回的最大搜索结果总数。每次 Google 搜索请求最多可以拉回 100 个结果,因此如果你选择 -m 500,则每个搜索语法搜索需要执行 5 次单独的搜索查询,这会增加完成所需的时间。
-o [可选的输出路径/results.json] - 将输出保存为 JSON 文件。如果你不指定文件名,将生成一个带有日期时间戳的文件。
-s [可选的输出路径/results.txt] - 将 URL 保存为文本文件。如果你不指定文件名,将生成一个带有日期时间戳的文件。
--log [可选的日志文件路径/file.log] - 将日志保存到指定文件。如果你不指定文件名,将默认使用 pagodo.py.log 文件(位于 pagodo 目录根目录)。
尽可能快地执行超过 7300 次 Google 搜索请求是行不通的。Google 会合理地检测到这是一个机器人,并在一定时间内阻止你的 IP。一种解决方案是使用一组 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
你甚至可以降低 -i 和 -x 的值,因为你将利用不同的代理 IP。传递给 pagodo 的代理按轮询方式选择。
另一种解决方案是使用 proxychains4 进行轮询查找。
安装 proxychains4
apt install proxychains4 -y
编辑 /etc/proxychains4.conf 配置文件,以通过不同的代理服务器进行轮询查找。在下面的示例中,设置了两个不同的动态 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 通用公共许可证 v3.0 下分发。更多信息请参见 LICENSE。