Привет! Я Иван, занимаюсь информационной безопасностью в Selectel. Недавно прошел CTF-турнир KnightCTF 2024, который организовали cybersecurity-энтузиасты из Бангладеша. В течение одного дня участники со всего мира решали более 40 задач из разных категорий. Спойлер: это оказалось не так уж и сложно. Под катом делюсь, как решил некоторые из них.
Дисклеймер: данный материал не обучает хакингу и взлому и не призывает к совершению противозаконных действий. Все описанное ниже лишь демонстрирует, какие пробелы в безопасности встречаются в реальных веб-приложениях. И предупреждает, на что нужно обратить внимание при разработке программного обеспечения.
Используйте навигацию, чтобы выбрать интересующий блок:
→ Немного о KnightCTF
→ Захватываем флаги
→ Категория Networking
→ Категория Web
→ Резюме
Немного о 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-адресах.
Захватываем флаги
Первым делом я хотел порешать задачки из Web, но меня также заинтересовала категория Networking. Веб-технологии есть на каждом CTF-турнире, а вот анализ трафика — скорее приятное исключение. Начну с этой категории.
Vicker IP
Задание
Hi! It's good to see you again in my networking series. There are total 18 challenges in this series & based on real life events of how can a server be compromised. Please download the attachment which will be used to answer all the questions. Don't make it too complex. Just keep it simple. Hope you'll solve them all. Wish you all a very good luck.
Scenario: Recently one of Knight Squad's asset was compromised. We've figured out most but need your help to investigate the case deeply. As a SOC analyst, analyze the pacp file & identify the issues.
So let's start with the basic.
Дано: .pcap-файл.
Сценарий. Недавно взломали один из активов Рыцарского отряда. Мы нашли почти все причины, но нам нужна ваша помощь, чтобы провести глубокое расследование. Как SOC-аналитик, проанализируйте .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
Задание
What service was vulnerable to the main server?
Решение
Смотрю в 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
Задание
What's the CVE id for the vulnerable service?
Решение
Поскольку я знаю точную версию уязвимого приложения, иду гуглить CVE. Открываю ссылку — флаг сдан.
Famous Tool
Задание
The attacker used a popular tool to gain access of the server. Can you name it?
Решение
Эксплоит для vsFTPd 2.3.4 есть в базе Metasploit — наверное, в самом известном инструменте для эксплуатации. Пробую сдать сходу — флаг сдан.
Port
Задание
What was the port number of the reverse shell of the server?
Please use the attachment of the first challenge.
Пожалуйста, используйте вложение первой задачи (.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/
Решение
На странице находится только картинка, иду на 66.228.53.87:5000/robots.txt (текст задания — отсылка). По ссылке robots.txt вижу: Disallow: /l3v1_4ck3rm4n.html. Далее перехожу к 66.228.53.87:5000/l3v1_4ck3rm4n.html, получаю флаг и сдаю.
Kitty
Задание
Tetanus is a serious, potentially life-threatening infection that can be transmitted by an animal bite.
Дано: 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
Задание
The web challenges are very much similar to real life application bugs. This is going to be a series of Gain Access with 3 challenges unlocks upon solving one by one. By solving these challenges, you'll gain a practical knowledge of Authentication Bypass Vulnerabilites as well as business logic error. The only difference is you'll not get any bounty but you'll get flags. Give it a try. And keep in mind, Don't make it hard, keep it simple. All the best. Solve the challenges & be a cyber knight.
Решение
Открывается страница с формой авторизации. Снова пробую инъекции — подходит:
root@knightctf.com
‘or%201=1#
Все просто — получаю флаг, сдаю.
Gain Access 2
Задание
You've everyting to reach your destination. A knight has lead the path. Follow the path & get the flag. keep in mind, all challenges are based on real life application bugs.
<spoiler title=«Перевод →»>
У вас есть все, чтобы достичь цели. Рыцарь указал вам путь. Следуйте по нему и получите флаг. Имейте в виду, что все задачи основаны на реальных ошибках в приложениях.
Решение
Дана форма авторизации:
В коде страницы закомментирован путь к файлу:
Перехожу к нему:
Сразу возникла мысль: на странице вывелся или логин/пароль, или логин/куки — надо проверить оба варианта.
Возвращаюсь на форму авторизации, пробую ввести полученные данные — и понимаю, что логин или пароль неверный.
Иду в исходный код страницы, вижу JavaScript-код:
Из кода понятно, что если авторизация проходит успешно, пользователя перебрасывает на страницу 2fa.php.
Включаю Burp в режим proxy и делаю запрос к 2fa.php. В перехваченном запросе меняю кукки на полученное ранее значение d05fcd90ca236d294384abd00ca98a2d. И меня перекидывает на страницу для ввода второго значения:
Аналогично иду в исходный код страницы, вижу JavaScript с таким же принципом, но теперь цель — dashboard.php.
Делаю запрос к dashboard.php, в Burp подменяю кукки, попадаю на страницу с флагом и сдаю задачу.
Gain Access 3
Задание
So you've come this far huh!!! Let me see if you can get this done. It's similar but with a twist. This time the email is sent to the admin only. Just think. keep in mind, all challenges are based on real life application bugs.
Решение
Снова дана форма авторизации:
И файл notesssssss.txt:
I've something for you. Think.....
root@knightctf.com:d05fcd90ca236d294384abd00ca98a2d
Аналогично через Burp меняю куки и попадаю на 2fa.php:
Вижу аналогичный JavaScript-код, также иду на dashboard.php с заменой куки и получаю флаг:
К слову, не понял, чем отличаются вторая и третья части.
Резюме
В целом, команда из Бангладеша подготовила интересные задания. Уверен, начинающим специалистам по инфобезу они будут полезны. Спасибо ребятам из KnightCTF!
Этот текст — начало моей серии статьей о CTF-турнирах. Пишите в комментариях, задачи с каких мероприятий вам были бы интересны!
Автор:
is113