一、介绍
HVNC是一种创造性的解决方案,最初用于银行木马。早在十年前,安全意识还不足够时,如果有人盗号并尝试登陆,大多数银行只能使用简单的IP或地理位置判断来阻止。为了解决这个问题,银行木马开始在受害者计算机上运行SOCKS代理服务器,从而使恶意软件可以使用相同的IP访问受害者的银行帐户。随着安全意识的日益提高,银行开始更先进的检测系统,比如对浏览器,操作系统/插件版本,语言环境,时区等进行检测来对用户的系统进行指纹识别。这种策略要求恶意软件完全复制受害者的系统配置,以确保不会被阻止登录该帐户,而这显然在大多数情况都是不现实的。因此必须找到一种更方便的方法,该方法就是HVNC。单纯的使用VNC控制受害计算机,然后使用它登录其银行帐户,显然不是理想的选择。如果受害者正在使用计算机,他们将看到电脑自己进行的操作,并可能会及时关闭计算机。所以,需要的是某种VNC软件,它允许在受害者使用系统的同时,隐蔽地访问系统。
HVNC恶意软件利用了一些鲜为人知的Windows功能,例如CreateDesktop和cross-process window subclassing来实现VNC运行且不被发现的目的。大多数Linux用户可能会感觉熟悉,许多发行版都可以同时运行具有独立任务栏的多个桌面。自Windows 2000以来,Windows便具有了创建多个桌面的功能,但这不是众所周知的功能,并且没有常见的使用此功能的应用。通过调用CreateDesktop,软件可以创建隐藏的桌面并在该桌面上执行应用程序。在隐藏桌面上运行的所有应用程序将对其他桌面(即受害者正在使用的那个桌面)不可见,它们甚至不会显示在隐藏桌面外部的任务栏中。
大多数VNC软件的工作原理是定期获取屏幕截图并将其发送回客户端。但是,Windows不会为处于非活动状态的桌面绘制gui。所以把不能简单地捕获隐藏桌面的屏幕截图,而是必须调用EnumDesktopWindows以获得在隐藏桌面上运行的窗口,然后在每个窗口上单独调用PrintWindow,将它们写到位图中(从最底部的窗口开始,一直到最顶部)。本质上,这只是个模拟屏幕快照功能。不过,某些应用程序不能正确处理WM_PRINT或WM_PRINTCLIENT消息(由PrintWindow发送),结果,应用程序的全部界面或部分界面可能显示为白色矩形,如下所示。
要解决这个问题,HVNC需要代理应用程序来实现WM_PRINT和WM_PRINTCLIENT,确保将所有可见元素绘制到缓冲区。这可以通过将代码注入进程并在user32.dll中挂钩各种功能来完成,也可以使用跨进程子类赋予HVNC程序处理从HVNC进程中发往目标应用程序的消息的能力。
当涉及到用户输入时,HVNC必须模拟虚拟键盘/鼠标,因为普通的模拟输入将发送到用户使用的活动桌面,而不是隐藏桌面。通常,当鼠标移动或单击时,HVNC会将位置以及按钮单击事件发送到HVNC客户端,之后其会将鼠标移至给定位置并模拟点击,但是由于真正的键盘和鼠标无法被使用,所以事情要复杂得多。HVNC客户端必须跟踪隐藏桌面上的每个窗口,其位置及其顺序;当发送click时,服务器将需要通过枚举每个窗口并检查其坐标和可见性来找到哪个窗口位于光标的当前位置,然后使用PostMessage向其发送click事件。键盘也是如此。
从接触恶意软件尤其是各种远控后,我就对HVNC产生了极大的兴趣。早期市场上数十美元每月的价格和常年的有价无市,令囊中羞涩的我望而却步。虽然简单分析过Bit Rat的HVNC模块,并印证了上文对hvnc的介绍,但是自己复现也是项大工程,所以就暂时断了想法。直到前一阵子,我才拿到了一份曾经在HF论坛售卖的Hvnc的源码,正式开始了对其的研究。
(下文源码经过我自己的部分修改,不完全等同于其原版,此处仅分析客户端,服务端与常见的vnc并无太大区别)
二、分析
首先是客户端的入口,根据启动参数连接指定的服务器,默认端口为6667。
其后使用OpenDesktopA打开隐藏桌面,若没有隐藏桌面就使用CreateDesktopA函数创建桌面。
这里可以看到HVNC对桌面及其上应用的绘制,整体的处理较为复杂。
之后就是HVNC的目的所在,使用客户端的电脑进行网页的登录,并实行进一步的行为。这里展示其中一个启动Chrome的代码,首先复制用户资料至新的目录,避免操作影响到活动桌面上的用户。其后使用一系列参数启动Chrome来避免对3D图形API等的调用,出现黑框白框的情况
至于鼠标键盘的操作也都是通过上文提到的原理,使用SendMessageA或PostMessageA函数来发送到指定窗口。
其他的连接服务器等部分就不赘述了,整体代码量可以说并不大,较预想中的大工程有不小的差距。但是其中内容吃透也要小花一阵功夫,称其为最复杂的恶意软件或许有些过分,但是说是恶意软件功能中功能实现最复杂的可以说是名不虚传。
三、现状
HVNC作为银行木马的必备模块,普遍出现在国外的非开源远控中,价格高低不一,总体来说可以是,区分高级远控或僵尸网络与普通远控或僵尸网络的分界线。也是众多论坛中求购的热门。
可以看到,一些恶意软件市场上的卖家都以HVNC功能为噱头繁忙自己的软件。由于目前市面上的基本所有HVNC源码都源于很久之前泄露的Tinynuke源码(其实也是因为实现过程统一,重复造轮子没意义),所以大部分软件质量好坏不一,全看作者对代码细微处的调教来适配不同的系统和程序。
作为一个小众到甚至大多数远控作者都没有接触的功能,HVNC保有其神秘性,但是也有众多缺陷,比如天生不支持一部分软件,及各种可能出现的玄学问题。这些都使得它的受众非常小,许多安全厂商也没有针对CreateDesktopA等函数进行简单的监控。总体看下来,有很多方法可以从行为上防御HVNC的攻击,强烈建议各个银行和安全厂家及时添加相应的防御策略。
四、应对策略
安全厂商等没有出具相应的防御或检测方法,那么我们自己如何进行自测呢?
在Github上,我找到了一个项目可以解决这个问题:HiddenDesktopViewer
这是一个可以让你清楚看到自己有几个桌面并列出每个进程所在的桌面的程序,并且可以快速的在其中切换。市面上所见的所有HVNC软件均没有发现有删除创建的桌面的行为,所以通过这个软件就可以发现未删除的桌面。
参考文献:
https://www.malwaretech.com/2015/09/hidden-vnc-for-beginners.html
https://github.com/Sts0mrg0/TinyNuke
https://github.com/AgigoNoTana/HiddenDesktopViewer
以及一部分看过但是忘记保存的网址
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)