作者:李安@星闌科技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


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1984/