Решаем задания по вебу. Часть 2. OverTheWire: Natas 6-10.
https://telega.at/hacker_sanctuary
Данный пост будет содержать решение заданий c сайта: http://overthewire.org/wargames/.
Решать будем базовые задания по вебу: http://overthewire.org/wargames/natas/.
В данном посте будет описано решение заданий с 6 по 10, в следующих постах будут описываться решения остальных заданий.
Рекомендуется перед прочтение решить их самостоятельно.
Как приступить к решению?
Заходим по ссылке выше (http://overthewire.org/wargames/natas/) и читаем описание к данному Wargame. Из описания можно понять, что уровни идут один за одним и имеют шаблон: http://natasX.natas.labs.overthewire.org где X - номер уровня. Пароль вы получаете на предыдущем уровне, а логин - это natasX, где Х - номер уровня.
Для первого задания нам сразу предоставлены данные для входа и ссылка:
Username: natas0 Password: natas0 URL: http://natas0.natas.labs.overthewire.org
Задача на каждом уровне одна - найти пароль для следующего уровня. Формулировок заданий - нет, но часто будут иметься подсказки на самих сайтах с заданиями.
Шестое задание (Natas Level 5).
ссылка: http://natas5.natas.labs.overthewire.org
пароль: iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq
Для решения данного задания будем использовать Burp Suite (материал по настройке и базовому применению тут).

После авторизации на сайте наблюдаем сообщение о том, что мы не залогинены. За логин на сайте могут отвечать cookie. Они представляют собой некоторые данные, которые хранятся в вашем браузере, и могут содержать в себе указание на различные настройки, статистику и авторизацию. В случае с авторизацией это работает примерно так: зайдя на сайт один раз, в Вашем браузере сохраняется информации о текущей сессии на сайте, и если она не будет удалена, то при последующих обращениях к данному сайту, Вам не нужно будет снова вводить свои учётные данные (логин и пароль).
Посмотрим, какие запросы идут к веб-приложению.

Видим в заголовке Cookie переменную loggedin. Её значение равно 0 (логическое "Не" или "Ложь") изменим на 1 и отправим запрос заново (с помощью Repeater в Burp Suite).

Получаем пароль для следующего уровня.
пароль: aGoY4q2Dc6MgDq4oL4YtoKtyAg9PeHa1
Седьмое задание (Natas Level 6).
ссылка: http://natas6.natas.labs.overthewire.org/
пароль: aGoY4q2Dc6MgDq4oL4YtoKtyAg9PeHa1
Перед нами форма ввода некоторого секретного значения.

При этом, есть конпка просмотра исходного кода. Воспользуемся ей.

Нас интересует код серверной части (то есть тот код, который не будет отображён при обычном просмотре исходного кода в браузере).
Видим, что при вводе верного значения будет отображён пароль. Вводимое значение сверяется с некоторой переменной $secret.
if($secret == $_POST['secret']) {
print "Access granted. The password for natas7 is <censored>";
} else {
print "Wrong secret";
}
Однако данная переменная нигде не инициализированна (в данном коде), но есть указание на подключаемый файл, в котором, возможно, эта переменная есть.
include "includes/secret.inc";
Откроем данный файл. При обращении к нему через браузер на экране будет пусто, однако необходимо открыть исходный код страницы.

Теперь мы нашли значение переменной и можем попробовать ввести его.

Вводим и получаем пароль.
пароль: 7z3hEENjQtflzgnT29q7wAvMNfZdh0i9
Восьмое задание (Natas Level 7).
ссылка: http://natas7.natas.labs.overthewire.org/
пароль: 7z3hEENjQtflzgnT29q7wAvMNfZdh0i9
Перед нами две кнопки: Home и About.

Нажима на эти кнопки получаем лишь следующие сообщения:
Однак в адресной строке появляется новый параметр для скрипта.

Параметр "page", в котором записывается страница, к которой мы обращаемся. Можно предположить, что, исходя из этого параметра, скрипт открывает некоторую страницу (если она имеется). Такого рода функционал может приводить к уязвимости, называемой LFI (Local File Inclusion). Данная уязвимость будет описана в следующих постах. Если коротко, то с помощью неё можно производить чтение и запуск (в некоторых случаях) локальных файлов, которые содержатся на сервере (не только веб-страниц, но и файлов операционной системы).
Посмотрим исходный код страницы.

Наблюдаем интересную закомментированную запись, о том, что пароль находится по такому-то пути (/etc/natas_webpass/natas8). Попробуем подставить данный путь в параметр и посмотреть, что произойдёт.

Данный файл прочитался и мы получили пароль.
пароль: DBfUBfqQG69KvJvJ1iAbMoIpwSNQ9bWe
Девятое задание (Natas Level 8).
ссылка: http://natas8.natas.labs.overthewire.org/index.php
пароль: DBfUBfqQG69KvJvJ1iAbMoIpwSNQ9bWe
Опять форма ввода и возможность посмотреть исходный код.

Смотрим исходный код серверной части (как и в прошлых заданиях).

Итак, видим, что введёное нами значение преобразуется с помощью функции "encodeSecret" и сравнивается с заданным значение в переменной $encodedSecret.
Проанализируем функцию преобразования. Она возвращает результат выполнения функции bin2hex, который в свою очередь в качестве аргумента принимает результат работы функции strrev, которая в качестве аргумента принимает результат работы функции base64_encode.
Кракто опишем каждую функцию:
base64_encode - переводит ASCII-строку в кодировку base64
http://php.net/manual/en/function.base64-encode.php
strrev - переворачивает строчку
https://www.w3schools.com/php/func_string_strrev.asp
bin2hex - переводит в шестнадцатиричную кодировку.
https://www.w3schools.com/php/func_string_bin2hex.asp
Нам нужно повторить все операции в обратную сторону для значения в переменной $encodedSecret, чтобы узнать исходное значение. Для этого можно воспользоваться онлайн интерпретатором PHP (ссылка).
Нам нужно найти обратные функции (кроме функции переворачивания строки).
Для функции bin2hex обратная функция - hex2bin.
Для функции base64_encode обратная функци - base64_decode.
Немного преобразуем код и запускаем скрипт.

Получаем секретное значение, которое необходимо ввести: oubWYf2kBq.
Вводим и получаем пароль.

Пароль: W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl
Десятое задание (Natas Level 9).
ссылка: http://natas9.natas.labs.overthewire.org/index.php
пароль: W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl
Опять форма, но немного другая и возможность просмотра исходного кода.

Смотрим код.

Видим, что если мы ввели какое-либо значение, то оно подставляется в функцию - passthru (http://php.net/manual/en/function.passthru.php).
Данная фукнция производит вызов системной утилиты grep, которая производит поиск вхождений некоторого заданного шаблона в тексте файла. Так как происходит вызов системной утилиты и на строку вызова мы можем повлиять, появляется подозрение в RCE (Remote Code Execution), то есть возможность удалённого выполнения кода (команд). Попробуем определить папку, в которой находимся.

Видим, что наша команда сработала, из-за того, что мы закрыли команду grep с помощью символа точки с запятой.
Теперь нужно вспомнить задание Natas Level 7, в котором нам дали путь расположения пароля для пользователя следующего уровня (/etc/natas_webpass/natas8). Попробуем просмотреть папку /etc/natas_webpass/ на наличие там паролей для следующих уровней.

Видим, что в данной папке все пароли для всех уровней. Попробуем прочитать пароль для следующего уровня (natas10).
Команда: ; cat /etc/natas_webpass/natas10

Получаем пароль: nOpp1igQAkUzaI1GUUjzn1bFVj7xCNzu
Итак, 6-10 задания - решены, ожидайте следующих решений (они будут).