内网渗透从零到一之令牌窃取
字数 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;

令牌枚举流程

  1. 使用NtQuerySystemInformation获取所有进程信息
  2. 遍历每个进程的SYSTEM_PROCESS_INFORMATION结构
  3. 使用DuplicateHandle获取进程的所有句柄
  4. 使用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;
  1. 过滤出类型为"Token"的句柄
  2. 使用OpenProcessToken获取进程自身的令牌句柄
  3. 检查令牌的模拟级别(需大于SecurityImpersonation)

0x02 令牌窃取与利用

窃取系统令牌流程

  1. 找到目标账户(如NT AUTHORITY\SYSTEM)的令牌

    • 使用GetTokenInformation获取令牌用户SID
    • 使用LookupAccountSidA将SID转换为账户名
  2. 修改令牌的TokenSessionId

    • 设置为当前进程令牌的TokenSessionId
    • 使用SetTokenInformation函数
    • 需要SeTcbPrivilege特权
  3. 使用窃取的令牌执行命令

    • 调用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
);
  1. 特权提升技巧
    • 先调用ImpersonateLoggedOnUser模拟系统账户
    • 这样就能获得必要的特权(SeTcbPrivilege和SE_ASSIGNPRIMARYTOKEN_NAME)

0x03 权限限制分析

普通用户无法有效窃取令牌的原因:

  1. 令牌数量限制

    • 管理员账户可获取约730个令牌
    • 普通用户只能获取约345个令牌
  2. 令牌访问限制

    • 普通用户只能获取自己账户的令牌
    • 无法获取System、Administrator等高权限令牌
  3. 安全机制限制

    • 令牌的安全描述符和完整性级别限制了访问
    • 需要特定特权(SeTcbPrivilege等)才能操作令牌

0x04 防御措施

  1. 权限最小化原则

    • 避免不必要的管理员权限分配
    • 使用普通用户账户进行日常操作
  2. 令牌保护

    • 启用UAC(用户账户控制)
    • 限制SeDebugPrivilege等敏感特权
  3. 监控与检测

    • 监控可疑的令牌操作API调用
    • 检测异常的进程创建行为
  4. 系统加固

    • 定期更新补丁
    • 使用LSA保护机制
    • 启用Credential Guard(Windows 10+)

总结

令牌窃取是一种有效的权限提升技术,但受限于用户权限。理解其原理不仅有助于渗透测试,也能帮助系统管理员更好地防御此类攻击。关键在于控制敏感特权的分配和加强系统监控。

Windows令牌窃取技术详解 0x00 令牌窃取概述 令牌窃取是内网渗透中一种重要的权限提升技术,主要用于: 从Administrator权限提升到System权限 获取trustedinstaller等特殊权限 横向移动时获取其他用户权限 常见实现工具有: Metasploit框架提供的载荷 JCTokenUtil SharpToken incognito 0x01 令牌列举技术 核心API NtQuerySystemInformation - 检索系统信息的关键API SYSTEM_ INFORMATION_ CLASS枚举 - 指定要检索的信息类型 进程信息结构 SYSTEM_ PROCESS_ INFORMATION - 包含进程详细信息 令牌枚举流程 使用 NtQuerySystemInformation 获取所有进程信息 遍历每个进程的 SYSTEM_PROCESS_INFORMATION 结构 使用 DuplicateHandle 获取进程的所有句柄 使用 NtQueryObject 检查句柄类型 NtQueryObject - 查询对象类型 PUBLIC_ OBJECT_ TYPE_ INFORMATION - 对象类型信息 过滤出类型为"Token"的句柄 使用 OpenProcessToken 获取进程自身的令牌句柄 检查令牌的模拟级别(需大于 SecurityImpersonation ) 0x02 令牌窃取与利用 窃取系统令牌流程 找到目标账户(如NT AUTHORITY\SYSTEM)的令牌 使用 GetTokenInformation 获取令牌用户SID 使用 LookupAccountSidA 将SID转换为账户名 修改令牌的 TokenSessionId 设置为当前进程令牌的 TokenSessionId 使用 SetTokenInformation 函数 需要 SeTcbPrivilege 特权 使用窃取的令牌执行命令 调用 CreateProcessAsUserA 函数 需要 SE_ASSIGNPRIMARYTOKEN_NAME 特权 CreateProcessAsUserA - 以指定用户身份创建进程 特权提升技巧 先调用 ImpersonateLoggedOnUser 模拟系统账户 这样就能获得必要的特权(SeTcbPrivilege和SE_ ASSIGNPRIMARYTOKEN_ NAME) 0x03 权限限制分析 普通用户无法有效窃取令牌的原因: 令牌数量限制 管理员账户可获取约730个令牌 普通用户只能获取约345个令牌 令牌访问限制 普通用户只能获取自己账户的令牌 无法获取System、Administrator等高权限令牌 安全机制限制 令牌的安全描述符和完整性级别限制了访问 需要特定特权(SeTcbPrivilege等)才能操作令牌 0x04 防御措施 权限最小化原则 避免不必要的管理员权限分配 使用普通用户账户进行日常操作 令牌保护 启用UAC(用户账户控制) 限制SeDebugPrivilege等敏感特权 监控与检测 监控可疑的令牌操作API调用 检测异常的进程创建行为 系统加固 定期更新补丁 使用LSA保护机制 启用Credential Guard(Windows 10+) 总结 令牌窃取是一种有效的权限提升技术,但受限于用户权限。理解其原理不仅有助于渗透测试,也能帮助系统管理员更好地防御此类攻击。关键在于控制敏感特权的分配和加强系统监控。