域渗透之用户会话收集分析
字数 3304 2025-08-20 18:18:16

域渗透之用户会话收集分析技术文档

1. 查询远程计算机当前登录的用户

1.1 RegistryKey方法

1.1.1 技术原理

  • Windows注册表HKU记录了计算机当前登录的用户SID
  • HKU SID下Volatile Environment的USERNAME属性包含实际用户名
  • 通过远程注册表服务(Remote Registry Service)可远程读取注册表

1.1.2 服务配置

  • 客户端:默认关闭(Disabled)
  • 服务器:默认开启(Automatic)
  • 空闲停止配置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\RemoteRegistry中的DisableIdleStop
    • 0:空闲10分钟后停止
    • 1:空闲时不停止

1.1.3 权限要求

  • HKEY_USERS:Everyone可读
  • HKEY_USERS<SID>\Volatile Environment:普通用户无访问权限

1.1.4 实现方式

  1. 注册表编辑器(regedit.exe)

    • File => Connect Network Registry
    • 输入远程计算机地址
    • 查看HKU中的SID
  2. PowerShell

    # 查看HKU
    [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::Users,'192.168.1.9').OpenSubKey('').GetSubKeyNames()
    
    # 查看HKLM
    [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::Users,'192.168.1.9').OpenSubKey('\System\CurrentControlSet').GetSubKeyNames()
    
  3. Python脚本

    • 核心功能:通过WINREG协议远程读取注册表

1.1.5 流量分析

  • 协议栈:TCP=>NetBIOS=>SMB=>DCERPC=>WINREG
  • 主要阶段:
    1. 建立SMB会话
    2. 连接IPC$共享
    3. 打开winreg命名管道
    4. 绑定winreg接口
    5. RPC方法调用
    6. 关闭连接

1.2 NetWkstaUserEnum方法

1.2.1 技术原理

  • 查询当前登录到工作站的所有用户信息
  • 包括:交互式登录、服务和批处理登录

1.2.2 函数结构

NET_API_STATUS NET_API_FUNCTION NetWkstaUserEnum(
  [in]      LMSTR   servername,
  [in]      DWORD   level,
  [out]     LPBYTE  *bufptr,
  [in]      DWORD   prefmaxlen,
  [out]     LPDWORD entriesread,
  [out]     LPDWORD totalentries,
  [in, out] LPDWORD resumehandle
);

1.2.3 权限要求

  • 需要目标计算机管理员权限
  • 允许的组:Administrators、Server、System和Print Operator本地组

1.2.4 实现方式

  • Python脚本:调用NetWkstaUserEnum API
  • 示例输出:
    Found logged on user at 192.168.1.15: lihua@QFTM
    Found logged on user at 192.168.1.15: dadmin@QFTM
    

1.2.5 流量分析

  • 协议栈:TCP=>NetBIOS=>SMB=>DCERPC=>WKSSVC
  • 主要阶段:
    1. 建立SMB会话
    2. 连接IPC$共享
    3. 打开wkssvc命名管道
    4. 绑定wkssvc接口
    5. RPC方法调用(NetrWkstaUserEnum)
    6. 关闭连接

2. 查询远程计算机当前用户网络会话

2.1 NetSessionEnum方法

2.1.1 技术原理

  • 查询访问远程主机网络资源(如文件共享)时创建的网络会话
  • 可获取域用户及IP等信息

2.1.2 函数结构

NET_API_STATUS NET_API_FUNCTION NetSessionEnum(
  [in]      LMSTR   servername,
  [in]      LMSTR   UncClientName,
  [in]      LMSTR   username,
  [in]      DWORD   level,
  [out]     LPBYTE  *bufptr,
  [in]      DWORD   prefmaxlen,
  [out]     LPDWORD entriesread,
  [out]     LPDWORD totalentries,
  [in, out] LPDWORD resume_handle
);

2.1.3 权限要求

  • 早期系统:Authenticated Users可访问
  • 后期系统(Windows 10 1709+/Windows Server 2019 1809+):需要管理员权限
  • Level权限:
    • 0或10:不需要管理员权限
    • 1或2:需要Administrators或Server Operators权限
    • 502:需要更高权限

2.1.4 实现方式

  • NetSess工具
    NetSess.exe 192.168.1.15
    NetSess.exe 192.168.1.15 -u lihua
    
  • Python脚本:调用NetSessionEnum API

2.1.5 流量分析

  • 协议栈:TCP=>NetBIOS=>SMB=>DCERPC=>SRVSVC
  • 主要阶段:
    1. 建立SMB会话
    2. 连接IPC$共享
    3. 打开srvsvc命名管道
    4. 绑定srvsvc接口
    5. RPC方法调用(NetrSessionEnum)
    6. 关闭连接

3. 常见用户会话收集工具

3.1 SharpHound

3.1.1 收集方法

  • Session收集:使用NetSessionEnum
  • LoggedOn收集:使用NetWkstaUserEnum和RegistryKey
  • 组合收集SharpHound.exe -c session,loggedon

3.1.2 方法对比

方法 OS版本 需要管理员 收集方式 BloodHound边 本地用户
NetWkstaUserEnum 所有 LoggedOn HasSession
NetSessionEnum Win10 1709+/WinSrv2019 1809+ Session HasSession
RegistryKey Windows Server LoggedOn HasSession

3.2 PsLoggedOn

3.2.1 收集方法

  • RegistryKey:查询HKU
  • NetSessionEnum:查询网络会话

3.2.2 使用方式

PsLoggedon.exe /accepteula \\dc
PsLoggedon.exe /accepteula administrator

3.3 PVEFindADUser

3.3.1 收集方法

  • RegistryKey:查询HKU

3.3.2 使用方式

PVEFindADUser.exe -current
PVEFindADUser.exe -current -target dc -noping
PVEFindADUser.exe -current qftm\dadmin -noping

3.4 NetSess

3.4.1 收集方法

  • NetSessionEnum:查询网络会话

3.4.2 使用方式

NetSess.exe 192.168.1.15
NetSess.exe 192.168.1.15 -u lihua

4. 总结对比表

4.1 API方法对比

API Call OS version Admin needed User status SMB share Port Protocol Name pipe RPC Interface UUID RPC Method Call
RegistryKey Windows Server No LoggedOn IPC$ 445 SMB/DCERPC/WINREG \pipe\winreg 338cd001-2244-31f1-aaaa-900038001003 OpenRemoteBaseKey/OpenSubKey/GetSubKeyNames
NetWkstaUserEnum All Yes LoggedOn IPC$ 445 SMB/DCERPC/WKSSVC \pipe\wkssvc 6BFFD098-A112-3610-9833-46C3F87E345A NetrWkstaUserEnum
NetSessionEnum Win10 1709+/WinSrv2019 1809+ Yes Net Session IPC$ 445 SMB/DCERPC/SRVSVC \pipe\srvsvc 4B324FC8-1670-01D3-1278-5A47BF6EE188 NetrSessionEnum

4.2 工具方法对比

工具 使用的方法 优点 缺点
SharpHound NetWkstaUserEnum/NetSessionEnum/RegistryKey 功能全面,与BloodHound集成 体积较大,可能被AV检测
PsLoggedOn RegistryKey/NetSessionEnum 轻量,Sysinternals工具 功能相对简单
PVEFindADUser RegistryKey 可查询域内用户登录位置 仅支持.NET 2.0
NetSess NetSessionEnum 轻量,快速查询网络会话 功能单一
域渗透之用户会话收集分析技术文档 1. 查询远程计算机当前登录的用户 1.1 RegistryKey方法 1.1.1 技术原理 Windows注册表HKU记录了计算机当前登录的用户SID HKU SID下Volatile Environment的USERNAME属性包含实际用户名 通过远程注册表服务(Remote Registry Service)可远程读取注册表 1.1.2 服务配置 客户端 :默认关闭(Disabled) 服务器 :默认开启(Automatic) 空闲停止配置: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\RemoteRegistry 中的 DisableIdleStop 值 0:空闲10分钟后停止 1:空闲时不停止 1.1.3 权限要求 HKEY_ USERS:Everyone可读 HKEY_ USERS\<SID>\Volatile Environment:普通用户无访问权限 1.1.4 实现方式 注册表编辑器(regedit.exe) File => Connect Network Registry 输入远程计算机地址 查看HKU中的SID PowerShell Python脚本 核心功能:通过WINREG协议远程读取注册表 1.1.5 流量分析 协议栈:TCP=>NetBIOS=>SMB=>DCERPC=>WINREG 主要阶段: 建立SMB会话 连接IPC$共享 打开winreg命名管道 绑定winreg接口 RPC方法调用 关闭连接 1.2 NetWkstaUserEnum方法 1.2.1 技术原理 查询当前登录到工作站的所有用户信息 包括:交互式登录、服务和批处理登录 1.2.2 函数结构 1.2.3 权限要求 需要目标计算机管理员权限 允许的组:Administrators、Server、System和Print Operator本地组 1.2.4 实现方式 Python脚本 :调用NetWkstaUserEnum API 示例输出: 1.2.5 流量分析 协议栈:TCP=>NetBIOS=>SMB=>DCERPC=>WKSSVC 主要阶段: 建立SMB会话 连接IPC$共享 打开wkssvc命名管道 绑定wkssvc接口 RPC方法调用(NetrWkstaUserEnum) 关闭连接 2. 查询远程计算机当前用户网络会话 2.1 NetSessionEnum方法 2.1.1 技术原理 查询访问远程主机网络资源(如文件共享)时创建的网络会话 可获取域用户及IP等信息 2.1.2 函数结构 2.1.3 权限要求 早期系统:Authenticated Users可访问 后期系统(Windows 10 1709+/Windows Server 2019 1809+):需要管理员权限 Level权限: 0或10:不需要管理员权限 1或2:需要Administrators或Server Operators权限 502:需要更高权限 2.1.4 实现方式 NetSess工具 : Python脚本 :调用NetSessionEnum API 2.1.5 流量分析 协议栈:TCP=>NetBIOS=>SMB=>DCERPC=>SRVSVC 主要阶段: 建立SMB会话 连接IPC$共享 打开srvsvc命名管道 绑定srvsvc接口 RPC方法调用(NetrSessionEnum) 关闭连接 3. 常见用户会话收集工具 3.1 SharpHound 3.1.1 收集方法 Session收集 :使用NetSessionEnum LoggedOn收集 :使用NetWkstaUserEnum和RegistryKey 组合收集 : SharpHound.exe -c session,loggedon 3.1.2 方法对比 | 方法 | OS版本 | 需要管理员 | 收集方式 | BloodHound边 | 本地用户 | |------|--------|------------|----------|--------------|----------| | NetWkstaUserEnum | 所有 | 是 | LoggedOn | HasSession | 否 | | NetSessionEnum | Win10 1709+/WinSrv2019 1809+ | 是 | Session | HasSession | 否 | | RegistryKey | Windows Server | 否 | LoggedOn | HasSession | 是 | 3.2 PsLoggedOn 3.2.1 收集方法 RegistryKey:查询HKU NetSessionEnum:查询网络会话 3.2.2 使用方式 3.3 PVEFindADUser 3.3.1 收集方法 RegistryKey:查询HKU 3.3.2 使用方式 3.4 NetSess 3.4.1 收集方法 NetSessionEnum:查询网络会话 3.4.2 使用方式 4. 总结对比表 4.1 API方法对比 | API Call | OS version | Admin needed | User status | SMB share | Port | Protocol | Name pipe | RPC Interface UUID | RPC Method Call | |----------|------------|--------------|-------------|-----------|------|----------|-----------|---------------------|-----------------| | RegistryKey | Windows Server | No | LoggedOn | IPC$ | 445 | SMB/DCERPC/WINREG | \pipe\winreg | 338cd001-2244-31f1-aaaa-900038001003 | OpenRemoteBaseKey/OpenSubKey/GetSubKeyNames | | NetWkstaUserEnum | All | Yes | LoggedOn | IPC$ | 445 | SMB/DCERPC/WKSSVC | \pipe\wkssvc | 6BFFD098-A112-3610-9833-46C3F87E345A | NetrWkstaUserEnum | | NetSessionEnum | Win10 1709+/WinSrv2019 1809+ | Yes | Net Session | IPC$ | 445 | SMB/DCERPC/SRVSVC | \pipe\srvsvc | 4B324FC8-1670-01D3-1278-5A47BF6EE188 | NetrSessionEnum | 4.2 工具方法对比 | 工具 | 使用的方法 | 优点 | 缺点 | |------|------------|------|------| | SharpHound | NetWkstaUserEnum/NetSessionEnum/RegistryKey | 功能全面,与BloodHound集成 | 体积较大,可能被AV检测 | | PsLoggedOn | RegistryKey/NetSessionEnum | 轻量,Sysinternals工具 | 功能相对简单 | | PVEFindADUser | RegistryKey | 可查询域内用户登录位置 | 仅支持.NET 2.0 | | NetSess | NetSessionEnum | 轻量,快速查询网络会话 | 功能单一 |