
호스트, 포트, CIDR/범위 및 TLS 인증서 vhost에서 응답 본문과 헤더를 문자열 또는 정규식으로 grep하는 비동기 HTTP(S) 스캐너입니다.
# 설명
HTTP(S) 서버를 스캔하고 HTTP 응답 본문과 헤더에서 문자열 또는 정규식 패턴을 grep하는
빠르고 비동기적인 Python 도구입니다.
단일 호스트, URL, CIDR 범위, IP 범위 또는 파일을 대상으로 하며; 대상별로 여러 포트를
스캔합니다(단일, 쉼표 목록 또는 범위, 포트별 TLS/일반 자동 감지); TLS 인증서에서
이름 기반 (v)host를 직접 가져와 스캔할 수 있으며; 일치 항목을 터미널에 실시간으로
스트리밍하고; 결과를 텍스트, CSV 또는 JSONL 로그 파일로 기록할 수 있습니다.
대규모 스캔을 위해 설계되었습니다: 비동기 코어가 수천 개의 동시 연결을 구동하고,
TCP 사전 점검이 죽은 포트를 저비용으로 건너뛰며, 호스트별 및 전체 타임아웃이
느리거나 죽은 대상에 걸려 멈추지 않게 하고, 중단된 실행은 재개할 수 있습니다.
# 요구 사항
- POSIX 시스템(Linux, \*BSD, macOS - `termios` 및 asyncio의 Unix 시그널 처리를 사용)의 Python 3.11+
- [httpx](https://pypi.org/project/httpx/) - `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
# 참고 사항
- quick'n'dirty 코드
- httpgrep은 이미 패키징되어 [BlackArch Linux](https://www.blackarch.org/)에서 사용 가능합니다
- 제 master 브랜치는 항상 안정적입니다; dev 브랜치는 현재 작업을 위해 생성됩니다.
- 제가 공개하는 모든 공개 자료는 [nullsecurity.net](https://www.nullsecurity.net)을 통해 공식적으로 발표되고 게시됩니다.
# 라이선스
docs/LICENSE를 확인하세요.
# 면책 조항
우리는 [nullsecurity.net](http://nullsecurity.net)에서 찾을 수 있는 해킹 관련 자료가
오직 교육 목적으로만 제공된다는 점을 여기서 강조합니다. 우리는 어떤 손해에 대해서도
책임을 지지 않습니다. 여러분은 자신의 행동에 책임이 있습니다.