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)
- 复制目录更改 (GUID:
- 或者拥有一条"完全控制"权限
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 权限
- 设置查询路径:
string dcsync_user_path = domain + "/" + distinguishedName;
- 获取安全描述符:
DirectoryEntry.ObjectSecurity // 表示目录的安全说明符
- 获取访问规则:
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 使用总结
- 工具通过检查域对象的 ACL 来识别具有 DCSync 权限的账户
- 主要检查两条关键权限或完全控制权限
- 能够处理 SID 到用户名的转换
- 输出同时拥有两条关键权限的账户
防御建议
- 定期审计域对象的 ACL 权限
- 限制"复制目录更改"和"复制目录更改全部"权限的分配
- 监控对域控制器的异常复制请求
- 对特权账户实施最小权限原则