____ _____ __ __ __ __
/ __ \_________ / __(_) /__ / / / /___ __ ______ ____/ /
/ /_/ / ___/ __ \/ /_/ / / _ \/ /_/ / __ \/ / / / __ \/ __ /
/ ____/ / / /_/ / __/ / / __/ __ / /_/ / /_/ / / / / /_/ /
/_/ /_/ \____/_/ /_/_/\___/_/ /_/\____/\__,_/_/ /_/\__,_/
ProfileHound 是一个权限提升后工具,用于通过定位目标机器上的域用户配置文件来帮助实现红队目标。它使用 BloodHound OpenGraph 格式构建一种名为 HasUserProfile 的新边,该边用于判断计算机上是否存在用户配置文件。该边使操作员能够做出更明智的决策,确定哪些计算机最适合用于窃取机密信息。
此工具需要目标机器上 C$ 共享的管理员访问权限才能枚举用户配置文件。
特别感谢 Remi Gascou (@podalirius) 贡献的 ShareHound 和 bhopengraph 工具。我一直想构建一个工具来收集这些数据,使用这些库让我能够专注于构建本身,而不是底层实现。
[!WARNING] ProfileHound 尚处于早期开发阶段,尚未实现所有收集模式。在生产环境中请谨慎使用,使用此工具的风险由您自行承担。
Active Directory 中的后利用目标已从本地存储的数据转向 SaaS 应用程序和云端。为了证明渗透测试的价值,我们需要展示如何能够攻破对这些服务的访问权限。在许多情况下,这些服务仅被特定组或用户使用,例如 HR、财务等。在某些场景中,某些 SaaS 应用程序只能从特定机器访问。
BloodHound 的 HasSession 边非常有用,但它仅在用户登录到机器时才有效。如果数据收集时用户未登录到机器,可能很难找到包含机密信息以促进进一步利用的计算机。用户配置文件中可能包含大量有价值的情报,例如 DPAPI、缓存的凭据、SSH 密钥、云密钥等——这些都不需要活跃的用户会话就能访问。

ProfileHound 使用 BloodHound 的 OpenGraph 格式来构建一个名为 HasUserProfile 的新图边,用于判断域机器上是否存在用户配置文件。这可以帮助操作员将注意力集中在高价值用户或组拥有配置文件的机器上。
HasUserProfile 边包含配置文件的创建日期和最后修改日期等属性。这些信息有助于确定:

该边还包含配置文件创建和修改的时间戳属性,允许通过特定的 Cypher 查询找到特定机器上活跃或长期存在的用户配置文件。
使用 pipx 安装 ProfileHound(除非您喜欢依赖地狱):
pipx install profilehound
要使用最新开发版本,您可以从源码安装:
pipx install git+https://github.com/m4lwhere/profilehound.git
要使用容器化方法,请使用以下命令构建镜像并运行工具:
docker build -t profilehound .
docker run --rm profilehound --help
docker run --rm -v ${PWD}:/profilehound profilehound --auth-user alice --auth-password whiteRabbit --auth-domain sccm.lab --dns 192.168.57.10 --auth-dc-ip 192.168.57.10
例如,使用域管理员账户 sccm.lab\alice 及密码 whiteRabbit 运行:
$ profilehound --auth-user alice --auth-password whiteRabbit --auth-domain sccm.lab --target 192.168.57.0/27
____ _____ __ __ __ __
/ __ \_________ / __(_) /__ / / / /___ __ ______ ____/ /
/ /_/ / ___/ __ \/ /_/ / / _ \/ /_/ / __ \/ / / / __ \/ __ /
/ ____/ / / /_/ / __/ / / __/ __ / /_/ / /_/ / / / / /_/ /
/_/ /_/ \____/_/ /_/_/\___/_/ /_/\____/\__,_/_/ /_/\__,_/ v0.1.1
@m4lwhere
BloodHound CE OpenGraph 收集器,用于收集域机器上的用户配置文件。
[12/30/25 11:58:05] INFO 加载了 32 个目标
[12/30/25 11:58:08] INFO 以 sccm.lab\alice 身份在 192.168.57.10 (192.168.57.10) 上认证成功
INFO 以 sccm.lab\alice 身份成功连接到共享 \\192.168.57.10\C$
INFO 正在枚举 \\192.168.57.10\C$\Users\ 中的配置文件...
INFO vagrant: S-1-5-21-3016982856-3796307652-1246469985-1000 创建时间:2025-11-07 修改时间:2025-11-07
INFO 在 192.168.57.10 上找到 1 个域配置文件
INFO 以 sccm.lab\alice 身份在 192.168.57.11 (192.168.57.11) 上认证成功
[12/30/25 11:58:09] INFO 以 sccm.lab\alice 身份成功连接到共享 \\192.168.57.11\C$
INFO 正在枚举 \\192.168.57.11\C$\Users\ 中的配置文件...
INFO administrator: S-1-5-21-3016982856-3796307652-1246469985-500 创建时间:2025-11-07 修改时间:2025-11-07
INFO alice: S-1-5-21-3016982856-3796307652-1246469985-1112 创建时间:2025-12-28 修改时间:2025-11-07
INFO eve: S-1-5-21-3016982856-3796307652-1246469985-1116 创建时间:2025-12-27 修改时间:2025-11-07
INFO 在 192.168.57.11 上找到 3 个域配置文件
INFO 以 sccm.lab\alice 身份在 192.168.57.12 (192.168.57.12) 上认证成功
INFO 以 sccm.lab\alice 身份成功连接到共享 \\192.168.57.12\C$
INFO 正在枚举 \\192.168.57.12\C$\Users\ 中的配置文件...
INFO alice: S-1-5-21-3016982856-3796307652-1246469985-1112 创建时间:2025-12-28 修改时间:2025-12-28
INFO franck: S-1-5-21-3016982856-3796307652-1246469985-1117 创建时间:2025-12-27 修改时间:2025-11-07
INFO sccm-sql: S-1-5-21-3016982856-3796307652-1246469985-1121 创建时间:2025-11-07 修改时间:2025-11-07
INFO 在 192.168.57.12 上找到 3 个域配置文件
INFO 以 sccm.lab\alice 身份在 192.168.57.13 (192.168.57.13) 上认证成功
INFO 以 sccm.lab\alice 身份成功连接到共享 \\192.168.57.13\C$
INFO 正在枚举 \\192.168.57.13\C$\Users\ 中的配置文件...
INFO alice: S-1-5-21-3016982856-3796307652-1246469985-1112 创建时间:2025-12-26 修改时间:2025-12-28
INFO sccm-account-da: S-1-5-21-3016982856-3796307652-1246469985-1119 创建时间:2025-12-26 修改时间:2025-11-07
INFO 在 192.168.57.13 上找到 2 个域配置文件
[12/30/25 11:59:27] INFO 找到 4 台包含配置文件的机器
INFO 已导出 OpenGraph 情报到 profilehound_20251230-115805.json
这在当前目录下创建了一个名为 profilehound_20251230-115805.json 的文件。该文件可以直接导入 BHCE:只需将文件拖放到 BloodHound UI 中即可。它会自动解析并通过 SID 关联节点。新的 HasUserProfile 边将创建以显示用户与配置文件之间的关系。
完成后,ProfileHound 还会在控制台打印一个小型统计摘要:
╭───────────────────────── 常规摘要 ──────────────────────────────╮
│ ProfileHound 统计信息 │
│ 包含配置文件的机器总数 4 │
│ 唯一配置文件(用户)总数 7 │
│ 每台机器平均配置文件数 2.25 │
╰──────────────────────────────────────────────────────────────────╯
拥有最多连接的用户
┏━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ 用户 ┃ 机器数量 ┃
┡━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ alice │ 3 │
│ vagrant │ 1 │
│ administrator │ 1 │
│ eve │ 1 │
│ franck │ 1 │
└────────────────┴────────────────┘
配置文件最多的机器
┏━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ 机器 ┃ 配置文件数量 ┃
┡━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 192.168.57.11 │ 3 │
│ 192.168.57.12 │ 3 │
│ 192.168.57.13 │ 2 │
│ 192.168.57.10 │ 1 │
└────────────────┴────────────────┘
最旧的用户配置文件
┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ 用户 ┃ 机器 ┃ 创建时间 ┃ 最后修改时间 ┃
┡━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ vagrant │ DC.sccm.lab │ 2025-11-07 │ 2025-11-07 │
│ sccm-sql │ MSSQL.sccm.lab │ 2025-11-07 │ 2025-11-07 │
│ administrator │ MECM.sccm.lab │ 2025-11-07 │ 2025-11-07 │
│ sccm-account-da │ CLIENT.sccm.lab │ 2025-12-26 │ 2025-11-07 │
│ alice │ CLIENT.sccm.lab │ 2025-12-26 │ 2025-12-28 │
└──────────────────┴──────────────────┴────────────┴────────────────┘
存活最久的配置文件(创建时间 -> 修改时间)
┏━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ 用户 ┃ 机器 ┃ 存活天数 ┃ 创建时间 ┃ 最后修改时间 ┃
┡━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ alice │ CLIENT.sccm.lab │ 1.8 │ 2025-12-26 │ 2025-12-28 │
│ alice │ MSSQL.sccm.lab │ 0.0 │ 2025-12-28 │ 2025-12-28 │
│ sccm-sql │ MSSQL.sccm.lab │ 0.0 │ 2025-11-07 │ 2025-11-07 │
│ administrator │ MECM.sccm.lab │ 0.0 │ 2025-11-07 │ 2025-11-07 │
│ vagrant │ DC.sccm.lab │ 0.0 │ 2025-11-07 │ 2025-11-07 │
└────────────────┴──────────────────┴────────────┴────────────┴────────────────┘
重点关注的 5 台机器(枢纽)
┏━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 机器 ┃ 得分 ┃ 原因 ┃
┡━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ MECM.sccm.lab │ 4.5 │ 拥有 3 个配置文件,潜在的横向移动枢纽 │
│ MSSQL.sccm.lab │ 4.5 │ 拥有 3 个配置文件,潜在的横向移动枢纽 │
│ CLIENT.sccm.lab │ 3.5 │ 拥有 2 个配置文件,潜在的横向移动枢纽 │
│ DC.sccm.lab │ 1.0 │ 拥有 1 个配置文件,潜在的横向移动枢纽 │
└──────────────────┴───────┴──────────────────────────────────────────────────┘
ProfileHound 使用 C$ 共享在域机器上枚举用户配置文件,路径为 \\<target>\C$\Users\。它会读取用户的 NTUSER.DAT 文件,通过检索文件元数据中的 SID 来判断该用户是域账户还是本地账户。例如,它会收集 \\<target>\C$\Users\ 下的所有用户目录,然后遍历每个目录,在 \\<target>\C$\Users\<username>\NTUSER.DAT 路径下查找 NTUSER.DAT 文件。如果 NTUSER.DAT 文件由已知 SID 所有,它将通过读取用户的 DPAPI 目录(例如 \\<target>\C$\Users\<username>\AppData\Roaming\Microsoft\Protect\<SID>)来尝试查找用户的 SID。
由于我们要访问 C$ 共享,因此需要管理员账户来验证目标机器。ProfileHound 将使用提供的凭据对目标机器进行身份验证。如果您使用的是域账户,可以使用 --auth-domain 选项指定域。如果您使用的是本地账户,可以使用 --smb-local-auth 选项。
默认情况下,ProfileHound 在 SMB 域身份验证失败后会停止,以降低账户锁定风险。如果某些端点预期会拒绝域身份验证,并且您希望继续扫描其余目标,请使用 --smb-ignore-failed-domain-auth 选项。
如果在 SMB 数据收集过程中 ProfileHound 停止,但已找到部分配置文件,它将尝试在退出前导出部分 OpenGraph 结果。
NTUSER.DAT 文件的创建时间和最后修改时间会被收集,可用于判断配置文件是否活跃。此关联通过边属性上的 cypher 查询处理,示例如下。
值得注意的是,如果 NTUSER.DAT 文件的最后修改时间早于创建时间,则很可能是该配置文件已创建但未以实质性方式使用。这种情况是因为创建新用户配置文件时,NTUSER.DAT 文件是从 C:\Users\Default 配置文件复制而来,尽管创建时间较晚,但修改日期保持不变。因此,我们可以合理地确信该特定配置文件不会包含任何机密信息。
ProfileHound 使用 @podalirius_ 的 ShareHound 作为库来枚举目标。如果未提供 --target 或 --target-file 选项,ProfileHound 将通过连接 LDAP 自动枚举域中所有机器的 FQDN。
从这些数据中我们可以得出许多有力的结论,告诉我们应重点关注哪些地方。所有查询都可以通过将 ProfileHound_Cypher_Queries.zip 文件 拖放到 BloodHound UI 中的“已保存查询”页面并使用“导入”按钮来导入。 以下是一些示例:
这是一个简单查询,用于查找图中所有用户配置文件。
MATCH p=(u:User)-[:HasUserProfile]->(c:Computer)
RETURN p
这将查找域“Administrators”组中所有成员的用户配置文件。
MATCH p=(g:Group)<-[:MemberOf*1..]-(u:User)-[:HasUserProfile]->(c:Computer)
WHERE toLower(g.samaccountname) = "administrators"
RETURN p
这将查找在过去 3 天内被修改过的所有用户配置文件。这有助于确定哪个用户配置文件可能是用户的主机器,并包含有价值的战利品。
WITH 3 as active_days
MATCH p = (u:User)-[e:HasUserProfile]-(c:Computer)
WHERE e.profileModified > (datetime().epochseconds - (active_days * 86400))
RETURN p
这是一个非常强大的查询,用于定位特定组成员在过去 3 天内使用过的用户配置文件。
WITH 3 as active_days, "administrators" as group_name
MATCH p = (g:Group)<-[:MemberOf*1..]-(u:User)-[e:HasUserProfile]-(c:Computer)
WHERE e.profileModified > (datetime().epochseconds - (active_days * 86400)) AND toLower(g.samaccountname) = group_name
RETURN p
这将移除所有 NTUSER.DAT 文件修改时间早于创建时间的用户配置文件。这表示配置文件已创建但未以实质性方式使用。这种情况是因为创建新用户配置文件时,NTUSER.DAT 文件是从 C:\Users\Default 配置文件复制而来的,尽管创建时间较晚,但修改日期保持不变。
match p = (u:User)-[e:HasUserProfile]-(c:Computer)
where e.profileCreated < e.profileModified
return p
如果没有 Remi Gascou (@podalirius) 的 ShareHound 和 bhopengraph 库,这一切将不可能实现。
该工具的重点是确定哪些机器最有可能包含特定用户的机密信息。未来的改进将包括:
get_lastlogon 函数在机器上创建 HasUserProfile 边。get_puser 函数将域用户关联为特定机器的首要设备所有者。AZDeviceOwner 对象收集在 .data.owners[owner.DeviceOwner.onPremisesSecurityIdentifier] 中。NTUSER.DAT 文件中的最近程序、文档和浏览器活动。