「我唯一会的和擅长的只有网络安全,如果我不能在我最擅长的事情上取得成功,那么我根本不知道,我的人生还有什么意义。」
前言
网络安全技术学习,承认⾃⼰的弱点不是丑事,只有对原理了然于⼼,才能突破更多的限制。
拥有快速学习能力的安全研究员,是不能有短板的,有的只能是大量的标准板和几块长板。
知识⾯,决定看到的攻击⾯有多⼴;知识链,决定发动的杀伤链有多深。
0x01 DLL注入概念
DLL注入(DLL Injection)是一种计算机编程技术,它可以强行使另一个进程加载一个动态链接库(DLL)以在其地址空间内运行指定代码。常见用途是改变原先程序的行为,实现程序作者本未设计或可预期的结果。比如用于hook系统调用、读取密码框内容。
将任意代码注入任意进程的程序被称为DLL注入器。
通俗来说,DLL注入的目标对象是某一进程,然后在该进程的地址空间上注入DLL中的代码并且执行,主要是起到了动态修改程序行为的作用。合理地来说,也可用于动态拓展程序功能,即起到增强作用。
0x02 远程线程注入步骤
本次介绍的DLL注入方式是远程线程注入(CreateRemoteThread)
步骤如下:
1.打开目标进程句柄
2.开辟目标进程空间,用于存放需要注入的DLL文件路径
3.通过CreateRemoteThread函数调用LoadLibrary,传入DLL文件路径的地址作为参数,进行远程动态调用。
技术的核心原理:
注入器的进程的内存空间是没办法让目标进程访问到的,而核心调用DLL的基础原理是程序执行LoadLibrary函数去加载指定的DLL,所以必须要在目标进程空间存放DLL的文件地址(这样目标进程才能调用到),由于kernel.dll加载的地址在所有进程都是一样的,且LoadLibrary是其导出模块,其RVA地址是固定在PE结构的,所以注入器获取到的API地址是一样,可作用于目标进程,这样就可以通过远程执行目标进程的新线程,然后线程执行LoadLibrary函数加载指定DLL实现DLL注入。
先用cs生成一个木马DLL文件:
勾选x64
编写注入器,用到核心API函数如下:
OpenProcess
HANDLE OpenProcess(
DWORD dwDesiredAccess, //PROCESS_ALL_ACCESS 进程控制的权限
BOOL bInheritHandle, //false, 句柄是否可以被继承
DWORD dwProcessId //目标进程pid,某些系统进程会出错
);
VirtualAllocEx
LPVOID VirtualAllocEx(
HANDLE hProcess, //目标进程句柄 PROCESS_VM_OPERATION
LPVOID lpAddress, //NULL,自动分配空间地址
SIZE_T dwSize, //单位byte, 分配的空间区域大小
DWORD flAllocationType, //MEM_COMMIT 内存类型
DWORD flProtect //PAGE_READWRITE, 内存区域权限可读可写
);
WriteProcessMemory
BOOL WriteProcessMemory(
HANDLE hProcess, //目标进程句柄 PROCESS_VM_WRITE and PROCESS_VM_OPERATION
LPVOID lpBaseAddress, //写入内容的基地址
LPCVOID lpBuffer, //指向写入数据的指针
SIZE_T nSize, //写入数据的大小
SIZE_T *lpNumberOfBytesWritten //NULL,不记录写入字节数目
);
CreateRemoteThread
HANDLE CreateRemoteThread(
HANDLE hProcess, //目标句柄
LPSECURITY_ATTRIBUTES lpThreadAttributes,//NULL,默认描述符
SIZE_T dwStackSize, //0,使用默认栈大小
LPTHREAD_START_ROUTINE lpStartAddress,// 指针指向远程调用函数的地址
LPVOID lpParameter, //指针指向参数地址
DWORD dwCreationFlags,//0,立刻执行
LPDWORD lpThreadId //NULL,不返回验证信息
);
GetModuleHandle
HMODULE GetModuleHandleA(
LPCSTR lpModuleName //kernel32.dll 模块名称
);
GetProcAddress
FARPROC GetProcAddress(
HMODULE hModule, //模块句柄
LPCSTR lpProcName //导出函数名称
);
0x03 远程线程注入实现
编译生成
将恶意DLL注入正常程序的进程
找到everything的进程进行注入,成功上线cs
攻防交流群
声明
文笔生疏,措辞浅薄,敬请各位大佬不吝赐教,万分感谢。
免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失,均由使用者本人负责, 文章作者不为此承担任何责任。
转载声明:平凡安全 拥有对此文章的修改和解释权,如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经作者允许,不得任意修改或者增减此文章的内容,不得以任何方式将其用于商业目的。