域内普通域用户权限查找域内所有计算机上登录的用户

本文主要记录了如何通过域内普通域用户权限来查找域内所有计算机上登录的用户, 并且最终落地工具.

前言

目前能够做到这点的工具有很多, 常见的有以下几个工具:

  • PsLoggedOn 这个是微软的工具, 工具并未开源, 用法网上有很多, 这里就不过多阐述了.

  • PVEFindADUser 工具并未开源. 用法网上有很多, 这里就不过多阐述了.

  • PowerView dev 版本的 PowerView 也可以实现这个功能, 估计有许多人不知道这个用法 ( PowerView 确实是个好东西).

    Invoke-UserHunter -UserIdentity "Administrator" -UserDomain missyou.com -Server DC.missyou.com
    

但是这些工具都一些痛点, 导致其实战中可用性并不高 ( 本人见识短浅, 如果有这方面好用的工具, 大家知道的话可以留言告诉我, 十分感谢 ).

HKEY_USERS

HKEY_USERS 是 Windows 注册表中的一个 “根键 ( root key )”, 用于存储所有用户配置文件的信息.

在每个用户登录时, 操作系统都会创建一个与该用户相关联的配置文件, 包含了该用户的偏好设置, 桌面背景, 应用程序配置等信息, 这些信息都存储在注册表的 HKEY_USERS 根键下对应的用户的子键中, 而该子键的名称就是该用户的安全标识符 ( SID ), 例如域内 MISSYOU\wanglei 用户对应的 SID 为 S-1-5-21-3769497069-907082914-4097527205-1112.

此处注意, 只有在用户登录时, 它的 SID 才会出现在 HKEY_USERS 的子键中.

经过测试我发现, 如果目标计算机开启了 “Remote Registry ( 远程注册表服务 )”, 域用户就可以尝试连接到指定计算机的注册表, 一旦我们成功连接到指定计算机的注册表, 我们就可以查看该计算机的 HKEY_USERS 根键下的子键名称 ( SID ).

Remote Registry

“Remote Registry ( 远程注册表服务 )”, 它允许用户通过网络访问远程计算机的注册表, 并且允许在本地计算机上进行注册表编辑操作 ( 编辑操作需要权限 ), 默认情况下, 此服务配置为手动启动.

如果目标计算机没有开启 “Remote Registry” 服务, 其他计算机是不能对该计算机进行远程注册表连接的.

查看本地计算机是否开启 “Remote Registry” 服务:

sc query RemoteRegistry

当然也并不是说所有开启了 “Remote Registry” 服务的计算机都能进行远程注册表连接, 有哪些限制可以参考 官方的文章.

实际测试

域控 ( DC ) 开启了 “Remote Registry” 服务, 使用域用户 missyou\ligang ( 普通域用户权限 ) 在域内的一台计算机上来远程连接域控 ( DC ) 的注册表.

whoami & hostname & net user ligang /domain

成功连接域控 ( DC ) 的注册表后, 是可以直接看到域控 ( DC ) 的 HKEY_USERS 根键下的子键的名称的, 也就是对应登录域控 ( DC ) 的用户的 SID.

但是通过远程连接注册表来查看 HKEY_USERS 根键下的子键中的键值时是需要对应权限的, 如果没权限查看会提示: “Details: Access is denied.” 访问被拒绝.

比如这里我想查看 S-1-5-21-3769497069-907082914-4097527205-500 这个子键的键值就会提示我没权限.

至此我们已经能够获取到了一些 SID, 而我们最终的目的是想拿到用户名, 这里可以使用 LookupAccountSidW 这个函数来将 SID 转换为对应的用户名, 具体的实现请参考代码.

这种方法不仅能够查看到正常通过桌面登录的用户帐户的 SID, 如果计算机上存在通过 “右键 -> 以管理身份员运行” 的程序的话, 还能查到对应的管理员用户帐户的 SID, 拿到了这些信息后, 后续怎么利用, 此处就不展开过多的叙述了.

感谢耐心阅读, 文章仅供参考, 本人学艺不精, 不足之处欢迎师傅们指点和纠正!

开源代码

完整的实现代码已上传至github, 地址如下:

https://github.com/0x727/UserRegEnum_0x727

0%