Привет! Расскажу, как не-хакеру удалось решить CTF таски и залутать призы на сцене главной хакерской конференции OFFZONE.
Меня зовут Пётр Покаместов, я руковожу проектами по пентесту в Singleton Security — общаюсь с клиентами, распределяю загруз коллег, провожу презентации отчётов, а также занимаюсь развитием партнерского направления. Когда есть кислород от проектов - люблю покреативить: сделать компании стикеры и т.д. Постоянно экспериментирую с различными нейронками, так как интересно увидеть возможности, границы, области применения и наблюдать их развитие.
Параллельно преподаю в Бауманке форензику. До прихода в Singleton руководил лабораторией криминалистики и eDiscovery.
C учетом креативных хобби, обожаю ходить на конференции и не мог пропустить Offzone.
Вечером после первого дня офзона пришло уведомление от бота Wildberries, что если хотите — можете решить наши CTF задания и написать коннектор.

Задача коннектора
? Осторожно, эта задача не из простых! Но если вы справитесь, получите много оффкоинов ?
Это комплексная задача по развитию Universal Harvester, в рамках которой вам предстоит создать новый коннектор. Выбор источника данных остаётся за вами: Cassandra/Clickhouse/MongoDB/Redis. Основная цель — обеспечить полноценную интеграцию Universal Harvester с этим внешним источником, чтобы система могла извлекать и обрабатывать данные, используя текущую архитектуру.
Вы можете написать коннекторы для всех четырёх источников данных и получить вознаграждение за каждый.
Действия по разработке коннектора:
Определитесь, какой коннектор вы будете писать.
Получите доступ read_only к стенду.
Напишите коннектор с учётом архитектуры Universal Harvester. Ваша задача — зарегистрировать source и source function, написать функцию для извлечения данных (с фильтром и аутентификацией), а также описать всё комментариями и протестировать.
Создайте Pull Request и покажите работу коннектора на своей технике.
Если всё работает и код описан, мы закрываем задачу, и вы получаете вознаграждение.
Если есть замечания, вам нужно их исправить и снова продемонстрировать работу.
Ожидаемое решение: pull request + демонстрация работоспособности.
Репозиторий Universal-Harvester (https://github.com/...)
Мне стало интересно, а справится ли с этим LLM в режиме агента? Сможет ли что-нибудь сделать полностью автоматизированно, и если да, то какая именно модель?
Далее я в режиме агента открыл 4 нейронки:
DeepSeek
Claude
ChatGPT 5
ChatGPT-5 Thinking
Grok
И просто загрузил в них текст сообщения о CTF. Надо отметить, что первоначально перед просмотром заданий было окно авторизации.

И только за ним уже сами таски с их описаниями.

И деплой для решения тасок.

Агенту этой информации дано не было, мне было интересно посмотреть, что он сможет сделать сам, автоматизировано. Сам я регистрацию прошел только уже после решения, а до этого и не видел что нужен деплой. Это оказалось сюрпризом и еще одним поводом удивиться успеху работы LLM.
По итогу все модели упирались в то, что всё-таки нужно было вручную что-то сделать для их дальнейшей работы.
Однако ChatGPT-5 Thinking смогла достать флаг третьего задания, которое, как потом оказалось, было самым сложным, и которое не решил больше никто из других участников. А вот более простые CTF задачи, даже самые простые из всего списка, ни одна модель решить не смогла.
Решение CTF таски
К решению таски вообще не притрагивался и даже не изучал на момент решения, была уже ночь. В рамках чистоты эксперимента у самой LLM узнаем о задаче и ее решении:
Для решения была выдана сборка Linux в формате “.img”.
В чем сложность:- Это не обычный ZIP. Это формат
cpio newc
(служебная «магия» 070701), иногда ещё и сжатыйgzip
.
- То есть нужно сначала разжать, потом правильно разобрать структуру и только затем искать файлы.
- Путь к флагу может быть неизвестен — приходится искать умно, а не «наугад».Чем задача интересна? - Комбинирует форензику и реверс инженеринг форматов: gzip → cpio → файловая иерархия.
- Учит писать универсальные парсеры и эвристики поиска секретов без знания формата.
- На initramfs видно, что «операционная система — это набор файлов», а не магия.Как решал:
- На сайте нужно логиниться, чтобы скачать файлы. Я автоматизировал регистрацию одноразового аккаунта: забрал скрытый токен со страницы, отправил форму регистрации, получил сессию.- Дальше скачал архив задачи по прямой ссылке из раздела «Files» (URL был известен из прошлых скриптов), так что ручной вход на сайт не требовался.- Для получения/отправки флага я вызывал публичные REST‑эндпойнты платформы (те, что фронтенд вызывает сам). Это не взлом входа, а «официальный путь», просто сделанный скриптом.
Что было загружено
-
ctfwarehouse.zip
— обычный архив. Внутри лежат «внутренности» мини‑системы.
-initramfs.img
— это «коробка с файлами», которую Linux разворачивает в память при старте. По сути архив в форматеcpio newc
, иногда дополнительно сжатыйgzip
.
-vmlinuz-…
— файл ядра Linux (нам не понадобился для извлечения флага).
- Иногда там бываютDockerfile
или скрипт запуска — это подсказки, но ключевой файл именноinitramfs.img
.
1) Написал чистый Python‑парсер
newc
(без внешних утилит), с on‑the‑fly gunzip. 2) Сделал режим «агностик» (agnostic_warehouse_
hunter.py
): не знает ни пути, ни шаблона — строит скоринг строк по энтропии, разнообразию символов и длине, отсекает мусор и показывает топ кандидатов с путями. 3) Автоматика загрузки архива задачи и распаковки — всё в один клик.Какие техники использовал:
- Форензика артефактов: анализ готовых образов (initramfs, ядро) без необходимости поднятия сервиса.
- Реверс‑инжиниринг
- Декомпрессия на лету: auto‑gunzip при обнаружении магии\x1f\x8b
.
- Контентный поиск секретов: regex для флагов((WB|CTF|flag)\{[^}]+\})
+ эвристики (энтропия/классы символов) в «агностическом» режиме.
- Оффлайн‑эксплуатация: извлечение из initramfs без доступа к рантайму/сети, что обходит любые сетевые ограничения.
Далее нужно было написать коннектор. Также берём ответ самой LLM, как удалось это сделать:
Для интеграции MongoDB в Universal Harvester (система сбора данных из различных источников) нужно было создать полнофункциональный коннектор, который поддерживает все основные операции MongoDB и идеально вписывается в существующую архитектуру системы.
В чем сложность:
- Архитектурная интеграция: Universal Harvester использует единый интерфейс для 15+ коннекторов (PostgreSQL, MySQL, Elasticsearch, etc.). MongoDB со своей спецификой должен был влиться в эту экосистему без нарушения общих принципов.
- BSON ≠ JSON: MongoDB использует BSON формат с специфическими типами (ObjectId, ISODate, Binary), которые не сериализуются напрямую в JSON. Нужна корректная конвертация без потери данных.
- Множественная аутентификация: поддержка 3 типов авторизации (login/pass, connection string, X.509 сертификаты) с разными настройками безопасности.
- Операционная полнота: не просто "SELECT * FROM table", а полный спектр MongoDB операций (find, aggregate, count, distinct) с их специфическими параметрами.Чем задача интересна:
- Системное мышление: каждое решение влияло на всю архитектуру - нужно думать о совместимости, производительности и расширяемости всей системы.
- Глубокий diving в MongoDB: пришлось изучить тонкости агрегационных pipeline, особенности индексации, оптимизацию запросов и внутренности PyMongo драйвера.
- Универсальность: коннектор должен работать везде - от localhost до MongoDB Atlas, от простых запросов до сложных аналитических агрегаций.
- Production-grade качество: не просто "работает на моей машине", а полноценный enterprise-ready код с обработкой ошибок, логированием и тестами.Как решал:
1. Архитектурный анализ
- Изучил интерфейсы существующих коннекторов (PostgreSQL, MySQL, Elasticsearch)
- Выделил общие паттерны и точки расширения
- Спроектировал единый интерфейс для всех MongoDB операций2. Решение проблемы BSON сериализации
``python
``
def serializebson(self, data):
if isinstance(data, ObjectId):
return str(data)
elif isinstance(data, datetime):
return data.isoformat()
elif isinstance(data, list):
return [self._serialize_bson(item) for item in data]
elif isinstance(data, dict):
return {k: self._serialize_bson(v) for k, v in data.items()}
return data
3. Универсальная система подключения
- Создал фабрику клиентов для разных типов аутентификации
- Реализовал автоматическое определение типа подключения по конфигурации
- Добавил pool соединений и настройки тайм-аутов4. Единый интерфейс операций
``python
``
def execute(self, query):
operation = query.get('operation', 'find')
method = getattr(self, f'_execute_{operation}')
return method(query)
5. Комплексное тестирование
- 10 тестовых сценариев покрывающих все операции
- Тестовые данные в 3 коллекциях с разными структурами
- Edge cases: пустые результаты, некорректные запросы, сетевые ошибки
- Достиг 100% успешного прохождения тестовКакие техники использовал:
- Адаптер паттерн: обертка специфики MongoDB в универсальный интерфейс Universal Harvester
- Фабрика: создание клиентов для разных типов аутентификации
- Рекурсивная сериализация: deep conversion BSON → JSON с сохранением структуры
- Defensive programming: обработка всех возможных исключений MongoDB
- Test-driven development: каждая функция покрыта тестами перед интеграциейРезультат:
- ✅ Полная интеграция с Universal Harvester (добавлен в engine.py как полноценный источник)
- ✅ Поддержка всех основных операций MongoDB
- ✅ 3 типа аутентификации + SSL/TLS
- ✅ Корректная BSON → JSON конвертация
- ✅ 100% покрытие тестами
- ✅ Production-ready код с документациейMongoDB коннектор стал 16-м источником данных в Universal Harvester, расширив возможности системы для работы с NoSQL базами данных.
Итоги эксперимента
GPT-5 Thinker в режиме агента смог решить таску, с которой не справился больше никто из всех хакеров на конфе, кто пробовал к ней приступить. Я предупредил организаторов о том, что проводил эксперимент по фану и использовал AI для решения CTF, однако это оказалось неважно и меня всё равно наградили на закрытии конфы приятным паком мерча.
В целом я удивлён, что LLM уже может в полностью автоматизированном режиме решать такие задачи, а не просто написать какой то скрипт под одну конкретную задачу. Они действую более комплексно, целостно и обдумано.
На мой взгляд, LLM это максимально удобный ассистент, который может быстро собирать низко висящие плоды. Как минимум, он может проанализировать, что есть по задаче, выдать какие-то первые идеи, что можно сделать и тд. Это инструмент, который позволяет автоматизировать многие процессы, он в состоянии сам запустить существующие инструменты, проанализировать результаты, написать нужные скрипты, запустить и снова изучить результаты. Главное — задать корректные правила, ограничения, четко формировать ТЗ и промты.
Когда вы приступаете к решению задачи, некоторые идеи могут не прийти в голову, а нейронка их увидит и подскажет (или даже сделает всё сама).
kilfoy
Любопытно. Но не убьет ли LLM мотивацию самим хоть что-то уметь и делать?