作者:李安@星闌科技PotalLab
原文鏈接:https://mp.weixin.qq.com/s/bbfFFczkycYCpRK0b7HeHg
漏洞描述
攻擊者可以向batch-requests插件發送請求來繞過管理API的IP限制。Apache APISIX的默認配置(帶有默認的API密鑰)容易受到遠程代碼執行的攻擊。當管理密鑰更改或管理API端口更改為與數據面板不同的端口時,影響較小。但是,繞過Apache APISIX數據面板的IP限制仍然存在風險。在batch-requests插件中有一個檢查,它用真實的遠程IP覆蓋客戶端IP。但是由于代碼中的一個bug,這個檢查可以被繞過。
batch-requests 插件介紹
batch-requests 插件可以一次接受多個請求并以 http pipeline (https://en.wikipedia.org/wiki/HTTP_pipelining) 的方式在網關發起多個 http 請求,合并結果后再返回客戶端,這在客戶端需要訪問多個接口時可以顯著地提升請求性能。
在漏洞版本中、默認是啟用狀態。
https://apisix.apache.org/zh/docs/apisix/2.12/plugins/batch-requests/
復現思路:
1、搭建漏洞環境。(注意需要修改:conf.yaml/allow_admin)
2、查看diff記錄、進行簡單調試,漏洞分析。
3、漏洞測試。
漏洞版本
Apache APISIX 1.3 ~ 2.12.1 之間的所有版本(不包含 2.12.1 )
Apache APISIX 2.10.0 ~ 2.10.4 LTS 之間的所有版本(不包含 2.10.4)
環境搭建
| 搭建方式 | Docker 搭建 | ||
|---|---|---|---|
| 版本號 | 默認端口 | 默認admin_key/用戶 | |
| Apache APISIX | apisix:2.12.0-alpine | 9080 | edd1c9f034335f136f87ad84b625c8f1 |
| Apache APISIX Dashboard | apisix-dashboard:2.10.1-alpine | 9000 | admin/admin |
環境搭建可以使用下面這個Github地址:
Github 地址 https://github.com/twseptian/cve-2022-24112/tree/main/apisix-docker
cd CVE-2022-24112-main/apisix-docker/example/
vi apisix_conf/config.yaml
將 allow_admin 修改為 127.0.0.0/24,此處修改的實際為nginx.conf。
使用 docker-compose 創建docker容器。
docker-compose -p apisixCveTest up -d
在服務啟動階段、會讀取config.yaml、生成nginx.conf 。
1、會基于 Lua 模板 apisix/cli/ngx_tpl.lua 文件生成 nginx.conf。(APISIX架構介紹:https://blog.csdn.net/alex_yangchuansheng/article/details/122053371)
2、調用 ngx_http_access_module 模塊。該模塊限制客戶端對某些地址的訪問。(nginx 模塊介紹:http://nginx.org/en/docs/http/ngx_http_access_module.html#allow)

進入到容器中查看,conf/nginx.conf。allow/deny 是設置允許與拒絕訪問的地址。只允許127.0.0.1/24 訪問 /apisix/admin 接口。

Admin api 接口如下:


漏洞分析
diff :
1.https://github.com/apache/apisix/pull/6254/commits/f5d44d1f58e0160132f009465e807f4093601a11
2.https://github.com/apache/apisix/pull/6251/commits/8f28aadc35362f417f89db505c18cd7f1d548c86
3.https://github.com/apache/apisix/pull/6204/commits/3d4b35b8e07f2c7cfcce7d7f56f24fad4e6e39de

查看diff記錄后、修復方式是將real_ip_hdr 轉化為小寫。
1、查看插件batch-requests 代碼,問題是出現在 set_common_header() 函數中

函數參數為data是我們傳入的請求體經過json.decode()后的數據、類型為"table"。

查看代碼,real_ip_hdr 為調用 try_read_attr()函數獲取到的返回值。通過遍歷表結構、獲取到 real_ip_header 的值然后再賦值給real_ip_hdr 。
select('#', ...) 獲取輸入參數的數量,
select(i, ...) 獲取第 n 個參數,


注意:此時的real_ip_hdr 為 X-Real-IP 為大寫。該值為在系統啟動后、給定的默認值。

2、通過遍歷data.pipeline和data.headers 、將data.headers 出現的頭信息賦值給data.pipline。發現data.headers中出現了x-real-ip:127.0.0.1 ,這是我們調用batch-requests插件傳遞的頭信息,而此時系統默認的X-Real-IP為大寫。

在請求頭覆蓋中、因為 real_ip_hdr 為 X-Real-IP , 函數core.request.get_remote_clinte_ip()獲取遠程客戶端ip、不能將 x-real-ip給覆蓋。

查看此時的棧數據。在data.headers 中出現了 x-real-ip 與 X-Real-IP。

最后經由batch-requests 插件、使用PUT方法將請求發送到 /apisix/admin/xxxx 注冊新的路由。通過filter_func 參數可寫入一段lua代碼、造成遠程代碼執行。

漏洞測試

利用條件
- batch-requests插件默認開啟狀態。
- 用戶使用了 Apache APISIX 默認配置(啟用 Admin API ,使用默認 Admin Key 且沒有額外分配管理端口),攻擊者可以通過 batch-requests 插件調用 Admin API 。
攻擊思路
1、利用batch-requests 插件漏洞、繞過請求頭檢測;
2、通過偽造請求頭、向Admin API 注冊路由;
3、注冊路由時、攜帶參數filter_func 傳遞 lua代碼、造成遠程代碼執行漏洞。
修復意見
1、更新至最新版本
2、禁用batch-requests 插件
參考材料
APISIX官網:https://apisix.apache.org/docs/apisix/2.12/getting-started/
APISIX Github:https://github.com/apache/apisix
漏洞環境:https://github.com/twseptian/cve-2022-24112
APISIX架構分析:https://blog.csdn.net/alex_yangchuansheng/article/details/122053371
漏洞發現:https://www.youtube.com/watch?v=yrCXamnX9No
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1984/
暫無評論