Machine info
Get started
Recon
nmap
1 | sudo nmap -T4 --min-rate 1000 -sC -sV -p- -oN nmap 10.10.10.161 |
1 | PORT STATE SERVICE VERSION |
- Active Directory (AD) là directory service dành cho Windows network environments. Đó là một cấu trúc phân cấp (hierarchical structure), phân tán (distributed) cho phép quản lý tập trung các tài nguyên của tổ chức, bao gồm users, computers, groups, network devices, file shares, group policies, devices, and trusts.. AD cung cấp các chức năng xác thực và ủy quyền trong Windows domain enviroment.
- Lưu ý khi
ping
- Nếu
ttl=64
→ Linux- Nếu
ttl=128
→ Windows
Machine này có vẻ là Windows Server đóng vai trò Domain Controller trong Active Directory với domain là htb.local
. Trên máy chủ này chạy các service có thể kể đến như:
- Kerberos (88) là network authentication protocol sử dụng chủ yếu trong môi trường Windows. Nó sử dụng tickets để xác thực an toàn cho users và services. ← Giao thức này có 1 loại tấn công khá phổ biến là AS-REP Roasting (Đọc trước bài này trước khi tiếp tục).
- RPC (135): Microsoft Remote Procedure Call (MSRPC) - giao thức giao tiếp giữa các phần mềm (hoặc process - tiến trình) mà một chương trình có thể yêu cầu một dịch vụ từ một chương trình khác nằm trong một máy tính/máy chủ khác hay hiểu đơn giản là phương pháp gọi hàm từ một máy tính ở xa để lấy về kết quả.
- LDAP (389): Lightweight Directory Access Protocol - giao thức truy cập cơ sở dữ liệu phân tán, được sử dụng để quản lý và truy xuất thông tin trong mạng máy tính. Thường được sử dụng bởi Active Directory.
- SMB (445): Server Message Block - giao thức mạng dùng để chia sẻ tệp tin và thiết bị trong một mạng. Nó được sử dụng chủ yếu trong các hệ điều hành Windows để cho phép các máy tính khác nhau truy cập và chia sẻ tài nguyên như file, máy in và thư mục. ← Giao thức này từng có 1 CVE rất nổi tiếng là Eternal Blue
- WinRM (5985): Windows Remote Management được đánh dấu là protocol bởi Microsoft cho phép quản lý từ xa các hệ thống Windows thông qua HTTP(S), tận dụng SOAP trong proccess. Về cơ bản, nó được cung cấp bởi WMI (Windows Management Instrumentation), được biểu diễn dưới dạng HTTP-based interface cho các WMI operation.
Tiếp theo ta cần thử access vào các service này để xem có thể khai thác được thông tin gì từ các service này không.
Enumeration
Follow theo instruction SMB trên Hacktricks ta có thể sử dụng công cụ enum4linux để khai thác một số thông tin thông qua login ẩn danh. Tuy nhiên công cụ trên đã không được update từ khá lâu nên không khuyến khích sử dụng. Thay vào đó ta sẽ sử dụng enum4linux-ng (ng - next generation).
1 | ./enum4linux -A 10.10.10.161 |
Ngoài SMB, thì tool này còn recon được các thông tin của các service khác bao gồm LDAP, NetBIOS, RPC.
Vậy thông qua việc scan trên ta thu thập được những thông tin sau:
- DNS domain:
htb.local
- FQDN (Fully qualified domain name - Tên miền đầy đủ):
FOREST.htb.local
- Máy chủ này là Root Domain Controller của domain này với domain name là
htb.local
.
Ngoài ra ta còn thu thâp được danh sách user và group.
Những user có username bắt đầu bằng HealthMailbox
và SM_
ta có thể skip vì đây là các user liên quan đến Microsoft Exchange. Exchange 2013/2016 Monitoring Mailboxes - Microsoft Community Hub.
Tiếp theo ta cần scan thêm bằng các tool khác để tránh bỏ sót thông tin.
rpcclient
1 | rpcclient -U "" -N 10.10.10.161 |
Thông qua việc đăng nhập ẩn danh, ta cũng thu thập được thông tin các user tương tự như enum4linux-ng
.
ldapsearch
1 | ldapsearch -H ldap://10.10.10.161 -x -s base -b '' "(objectClass=*)" "*" + |
-H
: xác định URL của máy chủ LDAP muốn kết nối.-x
: sử dụng simple authentication (xác thực đơn giản) thay vì SASL (Simple Authentication and Security Layer).-s base
: chỉ định scope (phạm vi) của tìm kiếm.base
có nghĩa là chỉ tìm kiếm ở cấp gốc (base level) của LDAP tree.-b
: chỉ định base DN (Distinguished Name) từ đó bắt đầu tìm kiếm. Ở đây, base DN là một chuỗi rỗng''
, có nghĩa là tìm kiếm từ gốc của LDAP tree."(objectClass=*)"
: filter cho tìm kiếm.(objectClass=*)
là tìm kiếm tất cả các mục có thuộc tínhobjectClass
, tức là tất cả các mục trong LDAP tree."*"
: lấy tất cả các thuộc tính của các mục khớp với bộ lọc tìm kiếm.+
: lấy tất cả các thuộc tính operational (thuộc tính hoạt động) của các mục khớp với bộ lọc tìm kiếm. Operational attributes là các thuộc tính được sử dụng nội bộ bởi máy chủ LDAP và không phải lúc nào cũng được hiển thị theo mặc định.
Keberos
Như đã đề cập thì Keberos có 1 bug khá nổi tiếng là ASREPRoast. Chi tiết về Kerberos Authentication và AS-REP Roasting được phân tích ở bài viết này.
Ở đây ta sẽ sử dụng 1 tool gắn liền với kĩ thuật này là script GetNPUsers.py
của bộ impacket-collection
python. Ở bài này vì default nếu không truyền -usersfile
thì script trên sẽ sử dụng SPN (Service Principal Name) Scanning để tự động tìm các user. Khi này ta có thể sử dụng thêm -request
để yêu cầu ticket-granting tickets (TGTs) cho các tài khoản không bật DONT_REQ_PREAUTH
.
1 | python3 ~/Documents/Tools/impacket/examples/GetNPUsers.py -dc-ip 10.10.10.161 -format hashcat htb.local/ -request |
Tiếp theo sử dụng hashcat để crack password của user svc-alfresco
, đây là service account của alfresco
.
Crack password
Đầu tiên ta cần tìm loại id type hashcat của password này.
1 | .\hashcat.exe .\hash.txt # autodetect mode |
Ngoài ra có thể tìm thủ công thông qua
1 | .\hashcat.exe --example-hashes | findstr krb |
Tiến hành crack (Ngoài ra nếu ta truyền thẳng chuỗi hash và wordlist thì hashcat sẽ tự động detect và crack đồng thời)
1 | .\hashcat.exe -m 18200 .\hash.txt C:\Users\dcduc\Documents\Tools\Wordlists\rockyou.txt |
Tìm được password của user svc-alfresco
là s3rvice
.
WinRM
Khi đã có username và password, thì ta sẽ tận dụng service WinRM đã tìm được khi scan nmap. Ở đây ta sẽ sử dụng tool evil-winrm
để thực hiện connect thông qua winrm trên linux.
1 | docker run --rm -ti --name evil-winrm -v /home/foo/ps1_scripts:/ps1_scripts -v /home/foo/exe_files:/exe_files -v /home/foo/data:/data oscarakaelvis/evil-winrm -i 10.10.10.161 -u svc-alfresco -p 's3rvice' -s '/ps1_scripts/' -e '/exe_files/' |
User flag
Privilege Escalation
Tiếp theo cần thêm thông tin về Active Directory này để thực hiện leo quyền. Tool ở đây sử dụng là BloodHound
, ngoài ra có thêm xem thêm các tool khác ở link trên.
BloodHound là 1 single page Java app, được build trên Linkurious, được biên dịch bằng Electron và sử dụng neo4j làm database. BloodHound sử dụng graph theory để biểu diễn hidden và often unintended relationships của Active Directory. Thông qua BloodHound thì attacker có thể xác định được dễ dàng attack path đặc biệt trong các trường hợp phức tạp.
Đầu tiên để khởi chạy BloodHound thì ta cần chạy neo4j để dùng làm database cho BloodHound.
1 | sudo neo4j console |
Tiếp theo cần chạy SharpHound.exe
trên máy đã điều khiển được để extract tất cả thông tin cần thiết cho BloodHound.
Để chuyển file từ máy host vào evil-winrm
shell thì ta có thể host 1 python server để có thể chia sẻ file.
Tiếp theo ở máy nạn nhân ta sẽ download file thông qua cách sau.
Tiếp theo chạy file SharpHound để tiến hành extract Active Directory info.
Tiếp theo tiến hành download file zip này về máy host.
Tiến hành chạy BloodHound và upload file zip vừa tải về.
Hiển thị như này là đã upload thành công. Tiếp theo tiến hành tìm node svc-alfresco
và đánh dấu owned
.
Tiếp theo ta tiến hành truy vấn lần lượt như sau
Từ đây có thể rút ra được kết luận sau:
svc-alfresco
là member của groupService Accounts
Service Accounts
là member của groupPrivileged IT Accounts
Privileged IT Accounts
là member củaAccount Operators
Account Operators
group có GenericAll permission đối vớiExchange Windows Permissions
Exchange Windows Permissions
group cóWriteDacl
permissions với domainhtb.local
.
Xâu chuỗi lại ta có thể xác định được như sau:
svc-alfresco
đồng thời sẽ là member của 3 group bao gồmService Accounts
,Privileged IT Accounts
vàAccount Operators
.- Follow theo document của Microsoft, ta có thể thấy
Account Operators
group có khả năng cấp các đặc quyền tạo tài khoản có giới hạn cho người dùng. → Vậy usersvc-alfresco
hoàn toàn có thể tạo được các user khác ở domain này. - Tiếp theo
Account Operators
cóGenericAll
permission đối vớiExchange Windows Permissions
group. Theo tài liệu thì quyền này đồng nghĩa với usersvc-alfresco
sẽ có full control của groupExchange Windows Permissions
này. - Kết hợp với việc
Exchange Windows Permission
group cóWriteDacl
permission trên domainhtb.local
. Theo tài liệu thì với quyền này user có thể chỉnh sửa DACL (Discretionary Access Control List) của domain. - Theo BloodHound, với quyền thì ta có thể khai thác thông qua DCSync Attack nhằm replicate domain và dump tất cả password hashes của domain.
Tóm lại ta sẽ có attack path như sau:
- Đầu tiên, tạo 1 user thuộc domain, vì
svc-alfresco
là member của groupAccount Operators
nên điều này hoàn toàn khả thi. - Tiếp theo ta sẽ thêm user này vào
Exchange Windows Permission
group. Vìsvc-alfresco
cóGenericAll
permissions củaExchange Windows Permissions
group nên điều này cũng khả thi. - Tiếp theo ta sẽ cấp
DcSync privileges
cho user vừa tạo. VìExchange Windows Permissions
group cóWriteDacl
permission thuộchtb.local
domain nên điều này cũng khả thi. - Tiếp theo ta sẽ thực hiện DcSync attack để có thể dump toàn bộ password hashes của tất cả users thuộc domain.
- Và cuối cùng ta sẽ login thông qua WinRM với hashed password của admin vừa dump được.
1 | net user dcduc password /add /domain # Create user on domain |
Để cấp DCSync privileges cho user dcduc
ta sẽ sử dụng Powerview script thuộc bộ PowerSploit
(Lưu ý: Sử dụng dev branch).
Tiếp theo ta sẽ sử dụng suggested command từ BloodHound để cấp DCSync privileges cho user.
1 | $pass = convertto-securestring 'password' -AsPlainText -Force |
Và cuối cùng ta sử dụng script secretdump.py
thuộc collection Impact Python để dump all password hashes.
Cuối cùng sử dụng evil-winrm
để login vào Admin account thông qua hash vừa tìm được. (Lưu ý: Ở đây sử dụng -H
flag để truyền vào hash string thay vì -p
với password)