Skip to content
KitploitKITPLOIT
도구블로그
Log in
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-42533-POC — CVE-2026-42533: map/script 엔진에서 PCRE 캡처 클로버링으로 인한 인증 전 nginx 힙 오버플로 및 정보 유출, RCE로 연쇄 연결됨. | Kitploit
도구/GitHubGitHub/0xcyberstan/cve-2026-42533-poc
Vulnerability AnalysisExploitationWeb SecurityPenetration TestingRed TeamingBinary Exploitation
GitHub0xcyberstan/cve-2026-42533-poc

CVE-2026-42533-POC

CVE-2026-42533: map/script 엔진에서 PCRE 캡처 클로버링으로 인한 인증 전 nginx 힙 오버플로 및 정보 유출, RCE로 연쇄 연결됨.

저장소 보기
181개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-42533

nginx에서 발생하는 사전 인증 힙 버퍼 오버플로 및 힙 정보 누출로, 스크립트 엔진의 두 번의 패스(pass)에 걸쳐 PCRE 캡처 상태를 저장/복원하지 않아 발생합니다. 두 캡처 참조 사이에서 평가되는 정규식 map 변수가 r->captures를 덮어써서, LEN 패스와 VALUE 패스가 캡처 크기를 서로 다르게 판단하게 됩니다. 버퍼는 하나의 캡처 크기로 할당되는데 다른 캡처로 채워집니다. 더 큰 값으로 덮어쓰면 공격자가 제어하는 내용과 길이로 힙 오버플로가 발생합니다. 더 작은 값으로 덮어쓰면 초과 할당된 버퍼의 초기화되지 않은 꼬리 부분이 클라이언트로 반환되어 libc 및 힙 포인터가 누출됩니다.

이 두 프리미티브는 신뢰할 수 있는 사전 인증 원격 코드 실행으로 이어집니다. 정보 누출은 단일 GET으로 ASLR을 무력화하므로 오버플로에 ASLR 비활성화가 필요하지 않습니다.

라이트업: https://cyberstan.co.uk/nginx-rce/ 권고: F5 K000162097 발견자: Stan Shaw (cyberstan)

영향을 받는 버전

영향을 받는 버전은 nginx 0.9.6 ~ 1.30.3(안정 버전) 및 1.31.2(메인라인)이며, 2011년 map 지시문에 정규식 지원이 추가된 이후 접근 가능합니다. http와 stream 모듈 모두 영향받습니다. 13개 호출 지점에 걸친 약 50개 지시문과, 이름 있는 캡처(r->variables[])를 통한 두 번째 경로가 있습니다. 1.30.4 및 1.31.3에서 수정되었습니다.

레이아웃

CVE-2026-42533-PoC/
├── exploits/                 exploit and validator scripts
│   ├── poc.py                numbered-capture proxy_method chain (crash/leak/rce/rce-det)
│   ├── calibrate.py          find PL_OFF / HEAP_PAGE_OFF for --rce-det on your build
│   ├── leak_multi.py         info leak on the return and set sinks
│   ├── test_all_sites.py     ASan validator, all 13 overflow sites
│   └── named_capture_poc.py  named-capture r->variables[] variant
├── configs/                  nginx configs the exploits run against
│   ├── nginx_poc.conf        crash / leak / rce
│   └── nginx_det.conf        deterministic rce-det
├── docs/
│   └── EXPLOITATION.md       full exploitation writeup
└── README.md

아래의 모든 명령은 저장소 루트에서 실행하세요. 그래야 exploits/, configs/, ../nginx-1.30.1 빌드 트리 경로가 모두 올바르게 해석됩니다.

내용

exploits/poc.py는 주요 익스플로잇입니다(번호가 매겨진 캡처, proxy_method 싱크). 그 모드는 다음과 같습니다:

모드목적
poc.py --crash힙 오버플로를 발생시킵니다. ASan 빌드에서는 ngx_http_script_copy_capture_code에서 쓰기 크기와 스택을 출력합니다.
poc.py --leak정보 누출: 과도하게 할당된 응답 본문에서 libc 및 힙 포인터를 덤프합니다.
poc.py --rce완전한 사전 인증 RCE. 일반 단일 시도(configs/nginx_poc.conf), 시도당 약 66%, 실패 시 재실행.
poc.py --rce-det완전한 사전 인증 RCE. 통제된 configs/nginx_det.conf 환경에서 결정적으로 동작.

버그의 나머지 표면을 다루는 독립 실행 스크립트:

스크립트목적
exploits/leak_multi.py두 개의 추가 평가자(return, set)를 통한 정보 누출. 각각 libc+힙 포인터가 /proc/<pid>/maps로 확인됩니다. 기본 설정 사용.
exploits/test_all_sites.py13개 오버플로 호출 지점(http + stream)을 모두 작동시키는 AddressSanitizer 검증기.
exploits/named_capture_poc.pyr->variables[] / copy_var_code를 통한 이름 있는 캡처 (?P<name>...) 변형으로, 두 번째 근본 원인입니다.

설정 파일은 configs/에 있습니다: nginx_poc.conf (crash/leak/rce), nginx_det.conf (rce-det). 전체 분석 문서는 docs/EXPLOITATION.md입니다.

요구 사항

Linux, gcc, python3 및 nginx 1.30.1 소스가 필요합니다. Ubuntu 24.04.4, glibc 2.39, PCRE2 10.42, python 3.12, 전체 ASLR 환경에서 개발 및 테스트되었습니다.

빌드

두 가지 빌드가 있습니다. 누출 및 RCE용 클린 빌드는 힙 잔여물이 실제로 유지되도록 합니다. 크래시 및 지점 검증기용 AddressSanitizer 빌드는 오버플로가 정확한 쓰기 크기와 스택으로 보고되도록 합니다.

tar xf nginx-1.30.1.tar.gz
cd nginx-1.30.1

# clean build -> objs.dbg/nginx  (leak, rce)
./configure --with-pcre --with-http_ssl_module --with-debug --builddir=objs.dbg
make -j"$(nproc)"

# ASan build with all the modules the site validator needs -> objs/nginx
./configure --with-pcre --with-http_ssl_module --with-http_v2_module \
    --with-stream --with-stream_ssl_preread_module --with-stream_ssl_module \
    --with-debug \
    --with-cc-opt='-g -O0 -fsanitize=address -fno-omit-frame-pointer' \
    --with-ld-opt=-fsanitize=address --builddir=objs
make -j"$(nproc)"

실행

exploits/poc.py는 127.0.0.1:8950에서 실행 중인 nginx와 통신합니다. 한 터미널에서 configs/nginx_poc.conf로 nginx를 시작한 다음, 다른 터미널에서 원하는 모드를 실행하세요. 나머지 세 스크립트는 자체적으로 nginx를 시작하고 종료하므로 NGINX_BIN만 필요합니다.

ASan 트레이스와 함께하는 오버플로

mkdir -p run/logs
../nginx-1.30.1/objs/nginx -p run -c "$PWD/configs/nginx_poc.conf"    # ASan build, foreground
python3 exploits/poc.py --crash

예상 결과: ngx_http_proxy_create_request의 ngx_http_complex_value에서 호출되는 ngx_http_script.c:1404의 ngx_http_script_copy_capture_code에서 힙 버퍼 오버플로(WRITE of size 200)가 발생합니다.

정보 누출

../nginx-1.30.1/objs.dbg/nginx -p run -c "$PWD/configs/nginx_poc.conf"    # clean build
python3 exploits/poc.py --leak

예상 결과: 8161바이트 본문에 2바이트만 쓰여지고 나머지는 힙 잔여물입니다. 오프셋 0x08에 libc 포인터, 0x10에 힙 포인터가 있습니다.

전체 체인

../nginx-1.30.1/objs.dbg/nginx -p run -c "$PWD/configs/nginx_poc.conf"    # clean build
python3 exploits/poc.py --rce            # writes /tmp/PWNED via system()

예상 결과: 정보 누출, 약 40개의 스프레이 연결, 오버플로 트리거 후 id의 출력을 담은 /tmp/PWNED가 생성됩니다. 이는 단일 샷이며 개발 빌드에서 약 2/3 확률로 성공합니다. 실패하면 워커가 크래시하므로 다시 실행하세요. docs/EXPLOITATION.md의 "Reliability" 섹션을 참조하십시오.

결정적 전체 체인

통제된 설정에서는 동일한 버그가 결정적 단일 샷으로 동작합니다. 정보 누출에서 한 줄로 절대 힙 베이스를 복구하고(heap_base = (leaked_ptr & ~0xfff) - 0x22000), 유지된 연결의 알려진 주소에 위조된 풀 정리 함수 하나를 배치한 다음, nginx가 종료 전에 해제하는 일시적인 트리거 본문 대신 피해자 풀의 정리 함수가 그 주소를 가리키도록 합니다.

mkdir -p run/logs
../nginx-1.30.1/objs.dbg/nginx -p run -c "$PWD/configs/nginx_det.conf"   # controlled config
python3 exploits/poc.py --rce-det

nginx_det.conf는 힙 레이아웃이 재현 가능한 실험실 설정(단일 워커, 고정 버퍼)으로, poc.py의 오프셋(PL_OFF, HEAP_PAGE_OFF)이 유효하게 되는 이유입니다. PL_OFF는 유지된 POST /b/ 정리 본문이 위치하는 힙 베이스로부터의 오프셋입니다. 정확한 할당 순서에 의존하므로 빌드, glibc 버전, 설정에 따라 달라집니다. --rce-det가 Recalibrate를 보고하면 calibrate.py로 실행 중인 워커에서 올바른 값을 읽어내세요:

NGINX_BIN=../nginx-1.30.1/objs.dbg/nginx python3 exploits/calibrate.py
# prints e.g.  set PL_OFF = 0x14426  ,  then edit it in exploits/poc.py

유일한 또 다른 실패 경우는 ASLR 추첨으로 0x0a가 정리 함수 주소나 오버플로 본문 안에 들어가는 경우입니다. map 정규식이 이를 전달할 수 없으므로 도구가 이를 보고하면 다시 실행하면 됩니다. 일반 배포 환경은 그렇게 예측 가능하지 않으므로 그런 경우에는 --rce를 사용하세요. docs/EXPLOITATION.md의 "A deterministic build"를 참조하십시오.

13개 오버플로 지점 모두

NGINX_BIN=../nginx-1.30.1/objs/nginx python3 exploits/test_all_sites.py       # ASan build
NGINX_BIN=../nginx-1.30.1/objs/nginx python3 exploits/test_all_sites.py 1 7 12   # a subset

이름 있는 캡처 변형

NGINX_BIN=../nginx-1.30.1/objs/nginx python3 exploits/named_capture_poc.py    # ASan build

두 개의 추가 싱크에서의 정보 누출, 기본 설정

NGINX_BIN=../nginx-1.30.1/objs.dbg/nginx python3 exploits/leak_multi.py       # clean build

예상 결과: return과 set이 각각 libc 및 힙 포인터를 누출하며, 둘 다 워커의 /proc/<pid>/maps로 확인됩니다.

문제 해결

사람들이 가장 많이 실수하는 두 가지는 잘못된 빌드 사용(ASan vs 클린)과 --rce-det 오프셋이 자신의 환경과 일치하지 않는 경우입니다. 둘 다 아래에 설명되어 있습니다.

증상원인조치 방법
--leak에 포인터가 표시되지 않거나 --rce / --rce-det가 계속 실패함ASan 빌드를 사용 중입니다. AddressSanitizer는 해제된 메모리를 오염(poison)시키므로 잔여물에 실제 포인터가 남지 않습니다.--leak, --rce, --rce-det, leak_multi.py에는 클린 objs.dbg 빌드를 사용하세요. ASan objs 빌드는 --crash, test_all_sites.py, named_capture_poc.py 전용입니다.
--rce가 3번 중 약 2번만 성공함일반 설정에 대한 단일 샷이며, 해제된 트리거 본문 위치가 달라집니다.정상입니다. 실패하면 워커가 크래시 후 다시 시작되므로 그냥 다시 실행하세요. 결정적 단일 샷이 필요하면 --rce-det를 사용하세요.
--rce-det가 실행할 때마다 No RCE. Recalibrate PL_OFF/HEAP_PAGE_OFF를 출력함PL_OFF는 빌드, glibc, 설정, nginx -p 접두어 경로 길이에 따라 달라집니다. 제공된 값은 -p run으로 실행한 이 저장소의 개발 빌드용입니다.exploits/calibrate.py를 실행하고 출력된 PL_OFF를 exploits/poc.py에 붙여넣은 다음 calibrate.py에 지정한 것과 동일한 -p 접두어로 nginx를 시작하세요(README에서는 -p run 사용).
--rce-det가 가끔 0x0a (regex-hostile) ... retry를 출력함ASLR 추첨에서 주소에 0x0a(줄바꿈) 바이트가 들어갔으며, map 정규식이 이를 전달할 수 없습니다.실패가 아닙니다. 다시 실행하면 다음 추첨에서는 거의 항상 피해집니다.
nginx 또는 calibrate.py: bind() to 127.0.0.1:8950 failed (Address already in use)이전 nginx가 여전히 포트를 점유하고 있습니다.pkill -x nginx를 실행하고 1초 기다린 후 다시 시도하세요. 8950 포트에는 nginx 하나만 유지하세요.
독립 실행 스크립트가 nginx not found를 출력함NGINX_BIN이 설정되지 않았거나 잘못된 빌드를 가리키고 있습니다.NGINX_BIN을 설정하세요(leak_multi.py에는 클린 빌드, 검증기에는 ASan 빌드).
설정, 스크립트 또는 nginx 바이너리에서 No such file 발생저장소 루트에 있지 않습니다.먼저 저장소 루트로 cd 하세요. 모든 명령이 저장소 루트를 가정합니다(exploits/..., configs/..., ../nginx-1.30.1/...).
한 설정에서는 누출이 되는데 다른 설정에서는 안 됨worker_connections가 약 256 미만이면 아레나가 줄어들어 해제된 청크에 포인터가 남지 않습니다.일반적인 worker_connections(512~1024)를 사용하세요. 프로덕션 값에서는 모두 누출됩니다.

RCE 오프셋에 관한 참고 사항

도구 다운로드