该工具是一个应用程序/服务,可部署在域控制器上,用于对域控制器同步尝试进行警报。当检测到尝试时,该工具会向 Windows 事件日志写入一条事件。这些事件可以在 SIEM 中关联。此外,该工具可以接受一个有效 DC IP 列表,在此配置下,仅当 DC 同步尝试来自非 DC IP 时才发出警报。该工具旨在为蓝队提供一种无需商业工具(如 Microsoft ATA 或复杂的 IDS/IPS)即可对抗 DC 同步和 DC SHADOW 攻击的方法。
简要 YouTube 视频:https://www.youtube.com/watch?v=oLND9QZfaJc
要安装此工具,您可以使用预构建的二进制文件,也可以自行构建工具。预构建二进制文件的链接如下:
32 位服务:https://github.com/shellster/DCSYNCMonitor/raw/master/Release/DCSYNCMONITORSERVICE.exe
64 位服务:https://github.com/shellster/DCSYNCMonitor/raw/master/x64/Release/DCSYNCMONITORSERVICE.exe
您需要在域控制器上安装 Winpcap 或 Npcap。Winpcap 应能工作,但建议使用 Npcap,因为其数据包捕获方法更高效、更彻底。此工具仅在 Winpcap 下进行过简要测试。
要安装 Npcap,请从此处下载安装程序:https://nmap.org/npcap/
您应确保已勾选以下选项:
安装后,您需要重新启动域控制器。
Npcap 不会将支持的库 DLL 安装到系统的 DLL 搜索路径中,因此您需要在安装后执行以下任务:
copy "%WINDIR%\System32\Npcap\*.dll" "%WINDIR%\System32\"
# 如适用(64 位系统上的 32 位服务):
copy "%WINDIR%\SYSWOW64\Npcap\*.dll" "%WINDIR%\SYSWOW64\"
注意: 如果未完成上一步,则尝试运行工具时会收到关于缺少 wpcap.dll 或 Packet.dll 的错误。
现在将本项目的 DCSYNCMONITOR.EXE 复制到合适的位置。对于 32 位系统或使用 64 位服务的 64 位系统,我们建议使用 %WINDIR%\SYSTEM32;如果在 64 位系统上使用 32 位服务,则使用 %WINDIR%\SYSWOW64。
现在可以运行该工具了。您可以选择以下两种方式之一运行:
在此模式下,每当一个新 IP(过去五分钟内未见过)尝试对域控制器执行 DC 同步时,工具会向 Windows 应用程序事件日志写入一条 DCSYNCALERT 警告事件。这包括域控制器之间的合法同步活动。
可以将名为 "dc_ip_list.conf" 的配置文件放置在工具所在目录中。如果该文件存在,应每行包含一个 IPv4(或长格式 IPv6)地址。工具会在启动时读取此列表。在此模式下,对于来自匹配 IP 地址的 DC 同步尝试,不会写入事件。但是,如果来自其他 IP 地址的 DC 同步尝试发生,则会向 Windows 应用程序事件日志写入一条 DCSYNCALERT 错误事件。
注意 对 dc_ip_list.conf 文件的更改不会生效,直到服务停止并重新启动。
使用此工具的常见方法是将其安装为服务。将工具放入正确的文件夹后,通过运行以下命令即可轻松完成:
DCMONITORSERVICE.exe -install
安装服务后,您需要从 Services.msc 菜单或使用适当的 net 或 sc 命令手动启动它。它将在未来的重新启动时自动启动。
如果需要卸载服务,请运行以下命令:
DCMONITORSERVICE.exe -remove
最后,以独立模式运行工具(不安装服务,特别适用于调试):
DCMONITORSERVICE.exe -standalone
当未提供有效 DC IP 列表,或来自有效 DC IP 的 DC 同步发生时,会出现 DC 同步警告事件:

当提供了有效 DC IP 列表且来自任何其他 IP 地址的 DC 同步发生时,会出现 DC 同步错误事件:

您需要 Visual Studio 2015 或更高版本。Community(免费)版本完全可用。打开项目后,您应能立即构建 32 位和 64 位版本的 Dev 和 Release 版。Debug 版本不应部署到生产环境。它们会输出大量错误和调试信息,包括 TCP 数据包转储(如果您在 monitor.cpp 文件中取消注释以下行):
#ifdef _DEBUG
//debug_print("TCP SRC IP: %s\nData:\n", tcppacket.source_ip.address.c_str());
//print_payload((const u_char *)tcppacket.data, tcppacket.data_length);
#endif
Release 版本小得多,并且会自动去除调试语句。
该工具具有以下已知限制:
此工具根据 MIT 许可证提供(见 LICENSE)
工具由 Shelby Spencer 编写:
FusionX 慷慨地为我提供了更新和完善此工具的时间,以及宣布它的平台。但是,此项目完全由我拥有和开发。
欢迎并鼓励提出建议、反馈和拉取请求。