域渗透自动化模块一-域信息收集
字数 2137 2025-08-06 12:20:45

域渗透自动化模块一:域信息收集工具开发指南

1. 工具概述

本工具是一个基于C#开发的域信息收集工具,类似于SharpHound,用于收集Active Directory(AD)域的结构、权限和潜在安全漏洞信息。工具采用LDAP协议进行查询,主要使用System.DirectoryServices命名空间实现。

2. 信息收集项

工具需要收集以下关键信息:

  1. 域控制器信息

    • 名称、IP地址、操作系统版本等
  2. 用户信息

    • 用户名、全名、邮箱、电话、部门、职务、最后登录时间等
  3. 计算机信息

    • 名称、IP地址、操作系统版本、补丁状态等
  4. 组信息

    • 组名称、组类型(安全组或分发组)和组成员(用户和计算机)等
  5. 组织单位(OU)信息

    • OU名称、层级结构和关联的用户、计算机和组等
  6. 权限和访问控制

    • 与用户、计算机、组和OU相关的访问控制列表(ACL)
  7. 委派权限

    • 与用户、计算机和服务账户相关的Kerberos委派权限
  8. 账户策略

    • 密码策略(长度、复杂性、过期时间等)和账户锁定策略等
  9. 服务主体名称(SPN)

    • 与服务账户关联的服务主体名称
  10. 组策略对象(GPO)

    • 名称、设置、关联的OU和权限等
  11. 域信任关系

    • 与其他域和森林之间的信任关系
  12. 登录事件和审计

    • 域控制器上的登录事件和审计日志

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 基本查询流程

  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);
  1. 设置查询条件
// 设置搜索过滤器
search.Filter = "(&(objectClass=user)(sAMAccountName=*example*))";
  1. 执行查询并处理结果
// 执行搜索并获取结果
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 委派权限收集

  1. 无约束委派
search.Filter = "(&(objectCategory=user)(userAccountControl:1.2.840.113556.1.4.803:=524288))";
  1. 不需要预身份验证
search.Filter = "(&(objectCategory=user)(userAccountControl:1.2.840.113556.1.4.803:=16777216))";
  1. 约束委派(KCD)
search.Filter = "(&(objectCategory=user)(msDS-AllowedToDelegateTo=*))";
  1. 资源属性基于约束委派(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 其他有用查询

  1. 无需密码的账户
search.Filter = "(userAccountControl:1.2.840.113556.1.4.803:=65536)";
  1. 判断是否在域内
try {
    var currentDomain = Domain.GetCurrentDomain();
    // 在域内
} catch {
    // 不在域内
}
  1. 获取域内指定组的成员列表
// 获取域上下文
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. 开发注意事项

  1. 模块化设计:每个信息收集项应作为独立模块实现,便于维护和扩展
  2. 错误处理:充分考虑网络中断、权限不足等异常情况
  3. 性能优化:批量查询、异步处理等技术可提高工具效率
  4. 结果存储:采用结构化格式(如JSON)存储结果,便于后续分析
  5. 权限要求:明确工具运行所需的最低权限,并在文档中说明

7. 参考资源

  1. 现有工具参考

    • BloodHound
    • ADRecon
    • SharpHound
  2. 微软文档

    • System.DirectoryServices命名空间
    • Active Directory架构文档
  3. 安全参考

    • MITRE ATT&CK框架中关于AD枚举的技术
    • 常见域渗透技术文档

8. 后续开发方向

  1. 信息分析模块:对收集的信息进行自动化分析,识别潜在风险
  2. 可视化展示:将复杂的关系数据图形化展示
  3. 攻击路径识别:基于收集的数据识别可能的攻击路径
  4. 权限提升检测:识别可能的权限提升路径
  5. 与其他工具集成:如与Cobalt Strike、Metasploit等工具的集成

通过本指南,开发者可以基于C#和LDAP协议实现一个功能完善的域信息收集工具,为后续的域渗透测试和分析提供数据基础。

域渗透自动化模块一:域信息收集工具开发指南 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 基本查询流程 建立连接 设置查询条件 执行查询并处理结果 4.2 优化查询性能 可以指定要检索的属性,提高查询性能: 4.3 结果保存 使用Newtonsoft.Json库将结果转化为JSON格式保存: 5. 各信息项收集实现 5.1 域控制器信息收集 5.2 用户信息收集 5.3 计算机信息收集 5.4 组信息收集 5.5 组织单位(OU)信息收集 5.6 服务主体名称(SPN)收集 5.7 组策略(GPO)信息收集 5.8 委派权限收集 无约束委派 不需要预身份验证 约束委派(KCD) 资源属性基于约束委派(RBCD) 5.9 域信任关系收集 5.10 访问控制列表(ACL)收集 5.11 其他有用查询 无需密码的账户 判断是否在域内 获取域内指定组的成员列表 6. 开发注意事项 模块化设计 :每个信息收集项应作为独立模块实现,便于维护和扩展 错误处理 :充分考虑网络中断、权限不足等异常情况 性能优化 :批量查询、异步处理等技术可提高工具效率 结果存储 :采用结构化格式(如JSON)存储结果,便于后续分析 权限要求 :明确工具运行所需的最低权限,并在文档中说明 7. 参考资源 现有工具参考 : BloodHound ADRecon SharpHound 微软文档 : System.DirectoryServices命名空间 Active Directory架构文档 安全参考 : MITRE ATT&CK框架中关于AD枚举的技术 常见域渗透技术文档 8. 后续开发方向 信息分析模块 :对收集的信息进行自动化分析,识别潜在风险 可视化展示 :将复杂的关系数据图形化展示 攻击路径识别 :基于收集的数据识别可能的攻击路径 权限提升检测 :识别可能的权限提升路径 与其他工具集成 :如与Cobalt Strike、Metasploit等工具的集成 通过本指南,开发者可以基于C#和LDAP协议实现一个功能完善的域信息收集工具,为后续的域渗透测试和分析提供数据基础。