注入的shellcode的提取和分析

admin 2024年3月20日01:33:00评论19 views字数 4439阅读14分47秒阅读模式

Shellcode 是一小段用作有效负载的可执行代码。进程注入是规避基于进程的防御的方法之一,其中恶意代码在另一个进程的地址空间中执行。当这两者结合在一起时该怎么办?假设用户报告了一个可疑文件,现在需要对其进行分析以验证其行为。

Step 1 静态分析

获取恶意文件后,最好先静态检查它,然后再动态检查。通过检查字符串、导入的函数和 PE 标头,文件似乎已经打包了——这意味着磁盘上的文件与执行后的文件不同(这意味着不同的哈希!),因为它会在内存中解压缩自己——这可以通过几个指标来证明,其中最可靠的是少量导入的函数:

  • 恶意软件开发 

  • 注入的shellcode的提取和分析

注入的shellcode的提取和分析

功能量小

除此之外,验证 PE Header 中的部分也很好——这里我们有高水平的熵:7.8(随机性的可测量性,在混淆恶意软件中很常见)和异常的 UPX 部分,这立即证明文件是由这个打包程序打包的;此外,EntryPoint 应该指向代码所在的部分(在普通文件中,这将是一个 .text 部分),但在 UPX 打包文件的情况下,EntryPoint 指向 UPX:

注入的shellcode的提取和分析

UPX 部分

为了继续分析,需要对文件进行解压缩——在这种情况下,这是一个非常有名的打包程序,称为 UPX,但还有其他打包程序,一些打包程序也可能由对手创建。要解开 UPX 的包装:

注入的shellcode的提取和分析

UPX 开箱

解压后,真实文件的字符串可见,似乎与notepad.exe有某种关系:

注入的shellcode的提取和分析

可疑字符串

该文件导入的所有函数现在也是可见的,其中很少有非常可疑的:

CreateProcessA创建并执行一个新进程,
OpenProcess用于打开另一个正在运行的进程的句柄,
VirtualAllocEx在另一个进程的地址空间中分配内存,
WriteProcessMemory将数据写入另一个进程的地址空间,
CreateRemoteThread在另一个进程中创建并启动线程。

注入的shellcode的提取和分析

解压缩文件函数

似乎会注入一些东西,因为这里使用的函数也是非常常见的 PE 注入方法,其中代码被注入到另一个进程内存中并从那里执行。

第 2 步:反汇编解压缩的文件

现在最好反汇编代码以查看将哪些参数传递给找到的函数。在检查了对 CreateProcessA 的交叉引用后,我们可以判断它将被sub_1400122C0调用:

注入的shellcode的提取和分析

CreateProcessA 交叉引用

单击该地址后,将有一个漂亮的图表,显示此函数和相关函数的执行方式以及后续步骤。现在最好检查 Microsoft 站点以检查哪些参数被传递到特定函数(右侧)。首先,让我们从 CreateProcessA API 开始:

注入的shellcode的提取和分析

CreateProcessA

从IDA的底部(左)和MS的顶部(右)开始:lpApplicationName是要执行的模块的名称,反汇编的代码确认此API将执行记事本;接下来的三个参数是异或,这意味着它们的值为 0;dwCreationFlags 是控制进程的优先级和创建的标志,在本例中,它获取值 4,这意味着创建的进程将被挂起。下一个函数 OpenProcess 查找notepad.exe:

注入的shellcode的提取和分析

OpenProcess 接口

接下来是 VirtualAllocEx,其中打开的进程的内存地址空间按特定大小分配。可以看出,分配空间的 dwSize 为 0x276(630 字节),flAllocationType 为 0x3000(一步保留并提交分配),flProtect 为 0x40(启用对页面提交区域的执行、只读或读/写访问)。简而言之:分配了 630 字节的代码,并具有 RX 或 RWX 权限:

注入的shellcode的提取和分析

之后,执行 WriteProcessMemory:nSize(0x276,630 字节)与之前 API 分配的相同;但这里最有趣的是 lpBuffer,它是一个指向缓冲区的指针,其中包含要写入指定进程地址空间的数据——这意味着注入的代码将在那里:

注入的shellcode的提取和分析

WriteProcessMemory 接口

CreateRemoteThread 在 hProcess 中指定的进程中创建并执行线程;除此之外,dwCreationFlags 的值为 0,这意味着线程在创建后立即运行:

注入的shellcode的提取和分析

CreateRemoteThread 接口

因此,基于静态分析和反汇编代码,似乎:

1. 使用 CreateProcess API 创建流程notepad.exe,2
.使用 OpenProcess API 打开用于读取和写入notepad.exe内存的句柄,
3。内存地址空间是使用 VirtualAllocEx API notepad.exe分配的,
4。使用 WriteProcessMemory API 将一些数据注入到notepad.exe先前保留的内存空间中,
5。注入的notepad.exe进程的线程使用 CreateRemoteThread API 执行。

可以假设文件正在创建notepad.exe进程,然后将一些代码注入其中。这可以通过动态分析来确认,但首先让我们尝试通过调试解压缩的文件notepad.exe从进程内存中提取注入的 shellcode。

步骤 3:通过调试器提取 Shellcode

在本例中,我们只关注最重要的 API:CreateProcess 和 WriteProcessMemory。设置断点并单击“运行”后,第一个断点将在 CreateProcess 上停止——这是在创建notepad.exe之前,因此在单击“执行直到返回”后,传递给此函数的所有参数都将“实时”执行;您可以在下面看到notepad.exe已创建:

注入的shellcode的提取和分析

x64dbg 创建流程

下一个断点将停止在 WriteProcessMemory 上执行,这里我们应该关注前面提到的参数:nSize,传递给 r9 寄存器,它保存注入代码的大小(0x276 或 630 字节),以及 lpBuffer,传递给 r8 寄存器(指向将要注入的随机代码的地址);我们可以在 r8 寄存器上单击鼠标右键并选择“Follow in Dump”,调试器将显示位于此地址空间中的代码:

注入的shellcode的提取和分析

x64dbg WriteProcessMemory shellcode

可能这是shellcode,可以通过在r8寄存器上单击鼠标右键来提取它 -> “Follow in Memory Map”,然后在以下地址上单击鼠标右键并选择“Dump Memory to File”:

注入的shellcode的提取和分析

从转储文件中删除乱码字节后,shellcode 现在清晰可见:

注入的shellcode的提取和分析

提取的 shellcode

第 4 步:Shellcode 仿真和分析

由于 shellcode 已被提取,因此可以使用 shellcode 模拟器(如 speakeasy)进行模拟:

注入的shellcode的提取和分析

Speakeasy 模拟 shellcode

现在确认 shellcode 是指向端口 10.0.0.10 (0x1bb) 上的反向 shell。为了对shellcode更有信心,可以使用shellcode2exe将其转换为EXE文件:

注入的shellcode的提取和分析

shellcode2exe

现在 shellcode 变成了 EXE,这意味着它可以在不先创建和注入记事本的情况下执行。仿真提供了有关目标 IP 和 PORT 的信息,因此可以将恶意 IP 地址添加为主机上的辅助/虚拟 IP,以使用 netcat 验证连接 — 连接已建立,但已加密:

注入的shellcode的提取和分析

已执行的 Shellcode

这可能表明 shellcode 可能是 msfvenom 的 meterpreter 反向 HTTPS shell。这也可以通过使用 metasploit 的漏洞(称为 multi/handler)来检查。将恶意 IP 分配给 Kali 机器后,让我们运行 Metasploit:

注入的shellcode的提取和分析

MSF 侦听器

如下图所示,已通过 HTTPS 正确建立连接,由于使用了 443 端口,HTTPS 可以融入正常的网络流量。在受害者的 Wireshark 上,连接是可见的,但都是加密的:

注入的shellcode的提取和分析

执行 shellcode 后的 ProcMon + Wireshark

如果攻击者从 meterpreter 切换到通常的 shell (cmd.exe),那么它将在 ProcMon 中可见,以及使用的命令:

注入的shellcode的提取和分析

meterpreter 切换到 shell + ProcMon 日志

现在,为了进行此分析,我将执行原始文件,看看会发生什么。执行此操作后,名为 invoice.pdf.exe 的原始文件创建notepad.exe然后退出;之后,notepad.exe 正在联系打开的 Metasploit 控制台:

注入的shellcode的提取和分析

已执行的原始文件

所以分析是正确的,原始文件确实在解包,创建记事本并将反向 shell 代码注入其中,这也已通过在 Metasploit 上打开侦听器来证明。

奖励步骤:shellcode提取的另一种方法

在结束之前,我想展示另一种提取 shellcode 的方法。执行后,可以使用 Process Hacker(或 SysInternals 中的 procdump/ProcessExplorer)转储注入的进程。可以在任何十六进制编辑器中打开转储,并搜索与之前从 x64dbg 中提取的 shellcode 中相同的十六进制值;在下面查看两个 shellcode 的比较,一个是从调试器中提取的,另一个是从注入的进程中提取的,你会看到它是相同的代码,所以如果你知道可能是恶意的十六进制值,最好在转储进程中搜索它们:

注入的shellcode的提取和分析

Shellcode 的十六进制值

提取 shellcode 的另一种方法是使用 SysInternal 的 VMMap(虚拟和物理进程内存分析)。不要从调试器中提取 shellcode,而是检查注入进程的内存权限。如果任何线程具有执行/读/写权限,则可能存在问题,应进行验证。VMMap 还可以显示来自指定内存区域的字符串;在下面查找附加了notepad.exe的 VMMap 和来自 RWX 内存区域的字符串:

注入的shellcode的提取和分析

VMMap 注入进程

还可以在转储注入的记事本进程中查找这些字符串:

注入的shellcode的提取和分析

VMMap 注入的内存区域字符串 + 转储的注入进程字符串

因此,可以通过调试器和在转储的注入进程中搜索相同的十六进制值来提取 shellcode;也可以通过检查注入进程内存的字符串并在注入进程的转储中搜索它们来找到它。

到此结束分析——使用静态(反汇编)和动态(调试)分析方法,提取和分析 shellcode——无需运行初始文件(除了用于确认分析的一次运行)。这个例子并不难分析,因为有更高级的注入或编码 shellcode 的方法(例如,通过异或十六进制值),但这个想法通常保持不变。

使用的工具:PEStudio(静态分析)、upx(UPX 打包器/解包器)、IDA(反汇编器)、x64dbg(调试器)、Procmon(实时文件活动)、hxD(十六进制编辑器)、speakeasy(shellcode 模拟器)、shellcode2exe(shellcode 到 exe 转换器)、ncat(网络侦听器)、Metasploit(渗透测试工具;在 Kali Linux 上)、Wireshark(协议分析器)、VMMap(过程MEM分析)。

其它教程
二进制漏洞 
  • 注入的shellcode的提取和分析

  • windows

  • 注入的shellcode的提取和分析

  • windows()

  • 注入的shellcode的提取和分析

  • USB()

  • 注入的shellcode的提取和分析

  • ()

  • 注入的shellcode的提取和分析

  • ios

  • 注入的shellcode的提取和分析

  • windbg

  • 注入的shellcode的提取和分析

  • ()

  • 注入的shellcode的提取和分析注入的shellcode的提取和分析注入的shellcode的提取和分析

  • 注入的shellcode的提取和分析

  • 注入的shellcode的提取和分析

  • 注入的shellcode的提取和分析

原文始发于微信公众号(安全狗的自我修养):注入的shellcode的提取和分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年3月20日01:33:00
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   注入的shellcode的提取和分析http://cn-sec.com/archives/2580036.html

发表评论

匿名网友 填写信息