本文翻译自: http://blog.ptsecurity.com/2018/07/pegasus-analysis-of-network-behavior.html

前言

最近Pegasus(一种银行木马)的源代码被公布到了网上。尽管报告的作者宣称木马出自黑客组织Carbanak之手,但Minerva实验室的研究人员已经证明,Pegasus实际上是一个名为Buhtrap(Ratopak)的黑客组织的作品。 该报告包含木马的概述,其源代码,关于俄罗斯银行业务流程的描述以及许多俄罗斯银行员工的信息。

Pegasus源代码的架构非常有趣。功能分为多个模块,在编译时组合成一个binpack。在编译期间,可执行文件使用文件tric.pfx中的证书进行签名,该证书未包含在报告里。

Pegasus的网络行为同样令人好奇。 感染后,Pegasus尝试在域内传播,并可以在Pipe和Mailslot传输的帮助下充当代理,在系统之间移动数据。 我们关注了该恶意软件的独特的网络行为,并快速将特征签名添加到PT网络攻击检测(PT Network Attack Discovery, PTNAD )中。由此,PT NAD的所有用户都可以在自己的网络上快速检测到此木马及其变种。在本文中,我将描述Pegasus如何在网络上传播以及Pegasus的拷贝如何相互通信。

基本结构

一旦感染计算机,初始化模块(InstallerExe)使用进程挖空(process hollowing)将代码注入svchost.exe。主模块初始化后,Pegasus启动了几个并行进程:
1.域复制:收集网络信息,并尝试将Pegasus传播到其他Windows系统。
2.Mailslot Listener:监听Mailslot广播,Pegasus使用它来发送被盗的凭据。 插件名称在编译时生成。
3.Pipe Server Listener:侦听windows pipe,其名称由计算机名派生 这些pipe主要用于在同一网络上发现Pegasus的其他拷贝并与之通信。
4.登录密码:在基于Mimikatz的模块的帮助下,每隔几分钟尝试一次从内存中转储凭据。
5.网络连接:负责与C&C服务器连接并定期交换消息。

// 启动与CB管理器 的数据传输
pwInitPipeServerAsync(dcmGetServerCallback());  mwInitMailslotServer(dcmGetServerCallback()); 
...  
// 开始向其他机器广播凭证
cmStartupNetworkBroadcaster();

域复制

该模块负责Windows网络的横向移动。包括两个步骤:

  1. 发现域上的其他计算机。

  2. 试图将Pegasus复制到那些机器上。

在域上发现其他计算机依赖于使用两个API调用:NetServerEnum,它需要浏览器服务(Browser service )才能工作,以及WNetOpenEnum / WNetEnumResource。 然后验证域中发现的所有计算机是否已被感染。 Pegasus会每200毫秒一次轮询生成的pipe名称,重复超过20次。 (我们将这种奇怪的行为标记为Pegasus存在的指标之一。)如果Pegasus没有检测到任何感染迹象,则进入下一步:复制。

借助被感染的主机上找到的凭据,Pegasus尝试通过SMB协议登录到IPC $和ADMIN $共享目标。如果IPC $可访问但ADMIN $不可访问,则Pegasus断定该帐户没有足够的权限并将凭据标记为无效。 在获得对ADMIN $ share(%windir%文件夹的别名)的访问权限后,恶意软件会尝试确定电脑的体系结构,以便选择要应用的合适模块。

它通过计算机上的PE文件的头部信息确定此计算机的体系结构。Pegasus尝试在%windir%文件夹中读取notepad.exe文件的前4 KB。此方法的一个小缺点是,在Windows Server 2012上,notepad.exe位于路径%windir%\ System32,而不是%windir%。

Windows 7上notepad.exe的位置:

C:\Users\Administrator>where notepad.exe
C:\Windows\System32\notepad.exe
C:\Windows\notepad.exe

Windows Server 2012上notepad.exe的位置:

C:\Users\Administrator>where notepad.exe
C:\Windows\System32\notepad.exe

如果未找到notepad.exe,则Pegasus无法感染服务器,即使它拿到了高权限帐户的凭据也一样。 因此,在%windir%中简单的缺少记事本程序就可以阻止Pegasus在Windows Server 2012上传播。举一反三,使用regedit.exe将是一种更加可靠的方式来完成此任务。

在确定目标服务器的体系结构后,Pegasus会下载一个大约10kb的小型的 Remote Service Exe dropper(RSE dropper)。 dropper的目的是通过明文Pipe下载包含有效载荷(Payload)模块的binpack,并将控制权移交给Shellcode模块。 dropper的名称是随机生成的,由8到15个十六进制字符组成。 随机生成器使用目标计算机的名称作为种子,并确保重新启动时名称相同,以避免将%windir%与多个Pegasus拷贝混淆。

在检查了dropper的完整性并确保未被反病毒软件删除dropper之后,恶意软件尝试通过Windows Management Instrumentation(WMI)运行dropper。 也可以使用服务控制管理器(Service Control Manager, SCM),但更倾向于使用第一种方法,因为SCM在Windows日志中留下了更多的痕迹。 源代码表明Pegasus的作者还打算使用别的方法进行复制:远程运行WSH,远程运行PowerShell 和计划任务。 通过RDP运行命令的模块也在开发中。

如前所述,一旦dropper启动成功,木马会检查并开始监听Pipe,然后将控制权移交给传来的payload。

清除痕迹

由于Pegasus代码是通过进程挖空注入svchost.exe进程的,因此被感染的磁盘不会保留初始模块InstallerExe的任何拷贝或RSE dropper 。 如果仍然可以通过已知路径访问dropper,Pegasus将按如下方式删除它:

  1. 用随机数据覆盖文件内容。
  2. 使用空数据(零)再次覆盖文件。
  3. 重命名文件。
  4. 删除文件。

如果感染成功,则域复制将再次开始

邮槽(Mailslot)

当Pegasus从另一个Pegasus拷贝或mod_LogonPasswords模块获取凭据时,恶意软件开始在域上广播凭据。 使用Mailslot机制执行广播,该机制基于SMB并允许将小部分数据的单向广播发送到域内的各台计算机中。 插件名称是随机生成的。 为了统一域上所有受感染计算机传输的插件名称,随机名称生成器都以变量TARGET_BUILDCHAIN_HASH开头,该变量在创建时可以预先设置。

由于邮槽对数据包大小施加了上限,因此一次只广播一组凭据。 在所有可用的域凭证中,选择了最早广播的凭证集,也就是说此时所有凭证已被广播过至少一次。

邮槽数据不是以明文形式发送的,而是包含在三层XOR加密中,其密钥与数据一起传输。 第一层是NetMessageEnvelope,带有SHA1完整性检查,用于本地网络上发送的所有数据。 密钥包含在数据包开头的4个字节中,每次循环向右移5位。 第二层是一个XOR加密的数据结构,包含凭据字段及其添加日期。 结构的开头包含一个8字节的密钥,没有移位。第三层, 在解码凭证的结构之后,剩下的就是从ENC_BUFFER结构(例如计算机名,域名,用户名和密码)反序列化单个字段。 这些字段使用带有移位的8字节密钥进行加密。 我们提供了一组样例:一个邮槽数据包和用于解密它的脚本: 脚本PCAP

在恶意软件的已发布版本中,邮槽消息以20秒到11分钟不等的间隔发送。

// 随机等待一段时间再进行下一步
  DbgPrint("going to sleep");
#ifdef _DEBUG
  // debug - 2-5 秒
  Sleep(rg.rgGetRnd(&rg, 2000, 5000));
#else
  // 每隔20 - 650 秒发送消息
  //Sleep(rg.rgGetRnd(&rg, 2000, 65000) * 10);
  Sleep(rg.rgGetRnd(&rg, 2000, 15000));
#endif

除了提供凭据之外,邮槽消息还会进行Internet访问并尝试查找具有此类访问权限的其他受感染计算机。 NetMessageEnvelope表示内部消息的类型。 pipe使得未连接外网的计算机可以通过与外网有连接的计算机中转进行通信。

Pipe

Pegasus使用pipe进行双向通信并发送大量数据。 虽然每个pipe的名称是由随机生成器生成的,但它还取决于机器名称和结构,这允许Pegasus客户端和服务器使用相同的名称。

在单向通信期间(例如在复制期间将binpack发送到另一台计算机时),数据将以未加密的方式发送。 binpack的开头是SHELLCODE_CONTEXT结构,长度为561个字节。

双向通信——比如,C&C服务器与Pegasus拷贝通过Internet访问获取数据——使用的NetMessageEnvelope结构与我们前面在mailslot章节讲的XOR加密的结构相同。它的实现方式是使用不同的id字段以区分不同的消息类型。

具体的获取数据的方法:发送数据查询指令(PMI_SEND_QUERY)到被查询ID,并且可以通过其ID(PMI_CHECK_STATUS_QUERY)检查查询的状态。 在大多数情况下,Payload是另一种Envelope结构,它在上述结构的基础上又加了一层加密和新功能。

这些pipe不仅可以帮助受感染的机器进行通信。 模块mod_KBRI_hd注入cmd.exe进程,其代码拦截MoveFileExW调用并分析所有复制的数据——这可是银行支付机制的一部分。 如果复制的文件包含攻击者感兴趣的支付数据,则会向C&C服务器发送通知。 注入cmd.exe的mod_KBRI模块通过pipe与Pegasus进行通信,该pipe的名称不是随机生成的,而是硬编码:

\.\pipe\pg0F9EC0DB75F67E1DBEFB3AFA2

模块功能还包括使用模板飞速写入并即时替换付款信息的功能。 屏幕截图中显示了样本的搜索模式。

C&C通信

与C&C服务器的数据交换由单独的数据流处理,该数据流每隔几分钟检查来自内部进程或Pegasus的其他拷贝的数据块队列,并将它们发送到服务器 。

在初始化mod_NetworkConnectivity模块期间,将通过以下几个步骤测试网络连接:

1)检测代理服务器设置并尝试连接到www.google.com:

  • 通过注册表分支
\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings
  • 通过WPAD(调用WinHttpGetProxyForUrl)
  • 通过当前用户的代理服务器配置(WinHttpGetIEProxyConfigForCurrentUser调用)

2)验证与Microsoft更新服务器的连接以及从服务器返回的数据( authrootseq.txt,authrootstl.cab , rootsupd.exe )

3)使用以下地址之一测试HTTPS连接:

只有在所有这些检查都通过后,Pegasus才会考虑访问外部网络,之后它会通过邮槽消息在域上广播这一情况。 为了隐匿踪迹,Pegasus仅在工作时间(当地时间上午9:00至下午7:00)与C&C服务器通信。

数据块被打包进带有校验和的信封之中,随后在CRYPT_MODE_CBC / PKCS5_PADDING模式下使用DES加密发送。 加密密钥完全来自在编译时设置的变量,这意味着只要我们知道BUILDCHAIN_HASH的值,我们就可以解密Pegasus和C&C服务器之间的流量。 在相关报告的源代码中,此变量等于0x7393c9a643eb4a76。 我们同样提供了一套样本以供下载研究:用于解密服务器签入(check-in)的样本数据包和脚本: GitHubPCAP

这些内容(在INNER_ENVELOPE结构中)在签入期间或与其他数据一起发送到C&C服务器。 它的开头是一个28字节的信封,其中含有表示数据包长度的字段以及SHA1校验和。

当通信对象是两台被感染的机器时,木马会通过pipe发送相同的数据,具体流程与我们前面讲NetMessageEnvelope的那部分相同,还加上了校验和以及XOR加密。

C&C控制者可以将执行命令发送到Pegasus拷贝。 带有命令或其他数据的消息(例如EID_CREDENTIALS_LIST)可以包含它们自己的字段加密层,正如广播被盗凭证这一过程中所看到的那样。

检测

我们重点研究了如何检测网络上的Pegasus活动。 在仔细研究了源代码并在测试环境中运行恶意软件后,我们建立了一个网络异常和工件的列表,能够清晰地指示出这个复杂的威胁。

可以这么说,Pegasus有好几把刷子:它主动使用SMB协议发送消息并与其他拷贝通信。 与其他拷贝和与C&C交互时用的方法也是不同的。 Pegasus拷贝在域上建立对等网络,搭建出一条路径连上Internet,并通过代理与C&C服务器通信。 拥有可执行文件的证书签名以及利用Microsoft和Mozilla站点来验证网络连接,这些都使得检测Pegasus活动和发现受感染主机变得困难。

Pegasus源代码的架构和注释做得相当的好,这使得其他黑客可能会复制或“借用”代码到自己的恶意软件里。

远程运行命令和搜索凭证的许多机制仍未实现。 木马开发人员未实现的功能包括在进程注入过程中动态修改shellcode。

我们已经开发出了几种特征,使得我们的安全产品PT NAD和Suricata IDS能够在的第一时间检测出不同阶段的Pegasus。 Suricata使用的已公开的特征可以在我们公司的GitHubTwitter上获得 ,如果您启用了suricata-update,它将自动添加到Suricata。

您可以在以下屏幕截图中查看Pegasus特征的检测。 此视图取自PT Network Attack Discovery,我们的事件检测和电子取证产品:

最后,这里还有一些有用的IoC:

MAILSLOT \ 46CA075C165CBB2786 
Pipe\ pg0F9EC0DB75F67E1DBEFB3AFA2 

hxxp://denwer/pegasus/index.php 
hxxp://mp3.ucrazy.org/music/index.php 
hxxp://support.zakon-auto.net/tuning/index.asp 
hxxp://video.tnt-online.info/tnt-comedy-tv/stream.php

原作者: Kirill Shipulin, @attackdetection team, Twitter | Telegram

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖