Bảo vệ: Notes

Nội dung này được bảo mật. Hãy nhập mật khẩu để xem tiếp:

Advertisements

SVATTT2017 – Mình có lỗi với team

WEB300-1: Bài mình Focus nhất, tâm huyết của lần thi này và kết quả là thất bại.
Flow: Try hard theo con đường CSRF nhưng thất bại.

WEB300-2:
Tuy không phải là một bài mà mình focus nhất, nhưng nếu team thua thì mình cảm thấy có lỗi nhất là bài này.
B1. Làm quen, tìm hiểu:
Thứ đầu tiên đập vào mắt chắc chắn sẽ là “index.php?page=login”, từ cái này mà bất kì ai chơi web cũng sẽ nghĩ tới “file inclusion” để get source và từ đây mình có full bộ source.
Ngoài ra không có gì đặc biệt (robots, git, .idea, .db) khi fuzzing.
B2. Đọc source:
Sau khi đọc đi đọc lại mấy lần, mình rút ra được một số lưu ý:
1. file này /tmp/log/log_request_web300.txt ghi log lại và thêm cái function include($_GET[‘page’].”.php”)
2. Hàm Forget password sử dụng hơi kì cục.
3. Thường xuyên sử dụng hàm sprintf
4. Thêm 2 cái hàm đáng nghi là dns_get_record và mail.
5. XSS chỗ username
6. Có 1 vài chỗ public comment và khả năng là không khai thác được gì.
7. Sử dụng database mysql.

B3. Vấn đề xảy ra:
Ở những notes trên B2, mình đã sắp sếp theo thứ tự tiềm năng để khai thác, và mình dự định sẽ đi theo thứ tự đó.
1. Ở đây, hình như là không có filter gì hết cho việc include 1 file, và nếu thành công ở case này, mình sẽ có được shell bằng cách gieo shell vào log và include cái log lên. Nhưng mình đã try hard thất bại vì không thể bypass được cái .php đằng sau.
2. Đây là case thứ 2 mà mình cảm thấy nó là exploit đẹp nhất. Từ cái flow của tính năng này, mình có thể lấy hết được username, password, email nhưng phải bruteforce. Thứ nhất, cái “username enumeration” sẽ giúp mình đoán username, thứ 2 “weak password”+”unauthen password update” có thể giúp mình lấy được password của bất kì user nào, hơn nữa mình cũng nghĩ cái hàm này openssl_random_pseudo_bytes có thực là an toàn không, thứ 3 email sẽ in ra nếu tồn tại username. Tuy nhiên mình đã thực sự sụp đổ khi phát hiện ra rằng trong code không hề tồn tại đoạn kiểm tra username có phải admin hay không.
3. sprintf, mình luôn mơ là format string sẽ xảy ra nhưng thực sự tối hôm trước mình đã ngủ đủ giấc.
4,5. Tuy là đặc biệt nhưng khai thác rồi mình cũng có được gì đâu.
6. Có vẻ như escape rất kĩ đến nỗi không thêm bất kì đoạn code nào để firewall và theo quan điểm của mình, sẽ không thể là 1 bug truyền thống như thế đối với 1 bài 300 điểm. Tuy nhiên, mình đã sai và vấn đề chính là nó.

B4. Khai thác:
Nếu đã confirm là case số 6 thì khả nghi nhất sẽ là hàm forget password ( vì thường những bài CTF sẽ không có hàm này ).
Vulnerable Code:

       
$update_result = mysqli_query($link, sprintf("update users set password='%s', resetinfo='%s' where username='%s'", $passwordnew,$details, $username)); 

Đoạn này không escape trước khi update và mà dữ liệu thì lấy trong database, do đó nếu ta có thể import được câu sqli vào database rồi thực thi đoạn này thì sẽ có SQLi.
Mình sửa lại code cho dễ debug:

$res = sprintf("update users set password='%s' where username='%s'",$passwordnew, $username);
echo $res;
$update_result = mysqli_query($link,$res);

Khi mình forget username: lala’and’1’=’1

Từ đây, mọi chuyện sẽ chỉ còn là blind theo quy trình:
1. Tạo 1 account có username chứa câu query
2. Forget password username trên
3. Login vào username với password cũ, nếu login được -> query sai, ngược lại -> query đúng.

Server tắt rồi, mình cũng nên dừng ở đây.

Tôi đã trộm đề thi như thế nào?

Lời minh oan: Mình cam đoan là mình chưa trộm đề thi như tiêu đề, nếu như mình có làm thì mình sẽ không share bài viết này để cảnh báo mọi người, mà âm thầm thực hiện cho tới khi bị cảnh cáo.

Kịch bản xảy ra: Thời gian giữa lúc báo cáo đồ án và thi học kỳ. Lúc này là lúc sinh viên nộp đồ án (trong đó có file virtual machine) và giảng viên có thể đã ra đề (giả sử đề nằm trong Laptop cá nhân)-> Cơ hội tấn công.
Attacker lợi dụng việc nộp đồ án để nộp 1 máy ảo chứa mã độc, bằng cách:
– Trong máy ảo này có config share thư mục (read, write), và mạng là NAT.
– Trong máy ảo chứa một đoạn code và đoạn code này sẽ được thực thi khi khởi động.
Đoạn code này có thể là đọc tất cả các file thư mục sharing và đẩy lên server của attacker bằng một giao thức nào đó -> leak data.
Thậm chí đoạn code này có thể sửa và ghi lên ổ đĩa của victim -> thực thi ransomware, thay đổi nội dung file nào đó (đề thi).
– Cuối cùng export ra file ova (hoặc định dạng nào đó khác) và nộp cùng đồ án.
Khi victim nhận được máy ảo, nếu victim chỉ import và chạy trực tiếp thì:
– Máy ảo sẽ load file config và không hỏi han gì
– Quyền load sẽ là quyền của VirtualBox (vì VirtualBox đọc file ova, không phải file ova tự chạy), do đó có khả năng read, write một số file …
– Nếu victim không check lại config mà run máy ảo này thì đoạn mã độc này có thể tấn công ở quyền read, write một số dữ liệu máy thật.
Dưới đây là video để chứng minh điều này

Lời cuối Attack vector này xảy ra là do những điều kiện sau đây:
– Một kẻ tấn công với một mục tiêu nào đó
– Một VirtualBox quá tin vào người dùng mà không kiểm tra config
– Một người sử dụng (Victim) cẩu thả không kiểm tra config ban đầu