«Захватить флаг!»: решаем задачи с CTF-турнира KnightCTF

«In the World of Hackers, Be a Knight»: решаем задачи с CTF-турнира. Часть 1

Тирекс
Тирекс Самый зубастый автор
7 февраля 2024

В статье делимся результатами задач с турнира по информационной безопасности. Пригодится новичкам, которые хотят прокачать свои навыки.

Изображение записи

Недавно прошел 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-адреса атакующего и жертвы. Для этого выполняем три шага:

  1. открываем .pcap в Wireshark,
  2. переходим из раздела Статистика в Последовательность запросов,
  3. смотрим на HTTP-запросы.
Последовательность запросов IP-адресов.

В результатах получаем список с последовательностью запросов от IP-адреса 192.168.1.8. Похоже на уязвимость в стиле CMD (Command) Injection:


    http://192.168.1.8/index.php?|=../../../../../../../../../etc/passwd 

Или, как на следующем изображении, попытку UNION BASED SQL injection:

Последовательность запросов IP-адресов.

Готово — жертва найдена.

Далее фильтруем общий .pcap, чтобы понять, от кого были обращения:


    http contains "etc/passwd"
Последовательность запросов IP-адресов.

На скриншоте видно, что запросы идут с 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
Данные о HTTP-протоколе.

Видим сервер — Apache 2.4.29. Далее составляем запрос для FTP:


    ip.src == 192.168.1.8 and ip.dst == 192.168.1.7 and ftp
Данные о 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:

Данные о HTTP-протоколе.

Задача: 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:

Список пакетов в статусе RST ACK.
Список пакетов в статусе 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:

Отслеживание потока TCP.

Категория web

Задача: Levi Ackerman 

Условие

Levi Ackerman is a robot!

Дано

http://66.228.53.87:5000/

Решение

На странице находится только картинка, переходим к 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/.

Изображение на странице 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 с тремя задачами, которые разблокируются после решения одной за другой. Решив эти задачи, вы получите практические знания об уязвимостях обхода аутентификации, а также об ошибках бизнес-логики. Единственное отличие — вы не получите вознаграждение, зато получите флаги. Попробуйте. И помните: не усложняйте, упрощайте. Всего наилучшего. Решайте задачи и становитесь кибер-рыцарями.

Решение

Открывается страница с формой авторизации. Снова пробуем инъекции — подходит:

Страница с формой авторизации.
Запрос HTTP-протокола.

    root@knightctf.com

‘or%201=1#

Все просто — получаем флаг и сдаем.

Задача: Gain Access 2

Условие

У вас есть все, чтобы достичь цели. Рыцарь указал вам путь. Следуйте по нему и получите флаг. Имейте в виду, что все задачи основаны на реальных ошибках в приложениях.

Решение

Дана форма авторизации: 

Страница с формой авторизации.

В коде страницы закомментирован путь к файлу:

Исходный код страницы.

Переходим к нему:

Скрытое послание с исходного кода.

Сразу возникает мысль: на странице вывелся или логин/пароль, или логин/куки — надо проверить оба варианта.

Возвращаемся на форму авторизации, пробуем ввести полученные данные — и видим, что логин или пароль неверный.

Страница с формой авторизации.

Идем в исходный код страницы, видим JavaScript-код:

Страница с исходным кодом.
Из кода понятно, что если авторизация проходит успешно, пользователя перебрасывает на страницу 2fa.php.

Включаем Burp в режим proxy и делаю запрос к 2fa.php. В перехваченном запросе меняем кукки на полученное ранее значение d05fcd90ca236d294384abd00ca98a2d. И нас перекидывает на страницу для ввода второго значения:

Запрос к IP-адресу.

Аналогично идем в исходный код страницы, видим JavaScript с таким же принципом, но теперь цель — dashboard.php.

Делаем запрос к dashboard.php, в Burp подменяю кукки, попадаем на страницу с флагом и сдаем задачу.

Задача: Gain Access 3

Условие

Итак, вы зашли так далеко! Давайте посмотрим, сможете ли вы сделать это. Задание похоже на предыдущее, но с изюминкой. На этот раз письмо отправляется только администратору. Просто подумайте. Имейте в виду, что все задачи основаны на реальных ошибках в приложениях.

Решение

Снова дана форма авторизации:

Страница с формой авторизации.

И файл notesssssss.txt:


    I've something for you. Think.....

root@knightctf.com:d05fcd90ca236d294384abd00ca98a2d

Аналогично через Burp меняем куки и попадаем на 2fa.php:

Страница 2fa.php.

Видим аналогичный JavaScript-код, также идем на dashboard.php с заменой куки и получаем флаг: 

Страница с ответом на задание.

Интересные материалы по CTF

Если хотите ознакомиться с другими задачами CTF-турниров, рекомендуем почитать предыдущие статьи на эту тему.