Привет %username%.
Некоторое время назад была найдена прикольная бага на сайте Ростелекома, а именно произвольное выполнение команд операционной системы. На одном из сайтов провайдера была такая штука как ping и traceroute удаленного узла, но не фильтровались юзерские данные. Ну не сложилось у ростелекома с пингом, не на роутерах, не на сайтах.
Как эта хрень работает? А просто php скрипт выполняет команду ping $сайт
и выводит ответ на страницу. Но дело в том, что вместо команды можно записать список команд.
Список команд — это последовательность команд, разделенных точками с запятой ;
, амперсандами &
, символами «и-если» &&
или «или-если» ||
.
Как раз точка с запятой вызывает последовательное выполнение предыдущей команды. Поэтому если указать в качестве сайта ya.ru;echo 123 — выполнятся две команды, пропингуется яндекс и выведется число 123.
Вот, можешь даже глянуть небольшой видос.
Таким образом пара команд, а именно ls -l
, чтобы показать листинг директорий и файлов (и права на них), и echo "злой-злой-код" >> /tmp/shell.php
, чтобы записать шелл в доступный для записи каталог. А каталогов там было несколько, tmp, font и i.
А это ещё один минус, неправильные права от пользователя daemon. Вот зачем скрипту, который делает пинг, возможность записи файлов?)
Ну поржали, а багу что-то не фиксят и не фиксят. Я писал в службу поддержки, создавал обращение, писал на support по почте, а реакции (тем более ответа) нет… В итоге я залил шелл, нашел админов в базе данных (баз было много), написал им на почту. Тишина. Ну что делать, нужно исправлять.
Теперь нужно было найти уязвимый код, почему-тоPя думал что там будет system() илиPexec(), а оказалось, что зло таилось в функции popen().
$ip = $_POST['ip'];
if (isset($_POST['tracert'])) {
$cmd = '/bin/traceroute';
}
if (!empty($cmd)) {
$f = popen("$cmd $ip", 'r');
while (!feof($f)) {
$buf .= fgets($f);
}
pclose($f);
}
Но вот незадача, редактировать-то нельзя! В руках у нас web-shell, linux с ядром 2.6.9 и уязвимый скрипт. Что будем делать?
А будем повышать привилегии. Благо версия kernel’а стара как смерть и под нее много различных эксплойтов.
В итоге я поместил сплойт, который имел расширение *.c в папку /tmp/ и скомпилировал его командойgcc sploit.c -o exploit
где sploit.c имя входного файла, а exploit — выходного. Теперь, чтобы запустить его достаточно выполнить ./sploit, что я и сделал. И у меня нахрен всё повисло.
Возможно, это из-за криворукости, но сплойт повис, пришлось убить его и попробовать другой. Другой не захотел компилироваться (возможно там были намеренные ошибки, даже не смотрел), другой не захотел работать, в итоге был найден тот самый, который дал мне права root и я удалил все к херам исправил уязвимость отфильтровав эти спецсимволы. Потом я в базе нашёл чувака среди админов, чья почта была на mail.ru, узнал его имя и дату рождения, нашёл в vk.com, постучался в личку, мы чутка пообщались и шелл был удалён. А опыт остался
Такой вот пятничный пост, %username%. Не болей!
Учим провайдер пинговать данный пост отсюда: Bo0oM.ru