攻击者是如何滥用msvsmon和Windows远程调试器的

阅读量    96261 |

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

 

在本文中,我们将为读者详细介绍攻击者是如何滥用msvsmon和Windows远程调试器的

 

简介

让无人值守的msvsmon.exe(远程调试器监视器)处于“无需身份验证”模式是一种非常危险的做法。与任何调试器一样,msvsmon.exe也可以根据来自网络的请求启动进程。攻击者可以利用msvsmon.exe的这个特性展开秘密行动,特别是当msvsmon.exe在具有很高的权限的帐户下运行时。同时,攻击者还可以将其用作后门,以便在攻陷机器后维持其访问权限。也就是说,msvsmon.exe不仅是一个带有Microsoft签名的应用程序,同时还能用于启动和操作进程,因此,攻击者可以将其用作隐藏恶意活动的方便工具。

除此之外,我们还将在这篇文章中为读者介绍远程调试功能及其内部机制,并演示如何将其转化为红队的一个新工具。最后,我们将分享一个工具,用于检测组织中运行的msvsmon.exe程序的危险实例。

 

Visual Studio远程调试器中的msvsmon.exe

为了便于调试部署在远程计算机上的应用程序,Microsoft Windows SDK提供了远程调试功能。并且,该远程调试解决方案的组件之一就是msvsmon可执行文件:一个在远程计算机上运行的应用程序,用于监听网络并充当本地调试器。实际上,msvsmon.exe的角色与Linux gdbserver非常相似。msvsmon工具可以从开发人员计算机上运行的Visual Studio实例那里接受命令,处理本地调试事件并与Visual Studio进行交互。

然而,与所有便利性一样,远程调试的强大功能也是以安全性为代价的,因为让远程调试器监听网络会带来安全隐患。为了防止该功能被攻击者所利用,Microsoft向该监视器添加了身份验证(默认情况下是启用的),并对某些调试核心组件的导出函数名进行了模糊处理:

这些措施虽然有一定的作用,但还是无法做到万无一失。尽管身份验证是基于Windows身份验证的,但仍然会让事情变得繁琐。为了让调试更简单,开发人员有时会禁用身份验证。值得一提的是,身份验证还允许对调试器和调试器之间的网络流量进行加密。

 

msvsmon是如何危及系统安全的

对于msvsmon.exe的恶意用法,至少有两种:一是用作横向移动工具,二是用作后门工具。

对于第一种用途,攻击者在获得对网络中计算机的访问权限后,可以扫描网络,寻找正在运行的msvsmon.exe实例。一旦找到,攻击者就可以利用该实例启动一个LOLBin进程,以便在网络中进一步发动攻击。

对于第二种用途,攻击者可以把msvsmon用作远程shell。由于msvsmon是一个可移植的应用程序,因此,攻击者可以将其植入到被攻陷的计算机上,并且与Mshta、WScript和其他lolbin结合起来,从而提供一种远程执行命令的方便方法。在这种情况下,恶意脚本的代码可以作为参数传递,从而实现无文件型的命令执行。

在启动时向应用程序传递以下参数有助于对用户隐藏msvsmon.exe的行踪:

/noauth, /anyuser, /nosecuritywarn, /nowowwarn /silent, /timeout:2147483646

此外,由于msvsmon是一个调试器,它可以通过网络操纵debuggee进程,从而让远程攻击者能够完全控制运行中的进程,包括操纵内存和线程。因此,即使是一个由msvsmon启动的合法进程,也可能被攻击者“偷梁换柱(hollowed)”,从而变成攻击者的帮凶。

 

SOAP与远程调试器的重要性

我们知道,调试服务器是使用SOAP协议进行通信的。并且这里的服务器是由多个msvsmon.exe实例组成的,其中一个实例提供有SSDP网络发现功能,使debuggee主机对客户端可见。另外,还有实例还托管了vsdebugeng.dll库,其中包含SOAP服务器的实现。同时,vsdebugeng.dll库也实现了SOAP客户端并被加载到Visual Studio实例中。

每当开发人员选择远程调试选项并按下F10键时,Visual Studio就会使用vsdebugeng.dll中的一个名称已经过混淆处理的函数与调试服务器进行通信,从而触发被调试进程的执行,并处理来自远程进程的调试事件。

下面是SOAP网络交互的示意图:

在Wireshark视图中,SOAP请求看起来非常混乱:

幸运的是,我们能够以更具可读性的格式记录和查看SOAP协议。为此,只需在EventViewer中为WebServices启用分析和调试日志功能,这样就会生成可直接通过EventViewer查看的XML日志:

为了证明第三方软件使用调试服务器的可能性,我们对该协议进行了深入的研究,并创建了一个自定义客户端来指示服务器启动和恢复进程。这个客户端首先会触发mshta.exe的执行,而mshta.exe则会运行作为参数传递给它的JScript代码。因此,这实际上就是一个真正的后门工具,可以用来控制远程计算机。

当然,这里的调试协议是相当复杂的。它不仅包含了许多数据结构,还实现了大量的SOAP请求。虽然我们确实发现了其中的一些请求,但这些仅仅是远程调试的冰山一角。首先,该服务器使用了多种类型的SOAP请求,其中最重要的是从服务器发送或查询信息,并处理来自服务器的请求(回调)。在创建进程的过程中,最值得注意的阶段为:初始化、设置配置和启动阶段。当然,每个阶段都是由客户端发起的SOAP请求所触发的。由于msvsmon是一个调试器,它会在CREATE_SUPANDED标志为on的情况下启动进程,因此,需要通过Resume请求让进程继续运行。

 

如何防止远程调试器被滥用

考虑到msvsmon远程调试组件被误用和滥用的可能性,必须加强开发人员的网络安全意识。

首先,严禁在身份验证关闭的情况下运行调试服务器。通过将远程管理用户的凭据添加到本地凭据存储器(Windows凭据管理器最初是在Windows Vista版本中引入的),可以创建简单的身份验证设置。Windows凭据管理器不仅可以用于存储网站、应用程序和网络连接的凭据,同时,它对于远程调试来说也非常有用。例如,如果目标计算机名为“DEBUGGEE”,管理用户为“dbg”,那么只需将DEBUGGEE\dbg条目和密码添加到凭据管理器就行了。有关凭据管理器API的详细信息,可以在这里找到。

接下来,在Visual Studio中将调试配置的“Connection”属性设置为“Remote with Windows authentication”,并在目标计算机上运行调试服务器。现在,基于身份验证的调试设置就准备好了。

 

如何扫描不安全的调试服务器

为了帮助查找网络中不安全的调试服务器,我们发布了一个相应的扫描程序,它可以向操作系统中的所有适配器广播SOAP探针请求,并处理运行中的调试服务器的回复。在默认情况下,msvsmon.exe会使用标准WebServices发现UDP:3702端口(有关调试器端口分配的更多信息,请参阅本文)。同时,msvsmon.exe还会使用配置描述符来回复探针请求,因为配置描述符能够配合其他设置来确定身份验证级别。该脚本的输出示例如下所示:

 

小结

远程调试运行在另一台机器上的应用程序的功能对于开发人员来说是一个非常有用的特性。但是,正如我们在本文中指出的,Visual Studio的远程调试器的msvsmon组件存在被滥用的安全隐患,所以,我们一定要引起足够的注意。我们希望,读者在阅读这篇文章后,能够加强这方面的安全认识;同时,我们还提供了一款免费的扫描攻击,来帮助大家发现这种潜在的安全隐患。

分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多