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

в 16:16, , рубрики: cft, selectel, информационная безопасность, кибербезопасность
«In the World of Hackers, Be a Knight»: решаем задачи с CTF-турнира. 1 часть - 1

Привет! Я Иван, занимаюсь информационной безопасностью в 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-турнире, а вот анализ трафика — скорее приятное исключение. Начну с этой категории.

Категория Networking

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-файл.

Перевод →

Привет! Рад снова видеть вас в моей networking-серии. Всего здесь 18 заданий по взлому, основанные на реальных событиях. Пожалуйста, скачайте приложение для ответа на вопросы. Не усложняйте себе жизнь, ищите простые пути решения. Надеюсь, у вас все получится. Желаю удачи.

Сценарий. Недавно взломали один из активов Рыцарского отряда. Мы нашли почти все причины, но нам нужна ваша помощь, чтобы провести глубокое расследование. Как SOC-аналитик, проанализируйте .pcap-файл и выявите проблемы.

Решение

Итак, мне нужно найти IP-адреса атакующего и жертвы. Для этого я:

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

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

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

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

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

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

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

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

http contains "etc/passwd"

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

На скриншоте видно, что запросы идут с IP-адреса 192.168.1.7. Получается, атакующий — 192.168.1.7, а жертва — 192.168.1.8.

Задача решена, формирую флаг и сдаю.

Vulnerable Service

Задание

What service was vulnerable to the main server?

Перевод →

Какая уязвимая служба была на главном сервере?

Решение

Смотрю в Wireshark, какие протоколы использовались. Для этого нужно перейти из Статистики в Иерархию протоколов.

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

Вижу, что в основном используется HTTP, но также есть и FTP. Фильтрую общий .pcap для этих протоколов. На месте атрибута src указываю адрес жертвы (192.168.1.8), чтобы получить данные о службе в ответных сообщениях.

Составляю запрос для HTTP:

ip.src == 192.168.1.8 and ip.dst == 192.168.1.7 and http

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

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

ip.src == 192.168.1.8 and ip.dst == 192.168.1.7 and ftp

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

Вижу службу, которая ответила сообщением: 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:

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

CVE ID

Задание

What's the CVE id for the vulnerable service?

Перевод →

Какой CVE у уязвимой службы?

Решение

Поскольку я знаю точную версию уязвимого приложения, иду гуглить 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:

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

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

Перехожу из Статистики в Диалоги и вижу, что 192.168.1.7 обращался к 192.168.1.8 через кучу протоколов, но пакетов единицы. Вероятно, они еще в процессе сканирования. Для портов 80/tcp, 443/tcp и 6200/tcp количество ощутимо выше:

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

Вероятно, на 80/tcp и 443/tcp завис веб-сервис, а 6200 использовался для Reverse Shell.

Немного погуглив код эксплоита, понимаю, что там прописан 6200/tcp. Это очень похоже на правду. Поэтому пробую сдать флаг с портом 6200 — успешно.

Поскольку все задачи связаны, то можем сделать следующие выводы:

  • атаковали через уязвимый vsFTPd 2.3.4.
  • использовали эксплоит в Metasploit.
  • создали бэкдор, доступ к которому есть с 192.168.1.7.

Также с помощью кода эксплоита можно понять, что для коннекта используется telnet. Это значит, что все команды были перехвачены в открытом виде и их можно найти.

Создаю фильтр:

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

На пакете выбираю ОтслеживатьTCP Stream и, по сути, получаю bash_history:

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

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


Категория Web

Levi Ackerman

Задание

Levi Ackerman is a robot!

Дано: http://66.228.53.87:5000/

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

Решение

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

Перевод →

Столбняк — это серьезная, потенциально опасная для жизни инфекция, которая передается через укусы животных.

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

Решение

Цепляюсь к слову infection, пробую инъекции для обхода авторизации — подходит:

Login: " or 1=1/*

Password: <можно указать любой>

После авторизации попадаю на дашборд, страницу публикации постов. При добавлении текста в форму и нажатии Execute появляется дополнительная запись:

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

Иду в исходный код страницы, ищу 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.

Перевод →

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

Решение

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

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

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

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=«Перевод →»>
У вас есть все, чтобы достичь цели. Рыцарь указал вам путь. Следуйте по нему и получите флаг. Имейте в виду, что все задачи основаны на реальных ошибках в приложениях.

Решение

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

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

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

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

Перехожу к нему:

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

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

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

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

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

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

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

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

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

Аналогично иду в исходный код страницы, вижу 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.

Перевод →

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

Решение

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

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

И файл notesssssss.txt:

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

root@knightctf.com:d05fcd90ca236d294384abd00ca98a2d

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

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

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

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

К слову, не понял, чем отличаются вторая и третья части.

Резюме


В целом, команда из Бангладеша подготовила интересные задания. Уверен, начинающим специалистам по инфобезу они будут полезны. Спасибо ребятам из KnightCTF!

Этот текст — начало моей серии статьей о CTF-турнирах. Пишите в комментариях, задачи с каких мероприятий вам были бы интересны!

Автор:
is113

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js