在本文中,我们将为读者详细介绍攻击者是如何滥用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组件存在被滥用的安全隐患,所以,我们一定要引起足够的注意。我们希望,读者在阅读这篇文章后,能够加强这方面的安全认识;同时,我们还提供了一款免费的扫描攻击,来帮助大家发现这种潜在的安全隐患。

译文声明

译文仅供参考,具体内容表达以及含义原文为准。

戳“阅读原文”查看更多内容

visualstudio开始调试不执行_攻击者是如何滥用msvsmon和Windows远程调试器的相关推荐

  1. antd confirm如何隐藏ok按钮_操作系统如何保护重要文件,Windows 7资源管理器设置隐藏文件夹...

    今天介绍操作系统如何保护重要的文件,Windows 7资源管理器设置隐藏文件夹.小伙伴们在日常工作中使用计算机,或多或少有一些重要的.私密的文件和文件夹,如何避免让其他未经许可的人看见呢?小伙伴们可能 ...

  2. Java 启动和停止界面_一文详解各种花里胡哨的Java调试技巧,多图预警,记得收藏...

    欢迎关注专栏<Java架构筑基>--专注于Java技术的研究与分享! Java架构筑基​zhuanlan.zhihu.com Java架构筑基--专注于Java技术的研究与分享! 后续文章 ...

  3. cassss服务未启动_不要再本地启动项目调试了,试SpringBoot远程调试你会发现新大陆!...

    前言 上周末一个朋友庆生,无意间听他说起了近况,说公司项目太多了,每天一堆BUG需要修复,项目来回切换启动,真是挺烦的. 随着项目越来越多,特别是身处外包公司的朋友,每天可能需要切换两三个项目,难道一 ...

  4. VS2008远程调试简介

    VS2008远程调试简介 先说明两个概念: 1. 目标机:远程需要调试的机子,也就是被调试程序exe所在的机子,该机子可以安装VS2008或者不安装vs2008: 2. 调试机:安装VS2008的机子 ...

  5. Linux下Debug模式启动Tomcat进行远程调试

    J2EE开发各类资源下载清单,  史上最全IT资源,点击进入! 一.      应用场景 在实际的测试过程中,可能会遇到由于程序执行的不间断性,我们无法构造测试场景来验证某个功能的正确性,只有通过代码 ...

  6. 惊呆了!Spring Boot 还能远程调试?

    目录 前言 什么是远程调试? 为什么要远程调试? 什么是JPDA? 如何开启远程调试? transport server suspend address onthrow onuncaught laun ...

  7. 如何为 Python 添加远程调试能力而不修改系统代码

    最近写了一些关于 Python 远程调试的扯淡向博文,第一篇是「远程调试你的 Python 代码」,第二篇是「使用 VS Code 远程调试 Python 程序」.前些日子开了一个叫做「第八个手艺人」 ...

  8. IDEA 13 tomcat 进行远程调试

    为什么80%的码农都做不了架构师?>>>    1.设置远程tomcat 的 bin/catalina.sh (linux 系统下,win系统下,就修改catalina.bat)文件 ...

  9. VS.net中的远程调试

    简介: 我们开发完一个软件后,提交给客户或者放到服务器上执行,如果有问题,我们可以使用远程调试进行发现bug. 这篇文字简单介绍一下远程调试. vs.net远程调试服务 在vs.net的安装目录下,有 ...

最新文章

  1. ci持续集成工程师前景_持续集成CI---失败原因
  2. python中循环迭代语句_python条件与循环-循环
  3. IO概述(概念分类)
  4. 【离散化】【差分】幻灯片(jzoj 1609)
  5. python打开文件_用Python(in PsychoPy)打开SPSS数据文件
  6. win7文件和文件夹可以重名吗_Win7下如何重命名,替换System32文件夹下的系统文件...
  7. 三星Galaxy A70s现身GeekBench数据库:搭载6400万像素传感器
  8. 如何为团队选择有用的增量进度衡量标准
  9. RHEL6/7 x86_64下cachefilesd占用cpu达到100%
  10. 任意文件夹下打开cmd窗口
  11. Java调用大华车牌识别摄像头_第三方软件调用大华网络摄像头监控
  12. 博途V15添加GSD文件
  13. 手机号码或账号查询支付宝名字和性别
  14. 一文读懂随机森林的解释和实现(附python代码)
  15. SNN综述(1):深度脉冲神经网络
  16. 毕设 电脑维修_入库出库结算论文
  17. 全站仪坐标计算机公式,全站仪测量时,坐标n,e,z如何对应于图形坐标x,y,z?...
  18. 计算机专业教师资格证考什么内容,计算机教师资格证需要考什么?信息技术教师资格证考试内容...
  19. GPS的相关指标的意思
  20. extern与static

热门文章

  1. 对信噪比SNR、EbN0、EsN0的个人详细理解
  2. SSH登陆慢的原因分析及解决
  3. Greenplum failed segment的恢复方法
  4. 在HP安腾服务器上安装SuSE Linux Enterprise Server(SLES)11SP1手记
  5. 设计模式之【抽象工厂模式】
  6. 谷歌浏览器安装POSTMAN
  7. 图的理解:深度优先和广度优先遍历及其 Java 实现
  8. cocos2x (c++/lua) spine 文件的预加载
  9. SharePoint:扩展DVWP - 第3部分:把DVWP的功能链接放在同一行中
  10. .NET CF WM上创建快捷方式