Active Directory Enumeration & Attacks (phần 1)
- Kiến thức nền tảng: Giới thiệu chung về dịch vụ Active Directory
- Phương pháp phòng thủ: Phát hiện tấn công trên Windows với Splunk
1. External Recon and Enumeration Principles
1.1 Thu thập thông tin từ bên ngoài
Hay còn gọi là giai đoạn trinh sát và thu thập thông tin, là bước đầu tiên và rất quan trọng khi thực hiện tấn công từ góc nhìn bên ngoài môi trường mạng thông qua việc nghiên cứu, tìm kiếm các thông tin, tài liệu nhạy cảm vô tình bị rò rỉ công khai của tổ chức.
Những thông tin quan trọng và trở thành mục tiêu thu thập sẽ bao gồm:
- Địa chỉ IP: ASN hợp lệ của tổ chức, các public IP, hạ tầng cloud đang sử dụng, DNS record,...
- Thông tin liên quan đến domain: dựa vào các public IP, domain thu thập được, xác thực ai là người sở hữu, các subdomain liên quan, các service public đang chạy trên IP, domain đó như mail, DNS, VPN, websites,... bao gồm cả các security control (SIEM, AV, IPS/IDS, firewall) đang sử dụng của tổ chức.
- Schema Format: phát hiện các email của tổ chức, AD username, password policy, điều này cung cấp cho chúng ta về format đặt tên username để có thể xây dựng wordlist phù hợp tiến hành tấn công brute-force hay password spraying.
- Data Disclosures: các nguồn thông tin (bài báo, blog, pdf) được tiết lộ công khai trên internet của tổ chức có thể chứ các thông tin quan trọng như IP, domain nội bộ, các credentials vô tình bị rò rỉ trên Github repo của nhân viên, hay format dùng để đặt username của tổ chức (VD:
lastname.firstname). - Breach Data: tất cả các nguồn công khai bao gồm username và password của các account đã bị rò rỉ của tổ chức.
Như vậy, chúng ta đã biết các thông tin quan trọng mà attacker sẽ thu thập trong giai đoạn trinh sát. Vậy các công cụ có thể được sử dụng là gì?
- ASN/IP: IANA, BGP Toolkit
- Domain/DNS: Domaintools, PTRArchive, ICANN
- Social Media: Linkedin, Twitter, Facebook, bài báo, blog,...
- Thông tin trên trang web của công ty, About Us, Contact Us
- Cloud và Dev Storage Spaces: GitHub, AWS S3 buckets & Azure Blog storage containers, Google searches using "Dorks"
- Các nguồn Breach Data: HaveIBeenPwned và Dehashed bao gồm các account email đã bị lộ, chúng ta có thể thử chúng trên các portal phơi ra ngoài mạng internet như Citrix, RDS, OWA, O365, VPN, VMware Horizon,... có thể được tích hợp sử dụng xác thực AD.
Mục đích của quá trình trinh sát và thu thập thông tin từ bên ngoài là có thể "chạm" vào mạng nội bộ của tổ chức, nơi có kết nối đến AD. Đối với góc nhìn từ bên ngoài mạng, truy cập được vào VPN của tổ chức là miếng mồi ngon. Ngoài ra, với các tổ chức có hạ tầng cloud, việc truy cập được vào hạ tầng này và chiếm một máy VM có thể truy cập vào mạng nội bộ.
Bên cạnh việc thu thập thụ động thông tin public, attacker có thể sử dụng các phương pháp chủ động như gửi phishing link đến user để lừa họ nhập thông tin đăng nhập email hoặc cài mã độc để chiếm quyền trên máy tính của user.
Sau khi đã vào được mạng nội bộ, các loại thông tin attacker có thể thu thập sẽ bao gồm:
- AD Users: thu thập các user account thông qua brute-force hoặc spraying password.
- AD Joined Computer: các host chạy services như Domain controllers, file servers. SQL servers, web servers, Exchange email servers, database servers,...
- Key Services: Kerberos, NetBIOS, LDAP, DNS
- Vulnerable Hosts and Services: các host chạy OS cũ, outdated version services chứa các lỗ hổng, CVE có thể khai thác.
Việc thu thập thông tin ở giai đoạn khi đã "chạm" vào được mạng nội bộ bao gồm các account domain user (nếu may mắn thì domain admin account) hoặc chiếm được quyền kiểm soát một máy domain-joined có quyền SYSTEM để tiến hành các cuộc tấn công khác liên quan sau này để lên được domain admin.
Các bước thu thập diễn ra như sau:
1.2 Xác định các host trong mạng
Để xác định các host/IP đang hoạt động trong mạng, có thể sử dụng kết hợp qua 2 phương pháp:
- Passive check: Sử dụng các công cụ như Wireshark, tcpdump để lắng nghe thụ động, sau đó filter các gói tin ARP, MDNS để phát hiện địa chỉ IP/domain đang hoạt động trong mạng. Thông thường, các service internal như web, Domain Controller, File Share, Mail thường được truy vấn rất nhiều nên không khó để tập trung vào các target này. Responder là một công cụ dùng để lắng nghe, phân tích và đầu độc giao thức LLMNR, NBT-NS và MDNS, có thể được sử dụng để passive check ở bước này dưới mode Analyze.
- Active check: Sử dụng ICMP để ping đến các subnet nhằm tìm các host đang hoạt động.
Công việc phía trên chỉ dừng lại ở việc thu thập địa chỉ IP/DNS name của các host đang hoạt động. Bước tiếp theo là thu thập các thông tin chi tiết hơn về các host như các port đang mở, các dịch chạy trên đó, OS version, service version,... Công cụ thường được sử dụng là nmap.
thune@htb[/htb]$ nmap -A 172.16.5.100
Starting Nmap 7.92 ( https://nmap.org ) at 2022-04-08 13:42 EDT
Nmap scan report for 172.16.5.100
Host is up (0.071s latency).
Not shown: 989 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 7.5
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Microsoft-IIS/7.5
| http-methods:
|_ Potentially risky methods: TRACE
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
443/tcp open https?
445/tcp open microsoft-ds Windows Server 2008 R2 Standard 7600 microsoft-ds
1433/tcp open ms-sql-s Microsoft SQL Server 2008 R2 10.50.1600.00; RTM
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Not valid before: 2022-04-08T17:38:25
|_Not valid after: 2052-04-08T17:38:25
|_ssl-date: 2022-04-08T17:43:53+00:00; 0s from scanner time.
| ms-sql-ntlm-info:
| Target_Name: INLANEFREIGHT
| NetBIOS_Domain_Name: INLANEFREIGHT
| NetBIOS_Computer_Name: ACADEMY-EA-CTX1
| DNS_Domain_Name: INLANEFREIGHT.LOCAL
| DNS_Computer_Name: ACADEMY-EA-CTX1.INLANEFREIGHT.LOCAL
|_ Product_Version: 6.1.7600
Host script results:
| smb2-security-mode:
| 2.1:
|_ Message signing enabled but not required
| ms-sql-info:
| 172.16.5.100:1433:
| Version:
| name: Microsoft SQL Server 2008 R2 RTM
| number: 10.50.1600.00
| Product: Microsoft SQL Server 2008 R2
| Service pack level: RTM
| Post-SP patches applied: false
|_ TCP port: 1433
|_nbstat: NetBIOS name: ACADEMY-EA-CTX1, NetBIOS user: <unknown>, NetBIOS MAC: 00:50:56:b9:c7:1c (VMware)
| smb-os-discovery:
| OS: Windows Server 2008 R2 Standard 7600 (Windows Server 2008 R2 Standard 6.1)
| OS CPE: cpe:/o:microsoft:windows_server_2008::-
| Computer name: ACADEMY-EA-CTX1
| NetBIOS computer name: ACADEMY-EA-CTX1\x00
| Domain name: INLANEFREIGHT.LOCAL
| Forest name: INLANEFREIGHT.LOCAL
| FQDN: ACADEMY-EA-CTX1.INLANEFREIGHT.LOCAL
|_ System time: 2022-04-08T10:43:48-07:00
<SNIP>
Việc thấy các tổ chức có thể sử dụng các phiên bản outdated của OS là thường xuyên, vì nhiều doanh nghiệp có lịch sử phát triển lâu đời, việc urgrade/migrate các dịch vụ có thể là bài toán không có lời giải. Do đó, họ thường giữ nguyên các thành phần này và thêm vào một lớp vỏ cứng bên ngoài (firewall, IDS/IPS, SIEM).
1.3 Xác định các user
Attacker cần tìm được username và password dạng cleartext hoặc NTLM password hash, đạt được một phiên điều khiển từ xa (remote shell) với quyền SYSTEM trên một máy domain-joined hoặc dưới context của domain account.
Ban đầu, có thể attacker sẽ không có được các username của domain nhưng có thể sẽ có được thông tin về quy cách đặt tên như lastname.firstname từ giai đoạn trinh sát, thu thập thông tin ở các bước trước đây. Điều này sẽ giúp xây dựng wordlist chính xác, giảm phạm vi và thời gian tấn công brute-force.
Công cụ được sử dụng phổ biến là Kerbrute. Công cụ này lợi dụng việc Kerberos pre-authentication thất bại sẽ không lưu log hoặc alert (nếu không được cấu hình thu thập). Sử dụng Kerbrute kết hợp với một wordlist xây dựng từ username schema.
Cách hoạt động của Kerbrute dựa trên việc nó sẽ gửi yêu cầu TGT ticket đến KDC với danh sách username nằm trong wordlist:
- Nếu tài khoản tồn tại, DC sẽ trả về lỗi KRB5KDC_ERR_PREAUTH_REQUIRED.
- Ngược lại, nếu username không tồn tại, DC trả về lỗi KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN.
1.4 Xác định các lỗ hổng tiềm ẩn
Account NT AUTHORITY\SYSTEM là account có quyền cao nhất trong hệ điều hành Windows. Các dịch vụ bên thứ ba thường chạy dưới context của user này theo mặc đinh. Nếu đạt được quyền SYSTEM trên một máy domain-joined, điều này tương đương với việc có domain user account.
Dưới đây là một số phương pháp attacker lựa chọn để đạt quyền SYSTEM trên một host:
- Khai thác các lỗ hổng Remote Windows như MS08-067, EternalBlue hoặc BlueKeep
- Khai thác các dịch vụ chạy trong context SYSTEM chứa các lỗ hổng, CVE đã biết hoặc lạm dụng đặc quyền
SeImpersonatecủa service account qua Juicy Potato. Loại tấn công này có thể được thực hiện trên các Windows OS cũ (nhỏ hơn Windows Server 2019). - Lỗ hổng leo thang đặc quyền cục bộ trong hệ điều hành Windows như Windows 10 Task Scheduler 0-day.
- Đạt quyền admin với local account và sử dụng Psexec để tạo cửa sổ cmd quyền SYSTEM.
Sau đó, attacker có thể tiến hành các tấn công nâng cao như:
- Thu thập thông tin về domain qua các công cụ như BloodHound hoặc PowerView
- Thực hiện tấn công Kerberoasting/ASREPRoasting trong cùng một domain
- Chạy các công cụ như Inveigh để thu thập Net-NTLMv2 hash hoặc thực thi SMB relay attack.
- Giả mạo token để chiếm đoạt domain user account có đặc quyền.
- Thực hiện tấn công ACL.
2. Phát hiện và giành được Foothold
Ở phần 1.3, chúng ta biết rằng có thể sử dụng Kerberute - một công cụ sử dụng kỹ thuật brute-force để có được danh sách các user hợp lệ của domain mục tiêu. Tiếp theo, để giành được một chỗ đứng trong domain, cần có được cleartext password hoặc NTLM hash của một tài khoản domain user.
Hai kỹ thuật có thể được sử dụng bao gồm:
2.1 LLMNR/NBT-NS Poisoning
Mô tả
Một kỹ thuật dạng Man-in-the Middle lợi dụng 2 giao thức LLMNR (port 5355) hoặc NBT-NS (port 137).
Đây là hai giao thức phân giải DNS động, trong trường hợp DNS server trong mạng không hoạt động hoặc không có kết quả trả về, máy yêu cầu phân giải DNS sẽ tiến hành đi hỏi toàn bộ các máy còn lại trong mạng (broadcast). Nếu attacker nằm trong mạng lắng nghe được các yêu cầu này, giả mạo bản thân là máy hợp lệ bằng cách trả lời lại máy yêu cầu DNS, khiến máy này tin rằng attacker chính là máy nó đang tìm kiếm và tiến hành các phiên giao tiếp liên quan.
Khi nạn nhân cố gắng truy cập các dịch vụ như SMB, RDP, HTTP/HTTPS, LDAP hoặc Kerberos, quá trình xác thực NTLM sẽ diễn ra và attacker có thể thu thập NetNTLM hash (NTLMv1 hoặc NTLMv2) của nạn nhân. Các hash này có thể được crack offline bằng Hashcat hoặc được sử dụng trực tiếp trong các kỹ thuật tấn công như SMB Relay Attack, dẫn đến nguy cơ compromise hệ thống trong domain.

Công cụ được sử dụng là Responder, Inveigh và Metasploit.
Khắc phục
- Đối với LLMNR thì chặn qua GPO là khả thi (Computer Configuration → Administrative Templates → Network → DNS Client and enabling "Turn OFF Multicast Name Resolution)
- NBT-NS không thể chặn qua GPO, chỉ có thể cấu hình thủ công trên từng máy (Network and Sharing Center) hoặc sử dụng PowerShell script và cấu hình khởi động script này khi mỗi khi máy khởi động (Startup)
Phát hiện tấn công
- Giám sát lưu lượng port UDP 5355 và 137
- Event Log ID 4697 và 7045
- Giám sát sự thay đổi của giá trị EnableMulticast DWORD trong registry
HKLM\Software\Policies\Microsoft\Windows NT\DNSClient, nếu bằng 0 tức là đã chặn LLMNR.
2.2 Password Spraying
Có cùng một concept với brute-force là xây dựng danh sách danh sách username/password và thử xác thực hàng loạt để tìm thông tin đăng nhập hợp lệ, nhưng Password Spraying tinh vi hơn rất nhiều. Có thể nói (hơi văn vẻ) nó là một môn nghệ thuật kết hợp sự sáng tạo, kỹ năng thu thập, phân tích thông tin.
Nếu như chỉ brute-force password một cách thuần tuý, khả năng cao attacker sẽ gặp phải rủi ro bị phát hiện và ngăn chặn từ sớm (quá ồn ào) khi kích hoạt các cảnh báo như:
- Số lượng thử đăng nhập thất bại vượt quá ngưỡng cảnh báo
- Việc có tài khoản bị lock out do cơ chế bảo vệ của Microsoft với những loại tấn công như này.
Hoặc may mắn khi giả sử tổ chức thực sự không giám sát những hành vi trên, thì sau khi số lần thử đăng nhập thất bại đạt đến ngưỡng lock-out, sẽ phải chờ thêm khoảng thời gian 10-30 phút (tuỳ vào cấu hình) để tự động unlock. Nhiều tổ chức sẽ chỉ định phải liên hệ quản trị viên mới được unlock tài khoản, dẫn tới việc tấn công bị phát hiện.
Do đó, việc thu thập thông tin về password policy mang lại nhiều lợi ích và hiệu quả thời gian hơn trước khi thực hiện tấn công brute-force. Các thông tin này có thể bao gồm:
- Độ dài tối thiểu của mật khẩu
- Ngưỡng lock out - số lần đăng nhập sai tối đa trước khi khoá tài khoản tạm thời
- Tài khoản được unlock tự động sau bao lâu (hoặc yêu cầu quản trị viên mở thủ công)
- Độ phức tạp yêu cầu của mật khẩu
Để thu thập được thì attacker cần có domain account hoặc phiên SMB NULL hoặc LDAP anonymous bind.
- SMB NULL thường xuất hiện ở các Domain Controller phiên bản cũ, cho phép attacker không cần account vẫn có thể lấy toàn bộ danh sách user, group, computer, thuộc tính cấu hình của các object này và bao gồm password policy. Ở các hệ thống mới, SMB NULL có thể là kết quả của việc vô tình cấu hình sai.
- Công cụ sử dụng: CrackMapExec, rpcclient, enum4linux,
net(công cụ có sẵn trên Windows)
- Công cụ sử dụng: CrackMapExec, rpcclient, enum4linux,
- LDAP anonymous bind tương tự SMB NULL nhưng khai thác dịch vụ LDAP.
- Công cụ sử dụng: PowerView, ldapsearch
3. Kerberoasting
Mô tả
Là kỹ thuật tấn công để di chuyển ngang (lateral movement) hoặc leo thang đặc quyền (privilege escalation) trong môi trường AD.
Mục tiêu của Kerberoasting là các Service Principal Name (SPN). SPN là định dạng duy nhất mà Kerberos sử dụng để tham chiếu một service với một service account dùng làm context để chạy service đó.
Trong môi trường Active Directory, domain user thường được sử dụng để chạy các dịch vụ chia sẻ tài nguyên và cần xác thực trong mạng thay vì tài khoản local NT AUTHORITY/LOCAL SERVICE cho phép bất kỳ domain user nào cũng có thể request TGS cho bất kỳ service nào trong cùng một domain.
Ví dụ: Giả sử SQL Server chạy trên máy sqlserver.thune.local, cổng mặc định 1433, và sử dụng service account svc-sql trong Active Directory để chạy dịch vụ SQL.
NT AUTHORITY/LOCAL SERVICE và NT AUTHORITY/SYSTEM là local account trên máy chủ hoặc máy trạm Windows. Khi một dịch vụ chạy bằng các tài khoản này, nó có thể truy cập tài nguyên trên máy cục bộ nhưng không thể xác thực vào các tài nguyên mạng như máy chủ file, SQL Server, hoặc máy chủ web trên một máy khác.
Tài khoản domain dùng để chạy service thường có quyền administrator trên máy chủ dịch vụ, hoặc trên nhiều máy chủ khác do đặc điểm phân tán của hệ thống. Đôi khi, nhiều dịch vụ yêu cầu các đặc quyền nâng cao trên nhiều hệ thống, nên service account được thêm vào các nhóm đặc quyền (privilege) như Domain Admins. Các service account cũng thường được đặt mật khẩu yếu và việc sử dụng lại mật khẩu cho nhiều service account nhằm đơn giản hoá công việc quản trị là phổ biến. Do đó, nếu có được mật khẩu của một service account, điều này có thể giúp attacker truy cập trên nhiều máy chủ khác, thậm chí là nhiều service account khác. Điều này đã thúc đẩy tấn công Kerberoasting.
Trong quá trình xác thực với Kerberos, TGS-REP trả về từ yêu cầu ticket của client sẽ được mã hoá với NTLM hash của service account, do đó mật khẩu dạng văn bản rõ có thể được lấy bằng cách thực hiện một cuộc tấn công brute-force ngoại tuyến với công cụ như Hashcat.
Để tấn công Kerberoasting, attacker cần có:
-
Thông tin đăng nhập của một domain user trên một máy non-domain joined Linux.
- Sử dụng
GetUserSPNs.pytrong công cụ impacket để liệt kê SPN và yêu cầu vé TGS.
- Sử dụng
-
Máy domain-joined Linux với quyền root sau khi trích xuất keytab file. Keytab file một file chứa các khóa bí mật (Kerberos keys) của tài khoản, giúp xác thực mà không cần nhập mật khẩu.
- Kiểm tra các ticket đã cấp bằng
klistvà yêu cầu cấp ticket lần nữa để lấy TGS.
- Kiểm tra các ticket đã cấp bằng
-
Máy domain-joined Windows đăng nhập bằng domain user
- Tìm tài khoản có SPN
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName- Sử dụng Ruberus để lấy ticket
-
Máy domain-joined Windows với một shell chạy trong context của domain account.
- User đã có shell trong ngữ cảnh tài khoản domain (vd: Remote Desktop, Meterpreter shell, PsExec).
- Dùng Mimikatz hoặc Rubeus
-
Máy domain-joined Windows với quyền SYSTEM
-
Máy non-domain joined Windows sử dụng runas /netonly nhưng có domain account.
- Dùng
runas /netonlyđể chạy PowerShell với quyền domain và yêu cầu TGS.
runas /netonly /user:DOMAIN\user powershell.exe- Dùng PowerShell để lấy vé TGS:
Add-Type -AssemblyName System.IdentityModel New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/sql.domain.local" - Dùng
Ruberus hoạt động theo cách yêu cầu và trích xuất vé Kerberos, còn Mimikatz trích xuất ticket từ bộ nhớ (kết hợp các công cụ living-off the land như Powershell, setspn.exe khác để yêu cầu vé trước, ví dụ PowerShell)
Phát hiện tấn công
Attacker sẽ cố gắng yêu cầu ticket được mã hoá bằng RC4 thay vì AES để dễ dàng crack hơn.
- Trên Windows Server 2016 trở xuống: Nếu tài khoản hỗ trợ AES, nhưng vẫn hỗ trợ RC4, attacker có thể yêu cầu vé RC4 thay vì AES để dễ dàng brute-force.
- Trên Windows Server 2019: Nếu tài khoản SPN chỉ hỗ trợ AES, attacker chỉ có thể nhận được vé AES-256 (mode 18200 trong Hashcat). AES-256 khó crack hơn RC4, nhưng nếu mật khẩu yếu vẫn có thể brute-force được.
Dựa vào Event ID 4769, 4770, phát hiện thông qua các RC4 ticket (lưu ý, một số hệ thống cũ có thể vẫn sử dụng RC4 ticket) với encryption type là 0x17
Các bước tấn công tiếp theo
Sau khi tấn công Kerberoasting thành công, attacker chiếm được một vài domain account có thể sử dụng cho các mục đích sau:
- Truy cập vào một host thông qua RDP hoặc WinRM dưới context của local user hoặc local admin
- Xác thực để sử dụng tool PsExec
- Truy cập file shares chứa thông tin nhạy cảm
- Nếu tài khoản đó có quyền Local Admin hoặc SYSTEM, bạn có thể lợi dụng nó để leo thang đặc quyền trên máy chủ trên MSSQL server, cho phép thực thi mã trên hệ thống Windows bằng cách chạy lệnh dưới ngữ cảnh của tài khoản MSSQL Service qua
xp_cmdshell
Còn nữa (mà chưa biết bao giờ có) ....