VNC概述
VNC 包括一个服务端和一个客户端。服务端运行在被控制的机器上,而客户端运行在远程用户的机器上。服务端将其屏幕内容分享给客户端,而客户端则可以发送键盘和鼠标事件给服务端。
颜色和编码
VNC 可以在不同的颜色深度下工作,例如 8-bit, 16-bit, 或 24-bit。这允许它适应不同的网络条件。它使用多种编码方法来传输屏幕数据,从原始像素数据到高度压缩的数据。常见的编码包括 Raw, CopyRect, RRE, Hextile, Tight 等。
帧缓冲区 (Frame Buffer)
VNC 的核心是帧缓冲区,它是计算机内存中的一个区域,用于存储屏幕上每个像素的颜色值。服务端定期检查这个帧缓冲区,看是否有任何变化,并将这些变化发送到客户端。
当服务端检测到帧缓冲区的变化时,它将这些变化编码并发送给客户端。客户端接收到这些更新后,会解码并在其屏幕上显示。
VNC 的工作原理是基于远程帧缓冲区的。服务端将其屏幕的变化发送给客户端,而客户端则可以发送输入事件给服务端。这种简单但强大的方法使 VNC 成为了一个流行的远程桌面解决方案。
输入事件
客户端可以发送键盘和鼠标事件给服务端。当用户在客户端上按下一个键或移动鼠标时,这个事件会被发送到服务端,服务端接收到后会做出相应的响应,比如移动光标或打开一个程序。
编码
为了有效地传输屏幕更新,VNC 使用了多种编码方法。常见的编码包括 Raw (原始像素数据), CopyRect (用于复制矩形区域), RRE (Rise-and-Run-length Encoding), Hextile 和 Tight。这些编码方法的目的是减少需要传输的数据量,从而提高性能。
状态无关性
VNC 是状态无关的,这意味着客户端和服务端之间没有持续的连接。如果连接断开,客户端可以重新连接并继续从上次断开的地方开始。
HiddenVNC
隐藏的 VNC 是针对银行欺诈问题的创造性解决方案。多年前,当欺诈行为并不常见时,大多数银行仅进行基本的 IP 或地理位置检查,以便在有人从另一台计算机登录时标记或阻止帐户。为了解决这个问题,银行木马会在受害者计算机上运行 SOCKS 代理服务器,从而允许欺诈者使用相同的 IP 访问受害者的银行帐户。随着欺诈变得更加突出,银行开始提出专有的欺诈检测系统,该系统使用各种检查(浏览器、操作系统/插件版本、区域设置、时区等)对用户系统进行指纹识别。这些系统的黑盒性质要求欺诈者几乎复制受害者的系统配置,以确保帐户不会被阻止,因此必须找到更方便的欺诈方法,该方法当然是 VNC。欺诈者可以通过 VNC 进入受害者的计算机并使用它登录他们的银行帐户,但显然这并不理想。如果受害者正在使用计算机,他们就会看到欺诈者在做什么,如果没有,计算机可能会被关闭。我们需要的是某种 VNC 软件,允许欺诈者在受害者使用系统的同时离散地访问系统。
隐藏桌面 恶意软件可以利用一些鲜为人知的Windows功能(例如CreateDesktop和跨进程窗口子类化)来实现VNC运行的隐形环境。正如大多数 Linux 用户可能熟悉的那样,许多发行版都能够运行多个具有独立任务栏的同步桌面。自 2000 年以来,Windows 就具备了创建多个桌面的能力,但这并不是一个众所周知的功能,也没有默认的应用程序可以使用它。通过调用CreateDesktop,软件可以创建隐藏桌面并在桌面上下文中执行应用程序。在隐藏桌面上运行的所有应用程序对于其他桌面(即受害者正在使用的桌面)来说都是不可见的,它们甚至不会显示在隐藏桌面之外的任务栏中。听起来很简单,对吧?
屏幕截图 大多数 VNC 软件的工作原理是定期获取屏幕截图并将其发送回客户端;但是,Windows 不会将任何 GUI 元素渲染到不活动的桌面(当前显示在显示器上)。人们不能简单地捕获隐藏桌面的屏幕截图,相反,VNC 服务器必须调用 EnumDesktopWindows 来获取隐藏桌面上运行的窗口列表,然后在每个单独的窗口上调用 PrintWindow,将它们写入反向 Z 位图-顺序(从最底部的窗口开始,一直到最顶部)。本质上,服务器只是通过将每个单独的窗口呈现为与屏幕上出现的顺序相反的位图来模拟屏幕截图功能。
不幸的是,某些应用程序无法正确处理 WM_PRINT 或 WM_PRINTCLIENT 消息(由 PrintWindow 发送),因此应用程序的全部或部分将显示为白色矩形。
为了解决这个问题,VNC 服务器需要代表应用程序实现 WM_PRINT 和 WM_PRINTCLIENT 消息,确保它将所有可见元素绘制到缓冲区。这可以通过将代码注入所有进程并挂钩 user32.dll 中的各种函数来完成,或者使用跨进程子类化使 VNC 服务器能够处理从 VNC 进程内发往目标应用程序的窗口消息。
用户输入 当涉及到用户输入时,服务器必须模拟虚拟键盘/鼠标,因为输入将被发送到活动桌面,而不是隐藏桌面。通常,当鼠标移动或单击时,VNC 客户端会将位置连同按钮单击事件一起发送到 VNC 服务器,VNC 服务器会将鼠标移动到给定位置并模拟单击,但因为真实的键盘和鼠标不能使用时,事情要复杂得多。VNC 服务器必须跟踪隐藏桌面上的每个窗口、它的位置及其 Z 索引;当发送单击事件时,服务器需要通过枚举每个窗口并检查其坐标和可见性来找到哪个窗口位于光标当前位置,然后使用 PostMessage 向其发送单击事件。对于键盘也是如此,VNC 服务器需要跟踪当前焦点所在的窗口,并使用 PostMessage 将输入定向到该窗口。
隐藏的 VNC 可能是最复杂的恶意软件功能之一,本质上需要编码人员实现自己的窗口管理器,这就是为什么在野外很少有独特的实现(大多数恶意软件使用单一的实现,简单地命名为 HVNC)。
原理
参考链接:https://www.mbsd.jp/blog/20180914.html
Windows 操作系统有一种机制,允许您在正常桌面(名为“默认”的桌面)之外自行创建新桌面。然而,还没有一种方法或手段可以让普通用户轻松创建。需要通过从程序调用创建新桌面的代码(Win32API)来显式创建新桌面。在新创建的桌面世界中,您可以像往常一样打开文件和文件夹并运行应用程序,但您将无法从我们通常看到的默认桌面世界中看到它。换句话说,如果攻击者用恶意软件感染用户的 PC,使用该恶意软件在用户的 PC 上创建新桌面,并在该桌面上执行恶意活动,用户将无法注意到。
Windows操作系统中的桌面及其结构
在使用Windows操作系统时,有一个我们每天都在使用但没有真正考虑过的系统称为“桌面”。它指的是我们熟悉的桌面,电脑启动时会显示图标和壁纸。
事实上,这个桌面的结构深得惊人,整体结构(轮廓)如下图。
图1 Windows操作系统及其周边结构
我们通常看到的桌面是“Session1”结构中WindowStation名称结构“WinSta0”中名为“Default”的桌面(准确地说是分配了一个大于1的数字)。
正如您从上图中看到的,不仅仅是一个桌面。还可以创建默认存在的特殊桌面,例如用于登录屏幕和屏幕保护程序的桌面,或有意创建新桌面。例如,当我们尝试运行一个需要管理员权限的程序时,我们会看到熟悉的“UAC”屏幕变黑,但实际上使用的是一个名为“Winlogon”的特殊桌面。
此外,与普通桌面分离的新创建的桌面将是一个空白的桌面屏幕,没有图标或任务栏,只显示壁纸。之所以什么也不显示,是因为资源管理器(Explorer.exe)没有启动,当启动“Explorer.exe”时,图标和任务栏就会像普通桌面一样显示。
此外,资源管理器启动后,您可以像常规桌面一样使用它,例如打开文件和文件夹以及显示窗口。
那么究竟如何创建新桌面呢?
实际上,并没有默认的方法供用户轻松创建。
您需要使用使用 Win32API(Windows 函数)的代码或使用外部免费工具来创建程序。
以下Win32API主要用于程序操作桌面时。
创建桌面:CreateDesktop
将桌面与自己的线程关联:SetThreadDesktop
切换桌面(移动到指定桌面):SwitchDesktop
获取桌面句柄:OpenDesktop
最重要的是,您可以使用函数 CreateDesktop 创建新桌面,并且可以通过调用函数 SwitchDesktop 以编程方式切换活动桌面。
如果您想在不使用免费工具等的情况下创建并使用新桌面,则需要使用这些 Win32 API 创建程序,但在移动到新桌面后很难意外添加返回原始桌面的代码。如果您忘记了,则在重新启动电脑或注销之前您将无法再次返回到原始桌面,因此您需要非常小心。
请注意,各个桌面之间存在限制,无法枚举(查看)每个桌面内创建的窗口(参见下图)。
图3 存在一个限制,即无法在不同桌面之间枚举窗口。
还有一些威胁利用了这一点。稍后会详细说明,但例如,即使攻击者通过网银恶意软件使用的 HiddenVNC(hVNC)在用户的隐藏桌面上打开各种窗口,攻击者也可以在用户的隐藏桌面上打开各种窗口(使用工具等)。基本上不可能枚举它们(尽管有可能干扰该过程)。
另外,一般来说,WindowStation 与进程绑定,而 Desktop 与线程绑定。
换句话说,在一般应用程序中创建的新窗口(无模式窗口:允许您操作同一应用程序的其他窗口而无需关闭顶部显示的窗口的窗口)被创建为单独的线程。 “在“Desktop 2”端创建一个新窗口(线程)。
利用这一点的威胁之一是勒索软件“Tyrant”,稍后将详细讨论。
另外,为什么Windows不提供一种机制让一般用户轻松处理这个桌面扩展功能,而另一方面MSDN上却公布了一系列用于创建新桌面(扩展桌面)的Win32 API呢?我只是猜测至于是否存在,但例如,您可能希望只能访问商店中的 PC 上的特定应用程序,或者您可以创建一个显示与普通桌面隔离的窗口的游戏。如果有的话,可能是它允许开发者开发各种用途的应用程序。(稍后将详细讨论,Windows 10 提供了另一个类似的功能,称为虚拟桌面,用户可以轻松使用。)
■潜伏在桌面上的威胁① – 勒索软件事件 –
“勒索软件”和“屏幕锁”(参考:https://www.mbsd.jp/blog/20171018.html)正拼命地试图利用各种方法向用户暴露威胁信息。如果用户不仔细查看威胁信息,就无法达到勒索钱财的目的,攻击者就会失去攻击的意义。(当然,也有不限于此的类型,比如以自我毁灭为目的的“擦拭者”。)
我们简要总结了勒索软件和屏幕锁如何尝试显示威胁消息,以及它们呈现这些威胁消息的方式。
●多种威胁画面呈现方式
我们将介绍勒索软件和屏幕锁所使用的各种威胁屏幕呈现方式,分为六大类。
1)使用文本文件和图像文件的方法
这是常用的方法之一。感染后,此类病毒会加密文件并创建包含威胁消息的文本文件或图像文件,并将其显示在默认应用程序中。
2)使用壁纸的方法
一旦被感染,它会将电脑的壁纸设置更改为带有威胁信息的图像。在上述方法1)中,使用的是与显示文本和图像相关的通用应用程序,因此用户可以轻松地终止它,并且如果威胁消息被关闭,则用户可以 虽然这确实使得检查威胁消息变得有点困难。该技术使威胁信息出现在整个壁纸上,使用户在任何情况下使用电脑时都很难看到威胁信息,有可能暴露在他人的眼睛中。
3) 使用windows的方法
当被感染时,会显示一个窗口,并在窗口中写入一条威胁消息。在这种情况下,窗口通常具有以下属性。
没有标题栏
在任务栏上不可见
无法移动(鼠标移动和点击处理被禁用)
最大化状态(全屏占据屏幕)
如果您创建一个包含所有这些元素的窗口,乍一看,它看起来就像是在屏幕上粘贴了一个图像(威胁性图像)。使用窗口的优点是它允许交互式交互,例如让用户输入信息或按下按钮,并且还允许动画(例如直到付款截止日期的时间限制的倒计时显示)和华丽的效果。这使得可以向用户传达情况更加紧急的信息。
4) 使用浏览器的方法
一旦被感染,病毒就会在现有浏览器中打开包含准备好的威胁消息的 HTML 文件或包含威胁消息的 URL。
在这种情况下,可以将以下属性分配给浏览器。
最大屏幕显示
没有标题栏
在任务栏上不可见
这还包括使用合法进程“MShta.exe”和 HTA 文件的情况。HTA 文件对于攻击者来说可能更方便,因为它们允许更灵活的窗口控制。
使用浏览器的优点是可以轻松动态更改勒索目的地和联系信息。
5) 使用引导区的方法
一旦感染,该病毒会重写系统盘(硬盘)的引导区,当引导区被重写的受感染电脑重新启动时,会显示写入引导区的威胁信息。由于威胁文本是在Windows操作系统启动之前显示的,因此感觉更像是PC被劫持了,可以说影响更大。然而,由于受感染的PC变得无法使用,与其他方法相比,很难使用用户的PC执行支付操作和联系用户,这对攻击者来说可能是一个劣势。
6) 如何使用新创建的桌面
最后一项技术将是本文的主题。
这是一种创建与现有桌面不同的单独桌面并在新桌面上显示威胁屏幕的方法。这是从多个角度呈现威胁信息的有效方法,下面我们将介绍并解释第六种技术。
如何呈现威胁性文字来创建和使用新桌面
让我们更深入地研究一下这个方法。
这里我们以名为“Tyrant”的勒索软件为例来解释它的工作原理。
一旦被感染,Tyrant会执行以下操作来创建新的桌面:
首先,使用名为 GetThreadDesktop 的 Win32API 临时保存(备份)有关当前桌面的设置信息。接下来,使用 CreateDesktop 创建一个新桌面。这只会在现有桌面后面创建一个新桌面,因此使用 SwitchDesktop 激活新创建的桌面,并使用 SetThreadDesktop 将当前程序的线程与新创建的桌面关联起来。
这一系列操作将激活一个由“暴君”控制的新桌面。然后“暴君”创建并显示一个显示威胁文本的窗口。下图是一个清晰的表示。
由于上述原因,用户看到的桌面(以下简称活动桌面)将如下所示:
此时,会出现一个带有暴君勒索窗口的新桌面,用户无法再访问原来的桌面。(如上所述,“Explorer.exe”没有在新创建的桌面上运行,因此不会显示任何图标或任务栏。)
在这种情况下,“土豪”的主进程存在于原来的默认桌面端,而上面显示的威胁屏幕是“土豪”主进程创建的一个“窗口”。
这意味着概念如下。
从上图中可以看出,“土豪”创建的窗口跨越了不同的桌面,而根据上述桌面之间存在的限制,“土豪”的勒索屏幕窗口可以从默认桌面查看。无法枚举信息。换句话说,例如,如果有一种安全产品可以根据窗口信息检测欺诈行为,那么就有可能绕过该检测。
Tyrant 这种使用扩展桌面的恐吓技术对攻击者来说有以下优点(对用户来说则有缺点)。
首先,新桌面是空白的,无法启动任何调查工具或应用程序。(由于资源管理器未运行,因此无法打开文件和文件夹。)因此,在限制用户可以进行的操作的同时,可以在威胁屏幕上自由地进行鼠标操作和按键输入,反过来又允许攻击者进行支付等必要的用户操作。
此外,即使安全软件能够删除勒索软件,在电脑重新启动之前也不会恢复原来的桌面。程序创建的桌面即使在程序退出后也不会消失,因此除非显式调用返回默认桌面的进程,否则用户将无法返回到原来的桌面,这可能会给用户带来混乱。
同样,从研究人员的角度来看,即使有一个工具可以枚举默认桌面上的窗口,该工具也无法枚举(理解)该勒索软件(屏幕锁)的窗口。你不能。这是因为,如上所述,存在一个限制,即不同桌面不能访问彼此桌面上的窗口信息。
综上所述,可以说,从各个角度来看,这种创建新桌面的方法都是最有效的勒索软件(屏幕锁)威胁技术之一。
■隐藏在桌面上的威胁② – 网上银行恶意软件案例研究(HiddenVNC) –
网上银行恶意软件是利用新创建的桌面的另一个主要威胁。网上银行恶意软件是一类持续隐藏在受感染的PC上,通过计时用户使用网上银行的时间来窃取密码、ID等登录信息等欺诈操作的恶意软件,其使用模块(组件)的类型有很多种。远程控制受感染的电脑。(*HiddenVNC是未经授权的模块,是开源远程控制软件VNC的修改版本,与常规VNC不同。)
使用普通的VNC(远程控制软件)时,鼠标和窗口的移动在操作侧和被操作侧之间是联动的,因此很明显正在执行远程控制,但是当使用名为HiddenVNC(hVNC)的模块时,即使如果遥控器端打开窗口或启动程序,则遥控器端屏幕不会出现任何变化。换句话说,可以在受感染 PC 前的用户不知情的情况下远程控制受感染的 PC。事实上,这就是本文重点介绍的隐藏桌面机制的用武之地。
使用 HiddenVNC 时最具威胁的情况之一是用户使用浏览器时。这是因为登录会话可能在相同的浏览器之间共享,即使它们位于不同的桌面上。例如,假设用户访问通常需要在默认桌面上的浏览器中登录的站点。此时(假设计算机已经感染了HiddenVNC),攻击者同时在隐藏桌面上启动相同类型的浏览器(例如,IE for IE)并访问同一站点。然后,攻击者无需知道(或输入)登录 ID 或密码即可登录该站点。
经笔者验证,当使用2013年左右的旧版HiddenVNC时,大多数现代浏览器都有某种对策,无法在两个桌面上启动同一个浏览器。 2016年后新开发的HiddenVNC,可以在除Edge之外的主流浏览器中,甚至在用户较多的国内主流浏览器中,在默认桌面和隐藏桌面上同时启动同一个浏览器,我们实际已经确认登录会话在多个网站上共享。
当使用这种方法时,用户的浏览器不再掌握在别人手中,而不是在交易过程中恶意软件介入的欺诈活动(如 MITB,它将恶意代码注入浏览器)。由于是手动操作,乍一看几乎无法区分用户和攻击者,准确区分极其困难。
以下是网银恶意软件等使用的HiddenVNC(hVNC)的部分代码,该代码是HiddenVNC(hVNC)用来在受感染PC(即用户端)上创建隐藏桌面的核心代码。
下面来自 HiddenVNC (hVNC) 的代码在受感染的 PC 上创建一个新桌面,并在新桌面上启动 Explorer.exe 进程。由于除非Explorer运行在桌面上,否则无法远程进行文件操作,因此认为显式启动了Explorer进程,HiddenVNC(hVNC)的开发者通过远程控制Explorer来实现文件操作,您可以在这里阅读意图。
请注意,即使使用 CreateDesktop 函数创建新桌面后,也根本不会调用 SwitchDesktop 函数,因此活动桌面不会发生变化,用户也不会注意到。换句话说,用户在执行这些操作时无法注意到。
此外,当使用 HiddenVNC (hVNC) 远程控制 PC 时,我们了解到由于使用了隐藏桌面,用户无法看到正在操作的屏幕。
那么,为什么连接到受 HiddenVNC (hVNC) 感染的 PC 的鼠标和键盘的操作不受影响呢?即使可以使用隐藏桌面来隐藏窗口移动,鼠标光标等也会被共享,并在远程控制期间根据攻击者的操作同时移动。
其实这里用到了HiddenVNC(hVNC)一项鲜为人知的复杂技术。
●为什么不用动鼠标就可以远程控制HiddenVNC(hVNC)?
总之,HiddenVNC (hVNC) 使用一种技术,使其能够在受感染的 PC 上模拟鼠标光标操作的结果,而无需在受感染的 PC 上移动鼠标光标。
例如,假设攻击者在 VNC 查看器上移动鼠标并单击某处。
然后,HiddenVNC(hVNC)首先获取攻击者发来的鼠标点击坐标(aX,aY),并计算隐藏桌面坐标(bX,将坐标转换为bY)。然后,使用 PostMessage 函数向该坐标发送单击事件(单击命令)。这会导致 Windows 操作系统继续处理,假设与实际用鼠标单击坐标相同的状态。
更具体地说,让我们检查一下 HiddenVNC 相关部分的源代码中的实际机制。
以下是 HiddenVNC 源代码的摘录,涉及将攻击者在攻击者 PC 上操作的鼠标左键或右键的单击作为单击事件发送到受感染 PC 上的 HiddenVNC (hVNC) 的部分。
图 13 隐藏桌面鼠标模拟的 HiddenVNC (hVNC) 源代码(摘录)
除了上述之外,我们还执行模拟双击和拖放等多个点击事件的处理。
HiddenVNC 还有许多其他经过深思熟虑的功能。
让我介绍一下另一个独特的机制。
虽然使用隐藏桌面进行未经授权的操作看似完美的掩饰,但实际上屏幕传输是有限制的。我的意思是,Windows 操作系统有一种机制,不会在不可见的屏幕区域(用户不可见的区域)中进行绘制。例如,如果有两个重叠的窗口,则隐藏的部分将被隐藏。窗口区域不在幕后绘制。同样的情况也适用于隐藏桌面;无法截取屏幕截图(捕获)或传输隐藏桌面(即用户不可见的区域)的屏幕。如果尝试,您将得到黑屏) 。因此,即使您尝试使用普通VNC远程控制隐藏桌面,也无法捕获屏幕并且该过程无法继续。
RFB概述
RFB (Remote FrameBuffer) 是 VNC 使用的核心协议。它是一个简单的基于像素的远程桌面协议。RFB 允许服务端将屏幕的更新发送给客户端,同时允许客户端发送键盘和鼠标事件。该协议不依赖于任何特定的图形界面,这意味着它可以用于各种不同的操作系统和环境。