Недавно прошел CTF-турнир KnightCTF 2024, который организовали cybersecurity-энтузиасты из Бангладеша. В течение одного дня участники со всего мира решали более 40 задач из разных категорий. Спойлер: это оказалось не так уж и сложно. В статье рассказываем, как коллега из отдела информационной безопасности решил некоторые из них.
Дисклеймер: данный материал не обучает хакингу и взлому и не призывает к совершению противозаконных действий. Все описанное ниже лишь демонстрирует, какие пробелы в безопасности встречаются в реальных веб-приложениях. И предупреждает, на что нужно обратить внимание при разработке программного обеспечения.
Немного о KnightCTF
В 2020 году cybersecurity-энтузиаст Md. Moniruzzaman Prodhan aka NomanProdhan собирает команду Knight Squad. С 2021 года они начинают проводить семинары по информационной безопасности, а в 2022 организовывают первый международный CTF-турнир (Capture the flag, захват флага) — KnightCTF. И вот уже третий год специалисты со всего мира участвуют в масштабном соревновании от этих парней!
Правила этого турнира, как и многих других, простые:
- не ломать инфру CTF,
- не шарить флаги,
- слушаться организаторов.
Узнать об этом мероприятии можно на площадке CTFtime, где есть удобное расписание предстоящих событий. Туда же добавляют команды, которые заняли первую десятку рейтинга.
После регистрации на KnightCTF необходимо создать команду или присоединиться к существующей. Во втором варианте нужно получить пароль от капитана.
CTF-турнир длится только 24 часа. В назначенное время организаторы открывают доступ — с этого момента их можно решать. У всех задач одинаковая стоимость, но чем больше участников сдали флаг, тем дешевле он становится. После завершения турнира доступ к заданиям остается еще на некоторое время, но решение уже не идет в зачет.
Все таски разбиты по следующим категориям:
- cryptography,
- web,
- networking,
- reverse Engineering,
- digital Forensics,
- pwn,
- steganography.
Важно: в турнире нет VPN, все задания выполняются на белых IP-адресах.
Категория networking
Первым делом коллега хотел порешать задачки из web, но его также заинтересовала категория networking. Веб-технологии есть на каждом CTF-турнире, а вот анализ трафика — скорее приятное исключение. Начнем с него.
Задача: Vicker IP
Условие
Привет! Рад снова видеть вас в моей networking-серии. Всего здесь 18 заданий по взлому, основанные на реальных событиях. Пожалуйста, скачайте приложение для ответа на вопросы. Не усложняйте себе жизнь, ищите простые пути решения. Надеюсь, у вас все получится. Желаю удачи.
Сценарий. Недавно взломали один из активов Рыцарского отряда. Мы нашли почти все причины, но нам нужна ваша помощь, чтобы провести глубокое расследование. Как SOC-аналитик, проанализируйте .pcap-файл и выявите проблемы.
Дано
.pcap-файл
Решение
Итак, нужно найти IP-адреса атакующего и жертвы. Для этого выполняем три шага:
- открываем .pcap в Wireshark,
- переходим из раздела Статистика в Последовательность запросов,
- смотрим на HTTP-запросы.
В результатах получаем список с последовательностью запросов от IP-адреса 192.168.1.8. Похоже на уязвимость в стиле CMD (Command) Injection:
http://192.168.1.8/index.php?|=../../../../../../../../../etc/passwd
Или, как на следующем изображении, попытку UNION BASED SQL injection:
Готово — жертва найдена.
Далее фильтруем общий .pcap, чтобы понять, от кого были обращения:
http contains "etc/passwd"
На скриншоте видно, что запросы идут с IP-адреса 192.168.1.7. Получается, атакующий — 192.168.1.7, а жертва — 192.168.1.8.
Задача решена, формируем флаг и сдаем.
Задача: Vulnerable Service
Условие
Какая уязвимая служба была на главном сервере?
Решение
Смотрим в Wireshark, какие протоколы использовались. Для этого нужно перейти из Статистики в Иерархию протоколов.
Видим, что в основном используется HTTP, но также есть и FTP. Фильтруем общий .pcap для этих протоколов. На месте атрибута src указываем адрес жертвы (192.168.1.8), чтобы получить данные о службе в ответных сообщениях.
Составляем запрос для HTTP:
ip.src == 192.168.1.8 and ip.dst == 192.168.1.7 and http
Видим сервер — Apache 2.4.29. Далее составляем запрос для FTP:
ip.src == 192.168.1.8 and ip.dst == 192.168.1.7 and ftp
Видим службу, которая ответила сообщением: vsFTPd 2.3.4. Этого достаточно, чтобы попробовать сдать два варианта флага — с Apache и vsFTPd. Последний принят, значит поломали через него.
Дополнительно
Чтобы получить информацию о сканировании жертвы, можно применить следующий фильтр:
ip.src == 192.168.1.7 and ip.dst == 192.168.1.8 and http contains "GET"
На основе данных в User-Agent можно сделать вывод, что сканировали инструментом Nikto:
Задача: CVE ID
Условие
Какой CVE у уязвимой службы?
Решение
Поскольку мы знаем точную версию уязвимого приложения, поищем информацию о CVE в интернете. Открываем ссылку — флаг сдан.
Задача: Famous Tool
Условие
Злоумышленник использовал популярный инструмент для получения доступа к серверу. Можете ли вы его назвать?
Решение
Эксплоит для vsFTPd 2.3.4 есть в базе Metasploit — наверное, в самом известном инструменте для эксплуатации. Попробуем сдать сходу — флаг сдан.
Задача: Port
Условие
Какой номер порта был у обратной оболочки сервера?
Пожалуйста, используйте вложение первой задачи (.pcap-файл).
Решение
Используем .pcap-файл из задачи Vicker IP. Адреса атакующего и жертвы мы уже знаем, пишем фильтр в Wireshark:
ip.src == 192.168.1.8 and ip.dst == 192.168.1.7 and not http and not tcp.port==80
Видим большой список пакетов в статусе RST ACK:
Перехожу из Статистики в Диалоги и вижу, что 192.168.1.7 обращался к 192.168.1.8 через кучу протоколов, но пакетов единицы. Вероятно, они еще в процессе сканирования. Для портов 80/tcp, 443/tcp и 6200/tcp количество ощутимо выше:
Вероятно, на 80/tcp и 443/tcp завис веб-сервис, а 6200 использовался для Reverse Shell.
Немного погуглив код эксплоита, коллега понимает, что там прописан 6200/tcp. Это очень похоже на правду. Поэтому попробуем сдать флаг с портом 6200 — успешно.
Поскольку все задачи связаны, то можем сделать следующие выводы:
- атаковали через уязвимый vsFTPd 2.3.4.
- использовали эксплоит в Metasploit.
- создали бэкдор, доступ к которому есть с 192.168.1.7.
Также с помощью кода эксплоита можно понять, что для коннекта используется telnet. Это значит, что все команды были перехвачены в открытом виде и их можно найти.
Создаем фильтр:
На пакете выбираем Отслеживать → TCP Stream и, по сути, получаем bash_history:
Категория web
Задача: Levi Ackerman
Условие
Levi Ackerman is a robot!
Дано
Решение
На странице находится только картинка, переходим к http://66.228.53.87:5000/robots.txt (текст задания — отсылка). По ссылке robots.txt видим сообщение: Disallow : /l3v1_4ck3rm4n.html. Далее идем к http://66.228.53.87:5000/l3v1_4ck3rm4n.html, получаем флаг и сдаем.
Задача: Kitty
Условие
Столбняк — это серьезная, потенциально опасная для жизни инфекция, которая передается через укусы животных.
Дано
http://45.33.123.243:5020/.
Решение
Цепляемся к слову infection, попробуем инъекции для обхода авторизации — подходит:
Login: " or 1=1/*
Password: <можно указать любой>
После авторизации попадаем на дашборд, страницу публикации постов. При добавлении текста в форму и нажатии Execute появляется дополнительная запись:
Идем в исходный код страницы, ищем JavaScript, отвечающий за публикацию постов. Находим кусок кода в теге script:
if (post_in.startsWith('cat flag.txt')) {
fetch('/execute', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: `post_input=${encodeURIComponent(post_in)}`
})
.then(response => response.text())
.then(result => {
const contentSection = document.querySelector('.content');
const newPost = document.createElement('div');
newPost.classList.add('post');
newPost.innerHTML = `<h3>Flag Post</h3><p>${result}</p>`;
contentSection.appendChild(newPost);
});
}
Вводим в форму cat flag.txt, получаем пост с флагом и сдаем очередное задание!
Задача: Gain Access 1
Условие
Веб-задачи похожи на реальные ошибки в приложениях. Это будет серия Gain Access с тремя задачами, которые разблокируются после решения одной за другой. Решив эти задачи, вы получите практические знания об уязвимостях обхода аутентификации, а также об ошибках бизнес-логики. Единственное отличие — вы не получите вознаграждение, зато получите флаги. Попробуйте. И помните: не усложняйте, упрощайте. Всего наилучшего. Решайте задачи и становитесь кибер-рыцарями.
Решение
Открывается страница с формой авторизации. Снова пробуем инъекции — подходит:
root@knightctf.com
‘or%201=1#
Все просто — получаем флаг и сдаем.
Задача: Gain Access 2
Условие
У вас есть все, чтобы достичь цели. Рыцарь указал вам путь. Следуйте по нему и получите флаг. Имейте в виду, что все задачи основаны на реальных ошибках в приложениях.
Решение
Дана форма авторизации:
В коде страницы закомментирован путь к файлу:
Переходим к нему:
Сразу возникает мысль: на странице вывелся или логин/пароль, или логин/куки — надо проверить оба варианта.
Возвращаемся на форму авторизации, пробуем ввести полученные данные — и видим, что логин или пароль неверный.
Идем в исходный код страницы, видим JavaScript-код:
Включаем Burp в режим proxy и делаю запрос к 2fa.php. В перехваченном запросе меняем кукки на полученное ранее значение d05fcd90ca236d294384abd00ca98a2d
. И нас перекидывает на страницу для ввода второго значения:
Аналогично идем в исходный код страницы, видим JavaScript с таким же принципом, но теперь цель — dashboard.php
.
Делаем запрос к dashboard.php
, в Burp подменяю кукки, попадаем на страницу с флагом и сдаем задачу.
Задача: Gain Access 3
Условие
Итак, вы зашли так далеко! Давайте посмотрим, сможете ли вы сделать это. Задание похоже на предыдущее, но с изюминкой. На этот раз письмо отправляется только администратору. Просто подумайте. Имейте в виду, что все задачи основаны на реальных ошибках в приложениях.
Решение
Снова дана форма авторизации:
И файл notesssssss.txt
:
I've something for you. Think.....
root@knightctf.com:d05fcd90ca236d294384abd00ca98a2d
Аналогично через Burp меняем куки и попадаем на 2fa.php:
Видим аналогичный JavaScript-код, также идем на dashboard.php с заменой куки и получаем флаг:
Интересные материалы по CTF
Если хотите ознакомиться с другими задачами CTF-турниров, рекомендуем почитать предыдущие статьи на эту тему.