域渗透自动化模块一-域信息收集
字数 2137 2025-08-06 12:20:45
域渗透自动化模块一:域信息收集工具开发指南
1. 工具概述
本工具是一个基于C#开发的域信息收集工具,类似于SharpHound,用于收集Active Directory(AD)域的结构、权限和潜在安全漏洞信息。工具采用LDAP协议进行查询,主要使用System.DirectoryServices命名空间实现。
2. 信息收集项
工具需要收集以下关键信息:
-
域控制器信息
- 名称、IP地址、操作系统版本等
-
用户信息
- 用户名、全名、邮箱、电话、部门、职务、最后登录时间等
-
计算机信息
- 名称、IP地址、操作系统版本、补丁状态等
-
组信息
- 组名称、组类型(安全组或分发组)和组成员(用户和计算机)等
-
组织单位(OU)信息
- OU名称、层级结构和关联的用户、计算机和组等
-
权限和访问控制
- 与用户、计算机、组和OU相关的访问控制列表(ACL)
-
委派权限
- 与用户、计算机和服务账户相关的Kerberos委派权限
-
账户策略
- 密码策略(长度、复杂性、过期时间等)和账户锁定策略等
-
服务主体名称(SPN)
- 与服务账户关联的服务主体名称
-
组策略对象(GPO)
- 名称、设置、关联的OU和权限等
-
域信任关系
- 与其他域和森林之间的信任关系
-
登录事件和审计
- 域控制器上的登录事件和审计日志
3. 技术选型
3.1 编程语言选择
| 语言 | 优点 | 缺点 | 最终选择 |
|---|---|---|---|
| C++ | 性能高,运行速度快,跨平台,支持面向对象和泛型编程 | 语法繁琐,内存管理复杂,编译时间长 | |
| C# | 语法清晰易于学习,面向对象,.NET生态丰富 | 主要限于Windows平台,性能略逊于C++ | ✓ |
| Python | 语法简单,社区庞大,跨平台 | 运行速度慢,高并发需求不佳 | |
| Go | 语法简洁,原生支持并发,运行速度快 | 社区小,第三方库少 | |
| Java | 跨平台,性能高,生态系统成熟 | 语法繁琐,开发效率低,资源消耗大 |
3.2 LDAP查询方式选择
System.DirectoryServices vs System.DirectoryServices.Protocols:
| 特性 | System.DirectoryServices | System.DirectoryServices.Protocols |
|---|---|---|
| 抽象级别 | 高级抽象,易于使用 | 底层LDAP访问,更灵活 |
| 兼容性 | 主要针对AD设计 | 兼容各种LDAP服务器 |
| 性能 | 较低(使用ADSI) | 较高(直接使用LDAP协议) |
| 引用 | System.DirectoryServices.dll | System.DirectoryServices.Protocols.dll |
| 选择 | ✓ |
4. LDAP查询实现
4.1 基本查询流程
- 建立连接
// 设置LDAP服务器地址和端口
string ldapServer = "Your_LDAP_Server_Address";
int ldapPort = 389;
// 创建LdapConnection对象并连接到LDAP服务器
DirectoryEntry entry = new DirectoryEntry($"LDAP://{ldapServer}:{ldapPort}", null, null, AuthenticationTypes.Secure);
DirectorySearcher search = new DirectorySearcher(entry);
- 设置查询条件
// 设置搜索过滤器
search.Filter = "(&(objectClass=user)(sAMAccountName=*example*))";
- 执行查询并处理结果
// 执行搜索并获取结果
var searchResults = search.FindAll();
foreach (SearchResult result in searchResults)
{
DirectoryEntry serverEntry = result.GetDirectoryEntry();
Console.WriteLine($"Xxx: {serverEntry.xxx}");
Console.WriteLine($"YYY: {serverEntry.YYY}");
Console.WriteLine($"Zzzz: {serverEntry.Properties["Zzzz"].Value.ToString()}");
Console.WriteLine("----------------------------------");
}
4.2 优化查询性能
可以指定要检索的属性,提高查询性能:
search.PropertiesToLoad.AddRange(new string[] { "dnshostname", "Ipv4address" });
4.3 结果保存
使用Newtonsoft.Json库将结果转化为JSON格式保存:
// 示例代码
var json = JsonConvert.SerializeObject(results, Formatting.Indented);
File.WriteAllText("output.json", json);
5. 各信息项收集实现
5.1 域控制器信息收集
search.Filter = "(&(objectCategory=computer)(objectClass=computer)(userAccountControl:1.2.840.113556.1.4.803:=8192))";
foreach (SearchResult result in searchResults)
{
DirectoryEntry serverEntry = result.GetDirectoryEntry();
string Name = serverEntry.Name;
string dnshostname = serverEntry.dnshostname;
string os = serverEntry.Attributes["operatingSystem"][0].ToString();
string osVersion = serverEntry.Attributes["operatingSystemVersion"][0].ToString();
// 获取IP地址
IPAddress[] ipAddresses = Dns.GetHostAddresses(dnsHostName);
IPAddress ipAddress = ipAddresses[0];
Console.WriteLine("----------------------------------");
}
5.2 用户信息收集
search.Filter = "(&(objectCategory=person)(objectClass=user))";
5.3 计算机信息收集
search.Filter = "(objectCategory=computer)";
5.4 组信息收集
search.Filter = "(objectCategory=group)";
5.5 组织单位(OU)信息收集
search.Filter = "(objectCategory=organizationalUnit)";
5.6 服务主体名称(SPN)收集
search.Filter = "(&(objectClass=user)(servicePrincipalName=*))";
5.7 组策略(GPO)信息收集
search.Filter = "(objectCategory=groupPolicyContainer)";
5.8 委派权限收集
- 无约束委派
search.Filter = "(&(objectCategory=user)(userAccountControl:1.2.840.113556.1.4.803:=524288))";
- 不需要预身份验证
search.Filter = "(&(objectCategory=user)(userAccountControl:1.2.840.113556.1.4.803:=16777216))";
- 约束委派(KCD)
search.Filter = "(&(objectCategory=user)(msDS-AllowedToDelegateTo=*))";
- 资源属性基于约束委派(RBCD)
search.Filter = "(&(objectCategory=computer)(msDS-AllowedToActOnBehalfOfOtherIdentity=*))";
5.9 域信任关系收集
// 获取当前计算机所属的域
Domain currentDomain = Domain.GetCurrentDomain();
// 获取与当前域的信任关系
TrustRelationshipInformationCollection trustRelationships = currentDomain.GetAllTrustRelationships();
5.10 访问控制列表(ACL)收集
// 替换为要查询的Active Directory对象的LDAP路径
string ldapPath = "LDAP://la0gke.local:389/CN=krbtgt,CN=Users,DC=la0gke,DC=local";
DirectoryEntry directoryEntry = new DirectoryEntry(ldapPath);
ActiveDirectorySecurity adsSecurity = directoryEntry.ObjectSecurity;
// 获取授权规则集合
AuthorizationRuleCollection authorizationRules = adsSecurity.GetAccessRules(true, true, typeof(NTAccount));
5.11 其他有用查询
- 无需密码的账户
search.Filter = "(userAccountControl:1.2.840.113556.1.4.803:=65536)";
- 判断是否在域内
try {
var currentDomain = Domain.GetCurrentDomain();
// 在域内
} catch {
// 不在域内
}
- 获取域内指定组的成员列表
// 获取域上下文
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domainName);
// 获取组上下文
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, groupName);
// 遍历组成员
foreach (Principal member in group.Members)
{
Console.WriteLine($"Name: {member.Name}, SAM Account Name: {member.SamAccountName}");
}
6. 开发注意事项
- 模块化设计:每个信息收集项应作为独立模块实现,便于维护和扩展
- 错误处理:充分考虑网络中断、权限不足等异常情况
- 性能优化:批量查询、异步处理等技术可提高工具效率
- 结果存储:采用结构化格式(如JSON)存储结果,便于后续分析
- 权限要求:明确工具运行所需的最低权限,并在文档中说明
7. 参考资源
-
现有工具参考:
- BloodHound
- ADRecon
- SharpHound
-
微软文档:
- System.DirectoryServices命名空间
- Active Directory架构文档
-
安全参考:
- MITRE ATT&CK框架中关于AD枚举的技术
- 常见域渗透技术文档
8. 后续开发方向
- 信息分析模块:对收集的信息进行自动化分析,识别潜在风险
- 可视化展示:将复杂的关系数据图形化展示
- 攻击路径识别:基于收集的数据识别可能的攻击路径
- 权限提升检测:识别可能的权限提升路径
- 与其他工具集成:如与Cobalt Strike、Metasploit等工具的集成
通过本指南,开发者可以基于C#和LDAP协议实现一个功能完善的域信息收集工具,为后续的域渗透测试和分析提供数据基础。