CTF Обучение Тренировка

Курс молодого бойца по 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, для того, чтобы файл не исполнялся при обращении к нему).

Можно попробовать скачать файлы, которые потенциально могут быть на сервере. Например, файлы со следующими названиями:

При указании в адресной строке последнего названия (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.

Задание решено.

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

На канале вы можете найти ещё множество подобных постов не только для веб-приложений, но и для бинарных приложений.

Ты спрашивал – мы рассказываем. Это самые простые задачки. Более сложные – впереди.

Очень злой админ
Очень злой админ Автор статьи

Админ сайта. Публикует интересные статьи с других ресурсов, либо их переводы. Если есть настроение, бывает, что пишет и что-то своё.

Leave a Reply

Your email address will not be published. Required fields are marked *