2012年7月11日6:22 AM Conficker仍在目标时间2012年11月7日6:18 AM检查日志-我们是干净的8:16 PM 7/2/2012-砰!,收到回调。
这些是方程组(NSA)操作员在记录他们对目标系统的攻击的记录中留下的一些文字,后来被影子经纪人泄露。影子经纪人在第五次也是最后一次泄密中曝光了过多的信息,被称为“翻译迷失”,以及随后在WannaCry和NotPetya等事件中形成的后果,使这成为我们所知的网络安全游戏的一个转折点。
最近,安全研究员胡安·安德烈斯·格雷罗-萨德(Juan Andres Guerrero-Saade)披露了一个之前被错误识别和未知的威胁组织,名为Nazar,这是影子经纪人最后一次泄密的一部分。在这项研究中,我们将在Juan和Maciej Koowicz撰写的另一项分析的基础上进行扩展,并对每一个纳扎尔组成部分进行深入的分析。但真正的问题是,这些新披露的信息是否为拼图增添了缺失的一部分,或者它们是否向我们展示了我们遗漏了多少拼图?
虽然影子经纪人的“翻译迷失”泄密事件将“永恒之蓝”等臭名昭著的漏洞带到了聚光灯下,但它包含了更多有价值的组件,这些组件显示了方程式组操作员在发动攻击之前可能采取的一些预防措施。
例如,在泄漏的文件中有一个名为“drv_list.txt”的文件,其中包含驱动程序名称列表和相应的备注,如果在目标系统上找到驱动程序,则会将这些备注发送回操作员。当然,该列表包含许多可以检测是否存在防病毒产品或安全解决方案(包括我们自己)的驱动程序:
但更令人好奇的是此列表中的恶意驱动程序名称,如果找到这些名称,可能表示目标系统已被另一个攻击者破坏,然后会警告操作员“撤回”。方程式集团武器库中负责这类检查的另一个关键组成部分被称为“领土争端”,或称“TEDI”。
与安全产品执行的扫描类似,“TEDI”由45个签名组成,用于在目标系统中搜索与其他威胁组关联的注册表项或文件名。但我们可以假设,与安全扫描不同,这种情况下的最终目的是确保Equation Group的操作不会中断,并且他们自己的工具不会被监视同一系统的其他对手(或“其他窥探者”,在“TEDI”中称为“其他窥探者”)检测到。
在某些情况下,这也保证方程组本身不会干扰“友好”威胁组正在进行的操作,也不会攻击同一目标。
CrySys Labs在2018年进行了广泛的研究工作,试图将45个签名中的每一个都映射到它打算检测的各自威胁组,因为“Tedi”本身没有名字。
尽管它包含的信息量相对较少,但安全研究人员经常重新访问“TEDI”,试图更好地了解Equation Group当时可以看到的威胁组,因为其中一些组(直到今天)仍然不为公众所知。
安全研究员胡安·安德烈斯·格雷罗-萨德(Juan Andres Guerrero-Saade)表示,“Tedi”中的第37个签名寻找一个名为“Godown.dll”的文件,它指向的可能是一个他称之为“Nazar”的伊朗威胁组织,而不是CrySys实验室报告中最初认为的中国威胁组织。
“TEDI”项目的美妙之处可能在于它的极简主义:它包含的少量签名使方程组有能力检测到臭名昭著的威胁组织的活动,这些组织多年来一直躲在阴影中:图拉、杜克、黑暗酒店,不一而足。这是我们只能估计的方程式小组多年来的情报和研究工作的结果。有了这些知识,我们开始寻找更多关于这个观察名单中新发现的神秘球员的信息:纳扎尔。
纳扎尔的活动据信始于2008年左右的某个地方,这意味着该组织至少活跃了四年,因为最新的样本是在2012年创建的。
CrySys实验室的报告指出了一个可能与第37个签名有关的文件,结果发现这是一个2015年的反病毒签名数据库,检测到了这个独特的纳扎尔文物“Godown.dll”。令人惊讶的是,相同的签名包含了我们看到的Nazar恶意软件使用的其他人工制品的名称(将在以下部分详细说明),这意味着一些安全公司在“Tedi”泄露之前就已经完全意识到了这种恶意活动:
在Nazar的流中执行的初始二进制文件是gpUpdates.exe。它是由名为“Zip 2 Secure EXE”的程序创建的自解压存档(SFX)。执行时,gpUpdate将三个文件写入磁盘:data.bin、info和Distribute.exe。然后,gpUpdates.exe将启动Distribute.exe,它作为安装组件运行。
开始时,Distribute.exe将读取gpUpdate删除的另外两个文件:info和Data.bin。Data.bin文件是一个二进制BLOB,它包含多个串联成序列的PE文件。INFO文件是一个非常小的文件,它包含一个简单的结构,其长度与Data.bin中的PE文件相同。Distribute.exe将按INFO中所示的文件长度顺序,将Data.bin作为流逐个文件读取。
下表显示了在Data.bin中与INFO中写入的长度连接的文件。
将上述文件拖放到磁盘后,Distribute.exe将使用regsvr32将3个DLL文件注册到注册表。
ShellExecuteA(0,";Open";,";regsvr32.exe";,";Godown.dll-s";,0,0);ShellExecuteA(0,";open";,";regsvr32.exe";,";ViewScreen.dll-s";,0,0);ShellExecuteA(0,";打开";,";regsvr32.exe";,";Godown.dll-s";,0,0);外壳执行。Filesystem.dll-s";,0,0);
然后,它使用CreateServiceA将svchost.exe添加为名为“EYService”的服务,然后它将启动该服务并退出。我们稍后将解释,此服务是流中的核心组件,负责处理攻击者发送的命令。
该服务是攻击中的主要组件,它协调了Nazar丢弃和加载的整个模块。在某种意义上,EYService只是一个由向其发送命令的木偶操纵者控制的提线木偶。通信协议将在这篇博客文章的后面部分详细解释。正如在类似RAT的组件中常见的那样,此服务主要包含受支持的命令列表,并且这些命令中的每个命令都分配有一个函数,用于根据攻击者的请求对其进行处理。下面列出了完整的命令列表。
与Nazar中的其他组件一样,该模块也没有展示新的技术或高质量的编写代码。事实上,这个模块和其他模块一样,主要基于当时普遍可用的开源库。为了管理流量和嗅探数据包,Nazar使用Microolap的数据包嗅探器SDK。为了录制受害者的麦克风,它使用了“蹩脚的”MP3编码库。对于键盘记录,它使用KeyDLL3。BMGLib是用来截屏的,即使是关机,它也使用了一个开源项目--关机警报。
在分析网络组件时,我们主要查找的是命令和控制的IP,因为这可能会开辟新的路径,也许还会打开最近的攻击和样本。唉,千方百计,我们找不到这样的IP,这是有意义的,因为纳扎尔是如何沟通的。
在执行该服务时,它从设置包嗅探开始。这是通过使用数据包嗅探器SDK来完成的,几乎是一种教科书式的方式。主线程获取一个面向外的网络适配器,并使用BPF来确保只将UDP数据包转发到处理程序。
DWORD__stdcall Main_ThreadParameter(LPVOID LpThreadParameter){Handle HMGR;//EDI Handle hCfg;//ESI Handle hFtr;//EDI HMGR=MgrCreate();MgrInitialize(HMGR);hCfg=MgrGetFirstAdapterCfg(HMGR);Do{if(!AdpCfgGetAccessibleState。Adapter_IP=AdpCfgGetIpA_wrapper(hCfg,0);AdpCfgGetMACAddress(hCfg,&;Mac_Address,6);hFtr=BpfCreate();BpfAddCmd(hFtr,BPF_LD_B_ABS,23u);//获取协议字段值BpfAddJmp(hFtr,BPF_JMP_JEQ。AdpSetOnPacketRecv(adp_struct,on_Packet_recv_Handler,0);AdpSetMacFilter(adp_struct,2);While(1){if(stop_and_ping==1){Adapter_IP=AdpCfgGetIpA_wrapper(hCfg,0);connection_method(2);stop_and_ping=0;}睡眠(1000U);}}返回0;}。
每当UDP数据包到达时,无论是否会有响应,都会记录其源IP,以便在下一个响应中使用。然后,将检查数据包的目的端口,如果是1234,则将UDP数据转发到命令调度器。
int__cdecl命令MethodsWrapper(udp_t*udp_Packet,int 0,char*src_ip,int IP_id){int length;//edi length=HIBYTE(udp_Packet->;length)-8;ntohs(udp_Packet->;src_port);if(ntohs(udp_Packet->;DST_port)!=1234)返回0。
每个响应都将从头开始构建数据包,因此可以使用PSSDK的发送方法AdpAsyncSend/AdpSyncSend发送。
发送文件:内容将作为UDP数据发送,后面是另一个带有-<;size_of_file>;的数据包,UDP目的端口将是请求消息中IP标识字段的小端序值。例如,如果服务器发送标识为0x3456的数据包(到目标端口1234),则恶意软件将使用目标端口0x5634发送响应。
为了使选项更清晰,并演示nazar如何通信,我们创建了一个python脚本,该脚本可以“播放”攻击者控制的服务器,并与受害者通信。该脚本在附录C中提供。
如前所述,svchost.exe或名为EYService的服务包含支持的命令列表。我们分析了两个版本的老鼠,发现略有不同。下表列出了支持的命令的完整列表,以及我们的分析说明。
通过将‘hodll.dll’库加载到内存并手动导入‘installhook’函数来启用键盘记录程序。击键与窗口名称一起保存到‘report.txt’。然后将写入的内容发送到服务器。键盘记录器基于称为“KeyDLL3”(由Anoop Thomas编写)和“键盘钩子”(由H.Joseph编写)的公共开源库。命令312将禁用键盘记录器。
关闭机器。该命令通过根据组件的RCLSID和RIID生成该组件,从而与该组件进行交互。The Godown模块可能是基于名为“关闭警报”的开源实现。
开始截屏。该函数调用良性的PViewScreen.dll文件,并指示它将屏幕截图保存在名为nz.png的PNG文件中。然后,该文件被发送到服务器。该模块基于M.Scott Heiman编写的一个名为“BMGLib”的已知开源项目。命令313将禁用屏幕捕获。
负责用受害者的麦克风录音。录音被保存到.music.mp3文件并发送到服务器。该实现基于一个著名的开源项目,该项目使用了一个已知的名为“Lame MP3”的开源库。命令315将禁用语音记录。
列出PC中的所有驱动器(C:\、D:\、…)。并将其保存到Drives.txt。然后,该文件被发送到服务器。此功能按原样存在于Filesystem.dll中,但较新版本的Insvchost.exe不使用DLL,即使它仍被放到计算机上。
列出系统中的所有文件和文件夹,并保存到Files.txt。文件和文件夹用“;File;”或“Folder;”分隔。此功能按原样存在于Filesystem.dll中,但较新版本的Insvchost.exe不使用DLL,即使它仍被放到计算机上。
通过枚举在以下注册表路径中找到的项来列出程序:Software\Microsoft\Windows\CurrentVersion\Uninstall.。然后,程序名称被保存到一个名为Programs.txt的文件中,并发送到服务器。
列出机器上的所有设备,并将其保存到名为“Devices.txt”的文件中,然后将该文件发送到服务器。设备之间用‘;Root;’或‘;Child;’分隔。
差不多没什么大不了的。将设置一个标志,该标志也由1119和1189设置,并且在发送文件时将取消设置。但是,它永远不会被选中。
使用Gregsvr32注册Godown.dll时,此命令曾包含在2010年后的Avchost.exe版本中,但后来被删除,模块注册移到了Dellbute.exe。
使用11regsvr32注册ViewScreen.dll时,此命令曾包含在2010年后的Avchost.exe版本中,但后来被删除,模块注册移到了Dellbute.exe。
在Filesystem.dll中注册使用Eregsvr32。此命令包含在2010年后的Avchost.exe版本中,但后来被删除,并且模块注册移到了Dellbute.exe。
dll是SIG37的聚光灯下的dll,也是在未知恶意软件之后开始这次搜捕的dll。在被守法的安全分析师发现之前,人们可以想象Godown.dll是整个操作的幕后策划者,是控制所有这些操作的组件,是一些隐藏的宝石,还是一朵看不见的玫瑰。实际上,Godown.dll是一个很小的DLL,只有一个目标-关闭计算机。相信我们,我们努力寻找二进制文件中任何隐藏或神秘的功能,但除了一个关闭命令外,什么都没有。为什么要将5行C代码放在DLL中,放在Data.bin中,放到磁盘上,使用regsvr32注册为COM DLL,然后使用GUID间接调用它,这是我们无法理解的。但是,这是一个足够好的线索来揭露纳扎尔,对于这一点,我们应该心存感激。
在此攻击中使用的所有模块中,Filesystem.dll可能是唯一一个其代码实际上由攻击者自己编写的模块。本模块的目的是枚举受感染系统上的驱动器、文件夹和文件,并将最终结果写入两个文本文件:Drives.txt和Files.txt。
我们能够获得此模块的两个版本,这两个版本相隔一年创建,两个版本都包括pdb路径,其中提到了一个波斯名为khzer(或خضر)的文件夹:
仔细检查后会发现,两条路径之间有一些不同:一条路径以C:\\分区开头,另一条路径以D:\\开头,一条路径使用Khzer(大写),另一条路径使用khzer(小写),依此类推。这可能表明模块的两个版本不是在同一环境中编译的,一些包含的标头路径进一步加强了这一点,这些路径表明Visual Studio安装在两个不同的位置:
但这并不是两个版本之间唯一的区别:尽管所有已知的gpUpdates.exe变体都删除了Filesystem.dll模块,但并不总是以相同的方式使用它。
例如,早在2010年前的svchost.exe版本有三个已被省略的命令:“211”、“212”和“213”。这些命令允许svchost.exe使用regsvr32注册删除的DLL模块,该功能后来迁移到Distribute.exe(如上面的执行流程部分所述)。
然后,当C2收到收集系统上的文件和驱动器的命令时,Filesystem.dll模块将在注册后被调用:
另一方面,2012年创建的更新版本的svchost.exe在从C2接收“199”和“200”命令时复制了Filesystem.dll中的文件和驱动器查找功能,并自行执行搜索。因此,即使在这种情况下仍然删除了Filesystem.dll模块,但在较新版本的Nazar中似乎没有使用该模块:
dll模块负责记录用户的击键。就像大多数键盘记录器一样,它是通过为键盘输入设置一个Windows钩子来完成的。虽然有许多键盘记录器的实现可用,但我们相信这个实现是基于一个或多个开源项目的。具体地说,我们认为代码取自名为“KeyDLL3”(由Anoop Thomas编写)和“keyboard Hooks”(由H.Joseph编写)的公共开源库,或者是这些项目的分支,因为有很多可用项目。事实上,我们拿到的hodll.dll示例看起来像是从不同层次的开放源码项目构建的。在某种程度上,它看起来像是有人从互联网上复制了代码,然后将其部分删除,然后拿走其他代码,并将其删除,以此类推。最终结果包含来自多层代码的进化片段。
此DLL基于一个名为“BMGLib”的已知开源项目,用于拍摄受害者计算机的屏幕截图。原始源没有添加任何重大更改(如果有的话),这是Nazar恶意软件如何仅为一个小任务使用整个库的又一个例子。
在这篇文章中,我们试图收集自纳扎尔最近曝光以来我们所了解的所有信息。我们深入研究了每一个组件,并试图解开尽可能多的谜团。影子经纪人泄露的信息告诉我们,美国国家安全局知道纳扎尔已有多年,多亏了其他研究人员,该社区才能从《泰迪》的签名列表中破解出另一个未知的恶意软件家族。
“泰迪”中的许多签名描述了先进而新颖的恶意软件家族,但纳扎尔的情况似乎并非如此。正如我们在本文中所展示的,代码的质量以及开源库的大量使用与精明的威胁参与者的特征不匹配。尽管我们试图涵盖一切,但围绕这些发现仍然有许多悬而未决的问题:纳扎尔群体发生了什么,他们是否演变成了现在以不同名字闻名的其他群体?他们还在活动吗?外面还有更多的样本吗?带着这些问题和其他问题在我们的脑海中,我们不禁让这件事无限期地进行。
在他的博客文章中,Juan发布了Yara Rules,以方便检测。这些规则写得很好,涵盖了不同的组件。我们希望共享我们在分析过程中创建的一些规则,以添加到现有规则中。
规则apt_nazar_svchost_Commands{META:DESCRIPTION=";根据支持的命令检测纳扎尔的svchost";作者=#34;Itay Cohen";日期=";2020-04-26";Reference=";<;https://www.epicturla.com/blog/the-lost-nazar>;";HASH=";2fe9b76496a9480273357b6d35c012809bfa3ae8976813a7f5f4959402e3fbb6";HASH=";be624acab7dfe6282bbb32b41b10a98b6189ab3a8d9520e7447214a7e5c27728";字符串:$str1={33 31 34 00 36 36 00 33 31 33 00}$str2={33 31 32 00 33 31 35 00 35 35 00}$str3={39 39 39 00 35 39 39 00 34 39 00}$str4={32 30 39 00 32 30 30 00}$str5={31 39 39 00 31 39 00 31 38 39 00 31 33 39 00 33 39 00 31 00}条件:4个}规则apt_nazar_component_guids{meta。作者伊泰·科恩(Itay Cohen";Date=";2020-04)。
..