25 Июля, 2014

Учим провайдер пинговать

Bo0oM

Привет %username%.


Некоторое время назад была найдена прикольная бага на сайте Ростелекома, а именно произвольное выполнение команд операционной системы. На одном из сайтов провайдера была такая штука как ping и traceroute удаленного узла, но не фильтровались юзерские данные. Ну не сложилось у ростелекома с пингом, не на роутерах, не на сайтах.


ростелеком 300x258 Учим провайдер пинговать


Как эта хрень работает? А просто php скрипт выполняет команду ping $сайт и выводит ответ на страницу. Но дело в том, что вместо команды можно записать список команд.


Список команд — это последовательность команд, разделенных точками с запятой ; , амперсандами & , символами «и-если» && или «или-если» || .


Как раз точка с запятой вызывает последовательное выполнение предыдущей команды. Поэтому если указать в качестве сайта ya.ru;echo 123 — выполнятся две команды, пропингуется яндекс и выведется число 123.

Вот, можешь даже глянуть небольшой видос.



Таким образом пара команд, а именно ls -l, чтобы показать листинг директорий и файлов (и права на них), и echo "злой-злой-код" >> /tmp/shell.php, чтобы записать шелл в доступный для записи каталог. А каталогов там было несколько, tmp, font и i.


rostelecom 300x115 Учим провайдер пинговать

Знай свои права


А это ещё один минус, неправильные права от пользователя 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’а стара как смерть и под нее много различных эксплойтов.


rostelecom2 300x72 Учим провайдер пинговать

searchsploit, а найди-ка мне эксплойты


В итоге я поместил сплойт, который имел расширение *.c в папку /tmp/ и скомпилировал его командой

gcc sploit.c -o exploit

где sploit.c имя входного файла, а exploit — выходного. Теперь, чтобы запустить его достаточно выполнить ./sploit, что я и сделал. И у меня нахрен всё повисло.


rostelecom sploit 300x223 Учим провайдер пинговать

Эксплойт на повышение привилегий


Возможно, это из-за криворукости, но сплойт повис, пришлось убить его и попробовать другой. Другой не захотел компилироваться (возможно там были намеренные ошибки, даже не смотрел), другой не захотел работать, в итоге был найден тот самый, который дал мне права root и я удалил все к херам исправил уязвимость отфильтровав эти спецсимволы. Потом я в базе нашёл чувака среди админов, чья почта была на mail.ru, узнал его имя и дату рождения, нашёл в vk.com, постучался в личку, мы чутка пообщались и шелл был удалён. А опыт остался icon wink Учим провайдер пинговать

Такой вот пятничный пост, %username%. Не болей!


Учим провайдер пинговать данный пост отсюда: Bo0oM.ru