内网渗透从零到一之令牌窃取
字数 1483 2025-08-26 22:12:02
Windows令牌窃取技术详解
0x00 令牌窃取概述
令牌窃取是内网渗透中一种重要的权限提升技术,主要用于:
- 从Administrator权限提升到System权限
- 获取trustedinstaller等特殊权限
- 横向移动时获取其他用户权限
常见实现工具有:
- Metasploit框架提供的载荷
- JCTokenUtil
- SharpToken
- incognito
0x01 令牌列举技术
核心API
NtQuerySystemInformation - 检索系统信息的关键API
__kernel_entry NTSTATUS NtQuerySystemInformation(
[in] SYSTEM_INFORMATION_CLASS SystemInformationClass,
[in, out] PVOID SystemInformation,
[in] ULONG SystemInformationLength,
[out, optional] PULONG ReturnLength
);
SYSTEM_INFORMATION_CLASS枚举 - 指定要检索的信息类型
typedef enum _SYSTEM_INFORMATION_CLASS {
SystemProcessInformation = 5, // 检索进程信息
// 其他枚举值省略...
} SYSTEM_INFORMATION_CLASS;
进程信息结构
SYSTEM_PROCESS_INFORMATION - 包含进程详细信息
typedef struct _SYSTEM_PROCESS_INFORMATION {
ULONG NextEntryOffset; // 下一个结构的偏移量
ULONG NumberOfThreads; // 线程数量
UNICODE_STRING ImageName; // 进程映像名称
HANDLE UniqueProcessId; // 进程PID
ULONG HandleCount; // 句柄数量
ULONG SessionId; // 会话ID
// 其他成员省略...
} SYSTEM_PROCESS_INFORMATION;
令牌枚举流程
- 使用
NtQuerySystemInformation获取所有进程信息 - 遍历每个进程的
SYSTEM_PROCESS_INFORMATION结构 - 使用
DuplicateHandle获取进程的所有句柄 - 使用
NtQueryObject检查句柄类型
NtQueryObject - 查询对象类型
NTSYSCALLAPI NTSTATUS NtQueryObject(
[in, optional] HANDLE Handle,
[in] OBJECT_INFORMATION_CLASS ObjectInformationClass,
[out, optional] PVOID ObjectInformation,
[in] ULONG ObjectInformationLength,
[out, optional] PULONG ReturnLength
);
PUBLIC_OBJECT_TYPE_INFORMATION - 对象类型信息
typedef struct __PUBLIC_OBJECT_TYPE_INFORMATION {
UNICODE_STRING TypeName; // 对象类型名称("Token"表示令牌)
ULONG Reserved[22];
} PUBLIC_OBJECT_TYPE_INFORMATION;
- 过滤出类型为"Token"的句柄
- 使用
OpenProcessToken获取进程自身的令牌句柄 - 检查令牌的模拟级别(需大于
SecurityImpersonation)
0x02 令牌窃取与利用
窃取系统令牌流程
-
找到目标账户(如NT AUTHORITY\SYSTEM)的令牌
- 使用
GetTokenInformation获取令牌用户SID - 使用
LookupAccountSidA将SID转换为账户名
- 使用
-
修改令牌的
TokenSessionId- 设置为当前进程令牌的
TokenSessionId - 使用
SetTokenInformation函数 - 需要
SeTcbPrivilege特权
- 设置为当前进程令牌的
-
使用窃取的令牌执行命令
- 调用
CreateProcessAsUserA函数 - 需要
SE_ASSIGNPRIMARYTOKEN_NAME特权
- 调用
CreateProcessAsUserA - 以指定用户身份创建进程
BOOL CreateProcessAsUserA(
[in, optional] HANDLE hToken, // 窃取的令牌
[in, optional] LPCSTR lpApplicationName,
[in, out, optional] LPSTR lpCommandLine, // 要执行的命令
[in, optional] LPSECURITY_ATTRIBUTES lpProcessAttributes,
[in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes,
[in] BOOL bInheritHandles,
[in] DWORD dwCreationFlags,
[in, optional] LPVOID lpEnvironment,
[in, optional] LPCSTR lpCurrentDirectory,
[in] LPSTARTUPINFOA lpStartupInfo,
[out] LPPROCESS_INFORMATION lpProcessInformation
);
- 特权提升技巧
- 先调用
ImpersonateLoggedOnUser模拟系统账户 - 这样就能获得必要的特权(SeTcbPrivilege和SE_ASSIGNPRIMARYTOKEN_NAME)
- 先调用
0x03 权限限制分析
普通用户无法有效窃取令牌的原因:
-
令牌数量限制
- 管理员账户可获取约730个令牌
- 普通用户只能获取约345个令牌
-
令牌访问限制
- 普通用户只能获取自己账户的令牌
- 无法获取System、Administrator等高权限令牌
-
安全机制限制
- 令牌的安全描述符和完整性级别限制了访问
- 需要特定特权(SeTcbPrivilege等)才能操作令牌
0x04 防御措施
-
权限最小化原则
- 避免不必要的管理员权限分配
- 使用普通用户账户进行日常操作
-
令牌保护
- 启用UAC(用户账户控制)
- 限制SeDebugPrivilege等敏感特权
-
监控与检测
- 监控可疑的令牌操作API调用
- 检测异常的进程创建行为
-
系统加固
- 定期更新补丁
- 使用LSA保护机制
- 启用Credential Guard(Windows 10+)
总结
令牌窃取是一种有效的权限提升技术,但受限于用户权限。理解其原理不仅有助于渗透测试,也能帮助系统管理员更好地防御此类攻击。关键在于控制敏感特权的分配和加强系统监控。