SharpDcsyncCheck
字数 778 2025-08-06 20:12:41

SharpDcsyncCheck 工具使用指南

0x01 DCSync 攻击简介

DCSync 是一种 Active Directory 攻击技术,允许攻击者模拟域控制器行为,从其他域控制器请求账户密码数据。关键点:

  • 实现 DCSync 攻击只需要两条特定的 ACL 权限:
    • 复制目录更改 (GUID: 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2)
    • 复制目录更改全部 (GUID: 1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)
  • 或者拥有一条"完全控制"权限

0x02 LDAP 连接实现

基础连接方法

使用 .NET 的 DirectoryServices 命名空间进行 LDAP 连接:

// 基本连接参数
string url = "LDAP://192.168.11.16/";
string username = "hack";
string password = "test123..";

// 创建 DirectoryEntry 对象
DirectoryEntry conn = new DirectoryEntry(url, username, password);

// 创建 DirectorySearcher 对象用于查询
DirectorySearcher search = new DirectorySearcher(conn);

参数处理

工具接受以下命令行参数格式:

-d 域名 -u 用户名 -p 密码 --list

解析代码:

if (args.Length == 7)
{
    if (args[0] == "-d" && args[2] == "-u" && args[4] == "-p" && args[6] == "--list")
    {
        domain = "LDAP://" + args[1];
        username = args[3];
        password = args[5];
    }
}

0x03 查询域基础信息

获取域 Distinguished Name

public static string GetdistinguishedName()
{
    string Domain_DNS_Name = "";
    search.Filter = "(&(objectClass=domainDNS))";
    foreach (SearchResult r in search.FindAll())
    {
        string domainDNS_Name = "";
        domainDNS_Name = r.Properties["distinguishedName"][0].ToString();
        Domain_DNS_Name = domainDNS_Name;
    }
    return Domain_DNS_Name;
}

0x04 检查 DCSync 权限

查询 ACL 权限

  1. 设置查询路径:
string dcsync_user_path = domain + "/" + distinguishedName;
  1. 获取安全描述符:
DirectoryEntry.ObjectSecurity  // 表示目录的安全说明符
  1. 获取访问规则:
GetAccessRules()  // 返回访问规则集合

关键 GUID 识别

检查 ACL 中是否包含以下 GUID:

  • 复制目录更改: 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2
  • 复制目录更改全部: 1131f6ad-9c07-11d1-f79f-00c04fc2dcd2

SID 到用户名的转换

public static string SidToUser(string sid, string domain)
{
    try
    {
        string url = domain + "/<SID=" + sid + ">";
        conn.Path = url;
        
        // 查询用户
        search.Filter = "(&(objectClass=user)(objectCategory=person))";
        foreach (SearchResult r in search.FindAll())
        {
            string users = "";
            users = r.Properties["name"][0].ToString();
            if (users != "")
            {
                return users;
            }
        }
        
        // 查询组
        search.Filter = "(&(objectClass=group))";
        foreach (SearchResult r in search.FindAll())
        {
            string groups = "";
            groups = r.Properties["name"][0].ToString();
            if (groups != "")
            {
                return groups;
            }
        }
        
        // 查询计算机
        search.Filter = "(&(objectClass=computer))";
        foreach (SearchResult r in search.FindAll())
        {
            string computers = "";
            computers = r.Properties["name"][0].ToString();
            if (computers != "")
            {
                return computers;
            }
        }
    }
    catch
    {
    }
    return "error";
}

用户名提取方法

public static string dcsync_return_username(ActiveDirectoryAccessRule rule, string domain)
{
    string username = "";
    string user_name = rule.IdentityReference.Value;
    
    if (user_name.Contains('-'))
    {
        username = SidToUser(user_name, domain);
    }
    else
    {
        username = user_name;
    }
    
    if (username == "error")
    {
        return null;
    }
    return username;
}

权限检查逻辑

string user_name = "";
string guids = rule.ObjectType.ToString();

switch (guids)
{
    case "1131f6aa-9c07-11d1-f79f-00c04fc2dcd2":
        user_name = dcsync_return_username(rule, domain);
        if (user_name == null) { continue; }
        ACE_Changes.Add(user_name);
        break;
        
    case "1131f6ad-9c07-11d1-f79f-00c04fc2dcd2":
        user_name = dcsync_return_username(rule, domain);
        if (user_name == null) { continue; }
        ACE_Changes_All.Add(user_name);
        break;
}

结果交集处理

IEnumerable<string> dcsync_users1 = ACE_Changes.Intersect(ACE_Changes_All);
foreach (string dcsync_users in dcsync_users1)
{
    Console.WriteLine(dcsync_users);
}

0x05 使用总结

  1. 工具通过检查域对象的 ACL 来识别具有 DCSync 权限的账户
  2. 主要检查两条关键权限或完全控制权限
  3. 能够处理 SID 到用户名的转换
  4. 输出同时拥有两条关键权限的账户

防御建议

  1. 定期审计域对象的 ACL 权限
  2. 限制"复制目录更改"和"复制目录更改全部"权限的分配
  3. 监控对域控制器的异常复制请求
  4. 对特权账户实施最小权限原则
SharpDcsyncCheck 工具使用指南 0x01 DCSync 攻击简介 DCSync 是一种 Active Directory 攻击技术,允许攻击者模拟域控制器行为,从其他域控制器请求账户密码数据。关键点: 实现 DCSync 攻击只需要两条特定的 ACL 权限: 复制目录更改 (GUID: 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2 ) 复制目录更改全部 (GUID: 1131f6ad-9c07-11d1-f79f-00c04fc2dcd2 ) 或者拥有一条"完全控制"权限 0x02 LDAP 连接实现 基础连接方法 使用 .NET 的 DirectoryServices 命名空间进行 LDAP 连接: 参数处理 工具接受以下命令行参数格式: 解析代码: 0x03 查询域基础信息 获取域 Distinguished Name 0x04 检查 DCSync 权限 查询 ACL 权限 设置查询路径: 获取安全描述符: 获取访问规则: 关键 GUID 识别 检查 ACL 中是否包含以下 GUID: 复制目录更改: 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2 复制目录更改全部: 1131f6ad-9c07-11d1-f79f-00c04fc2dcd2 SID 到用户名的转换 用户名提取方法 权限检查逻辑 结果交集处理 0x05 使用总结 工具通过检查域对象的 ACL 来识别具有 DCSync 权限的账户 主要检查两条关键权限或完全控制权限 能够处理 SID 到用户名的转换 输出同时拥有两条关键权限的账户 防御建议 定期审计域对象的 ACL 权限 限制"复制目录更改"和"复制目录更改全部"权限的分配 监控对域控制器的异常复制请求 对特权账户实施最小权限原则