01阅读须知
此文所节选自小报童《.NET 内网实战攻防》专栏,主要内容有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧,对内网和后渗透感兴趣的朋友们可以订阅该电子报刊,解锁更多的报刊内容。
02基本介绍
本文内容部分节选自小报童《.NET 通过APC注入绕过终端安全防护》,完整的文章内容请加入小报童后订阅查看。现在限时只需69元,永久买断!目前已有280+位朋友抢先预定,我们会长期更新,对.NET内网安全的朋友们请尽快订阅该报刊!
03原理分析
Windows 线程是 CPU 调度的最小单位,在 Windows 中每个线程都是由内核对象表示,包含寄存器状态、栈、线程环境块、调度信息等。一个进程可以拥有多个线程,通常是主线程 + 辅助线程,线程一般会共享进程的地址空间和句柄、内存等。
3.1 什么是线程
线程在不同阶段具有不同状态。虽然这些状态不像进程状态那样通过 API 直接暴露,但可以通过调试器或性能分析工具查看,常见的状态有如下几种
Initialized 表示刚创建尚未运行,尚未进入调度器队列
Ready 等待 CPU 调度运行
Running 正在 CPU 上执行
Standby 将要被调度器选中运行
Waiting 阻塞状态,等待某事件、I/O、信号等
Transition 面切换中、暂不可运行
Terminated已退出,等待回收
在上述几种状态中, 线程如果处于 Waiting 状态比较特殊,当该线程调用如 SleepEx、WaitForSingleObjectEx、WaitForMultipleObjectsEx 并设置 bAlertable = TRUE 时,线程进入一种 alertable wait 状态。alertable wait 是一种可中断等待信号的状态,这个时候线程在等待某对象的同时接受并执行排入的APC。
3.2 APC注入技术
APC 英文全称 Asynchronous Procedure Call ,是系统提供的一种调用机制,用于将一段代码排队到特定线程的 APC 队列中,待该线程进入 alertable state 时被调用,APC 注入就是利用这个特性,将 shellcode 地址排队到目标线程,待其进入 alertable 状态时执行代码。
首先,通过 OpenProcess 打开目标进程句柄,并使用 VirtualAllocEx 在其中分配一块可执行内存。
IntPtr pHandle =OpenProcess((uint)ProcessAccessRights.All,false,(uint)pid);
IntPtr allocAddr =VirtualAllocEx(pHandle, IntPtr.Zero,(uint)buf.Length,
(uint)(MemAllocation.MEM_COMMIT | MemAllocation.MEM_RESERVE),
(uint)MemProtect.PAGE_EXECUTE_READWRITE);
随后,使用 WriteProcessMemory 将 shellcode 写入这块内存,调用 OpenThread 获取目标线程句柄,并使用 QueueUserAPC 将 shellcode 的地址排入该线程的 APC 队列。
IntPtr tHandle =OpenThread((uint)ThreadAccess.THREAD_ALL,false,(uint)threadid);
QueueUserAPC(allocAddr, tHandle, IntPtr.Zero);
ResumeThread(tHandle);
由于 APC 仅会在线程处于 alertable 状态时被触发,因此必须等待或促使目标线程调用诸如 SleepEx 或 MsgWaitForMultipleObjectsEx 等支持 alertable 等待的 API。当线程进入此状态时,操作系统会自动调用 APC 队列中的 shellcode,从而实现代码注入与执行,运行后如下图所示。
综上 ,APC 注入是一种历史悠久但依然活跃的进程注入技术,凭借其 API 简单、行为隐蔽的特点,成为红队与恶意软件常用的技术之一。想要了解完整或者更多的内网安全方向的文章,可以移步订阅小报童《.NET 内网实战攻防》电子报刊。
04.NET 电子报刊
我们的小报童电子报刊【.NET内网安全攻防】也开始运营,引入小报童也是为了弥补知识星球对于轻量级阅读支持的不足,为用户读者提供更佳的阅读体验。如果您对阅读体验的需求比较高,那么可以订阅这个专栏。
本次电子报刊《.NET 内网安全攻防》专栏,内容主要有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧,可细分为以下8个方向。
1) .NET 安全防御绕过
2) .NET 本地权限提升
3) .NET 内网信息收集
4) .NET 内网代理通道
5) .NET 内网横向移动
6) .NET 目标权限维持
7) .NET 数据传输外发
8) .NET 目标痕迹清理
原价899,现在限时只需59元,永久买断!目前已有280+位朋友抢先预定,我们会长期更新,初步计划保持每周更新1-2篇新内容,对.NET内网安全的朋友们请尽快订阅该报刊!
想要了解完整或者更多的内网安全方向的文章,可以移步订阅小报童《.NET 内网实战攻防》电子报刊,报刊地址:小报童