
pagodo (수동 Google Dork) - Google 해킹 데이터베이스 스크래핑 및 검색 자동화
pagodo는 인터넷에서 잠재적으로 취약한 웹 페이지 및 애플리케이션을 찾기 위해 Google 검색을 자동화합니다. 웹 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 검색 결과를 스크래핑하는 것은 Google의 서비스 약관을 위반할 수 있습니다. 다른 Python Google 검색 라이브러리에 몇 가지 흥미로운 정보/논의가 있습니다:
Google이 선호하는 방법은 API를 사용하는 것입니다.
스크립트는 Python 3.6+ 용으로 작성되었습니다. git 저장소를 클론하고 요구 사항을 설치하세요.
git clone https://github.com/opsdisk/pagodo.git
cd pagodo
python3 -m venv .venv # 가상 환경을 사용하는 경우.
source .venv/bin/activate # 가상 환경을 사용하는 경우.
pip install --upgrade pip setuptools
pip install -r requirements.txt
시작하려면 pagodo.py에 모든 현재 Google 도크 목록이 필요합니다. 저장소에는 ghdb_scraper.py가 마지막으로 실행되었을 때의 현재 도크가 포함된 dorks/ 디렉토리가 있습니다. pagodo.py를 실행하기 전에 ghdb_scraper.py를 실행하여 가장 최신 데이터를 가져오는 것이 좋습니다. dorks/ 디렉토리에는 다음이 포함됩니다:
all_google_dorks.txt 파일 (한 줄에 하나)all_google_dorks.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 셸(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 셸(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 = 파일 이름 자동 생성, 그렇지 않으면 경로 및 파일 이름 문자열 전달.
save_urls_to_file=None, # None = 파일 이름 자동 생성, 그렇지 않으면 경로 및 파일 이름 문자열 전달.
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을 선택하면 각 Google 도크 검색에 대해 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 디렉토리 루트에 사용됩니다.
가능한 한 빨리 Google에 7300개 이상의 검색 요청을 수행하는 것은 작동하지 않습니다. 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
다른 프록시 IP를 활용할 것이므로 -i 및 -x 값을 줄일 수도 있습니다. pagodo에 전달된 프록시는 라운드 로빈 방식으로 선택됩니다.
또 다른 해결책은 proxychains4를 사용하여 조회를 라운드 로빈하는 것입니다.
proxychains4 설치
apt install proxychains4 -y
/etc/proxychains4.conf 설정 파일을 편집하여 다른 프록시 서버를 통해 조회를 라운드 로빈합니다. 아래 예에서는 서로 다른 로컬 수신 포트(9050 및 9051)를 가진 2개의 다른 동적 소켓 프록시가 설정되었습니다.
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으로 "브라우징" 시뮬레이션이러한 이유로, yagooglesearch 문서에 명시된 대로 기본 -p 프록시 지원을 사용하는 것이 권장됩니다. "제공된 프록시는 검색의 전체 수명 주기 동안 사용되어 검색을 더 인간처럼 보이게 하며, 검색의 다른 부분에 대해 다양한 프록시를 회전하는 대신 사용됩니다."
GNU General Public License v3.0에 따라 배포됩니다. 자세한 내용은 LICENSE를 참조하세요.
프로젝트 링크: https://github.com/opsdisk/pagodo