
호스트, 포트, CIDR/범위 및 TLS 인증서 vhost에서 응답 본문과 헤더를 문자열 또는 정규식으로 grep하는 비동기 HTTP(S) 스캐너입니다.
HTTP(S) 서버를 스캔하고 HTTP 응답 본문과 헤더에서 문자열 또는 정규식 패턴을 grep하는 빠르고 비동기적인 Python 도구입니다.
단일 호스트, URL, CIDR 범위, IP 범위 또는 파일을 대상으로 하며; 대상별로 여러 포트를 스캔합니다(단일, 쉼표 목록 또는 범위, 포트별 TLS/일반 자동 감지); TLS 인증서에서 이름 기반 (v)host를 직접 가져와 스캔할 수 있으며; 일치 항목을 터미널에 실시간으로 스트리밍하고; 결과를 텍스트, CSV 또는 JSONL 로그 파일로 기록할 수 있습니다.
대규모 스캔을 위해 설계되었습니다: 비동기 코어가 수천 개의 동시 연결을 구동하고, TCP 사전 점검이 죽은 포트를 저비용으로 건너뛰며, 호스트별 및 전체 타임아웃이 느리거나 죽은 대상에 걸려 멈추지 않게 하고, 중단된 실행은 재개할 수 있습니다.
termios 및 asyncio의 Unix 시그널 처리를 사용)의 Python 3.11+pip install -r requirements.txt
(또는 pip install httpx)uvloop(더 빠른 이벤트 루프), aiodns
(-r용 비차단 DNS), h2(-2용 HTTP/2), httpx[socks] / socksio
(SOCKS 프록시)httpgrep은 단일 자체 포함 스크립트입니다 - 그냥 ./httpgrep.py를 실행하세요.
$ httpgrep -H
__ __ __
/ /_ / /_/ /_____ ____ _________ ____
/ __ \/ __/ __/ __ \/ __ `/ ___/ _ \/ __ \
/ / / / /_/ /_/ /_/ / /_/ / / / __/ /_/ /
/_/ /_/\__/\__/ .___/\__, /_/ \___/ .___/
/_/ /____/ /_/
--== [ by nullsecurity.net ] ==--
사용법
httpgrep -h <arg> -s <arg> [opts] | <misc>
대상 옵션
-h <hosts|file> - 단일 호스트/URL 또는 호스트-/CIDR 범위 또는 호스트가 포함된
파일 또는 URL이 포함된 파일, 예: foobar.net,
192.168.0.1-192.168.0.254, 192.168.0.0/24, /tmp/hosts.txt
쉼표로 구분된 호스트 목록도 작동합니다, 예:
1.2.3.4,foo.net,10.0.0.0/24
참고: 호스트는 명령줄 또는 파일에서 ': <ports>'도 포함할 수
있으며, 여기서 <ports>는 단일 포트, 쉼표 목록 또는 범위입니다, 예:
foo.net:8080, foo.net:80,443, 10.0.0.1:1-1024
-p <ports|file> - 연결할 포트: 단일 포트, 쉼표로 구분된 목록, 범위, 또는 줄당
하나의 사양이 있는 파일, 예: 80,
80,443,8080, 8000-8100, /tmp/ports.txt
(기본값: 80, 또는 -t가 주어지면 443)
-t - 모든 포트에 TLS/SSL 강제 적용. 기본적으로 스킴은 포트별로
자동 감지됩니다(일반 http, 포트가 TLS를 사용하면 TLS로 전환)
-u <URI|file> - 지정된 문자열을 검색할 URI 또는 쉼표로 구분된 URI 또는 URI가
있는 파일(줄당 하나), 예: /foobar/,
/foo.html, /admin,/login, /tmp/paths.txt (기본값: /)
-r - 스캔된 IPv4의 역방향 DNS(PTR) 이름을 라벨로 표시; IP는
스캔 대상으로 유지됩니다(범위 이탈 없음).
aiodns 패키지로 비차단 동작
http 옵션
-X <method> - 사용할 HTTP 요청 메서드, 대소문자 무관 (기본값: get).
사용 가능한 메서드를 나열하려면 '?'를 사용하세요.
-a <user:pass> - http 인증 자격 증명 (형식: 'user:pass')
-U <UA> - 사용자 정의 User-Agent 설정 (기본값: 최신 ms edge, windows)
-A - 요청마다 임의의 user-agent 사용
-R <headers> - 사용자 정의 헤더 설정 (형식: 'foo=bar;lol=lulz;...')
-C <cookies> - 쿠키 설정 (형식: 'foo=bar;lol=lulz;...')
-F - HTTP 리다이렉트를 따르지 않음
-L <num> - 따라갈 최대 리다이렉트 수 (기본값: 10; -F와 함께 사용 시 무시됨)
-E - TLS/SSL 인증서 검증 (기본값: 검증 안 함)
-P <proxy> - 프록시 사용 (형식: '[http|https|socks4|socks5]://host:port')
(socks는 'httpx[socks]' / socksio 패키지 필요)
-f <codes> - 주어진 HTTP 상태 코드의 응답만 보고, 예: '200', '200,301,302'
-e <codes> - 주어진 HTTP 상태 코드의 응답 제외, 예: '404', '403,404,500'
-2 - HTTP/2 시도 (TLS에서 ALPN 협상, 1.1로 폴백;
일반 http는 1.1 유지). 'h2' 패키지 필요
검색 옵션
-s <str|file> - HTTP 응답 본문과 헤더에서 찾을 단일 문자열/정규식 또는 파일의
여러 문자열/정규식 (-w 참조), 예: 'tomcat 8',
'/tmp/igot0daysforthese.txt'
-S <str|file> - 반전 (grep -v): 이 문자열/정규식(또는 파일)이 본문 또는
헤더 어디에든 나타나면 해당 응답의 모든 일치 항목을 버립니다,
예를 들어 동적 오류 / 404 페이지를 걸러낼 때
-w <where> - 검색 위치: headers, body 또는 headers,body
(기본값: headers,body)
-b <bytes> - 본문 일치에서 표시할 컨텍스트 바이트 수 (기본값: 64)
-m <size> - 읽고 검색할 최대 본문 크기; 접미사 b/kb/mb, 접미사 없음 = kb,
예: 512, 1mb, 262144b (기본값: 256kb)
-i - 대소문자 구분 없는 검색 사용
-I - 대소문자 구분 없는 반전 사용 (-S용)
스캔 옵션
-x <num> - 최대 동시 연결 수 (비동기; 기본값: 300). 매우 높은 값의 경우
ulimit -n을 그에 맞게 올리세요
-c <seconds> - 호스트별 읽기 타임아웃(초), 본문 읽기 시간도 제한합니다.
tcp 사전 점검은 무조건 2초로 제한되므로 필터링되거나
죽은 호스트는 슬롯을 빠르게 비웁니다 (기본값: 3.0)
-G <seconds> - 전체 타임아웃: N초 후 전체 스캔을 강제 중지
(어떤 멈춤에 대한 안전망; 기본값: 없음)
-y <num> - 실패한 프로브를 최대 <num>회 재시도 (기본값: 0).
대규모에서 불안정한 호스트에 도움이 됩니다; 작게 유지하세요
-1 - 호스트에 일치 항목이 있으면 아직 시작되지 않은 프로브를 건너뜁니다
(최선 노력; 진행 중인 요청은 여전히 완료되므로 높은 -x에서는
호스트당 몇 개의 일치 항목이 여전히 보일 수 있음)
-z <size> - 메모리 제한이 있는 <size> RAM 창 내에서 스캔 대상을 임의 순서로
처리 (접미사 b/kb/mb/gb), 예: -z 1gb.
거대한 범위/파일이 메모리를 소진하지 않게 합니다
-Z <num> - -z 창을 <num>개 대상으로 제한 (기본값 2000000,
각각 약 140바이트로 ~267mb). 더 크면 거대한 범위에서
더 넓은 혼합이 가능하지만 RAM과 시작 버퍼링 비용이 듭니다
-W - 저장/재개: ctrl+c 시 진행 상태를 httpgrep.session에 기록;
-W로 다시 실행하면 재개합니다 (그렇지 않으면 새로 시작)
-T <0|1> - 직접 스캔에 더해 인증서 (v)host(CN + SAN)도 추가 요청으로
프로브합니다. 0 = 동일 IP의 Host 헤더를 통해 (범위 내);
1 = DNS 이름/SNI로도 (범위를 벗어날 수 있음).
TLS 필요 (https url, -t 또는 *443 포트)
출력 옵션
-l <file> - 선택한 -O 형식에 따라 찾은 일치 항목을 <file>.<fmt>로 기록
(예: -l out -O csv,jsonl => out.csv, out.jsonl)
-O <formats> - 로그 파일 형식, 쉼표 목록: txt, csv, jsonl
(기본값: txt; '?'를 사용하여 목록 확인). 터미널 출력은 항상
사람이 읽을 수 있는 형태로 유지됩니다.
-v - 자세히: 각 URL을 스캔할 때마다 출력
-7 - 터미널 출력의 비ASCII를 \xNN으로 이스케이프하여 악의적인
응답 본문이 터미널을 손상시키지 못하게 합니다 (로그는 원본 유지)
기타 옵션
-H - 도움말 출력
-V - 버전 정보 출력
예시
# 단일 호스트의 헤더와 본문에서 'apache' grep
$ httpgrep -h foobar.net -s apache
# CIDR 범위의 포트 8080 스캔, 본문에서만 'tomcat' 검색
$ httpgrep -h 192.168.0.0/24 -p 8080 -s tomcat -w body
# 여러 포트와 포트 범위에서 'jenkins' 검색
$ httpgrep -h 192.168.0.10 -p 80,443,8080,8000-8100 -s jenkins -i
# 호스트 목록 스캔, 문자열 파일 검색, 일치 항목 기록 (-> /tmp/out.txt)
$ httpgrep -h /tmp/hosts.txt -s /tmp/strings.txt -x 200 -l /tmp/out
# TLS를 통해 여러 URI에서 'admin' 대소문자 구분 없이 grep
$ httpgrep -h foobar.net -t -u /admin,/login,/dashboard -s admin -i
# IP 범위 스캔, 역방향 DNS, 200 응답만 보고
$ httpgrep -h 10.0.0.1-10.0.0.254 -s 'powered by' -r -f 200
# 헤더만 검색, 리다이렉트를 따르지 않음, 자세한 출력
$ httpgrep -h foobar.net -s 'X-Powered-By' -w headers -F -v
# 'admin' grep, 하지만 동적 오류 페이지 제외 (반전, 대소문자 구분 없음)
$ httpgrep -h 192.168.0.0/24 -s admin -i -S 'error|not found' -I
# 프록시 경유, 사용자 정의 UA, 버전 문자열 검색
$ httpgrep -h /tmp/hosts.txt -s 'nginx/1\.' -P http://127.0.0.1:8080 -U 'curl/8.0'
# 대규모 재개 가능 스캔: ctrl+c로 상태 저장, -W로 계속 실행; 또한
# 전체 실행을 멈춤 안전망으로 1시간으로 제한
$ httpgrep -h 10.0.0.0/16 -p 80,443 -s admin -W -G 3600
일치 항목은 줄당 하나씩 실시간으로 출력됩니다:
[*] <url> | [vhost] | <status> | <type> | <match>
<url> - 스캔된 URL (scheme://host:port/uri).<vhost> - -T(Host 헤더를 통해 시도된 인증서 (v)host) 또는 -r(스캔된 ip의
PTR 이름)과 함께 표시; 직접 스캔에서는 비어 있음.<status> - HTTP 응답 상태 코드 (리다이렉트 후).<type> - body 또는 header.<match> - 본문 적중: 일치 지점의 짧은 repr 창 (-b 바이트);
헤더 적중: name: value.터미널에는 항상 이 사람이 읽을 수 있는 형태가 표시됩니다. -l <base>를 사용하면
동일한 일치 항목이 각 -O 형식에 대해 <base>.<fmt>로 미러링됩니다 - txt(이
줄들), csv(url,vhost,status,type,match 행과 헤더 포함), jsonl(일치 항목당
JSON 객체 하나).
다중 대상 스캔에서는 실시간 상태 줄이 표시됩니다 (tty에서는 하단에 고정, 리다이렉트 시 일반 줄):
[+] wait bitch, scanning: <targets> | <scanned>/<total> | <pct>% | <n> hits
<total>은 대상 수입니다 (cidr/범위는 계산됨, 확장되지 않음); <n> hits는 지금까지
출력된 일치 줄의 누적 수입니다.
noptrix
docs/LICENSE를 확인하세요.
우리는 nullsecurity.net에서 찾을 수 있는 해킹 관련 자료가 오직 교육 목적으로만 제공된다는 점을 여기서 강조합니다. 우리는 어떤 손해에 대해서도 책임을 지지 않습니다. 여러분은 자신의 행동에 책임이 있습니다.