漏洞案例研究 ConnectWise ScreenConnect Authentication Bypass

最近 ConnectWise ScreenConnect 爆了 2 个漏洞(CVE-2024-1709 和 CVE-2024-1708),其中 CVE-2024-1709 是一个 Authentication Bypass 漏洞,CVSS 评分 10 分。Sophos 安全团队表示,勤劳的攻击者已经在第一时间利用这些漏洞来投递勒索软件。本文简单整理相关信息,作为漏洞案例研究系列的第一篇文章。

0x01. 为什么在这水文章

笔者最近的工作方向开始转向产品安全蓝军,当前主要工作包括:代码审计、安全攻防、垂类恶意软件检测。

一方面,代码审计和之前做二进制漏洞挖掘在思路上比较类似,最重要的熟知各种漏洞模式(或者说攻击面)。就好比 Integer Overflow,挖掘思路就是找到各个内存分配点,然后看参数是否是经过某些算术运算而来,最后是这些参数是否是攻击者可以控制的,其实也就是污点分析的思路。也不难理解漏洞模式其实类似设计模式,是一套总结出来的方法论。

另一方面,真正的 RCE 漏洞往往是攻击者最喜欢的漏洞,比如本文提到的 ConnectWise ScreenConnect Authentication Bypass 漏洞 CVE-2024-1709,以及去年还算比较火的 Citrix Bleed 漏洞 CVE-2023-4966,都被攻击者用来投递勒索软件,在 ATT&CK 框架中被归类为 Initial Access。而在黑市上,就有专门从事这类操作的组织,被称之为 Initial Access Broker(IAB),他们利用漏洞或者钓鱼等手段来获取各种系统的权限,然后将权限倒卖给其他组织(比如勒索软件团伙)。

鉴于此,笔者决定对这类漏洞进行简单的分析、整理和归类,以便日后在工作中作为参考。

0x02. CVE-2024-1709

在漏洞模式上,暂且将这个漏洞归类为 Setup Wizard 类型。

2.1 漏洞原理

Huntress 安全团队通过补丁对比分析,给出了漏洞的细节信息。

首先是 ScreenConnect\SetupWizard.aspx 的变化:

1a2
> <%@ Implements Interface="ScreenConnect.ISetupHandler" %>
5a7,14
>
> protected override void OnInit(EventArgs e)
> {
> base.OnInit(e);
>
> if (SetupModule.IsSetup)
> throw new InvalidOperationException("Already setup");
> }

此外,ScreenConnect\Bin\ScreenConnect.Web.dll 中,ScreenConnect.SetupModuleOnBeginRequest 变成了 OnPostMapRequestHandler,如下所示:

private void OnPostMapRequestHandler(object sender, EventArgs e)
{
HttpContext context = ((HttpApplication)sender).Context;
string text = context.Response.ApplyAppPathModifier(ConfigurationCache.SetupPage);
bool flag = context.Handler is ISetupHandler || // --> 新增条件
string.Equals(context.Request.Path, text, StringComparison.OrdinalIgnoreCase); // --> 之前可绕过
if (!ConfigurationCache.IsSetup)
{
if (!ConfigurationCache.AllowRemoteSetup && !context.Request.IsLocal)
{
throw new HttpException(403, "Application is in setup mode and is only accessible from local machine.");
}
if (!flag && Regex.IsMatch(context.Request.Path, ConfigurationCache.SetupRedirectFilter))
{
context.Response.Redirect(text);
}
}
else if (flag)
{
if (ConfigurationCache.AlreadySetupPage == null)
{
throw new HttpException(403, "Application is already setup.");
}
string url = context.Response.ApplyAppPathModifier(ConfigurationCache.AlreadySetupPage);
context.Response.Redirect(url);
}
}

可以看出,对于 SetupWizard.aspx 的访问,上面这段代码原本已经有了相关检查逻辑,但是对 URL Path 的判断在旧版本中是可以绕过的。因为 .NET 有个奇怪的特性:请求的 URL Path 后面竟然还可以附加额外的信息!

URL: http://www.contoso.com/virdir/page.html/tail
FilePath: /virdir/page.html
PathInfo: /tail
Path: FilePath + PathInfo = /virdir/page.html/tail

也就是说,context.Request.Path 可以是 /SetupWizard.aspx/literallyanything,因此访问 /SetupWizard.aspx/ 即可触发漏洞。在这个页面可以重新设置管理员账号密码,之后直接重置和覆盖原有的数据库。

2.2 类似漏洞

Drive-By Compromise: A Tale Of Four Wifi Routers 给出了一个路由器上的类似漏洞:路由器初始化设置页面(Setup Wizard)在已经设置过的情况下,无需授权仍然可以再次访问,因此可以通过钓鱼来实现管理员账号重置,比如受害者访问攻击者控制的网页时自动发送如下 HTTP 请求。

POST /cgi-bin/login.cgi HTTP/1.1
Host: 192.168.10.1
Content-Type: application/x-www-form-urlencoded
<HTTP headers redacted for brevity>

page=sysinit&newpass=<attacker-supplied password>

Trendnet AC2600 TEW-827DRU Multiple Vulnerabilities 也有一个 Setup Wizard 相关的漏洞案例:

Information Disclosure via Setup Wizard - CVE-2021-20150

Authentication can be bypassed and a user may view information as Admin by manually browsing to the setup wizard and forcing it to redirect to the desired page. The following is an example request:

POST /apply_sec.cgi HTTP/1.1
Host: 192.168.10.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 107
Origin: http://192.168.10.1
Connection: close
Referer: http://192.168.10.1/setup_wizard.asp
Cookie: compact_display_state=false
Upgrade-Insecure-Requests: 1

action=setup_wizard_cancel&html_response_page=client_status.asp&html_response_return_page=client_status.asp

通过 Setup Wizard 实现未授权访问特定页面。

0x03. CVE-2024-1708

这是一个 Zip 解压场景下的路径穿越漏洞。

ScreenConnect.Core.dll 补丁对比:

11057c11057
< public void ExtractAllEntries(string basePath)
---
> public void ExtractAllEntries(string basePath, string requireEntriesInMoreStringentPath = null)
11062c11062
< FileSystemExtensions.DemandInParentPath(basePath, text);
---
> FileSystemExtensions.DemandInParentPath(requireEntriesInMoreStringentPath ?? basePath, text);

ScreenConnect.Server.dll 补丁对比:

8392a8393
> DirectoryInfo extensionsDirectory = GetExtensionsDirectory();
8398c8399
< zipFile.ExtractAllEntries(GetExtensionsDirectory().FullName);
---
> zipFile.ExtractAllEntries(extensionsDirectory.FullName, extensionDirectory.FullName);

利用这个漏洞可以实现一层目录穿越,即插件 X 的文件,可以解压到插件 Y 的目录下,但不会穿越出大的插件目录 ScreenConnect\App_Extensions

0x04. 小结

两类漏洞:

  • Setup Wizard 未授权访问漏洞
  • Zip 解压路径穿越漏洞

0x05. 参考文档

  1. https://news.sophos.com/en-us/2024/02/23/connectwise-screenconnect-attacks-deliver-malware/
  2. https://attack.mitre.org/tactics/TA0001/
  3. https://www.huntress.com/blog/a-catastrophe-for-control-understanding-the-screenconnect-authentication-bypass
  4. https://learn.microsoft.com/en-us/dotnet/api/system.web.httprequest.path?view=netframework-4.8.1
  5. https://blog.includesecurity.com/2021/09/drive-by-compromise-a-tale-of-four-routers/
  6. https://www.tenable.com/security/research/tra-2021-54
请作者喝杯咖啡☕