2018 年3月,BooldHound
发表了篇博文 SharpHound: Target Selection and API Usage 。这里面介绍了一些关于收集 BooldHound
所需信息的收集方法及所使用的 API
。而本文主要介绍两个关于收集会话信息的 API
及利用远程注册表的方法(翻译+补充),也是对【域渗透】获取域环境内用户登录信息 的一个补充。
0x00 前言
使用过BooldHound
的朋友都知道,它所呈现出来非常多的信息,基本能满足日常信息收集所需的数据,但是之前使用的时候,就很惊讶,它们的会话关系数据来源是怎么来的,所幸后来官方给了解释。
0x01 会话收集
BooldHound
公开了三种不同的查询计算机会话信息的方法,都是从检查 445 端口开始的。
1)、NetSessionEnum
它不允许直接查询是谁登陆了此工作站,但是它允许查询是谁在访问此工作站的网络资源(例如文件共享)时所创建的网络会话,从而知道来自何处。当然这里最好的查询对象是域控 + 文件共享服务器。此函数不需要高权限。
该函数原型是:
它需要 9 个参数,我们只需了解其中的 5 个参数即可:
- servername:该字符串指定要在其上执行函数的远程服务器的DNS或NetBIOS名称。如果此参数为
NULL
,则使用本地计算机。 - UncClientName:该字符串指定要为其返回信息的计算机会话的名称。如果此参数为
NULL
,则NetSessionEnum
将返回服务器上所有计算机会话的信息。 - username:该字符串指定要为其返回信息的用户的名称。如果此参数为
NULL
,则NetSessionEnum
将返回所有用户的信息。 - level:指定数据的信息级别。
- bufptr:指向接收数据的缓冲区的指针。此数据的格式取决于
level
参数的值。此缓冲区由系统分配,必须使用 NetApiBufferFree 函数释放 。请注意,即使函数因ERROR_MORE_DATA
而失败,也必须释放缓冲区。
而此 API 的调用示例为:
1 | string server = "rcoil.me" |
其中,level
的数值为10,是唯一以未经身份验证的方式获取所需数据的级别。
它会返回如下内容:
1 | sesi10_cname - 192.10.22.102 |
关键源码如下:
1 | /// <summary> |
2)、NetWkstaUserEnum
该 NetWkstaUserEnum 功能可以列出当前登录到该工作站的所有用户的信息。此列表包括交互式、服务和批量登录。此函数需要主机的管理权限或这域管权限,适用于自检使用。
该函数原型是:
它需要 7个参数,我们只需了解其中的 3 个参数即可:
- servername:该字符串指定要在其上执行函数的远程服务器的DNS或NetBIOS名称。如果此参数为
NULL
,则使用本地计算机。 - level:指定数据的信息级别。
- bufptr:指向接收数据的缓冲区的指针。此数据的格式取决于
level
参数的值。此缓冲区由系统分配,必须使用 NetApiBufferFree 函数释放 。请注意,即使函数因ERROR_MORE_DATA
而失败,也必须释放缓冲区。
而此 API 的调用示例为:
1 | string server = "rcoil.me" |
其中,level
的数值为1,是因为 1 比 0 返回的数据多,因此选择了 1。
它会返回如下内容:
1 | wkui1_username - Administrator |
关键源码如下:
1 | /// <summary> |
3)、远程注册表
此方法仅为辅助启用。尝试打开远程注册表的用户配置单元(如果已启用),并将查找与 SID 格式匹配的子项,这些对应于登录用户将获取的 SID 转换成用户名即可。一般来说,需要域管权限去操作,而在极少数情况下,无需管理员权限即可访问此数据,这个得看脸。
此处使用 OpenRemoteBaseKey()
函数。
它需要 2 个参数:
- RegistryHive:来自 RegistryHive 的枚举。这里选择
Users
,表示HKEY_USERS
。 - string:表示远程主机。
此函数的调用示例为:
1 | var key = RegistryKey.OpenRemoteBaseKey(RegistryHive.Users, server); |
它会返回如下内容:
1 | HKEY_USERS |
然后读取 HKEY_USERS
的键项就可以了。关键源码如下:
1 | /// <summary> |
最后将 用户的SID 转成用户名即可。
1 | string Username = new SecurityIdentifier(regSID).Translate(typeof(NTAccount)).ToString(); |
4)、结果
0x02 备忘录
API 调用 | 协议 | 端口 | RPC 接口 UUID | 命名管道 | RPC 方法 |
---|---|---|---|---|---|
NetSessionEnum.aspx) | [MS-SRVS]: Server Service Remote Protocol | TCP 445 | 4B324FC8-1670-01D3-1278-5A47BF6EE188 | \PIPE\srvsvc | NetrSessionEnum |
NetWkstaUserEnum.aspx) | [MS-WKST]: Workstation Service Remote Protocol | TCP 445 | 6BFFD098-A112-3610-9833-46C3F87E345A | \PIPE\wkssvc | NetrWkstaUserEnum |
Github 项目地址:SharpDomainSession ,此项目仅供实验使用 Demo。如想更进一步利用,可移至 SharpHound