
강력한 웹 취약점 스캐너용 브라우저 크롤러
웹 취약점 스캐너를 위한 강력한 브라우저 크롤러
영어 문서 | 중국어 문서
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 역직렬화 후 반환된 결과는 네 부분으로 구성됩니다:
all_req_list : 이 크롤 작업 중 발견된 모든 요청으로, 다른 도메인의 모든 리소스 유형을 포함합니다.req_list : 이 크롤 작업의 현재 도메인 결과를 반환하며, 의사 정적 중복 제거가 적용되었고 정적 리소스 링크는 제외됩니다. 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에서는 사용 불가) (예제)
사용자 정의 쿠키 (예제)
crawlergo가 생성한 좀비 프로세스를 정기적으로 정리 (예제) , @ring04h 제공
crawlergo는 기본적으로 headless 모드 감지를 우회할 수 있습니다.
https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html

'Fetch.enable'을 찾을 수 없음
Fetch는 새 버전의 Chrome에서 지원하는 기능입니다. 이 오류가 발생하면 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 크롤러의 최대 작업 수로, 의사 정적으로 인한 긴 크롤링 시간을 방지합니다. (기본값: 200)--filter-mode Mode, -f Mode 필터링 모드, simple: 정적 리소스 및 중복 요청만 필터링합니다. smart: 의사 정적 필터링 가능. strict: 더 엄격한 의사 정적 필터링 규칙. (기본값: smart)--output-mode value, -o value 결과 출력 모드, console: 보기 좋은 결과를 화면에 직접 출력합니다. json: 모든 결과의 JSON 직렬화 문자열을 출력합니다. none: 출력하지 않습니다. (기본값: console)--output-json filepath JSON 직렬화 후 결과를 지정된 파일에 기록합니다. (기본값: null)--fuzz-path 내장 사전을 사용한 경로 퍼징입니다. (기본값: false)--fuzz-path-dict 사용자 정의 Fuzz 경로, 사전 파일 경로를 전달합니다(예: /home/user/fuzz_dir.txt). 파일의 각 줄은 퍼징할 경로를 나타냅니다. (기본값: null)--robots-path /robots.txt 파일에서 경로를 해석합니다. (기본값: false)--ignore-url-keywords, -iuk 방문하고 싶지 않은 URL 키워드로, 일반적으로 쿠키를 사용자 정의할 때 로그아웃 링크를 제외하는 데 사용됩니다. 사용법: -iuk logout -iuk exit. (기본값: "logout", "quit", "exit")--form-values, -fv 폼 채우기 값을 텍스트 유형별로 사용자 정의합니다. 지원되는 정의 유형: default, mail, code, phone, username, password, qq, id_card, url, date 및 number. 텍스트 유형은 입력 상자 레이블의 id, name, class, type 네 가지 속성 값 키워드로 식별됩니다. 예를 들어, 메일 입력 상자에 A를 자동으로 채우고 비밀번호 입력 상자에 B를 자동으로 채우도록 정의하려면 -fv mail=A -fv password=B를 사용합니다. 여기서 default는 텍스트 유형이 인식되지 않을 때의 채우기 값으로, "Cralwergo"입니다. (기본값: Cralwergo)--form-keyword-values, -fkv 폼 채우기 값을 키워드 퍼지 일치로 사용자 정의합니다. 키워드는 입력 상자 레이블의 id, name, class, type 네 가지 속성 값과 일치합니다. 예를 들어, pass 키워드를 퍼지 일치하여 123456을 채우고 user 키워드를 퍼지 일치하여 admin을 채우려면 을 사용합니다. (기본값: Cralwergo)--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 headless 모드를 끄고 크롤링 과정을 시각화합니다. (기본값: false)Weibo: @9ian1i Twitter: @9ian1i
관련 기사: 웹 취약점 스캐닝을 위한 브라우저 크롤러 실습
--request-proxy proxyAddress-fkv user=admin -fkv pass=123456