域渗透工具SharpHound原理分析
字数 1856 2025-08-06 12:20:45
SharpHound原理分析与使用指南
1. SharpHound概述
SharpHound是BloodHound的官方数据收集工具,使用C#编写,通过调用Windows原生API和LDAP命名空间函数从域控制器和已加入域的Windows系统中收集数据。
2. 核心功能
SharpHound主要收集以下类型的数据:
-
域信息收集:
- 域用户、组、计算机等对象信息
- 组策略对象(GPO)信息
- 组织单位(OU)结构
-
权限关系收集:
- 用户对计算机的本地管理员权限
- 组嵌套关系
- 委派权限
-
会话信息收集:
- 当前登录会话
- 远程桌面会话
- 网络共享会话
3. 工作原理
3.1 LDAP查询机制
SharpHound通过LDAP协议与域控制器通信,执行以下关键查询:
-
基础域信息查询:
- 查询域根目录信息
- 获取域SID和域功能级别
-
对象枚举:
// 使用DirectorySearcher进行LDAP查询的示例 DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain); DirectorySearcher searcher = new DirectorySearcher(entry); searcher.Filter = "(objectClass=user)"; searcher.PropertiesToLoad.Add("samAccountName"); searcher.PropertiesToLoad.Add("objectSid"); -
特殊属性收集:
- msDS-AllowedToDelegateTo (约束委派)
- msDS-AllowedToActOnBehalfOfOtherIdentity (基于资源的约束委派)
- userAccountControl (账户属性标志)
3.2 本地权限收集
-
本地管理员枚举:
- 通过NetLocalGroupGetMembers API获取本地管理员组成员
[DllImport("netapi32.dll", CharSet = CharSet.Unicode)] public static extern int NetLocalGroupGetMembers( string servername, string localgroupname, int level, out IntPtr bufptr, int prefmaxlen, out int entriesread, out int totalentries, IntPtr resumehandle); -
远程注册表查询:
- 访问远程系统的注册表获取本地组信息
3.3 会话收集技术
-
NetSessionEnum API:
[DllImport("netapi32.dll", CharSet = CharSet.Unicode)] public static extern int NetSessionEnum( string servername, string UncClientName, string username, int level, out IntPtr bufptr, int prefmaxlen, out int entriesread, out int totalentries, ref int resume_handle); -
WMI查询:
- 通过Win32_LoggedOnUser类获取登录会话
4. 使用方法
4.1 基本命令
# 收集所有数据
SharpHound.exe --CollectionMethod All
# 指定收集方法
SharpHound.exe -c Group,LocalAdmin
# 从文件读取计算机列表
SharpHound.exe -c Session --ComputerFile computers.txt
4.2 常用参数
| 参数 | 描述 |
|---|---|
| -c, --CollectionMethod | 指定收集方法 (Default: Default) |
| -d, --Domain | 指定目标域 |
| --DomainController | 指定域控制器 |
| --Stealth | 使用隐蔽模式 |
| --Loop | 循环收集会话信息 |
| --LoopDuration | 循环持续时间 (默认: 00:00:00) |
| --LoopInterval | 循环间隔 (默认: 00:05:00) |
4.3 收集方法选项
- Default: 等同于ACL, ObjectProps, Container, GPOLocalGroup
- All: 所有收集方法
- Group: 收集组和组成员关系
- LocalAdmin: 收集本地管理员数据
- RDP: 收集远程桌面用户数据
- DCOM: 收集DCOM用户数据
- Session: 收集会话数据
- Trusts: 收集域信任关系
- ACL: 收集ACL信息
- Container: 收集容器数据
- ObjectProps: 收集对象属性
- LoggedOn: 收集登录会话数据
- GPOLocalGroup: 收集GPO本地组数据
- PSRemote: 收集PowerShell远程用户数据
5. 输出与数据处理
-
输出文件:
- 默认生成时间戳命名的ZIP文件
- 包含JSON格式的数据文件
-
数据导入BloodHound:
neo4j start bloodhound- 在BloodHound界面中导入生成的ZIP文件
6. 防御与检测
6.1 检测SharpHound活动
-
LDAP查询特征:
- 大量LDAP查询请求
- 查询敏感属性如msDS-AllowedToDelegateTo
-
API调用特征:
- NetLocalGroupGetMembers调用
- NetSessionEnum调用
-
网络特征:
- 来自单一主机的多台计算机的SMB/WMI连接
6.2 防御措施
-
监控与警报:
- 监控异常LDAP查询模式
- 设置API调用警报阈值
-
权限限制:
- 限制普通用户查询敏感LDAP属性的权限
- 实施本地管理员权限最小化原则
-
BloodHound防御:
- 定期运行BloodHound分析自身域环境
- 修复识别出的危险权限路径
7. 高级技巧
-
隐蔽收集:
SharpHound.exe -c All --Stealth --DomainController dc01.domain.com -
绕过防护:
- 使用合法管理账户执行收集
- 降低查询频率
- 分散收集任务
-
自定义收集:
- 通过修改SharpHound源码定制收集逻辑
- 添加新的属性收集功能
8. 总结
SharpHound作为BloodHound生态系统的关键组件,通过系统化的数据收集为域渗透测试提供了全面的攻击路径可视化。理解其工作原理不仅有助于有效使用该工具,也能帮助防御者更好地检测和防范此类信息收集活动。