https://ijustwannared.team/2018/02/13/reflective-dlls-and-you/amp/
这篇文章是关于反射动态链接库(DLL)的,并将简单介绍如何编写一个。这是由Stephen Fewer开发的一种技术,将使用他的代码来实现魔术。我意识到这是一个已经讨论过几次的话题,所以我要保持这篇文章简单而紧凑。
参考
- http://blog.opensecurityresearch.com/2013/01/windows-dll-injection-basics.html
- https://github.com/stephenfewer/ReflectiveDLLInjection
什么是DLL?DLL是可移植代码,通常由应用程序共享。但是,对于这篇文章,DLL是执行代码的机会。为什么甚至打扰这个?如果我们的目标是执行代码,为什么不写一个exe到磁盘?暂时考虑一下脚印:写入磁盘,创建进程,然后进行处理; 它可以匆忙加起来。输入DLL以及如何将它们加载到内存中。
通常,DLL在进程启动时被加载到内存中; 但是,它们也可以注入已经运行的过程中。通过DLL注入,我们不再需要创建一个执行代码的过程(各种DLL注入技术); 然而,我们仍然需要将我们的文件写入磁盘才能注入。反射DLL注入解决了这个问题。由Stephen Fewer开发,这种技术允许我们将代码注入现有流程而无需写入磁盘。因此,使用反射DLL注入,我们从写入到磁盘并创建一个过程,将我们的代码完全注入内存...谢谢Stephen。
如何保护和检测
端点保护平台(EPP)开始标记这些技术。就个人而言,我会使用我的EPP软件探索端点上的反射DLL注入,以识别任何限制。此外,反射DLL通常会使用Windows API调用执行恶意代码,这是一个潜在的检测点。例如,createremotethread是一种在远程进程中执行shellcode的流行技术。
在观看了拉斐尔关于记忆内逃避的最新帖子后,还有其他一些工具:
- GET-InjectedThread
- 反射注入检测 (未经验证)
- LOKI (未经证实)
演练
本演练将使用Visual Studio 2017完成。
- 下载Stephen Fewer的Reflective DLL存储库
- 创建一个新项目:C ++ - > Windows桌面 - >动态链接库
- 删除stdafx.h,stdafx.cpp,targetver.h和*项目名* .cpp
- 从Reflective DLL存储库中,复制并将ReflectiveDLLInjection.h,ReflectiveLoader.c和ReflectiveLoader.h添加到项目中。
- 项目 - >属性
- 转到C / C ++ - >预编译标题 - >将预编译标题设置为“不使用预编译标题”(因为我们删除了stdafx.h)
- C / C ++ - >预处理器 - >预处理器定义 - >将处理器定义设置为以下(对于x64 DLL,WIN64和WIN_X64而不是WIN32和WIN_X64 ......我意识到有更好的方法):
WIN32; WIN_X86; NDEBUG; _WINDOWS; _USRDLL; RDLL_EXPORTS; REFLECTIVE_DLL_EXPORTS; REFLECTIVEDLLINJECTION_VIA_LOADREMOTELIBRARYR; REFLECTIVEDLLINJECTION_CUSTOM_DLLMAIN;
- dllmain.cpp应如下所示:
- 注意,lpReserved保留用于在执行期间可以传递给我们的代码的参数(或shellcode)。我确信Metasploit可以传递参数,但我不知道如何做到这一点。Cobalt Strike绝对有效且可以在这里找到信息@bdllspawn。
// dllmain.cpp : Defines the entry point for the DLL application. #include "ReflectiveLoader.h" #include <stdio.h> void PartyTime() { MessageBox(0, "PartyTime", "PartyTime", MB_OK); return; } extern "C" HINSTANCE hAppInstance; BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_QUERY_HMODULE: if (lpReserved != NULL) { *(HMODULE *)lpReserved = hAppInstance; } break; case DLL_PROCESS_ATTACH: hAppInstance = hModule; if (!lpReserved != NULL) { printf("Parameter passed to Reflective DLL: %s", (char *)lpReserved); } else { printf("No parameter passed to Reflective DLL"); } PartyTime(); fflush(stdout); ExitProcess(0); break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }
编译
通过我们的反射DLL编译(希望如此),我们应该能够在不写入磁盘的情况下进行注入。Metasploit,Cobalt Strike和Empire(假设)都有用于注入自定义书面反射DLL的后期开发模块。
来自Metasploit
在WIN10-DM的桌面上
这种技术是一种古老而又善良的技术。如果您已经使用过任何流行的C2平台,那么您可能已经使用了反射DLL注入。安全解决方案在捕获这样的内存技术方面变得越来越好,但是高级威胁参与者在调整他们的技术方面也变得越来越好。在我看来,测试你的安全解决方案反对基本反射DLL注入以了解它们的表现并不是一个坏主意。像Meterpreter,Empire(假设)和Cobalt Strike这样的后期开发工具也使用反射式DLL,看看究竟是什么标记以及原因可能是个好主意。