通过APC实现Dll注入——绕过Sysmon监控

本文讲的是通过APC实现Dll注入——绕过Sysmon监控


0x00 前言

要对指定进程进行远程注入,通常使用Windows提供的API CreateRemoteThread创建一个远程线程,进而注入dll或是执行shellcode

Sysmon可用来监控和记录系统活动,可记录CreateRemoteThread操作

注入的方法不只有CreateRemoteThread,能否通过其他注入方式绕过Sysmon的监控呢?

Casey Smith@subTee在他的文章中给出了答案:

Shellcode Injection via QueueUserAPC – Hiding From Sysmon

地址如下:

http://subt0x10.blogspot.com/2017/01/shellcode-injection-via-queueuserapc.html

0x01 简介

本文将要介绍如下内容:

1. Sysmon配置测试,监控CreateRemoteThread操作

2. c++实现通过APC对Dll注入

3. 绕过Sysmon测试

4. Casey Smith@subTee分享的C#实现代码和用途

Sysmon:

可用来监控和记录系统活动,并记录到windows事件日志,包含如下事件:

Event ID 1: Process creation
Event ID 2: A process changed a file creation time
Event ID 3: Network connection
Event ID 4: Sysmon service state changed
Event ID 5: Process terminated
Event ID 6: Driver loaded
Event ID 7: Image loaded
Event ID 8: CreateRemoteThread
Event ID 9: RawAccessRead
Event ID 10: ProcessAccess
Event ID 11: FileCreate
Event ID 12: RegistryEvent (Object create and delete)
Event ID 13: RegistryEvent (Value Set)
Event ID 14: RegistryEvent (Key and Value Rename)
Event ID 15: FileCreateStreamHash
Event ID 255: Error

详情见https://technet.microsoft.com/en-us/sysinternals/sysmon

注:CreateRemoteThread为Event ID 8

Dll注入

常见方法:

创建新线程
设置线程上下背景文,修改寄存器
插入Apc队列
修改注册表
挂钩窗口消息
远程手动实现LoadLibrary

引用自http://www.cnblogs.com/uAreKongqi/p/6012353.html

Shellcode Injection via QueueUserAPC - Hiding From Sysmon:

c#实现,通过调用QueueUserAPC执行shellcode,可应用于InstallUtil.exe和Msbuild.exe,能够绕过Sysmon对Event ID 8: CreateRemoteThread的监控

文章地址:

http://subt0x10.blogspot.com/2017/01/shellcode-injection-via-queueuserapc.html

0x02 Sysmon简介

下载地址:

https://technet.microsoft.com/en-us/sysinternals/sysmon

以系统服务和驱动的方式安装在系统上

用来监控和记录系统活动,并记录到windows事件日志中

提供进程创建、网络连接以及文件创建时间更改等操作的详细信息

通过事件日志,可识别异常活动,了解攻击者在网络上的操作

注:

系统安装Sysmon后,新增服务Sysmon

如图

也就是说,如果攻击者获得了主机权限,通过查看已安装服务可以看到Sysmon的安装

安装

以默认配置安装:

sysmon -accepteula –i -n

以配置文件安装:

sysmon -c config.xml

配置文件config.xml格式示例如下:

注:

xml大小写敏感

<Sysmon schemaversion="3.20">      
<!-- Capture all hashes -->      
<HashAlgorithms>*</HashAlgorithms>      
<EventFiltering>        
<!-- Log all drivers except if the signature -->       
 <!-- contains Microsoft or Windows -->       
 <DriverLoad onmatch="exclude">          
<Signature condition="contains">microsoft</Signature>         
 <Signature condition="contains">windows</Signature>        
</DriverLoad>       
 <!-- Do not log process termination -->        
<ProcessTerminate onmatch="include" />       
 <!-- Log network connection if the destination port equal 443 -->        
<!-- or 80, and process isn't InternetExplorer -->        
<NetworkConnect onmatch="include">          
<DestinationPort>443</DestinationPort>          
<DestinationPort>80</DestinationPort>        
</NetworkConnect>        
<NetworkConnect onmatch="exclude">          
<Image condition="end with">iexplore.exe</Image>       
 </NetworkConnect>     
 </EventFiltering>    
</Sysmon>

注:

该示例引用自http://www.freebuf.com/sectool/122779.html

查看配置

sysmon -c

注:

配置属性保存在注册表如下位置:

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesSysmonDrvParameters

如图

查看日志记录

1.通过面板

位置如下:

Control PanelSystem and Security-View event logs
Applications and Services Logs-Microsoft-Windows-Sysmon-Operational

如图

2.通过powershell查看,命令如下:

(管理员权限)

Get-WinEvent -FilterHashtable @{logname="Microsoft-Windows-Sysmon/Operational";}

监控并记录CreateRemoteThread

配置文件如下:

<Sysmon schemaversion="3.20">      
<!-- Capture all hashes -->      
<HashAlgorithms>*</HashAlgorithms>      
 <EventFiltering>        
<!-- Log all drivers except if the signature -->       
 <!-- contains Microsoft or Windows -->       
<CreateRemoteThread onmatch="include">
<TargetImage condition="end with">calc.exe</TargetImage>
</CreateRemoteThread>
 </EventFiltering>    
</Sysmon>

保存为RecordCreateRemoteTh.xml

注:

该配置文件表示对进程calc.exe监控,如果捕获到CreateRemoteThread,将会写入事件日志

安装配置文件:

Sysmon.exe -c RecordCreateRemoteTh.xml

查看配置信息

Sysmon.exe -c

如图

启动calc.exe

执行CreateRemoteTh.exe,calc.exe被注入,弹框,如图

CreateRemoteTh.exe的源代码可参照:

https://github.com/3gstudent/CreateRemoteThread/blob/master/CreateRemoteThreadTest.cpp

查看日志,发现Event ID 8

如下图,检测到CreateRemoteThread

通过powershell查看Event ID 8

Get-WinEvent -FilterHashtable @{logname="Microsoft-Windows-Sysmon/Operational";ID=8}

如下图,获取日志Event ID 8

0x03 c++实现通过APC对Dll注入

使用APC注入:

代码如下:

https://github.com/3gstudent/Inject-dll-by-APC/blob/master/test.cpp

关于代码的详细说明可参照:

http://blogs.microsoft.co.il/pavely/2017/03/14/injecting-a-dll-without-a-remote-thread/

如图,成功注入到calc.exe

使用ProcessExplorer查看calc.exe加载的dll,如下图,成功注入testdll

查看日志,并没有产生Event ID 8,成功绕过Sysmon对CreateRemoteThread的监控

0x04 Casey Smith@subTee分享的C#实现代码和用途

可应用到 InstallUtil.exe和Msbuild.exe的利用上面

InstallUtil.exe:

https://gist.github.com/subTee/7bbd8e995ed8e8b1f8dab1dc926def8a

Msbuild.exe:

https://gist.github.com/subTee/cf3e1b06cf58fcc9e0255190d30c2d38

调用过程中没有产生Event ID 8

0x05 小结

本文对Sysmon的监控功能做了测试,并介绍如何通过APC实现Dll注入,绕过Sysmon对CreateRemoteThread的监控

在特定环境下,如果无法手动关闭Sysmon服务,利用APC能在一定程度上绕过Sysmon对CreateRemoteThread的监控

原文发布时间为:2017年4月20日

本文作者:3gstudent

本文来自合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。

原文链接

时间: 2024-12-27 09:34:01

通过APC实现Dll注入——绕过Sysmon监控的相关文章

win7x64 dll注入-win7 64位dll注入到任务管理器

问题描述 win7 64位dll注入到任务管理器 我需要在win7 64位系统下将一个64位的dll注入到任务管理器,我安装了一个CBT钩子, 我打开任务管理器发现注入是没有问题的.但是当我点击任务管理器的<显示所有用户进程>的按钮后,发现任务管理器重新启动了,启动后的任务管理器就不能在用CBT钩子注入了.有没有高手帮助我解决这个问题. 解决方案 问题的原因是权限的问题,我在UAC开启的情况下,使用普通用户权限来安装钩子,打开任务管理器,任务管理器进程的权限和当前用户权限是一致的, 此时任务管

《Metasploit渗透测试手册》—第3章3.8节 理解Windows DLL注入漏洞

3.8 理解Windows DLL注入漏洞Metasploit渗透测试手册本节将介绍一种特殊类型的漏洞,这种漏洞不直接存在于Windows操作系统中,而是存在于Windows上运行的各种应用程序软件之中.这种远程攻击方法针对的是应用程序加载外部库时存在的漏洞,下面介绍这类漏洞,以便对其进行深入分析. 准备这种攻击方法需要创建包含漏洞的目录路径,目标机器需要执行该路径以便激活该漏洞.这个目录可以是文件.提取的文件夹.USB驱动器或网络共享等.创建的文件本身是完全无害的,但会执行DLL注入漏洞来攻击

Dll注入经典方法完整版

Pnig0s1992:算是复习了,最经典的教科书式的Dll注入. 总结一下基本的注入过程,分注入和卸载 注入Dll: 1,OpenProcess获得要注入进程的句柄 2,VirtualAllocEx在远程进程中开辟出一段内存,长度为strlen(dllname)+1; 3,WriteProcessMemory将Dll的名字写入第二步开辟出的内存中. 4,CreateRemoteThread将LoadLibraryA作为线程函数,参数为Dll的名称,创建新线程 5,CloseHandle关闭线程句

c++ win32编程-在win7下面写了个dll注入工具,调试没有问题,就是注入不进去,求助

问题描述 在win7下面写了个dll注入工具,调试没有问题,就是注入不进去,求助 附上代码: void CsqdllDlg::OnBnClickedButton1()//注入 { // TODO: Add your control notification handler code here int pid; CString char_pid,dllname; m_UID.GetWindowText(char_pid); m_DllNames.GetWindowText(dllname); pi

【求助】如何通过DLL注入获取宿主的窗体内变量

问题描述 准备寄宿的对象是一个C#开发的应用程序,手上没有它的源代码,想通过DLL注入的方式获取该程序正在运行的窗体实例内的一个变量值,各位大侠有没有办法,最好能教教这个DLL怎么写?或者有其它方法也行,先跪谢:eek: 解决方案 解决方案二:哪一个变量值?解决方案三:mark感兴趣,.net可以么,不是有个虚拟机么,如果是nativecode分分钟钟教你搞定.解决方案四:一个窗体实例内的public变量是DataTable类型解决方案五:引用3楼lokirf的回复: 一个窗体实例内的publi

借助内核命令行注入绕过Nexus 6安全引导

本文讲的是借助内核命令行注入绕过Nexus 6安全引导,在2017年5月的Android安全公告中,Google发布了一个用于修复CVE- 2016-10277的补丁. 利用此漏洞,攻击者可以对具有ADB/ fastbootUSB访问权限(启动加载程序锁定)的设备进行破坏,允许他获得无限制的root权限,并通过加载篡改或恶意图像来完全拥有用户空间initramfs.此外,这种利用不会导致设备恢复出厂设置,因此用户数据仍会保持不变(并且仍然加密). 在这项研究中,我们还发现了一个已经有18年的的L

系统安全攻防战:DLL注入技术详解

DLL注入是一种允许攻击者在另一个进程的地址空间的上下文中运行任意代码的技术.攻击者使用DLL注入的过程中如果被赋予过多的运行特权,那么攻击者就很有可能会在DLL文件中嵌入自己的恶意攻击代码以获取更高的执行权限. 具体而言,该技术遵循以下步骤: 需要将DLL写入磁盘中; "CreateRemoteThread"调用"LoadLibrary"; 反射加载程序功能将尝试使用适当的CPU寄存器找到目标进程的进程环境块(PEB),并从中尝试查找内存中的kernel32dll

线程-关于Win32核心编程中DLL注入后无反应的解决办法

问题描述 关于Win32核心编程中DLL注入后无反应的解决办法 #include #include HINSTANCE hProcess; PWSTR pszLibFileRemote; HINSTANCE hThread; void StartInject(int ProcessID, char * DllName); void OverInject(char * DllName); void EnableDebugPrivilege(HANDLE processHandle); int ma

hook recv的问题,dll注入

问题描述 hook recv的问题,dll注入 如题,myrecv中必须最后调用原recv才行,不然目标程序会崩溃; int WINAPI MyRecv(SOCKET s, char* buf, int len, int flags) { int ret = pRecv(s,buf,len,flags); ......//我的操作代码 return ret; } 这样写就崩溃了,但是 int WINAPI MyRecv(SOCKET s, char* buf, int len, int flag