Курс молодого бойца по CTF. Простые задания категории Web. Для самых маленьких
Вы спрашивали как научиться ломать? Мы отвечаем.
Мы уже писали о ресурсах, на которых ты можешь прокачать свои хакерские навыки. А теперь я расскажу тебе о том, как это делать на практике. Начнём с самых простых примеров.
Что важно знать и помнить?
Решение заданий на CTF-соревнованиях – это, по сути, решение некоторой загадки, зачастую не имеющей исключительго тренировочный характер. И даже если ты хорошо справляешься с такими заданиями (может быть даже лучше всех в мире), это не означает, что ты будешь лучше всех ломать реальные системы и находить уязвимости. Не стоит забывать, что все задания на тематических ресурсах и соревнованиях – имеют решение, то есть при их разработке уже продумывалось, что в них есть определённая уязвимость, которую необходимо найти и проэксплуатировать. В реальной жизни это зачастую не так, и это надо знать и помнить. Ресурсы с заданиями и решение задач позволяют “прокачать” свои навыки владения инструментами и не стандартного мышления, что крайне важно при взломе систем и поиске уязвимостей, но зацикливаться на решение “задачек” не нужно. Как говорят йоги – важна только практика.
Тем не менее, в этой статье мы рассмотрим самые простые задачки с известного сайта с различными задачами (CTF и не только) – https://www.root-me.org.
Потренируемся на простейших задачках из категории Web Server.
Пример 1.
Самое первое задание называется HTML. Из названия уже можно понять на что необходимо будет обратить внимание. Ссылка на условие задания: https://www.root-me.org/en/Challenges/Web-Server/HTML
Нажимаем кнопку “Start the challenge” и попадаем на сайт.
Сразу откроем исходный код и смотрим его.
Ничего интересного, но если мы двинем ползунок влево, то увидим следующий закомментированный текст. В нём и будет наш пароль.
Обычно такие задания стоят одними из первых на различных не сложных соревнованиях, и их “стоимость” минимальна. Это задание обращает внимание на то, что иногда в комментариях к коду можно найти что-нибудь интересное, т.к. комментарии оставляют разработчики.
Пример 2.
Далее решим задание “Weak password”. Прямая ссылка: https://www.root-me.org/en/Challenges/Web-Server/Weak-password
По названию опять-таки понятно, на что необходимо обратить внимание.
Нажимаем на кнопку “Start the challenge” и попадаем на так называемую “Базовую аутентификацию”.
Попробуем ввести одну из самых простых и популярных комбинаций логина и пароля: “admin/admin”. И получим сообщение о верном решении задания и о том, что введённый нами пароль “admin” можно использовать в качестве ответа на задание.
Задания такого рода иногда встречаются на CTF-cоревнованиях. Смысл таких заданий заключается в том, чтобы показать, что в форме логина может и не быть уязвимостей, однако администраторы могут использовать слабые или стандартные пароли для входа в систему. Часто во время проведения пентестов происходит брутфорс (полный перебор) паролей по словарю популярных паролей. Однако в CTF’ax брутфорс используется редко, т.к. это не особо интересно и затратно.
Пример 3.
Следующее задание, которые мы решим называется “User-agent”. Из его названия опять понятно, на что нужно обратить внимание.
Прямая ссылка: https://www.root-me.org/en/Challenges/Web-Server/User-agent
Нажимаем на “Start the challenge” и видим следующее сообщение.
“user-agent” – это одно из полей HTTP-запроса, которое отвечает за описание браузера с которого происходит обращение к ресурсу. Изменим запрос с помощью инструментов разработчика (они открываются в разных браузерах по разному, но обычно достаточно нажать ПКМ на странице и выбрать опцию “Исследовать элемент”, после откроется меню и там нужно выбрать категорию “Сеть”, если у вас английская версия браузера, то у вас будет “Inspect elements” и “Network” соответственно, после находим запрос, изменяем его и отправляем. Меняем мы только User-Agent)
Смотрим ответ (он будет в самом низу списка запросов)
И получаем пароль.
Данное задание нацелено на основы работы с HTTP-заголовками. Задания такого рода очень часто встречаются на CTF’ах, при этом могут использоваться различные HTTP-заголовки, даже самые редкие, поэтому стоит знать хотя-бы самые базовые.
Пример 4.
Решим задание “Backup file”. Из названия видно, что речь пойдёт про бекапы (бекап – резервная копия каких либо данных для экстренных случаев).
Прямая ссылка на задание – https://www.root-me.org/en/Challenges/Web-Server/Backup-file
Приступаем к заданию и попадаем на форму ввода логина и пароля.
Данное задание по большей части основано на некотором прямом знании, нежели логики и рассуждениям. При создании бекапа часто делается просто копия объекта, однако его наименование нужно немного изменить, для этого могут добавляться различные символы в конец файла (например, чтобы убрать расширение *.php, для того, чтобы файл не исполнялся при обращении к нему).
Можно попробовать скачать файлы, которые потенциально могут быть на сервере. Например, файлы со следующими названиями:
- backup.zip
- backup.tar.gz
- index.zip
- index.tar.gz
- index.php_
- index.php1
- index.phps
- index.php~
При указании в адресной строке последнего названия (index.php~) произойдёт скачивание файла с исходным кодом.
Открыв данный файл в текстовом редакторе получим исходный код (в том числе и серверную часть) обработчика формы.
И получаем пароль для подтверждения решения данного задания.
Данное задание по большей части зацикливается на некотором прямом знание того, что на серверы могут быть забыты/оставлены бекапы важных файлов.
Пример 5.
Решим ещё одно задание. Название – “HTTP directory indexing”. Судя по названию, задание нацелено на индексацию директорий на веб-сервере.
Прямая ссылка на задание – https://www.root-me.org/en/Challenges/Web-Server/HTTP-directory-indexing
Приступаем к заданию и попадаем на следующее веб-приложение.
Никаких видимых подсказок нет, по этому посмотрим исходный код.
В исходном коде видим, что подключается некоторый файл из локальной папки admin. Так как в названии задание сказано про индексацию, попробуем просто зайти в папку admin.
Отлично, она индексируется (мы видим её содержимое). В данной папке находится файл (который и подключается к предыдущей страничке) и папку. Зайдём в папку и посмотрим её содержимое.
Видим некоторый текстовый файл “admin.txt”. Попробуем открыть его.
Получаем пароль.
Это задание акцентирует внимание на таком свойстве, как индексация. Смысл индексации заключается в том, что перед вам предстаёт по сути папка с файлами и другими папками и всё это находится на сервере. Не редкость, когда про индексацию забывают в важных местах веб-приложения, и таким образом любой желающий может получить доступ к конфиденциальным файлам или исходным кодам.
Пример 6.
Решим задание “Command injection”.
Ссылка на задание – https://www.root-me.org/en/Challenges/Web-Server/Command-injection
Из описания и названия берём самое важно и получаем, что речь пойдёт об “внедрении команд”, пароль хранится в файле index.php
Заходим на сайт и видим следующую форму.
В описании задания было сказано, что это сервис, предназначенный для пинга. Предположим, что пинг реализуется с помощью системной функции и фильтрация вводимых данных – отсутствует. Данная уязвимость относится к классу RCE, описание уязвимости уже было на канале и пример был практически такой-же. Вот ссылки на описание RCE:
Подаём на вход следующую строку “; cat index.php”, суть которой заключается в том, что мы закрываем команду ping и добавляем ещё одну команду, которая прочитает файл index.php и отобразит его.
После выполнения будет отображено 2 формы ввода – это нормально, так как мы прочитали файл и отобразили его, а он содержит не только php-код но и html-код, который повторно отображается. Нам нужно открыть исходный код.
Видим серверную часть кода, в которой и расположен наш флаг/пароль для решения задания.
Пример 7.
Решим задание “PHP filters”.
Прямая ссылка на задание – https://www.root-me.org/en/Challenges/Web-Server/PHP-filters
Смотрим описание.
По заданию нам надо получить пароль администратора, обратим внимание на название задания, а также на прикреплённые источники.
Много ссылок на LFI.
Заходим на само задание и видим две ссылки.
Прейдём на login и обратим внимание на строку запроса.
Внимание сразу привлекает параметр “inc” который принимает в качестве значения название скрипта. Похоже на LFI. Только есть проблема, судя по всему данный файл “выполняется”, то есть содержащийся в нём php-код выполняется на сервере при загрузке данного файла, то есть по сути файл подгружен, но полный его исходный код не увидеть.
Для решения этой проблемы можно закодировать вывод этого файла в base64 для этого и используются php-фильтры.
Мы получаем большой вывод base64, декодируем его.
Видим, что скрипт подключает файл “config.php” и использует переменные $password и $username, которых нет в файле, прочитаем таким же образом файл “config.php”
Декодируем полученный base64 и получаем ответ.
Задание решено. Оно оказалось не сложным и довольно хорошо демонстрирует базовую концепцию уязвимости LFI с использованием php-фильтров.
Пример 8.
Решим задание “HTTP verb tampering”.
Прямая ссылка на задание – https://www.root-me.org/en/Challenges/Web-Server/HTTP-verb-tampering
Смотрим описание.
Итак по заданию не особо понятно, что надо сделать, но если перейти по ссылке и начать решение, то станет ясно, что нужно обойти базовую аутентификацию.
В названии задания нам указали на метод, с помощью которого это можно сделать. Если подробно посмотреть про этот метод, то можно выяснить, что в файле .htaccess можно настроить базовую аутентификацию для разного рода запросов (GET, POST …) и может получится так, то для запросов определённого рода не выставлены правила аутентификации и страница будет получена без ввода логина и пароля.
Попробуем реализовать данную атаку с помощью Burp Suite.
Обычный GET-запрос.
Требует авторизироваться. Меняет тип запроса на PUT.
Получаем ответ. Задание решено.
Пример 9.
Решим задание “HTTP – Open redirect”.
Прямая ссылка на задание – https://www.root-me.org/en/Challenges/Web-Server/HTTP-Open-redirect
Смотрим описание.
Судя по описанию, нам необходимо совершить переход на другой домен, кроме предложенных.
Зайдём на сайт с заданием.
При нажатии на одну из ссылок получаем такой запрос.
Видим, что в параметре url передаётся адрес, по которому будет осуществлён переход. А в параметре h передаётся какой-то хеш, по формату похожий на md5. Правда, не ясно от чего он, поэтому попробуем найти его в базе.
Получается, что это хеш от адреса.
Поменяем адрес на другой и запишем хеш от него в запрос.
Получаем флаг. Задание решено.
Пример 10.
Решим задание HTTP/POST.
Прямая ссылка на задание – https://www.root-me.org/en/Challenges/Web-Server/HTTP-POST
Посмотрим описание.
Судя по всему речь пойдёт об HTTP-методе POST. Нам надо найти путь получения топовых очков (судя по всему максимальных).
Перейдём по ссылке для начала решения задания.
Видим некоторую игру. В которой мы можем нажимать на кнопку и получать случайный результат. Необходимо, чтобы случайный результат был равен максимальному – 999999.
В задании указывалось что-то про методы, подключим Burp Suite и посмотрим какие запросы идут на сервер.
При нажатии на кнопку отправляется следующий запрос.
Видим, что число в параметре score отображается после запроса на странице и получается, что мы можем его контролировать. Давайте заменим его на максимальное + 1.
Всё верно, мы победили в игру и получили флаг. Задание решено.
Данное задание демонстрирует основы отправки изменяющих запросов на сервер и показывает, что вы можете изменять отправляемые значения в надежде на изменение результата ответа от сервера.
Пример 11.
Решим задание – “Improper redirect”
Прямая ссылка на задание – https://www.root-me.org/en/Challenges/Web-Server/Improper-redirect
Посмотрим описание.
Задание связано с редиректом, нужно получить доступ к index.
Попробуем перейти по ссылке.
При любом обращении к index.php попадаем на login.php?redirect
Попробуем обратится к index.php и перехватим запрос с помощью Burp Suite и отправим запрос в Repeater.
Теперь просто отправим данный запрос и если будет происходит редирект мы увидим это и пока не нажмём на кнопку принятия он не произойдёт.
Отлично, мы получили флаг и указание на данную проблему безопасности (CWE-698) и небольшое описание в чём заключается её смысл.
Вот такое простое задание, демонстрирующее возможные проблемы при плохой реализации редиректа.
Пример 12.
Прямая ссылка на задание – https://www.root-me.org/en/Challenges/Web-Server/File-upload-double-extensions
Посмотрим описание.
Нам полностью написано, что надо сделать и где лежит пароль для задания. Мы должны загрузить в фото-галерею файл с php-кодом и достать пароль из файла .passwd в корневой директории этого приложения.
Зайдём на сайт и увидим, следующее.
Как можно заметить, это действительно похоже на фото-галерею, но это не самое интересное. Мы видим вкладку “upload” в небольшом меню. Давайте попробуем перейти в неё и загрузить какой нибудь файл.
Итак, мы видим, что можно загружать свои фотографии, однако они должны быть строго определённого формата.
Попробуем один из самых простых способов обхода данного фильтра, а именно “файл с двойным расширением”.
Создадим такой файл.
Это достаточно распространённый простой шелл, с указанием в начале констант, которые соответствуют изображению. Также обязательно надо указать двойное расширение (сначала .php потом .jpeg)
Всё дело в том, что при загрузке файл будет распознавать по последнему расширению (то есть как изображение), а при обращении к файлу, сервер попытается изначально открыть его по первому найденному расширению (если это не запрещено в настройках сервера), то есть по расширению “.php”.
Загружаем файл.
После отправки этого запроса, получаем результат загрузки файла.
Файл успешно загружен, его тип определился как изображение, а также нам показали путь по которому файл сохранён. Попробуем перейти по нему.
Отлично, мы можем выполнять код на сервере. Теперь просто прочитаем необходимый файл.
И получаем наш пароль. Проверим его.
Задание решено.
Пример 13.
Прямая ссылка на задание – https://www.root-me.org/en/Challenges/Web-Server/File-upload-MIME-type
Посмотрим описание.
Задание снова по загрузке шелла. На этот раз речь (судя по названию) нужно обойти MIME type.
Перейдём на сайт и посмотрим, что нам предлагают.
Есть опция загрузки. Посмотрим как она выглядит.
Не отличается от прошлого задания. Попробуем загрузить шелл, используемый в прошлом решении.
Загрузка прошла, однако немного неясно, где был сохранён файл. Поищем его.
Если обновить страницу загрузки, то можно увидеть ссылку на загруженный ранее файл. Попробуем обратиться к нему.
Как можно заметить, двойное расширение не сработало. Попробуем загрузить файл с расширением .php при этом в процессе загрузки подменим тип и файл будет содержать magic-number для jpeg изображения.
Запрос выглядит так (поле Content-Type изменяется в процессе запроса с помощь перехвата его в Burp’e).
Посмотрим ответ.
Файл загружен. Отлично, проверим его.
Всё верно, код отрабатывает. Сделаем “ls”, чтобы показать, что сейчас загружено 2 файла и просто прочитаем флаг.
Пароль получен. Задание решено.
Пример 14.
Ссылка на задание – https://www.root-me.org/en/Challenges/Web-Server/HTTP-cookies
Описалово:
Исходя из описания и названия задания речь пойдёт про куки и скорее всего про их подмену. Перейдём по ссылке (кнопка Start the challenge) и посмотрим, что нам предлагают.
Какая-то форма сохранения email’ов и просмотр сохранённых почт. Попробуем нажать на просмотр почт.
Видим, что нам выдало сообщение о том, что мы не администратор, а также установился некоторый параметр “c” со значением “visiteur”. Попробуем поменять его на admin.
Теперь видим, что проблема состоит в куки. Посмотрим на запросы к серверу с помощью Burp Suite.
Видим, что на сервер передаётся некоторая куки переменная ch7 со значением “visiteur”, попробуем подменить её на admin.
И получим верный пароль. Ниже представлен запрос в Repeater’e.
Задание решено.
Вот такой простой пример подмены куки для получения доступа к другому аккаунта. Данная уязвимость имеет место быть в достаточно плохих веб-проектах, где разработчики совсем не заботяться о безопасности и разграничении доступа у пользователей.
На канале вы можете найти ещё множество подобных постов не только для веб-приложений, но и для бинарных приложений.
Ты спрашивал – мы рассказываем. Это самые простые задачки. Более сложные – впереди.