moltenbit/daemon-tools-ioc-scanner

GitHub: moltenbit/daemon-tools-ioc-scanner

针对 Kaspersky 披露的 DAEMON Tools 供应链攻击,提供一款纯离线、严格只读的 PowerShell IoC 扫描器,帮助安全团队在不修改系统的前提下快速排查 Windows 主机感染痕迹。

Stars: 0 | Forks: 0

# DAEMON Tools 供应链 IoC 扫描器 ![PowerShell 5.1+](https://img.shields.io/badge/PowerShell-5.1%2B-blue) ![PowerShell 7+](https://img.shields.io/badge/PowerShell-7%2B-blue) ![License: MIT](https://img.shields.io/badge/License-MIT-green) ![Read-only](https://img.shields.io/badge/scan-read--only-brightgreen) 2026 年 5 月 5 日,Kaspersky 披露了一起针对 DAEMON Tools Lite 安装程序的活跃供应链攻击事件,该事件自 2026 年 4 月 8 日起通过合法的 DAEMON Tools 网站分发带有木马的二进制文件。恶意安装程序使用真实的 AVB Disc Soft 开发者证书进行签名,其中释放到磁盘上的三个二进制文件(`DTHelper.exe`、`DiscSoftBusServiceLite.exe`、`DTShellHlp.exe`)在其 CRT 初始化中携带了后门,会联系 `env-check.daemontools[.]cc` 并拉取第二阶段 payload。本扫描器用于检查 Windows 主机上是否存在 Kaspersky 报告中公布的文件哈希、路径、网络指标和持久化痕迹。它是只读的,并且完全在离线状态下运行。 ## 只读保证 该扫描器不会以任何方式修改系统。它不会连接网络,不会写入注册表,不会删除或隔离文件,不会启动或停止服务,不会发送信号或终止进程,也不会更改防火墙规则、计划任务、组策略或任何其他系统配置。它不会发送遥测数据。它唯一会写入的文件只有您明确要求的两个输出: - `-JsonOutputPath `(可选)。发现项将写入为不带 BOM 的 UTF-8 JSON 格式。 - `-LogPath `(可选)。追加纯文本运行日志。 规范的写入操作枚举位于 `Invoke-DaemonToolsIOCScan.ps1` 顶部的 `READ-ONLY GUARANTEE` 注释块中。如果您修改了该脚本,请保持该块同步更新。 ## 本脚本检查的内容 该扫描器运行 11 项独立的检查。每项检查都经过封装,以确保其中一项的失败不会阻止其余检查的运行。每个发现项都包含一个检查 ID、一个目标(文件路径、哈希、IP、注册表值等)、严重级别、自由文本详细信息和结构化证据。 1. **`FILE_HASH_INSTALLER`:可疑安装程序文件。** 在用户的 Downloads 和 Desktop 文件夹、用户 TEMP 目录、`C:\Users\Public\Downloads` 以及(在以提升权限运行时)每个用户配置文件的 Downloads 文件夹中查找。与安装程序名称模式匹配的文件(`daemon*.exe`、`dtlite*.exe`、`dt-lite*.exe`、`dt_lite*.exe`、`discsoft*.exe` 以及 `.msi` 等效项)将被计算 SHA1 哈希值,并与 Kaspersky 发布的八个木马化安装程序哈希值进行比较。匹配项将被标记为 `CONFIRMED`。名称模式匹配但哈希值未知的文件将被报告为 `INFO` 并附带其哈希值,以便您获得双向的证据。 2. **`DAEMON_TOOLS_INSTALL`:安装发现和版本。** 读取 `HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall` 下的标准卸载键(包括 64 位和 WOW6432 配置单元)以及 `HKLM\SOFTWARE\DT Soft` 注册表根目录。对于每个匹配项,将捕获安装位置、发布者和版本。如果版本可解析并且落在受影响范围 `12.5.0.2421` 到 `12.5.0.2434`(含)之内,则发现项为 `SUSPICIOUS`。否则,发现项为 `INFO`。如果根本没有安装 DAEMON Tools,则记录为 `INFO`。安装位置将被检查 3 重用。 3. **`FILE_HASH_BINARIES`:就地木马化二进制文件哈希。** 对于每个 DAEMON Tools 安装根目录(在检查 2 中发现,加上 Lite、Pro 和 Ultra 的标准 `Program Files` 和 `Program Files (x86)` 位置),检查 `DTHelper.exe`、`DiscSoftBusServiceLite.exe` 和 `DTShellHlp.exe`。将 SHA1 哈希值与已发布的九个 `DiscSoftBusServiceLite.exe` 变体进行比较。直接匹配为 `CONFIRMED`。如果二进制文件存在且安装版本处于标记范围内,但哈希值不在列表中,则发现项为 `SUSPICIOUS`,因为 Kaspersky 没有发布 `DTHelper.exe` 或 `DTShellHlp.exe` 的哈希值,并且可能没有编录每个 `DiscSoftBusServiceLite.exe` 变体。使用 `-IncludeAllVolumes` 时,还会搜索额外的固定驱动器。 4. **`FILE_HASH_PAYLOAD`:已知路径下的第二阶段 payload 文件。** 测试已发布的第二阶段路径是否存在:`C:\Windows\Temp\envchk.exe`、`cdg.exe`、`cdg.tmp`、`imp.tmp`、`piyu.exe`、`crypto.dll`,加上 `C:\ProgramData\Microsoft\mcrypto.chiper`、`C:\ProgramData\Microsoft\mcrypto.dat` 以及 `%APPDATA%\Microsoft` 下每个用户配置文件对应的路径。路径 `mcrypto.chiper` 包含了攻击者对“cipher”的拼写错误,文件名 `envchk.exe` 和 `piyu.exe` 是此活动特有的,其余部分是已记录的 payload 位置。仅路径存在即为 `CONFIRMED`。如果存在文件的 SHA1 与已发布的三个第二阶段哈希之一匹配,则特定变体名称也会记录在证据中。 5. **`DNS_CACHE`:DNS 解析器缓存。** 调用 `Get-DnsClientCache` 并在 entry/name/data 字段中搜索 `daemontools.cc`(该活动对合法 `daemon-tools.cc` 的域名仿冒)和 IP `38.180.107.76`。匹配项为 `CONFIRMED`。如果 cmdlet 不存在(较旧的 Server Core 版本),则检查为 `SKIPPED`。 6. **`HOSTS_FILE`:hosts 文件内容。** 读取 `%SystemRoot%\System32\drivers\etc\hosts` 并作为子字符串搜索 C2 域名和 IP。匹配项为 `CONFIRMED`。如果文件不可读,则检查为 `INFO`。 7. **`NETWORK_CONNECTIONS`:活动网络连接。** 调用 `Get-NetTCPConnection -RemoteAddress 38.180.107.76`。活动连接为 `CONFIRMED`,同时会捕获拥有该连接的进程名、ID 以及(可读时的)路径。UDP 和 QUIC 套接字不会在本地套接字表中记录远程端点,因此无法通过此检查检测到 QUIC RAT;`INFO` 发现项明确指出了这一限制。 8. **`PROCESSES`:可疑的运行中进程。** 枚举正在运行的进程,并将任何基名称为 `envchk`、`cdg`、`piyu`、`crypto` 或 `mcrypto` 的进程标记为 `CONFIRMED`。还会查询 `Win32_Process` 以查找命令行中包含 `mcrypto` 的任何 `rundll32.exe`,并将其记录为 `SUSPICIOUS`。 9. **`PREFETCH`:Windows prefetch 中的执行证据。** 枚举 `C:\Windows\Prefetch\*.pf` 并匹配如 `ENVCHK.EXE-*`、`CDG.EXE-*`、`PIYU.EXE-*`、`CRYPTO.EXE-*`、`MCRYPTO.EXE-*` 这样的名称。匹配项为 `CONFIRMED`,并且 prefetch 文件的 `LastWriteTime` 提供了大致的上次执行时间。如果设置了 `-SkipPrefetch` 或 prefetch 不可读,则跳过此检查。 10. **`POWERSHELL_LOG`:PowerShell 操作日志。** 从 `Microsoft-Windows-PowerShell/Operational` 读取最多 5000 个 ID 为 4104 的事件,并在每个 script-block 消息中搜索 `38.180.107.76`、`daemontools.cc`、`env-check`、`mcrypto.chiper`、`mcrypto.dat`、`envchk.exe` 和 `first_match`(在 cdg 加载器中观察到的 RC4 密钥)。匹配项为 `CONFIRMED`,并附带匹配点周围 200 个字符的代码片段。需要管理员权限才能读取日志;否则为 `SKIPPED`。只有在恶意活动发生之前启用了 Script Block Logging 时才有用。使用 `-SkipEventLog` 可完全跳过。 11. **`PERSISTENCE_TASKS`:计划任务和 Run 键。** 使用 `Get-ScheduledTask` 枚举计划任务,并检查每个动作的 `Execute` 和 `Arguments`。读取 `HKLM`、`HKLM\WOW6432Node` 和 `HKCU` 的标准 `Run` 和 `RunOnce` 键。任何对 `mcrypto`、`envchk`、`cdg.exe`、`piyu.exe` 或 C2 IP 的引用均为 `CONFIRMED`。 最后的总结块按严重级别统计发现项并打印总体结论。即使在 `-Quiet` 模式下,也始终会显示总结。 ## 本脚本不执行的操作 该扫描器是一个检测工具。它不会移除恶意软件,不会修补 DAEMON Tools,不能防止未来的感染,也无法检测到超出 Kaspersky 已发布 IoC 范围的变种。基于哈希的检测只能捕获 Kaspersky 发布的特定样本;具有不同 SHA1 的重新编译或修改过的 payload 将无法被哈希检查检测到。QUIC RAT 通信通道无法从本地套接字状态中检测到。 **此扫描的干净结果不能保证系统未被入侵。** 该扫描仅涵盖 Kaspersky 发布的 IoC。修改过的或更复杂的植入物变种,或任何不相关的入侵,都无法被此工具检测到。请将干净的扫描结果视为一个数据点,而不是最终结论。 ## 受影响的 DAEMON Tools 版本 Kaspersky 的报告确定了以下木马化的 DAEMON Tools Lite 安装程序版本(SHA1 哈希嵌入在脚本中,并列在 `docs/IOCS.md` 中): - 12.5.0.2421 - 12.5.0.2422 - 12.5.0.2423 - 12.5.0.2424 - 12.5.0.2430 - 12.5.0.2431 - 12.5.0.2433 - 12.5.0.2434 公布的范围是 `12.5.0.2421` 到 `12.5.0.2434`。中间版本号(2425 到 2429,2432)即使没有发布特定的哈希值,也可能受到影响。任何解析后数字处于该范围内的已安装版本,都将被视为在二进制文件哈希检查(检查 3)的范围内。 ## 要求 - Windows 10、Windows 11 或 Windows Server 2019 及更高版本。 - PowerShell 5.1(Windows 默认)或 PowerShell 7 及更高版本。 - 可选:管理员权限,用于全面覆盖 prefetch 枚举、PowerShell 操作事件日志以及按用户配置文件进行的安装程序搜索。该扫描器也可以在非提升模式下运行;需要提升权限的检查将被报告为 `SKIPPED` 而不是失败。 ## 用法 基本扫描,仅控制台输出: ``` PS> .\Invoke-DaemonToolsIOCScan.ps1 ``` 扫描并输出结构化 JSON: ``` PS> .\Invoke-DaemonToolsIOCScan.ps1 -JsonOutputPath .\dt-scan.json ``` 扫描并同时输出 JSON 和纯文本运行日志: ``` PS> .\Invoke-DaemonToolsIOCScan.ps1 -JsonOutputPath .\dt-scan.json -LogPath .\dt-scan.log ``` 用于计划执行(如定时任务)的安静模式: ``` PS> .\Invoke-DaemonToolsIOCScan.ps1 -Quiet -JsonOutputPath C:\reports\dt-scan.json PS> $LASTEXITCODE ``` 跳过耗时的检查: ``` PS> .\Invoke-DaemonToolsIOCScan.ps1 -SkipPrefetch -SkipEventLog ``` 搜索额外的固定驱动器: ``` PS> .\Invoke-DaemonToolsIOCScan.ps1 -IncludeAllVolumes ``` 该脚本不导入任何模块,也不需要任何安装步骤。将其放入文件夹中并运行即可。 如果本地执行策略阻止了未签名脚本的运行,您可以启动一个单一范围受限的会话,而无需更改计算机策略: ``` PS> powershell.exe -ExecutionPolicy Bypass -File .\Invoke-DaemonToolsIOCScan.ps1 ``` 您也可以使用自己的代码签名证书对脚本进行签名。本仓库不包含签名逻辑。 ### 退出代码 | 代码 | 含义 | |------|---------| | 0 | 没有 `CONFIRMED` 和 `SUSPICIOUS` 发现项。 | | 1 | 至少有一个 `SUSPICIOUS` 发现项,没有 `CONFIRMED`。 | | 2 | 至少有一个 `CONFIRMED` 发现项。 | | 3 | 脚本级别错误(由顶层的 `try/catch` 捕获)。 | ## 输出 每个发现项包含以下字段: | 字段 | 类型 | 描述 | |------------|----------|-------------| | CheckId | string | 定标识符,如 `FILE_HASH_INSTALLER`。 | | CheckName | string | 人类可读的检查名称。 | | Severity | string | `CONFIRMED`、`SUSPICIOUS`、`INFO`、`CLEAN`、`SKIPPED` 或 `ERROR`。 | | Target | string | 检查所审查的路径、哈希、IP 或注册表值。 | | Detail | string | 结果的自由文本描述。 | | Evidence | object | 结构化支持数据,如哈希、拥有者进程 ID 或代码片段。 | | Reference | string | 源发布物的 URL(Kaspersky 报告)。 | | Timestamp | datetime | 发出发现项时的 UTC 时间戳。 | 控制台中的严重级别颜色: - `CONFIRMED` 为红色。IoC 直接匹配。 - `SUSPICIOUS` 为黄色。该工件与此活动一致,但没有可用的哈希匹配。 - `INFO` 为青色。有用的上下文,无 IoC 匹配。 - `CLEAN` 为绿色。检查已运行且未发现任何问题。 - `SKIPPED` 为灰色。检查已被绕过(cmdlet 缺失、参数集、未提升权限)。 - `ERROR` 为品红色。检查内部出现异常。 写入到 `-JsonOutputPath` 的 JSON 文件具有以下结构: ``` { "Header": { "Tool": "DAEMON Tools Supply Chain IoC Scanner", "ScriptVersion": "1.0.0", "ScanStart": "2026-05-06T10:11:12.0000000Z", "ScanEnd": "2026-05-06T10:11:14.0000000Z", "Hostname": "WIN-EXAMPLE", "OS": "Microsoft Windows 11 Pro", "OSVersion": "10.0.22631", "PSVersion": "5.1.22621.4391", "IsAdmin": true, "Verdict": "OVERALL VERDICT: NO INDICATORS FOUND", "ExitCode": 0, "Counts": { "CONFIRMED": 0, "SUSPICIOUS": 0, "INFO": 3, "CLEAN": 8, "SKIPPED": 0, "ERROR": 0 } }, "Findings": [ { "CheckId": "FILE_HASH_INSTALLER", "CheckName": "Suspect installer files", "Severity": "CLEAN", "Target": "", "Detail": "No DAEMON Tools installer-like files found in the inspected directories.", "Evidence": null, "Reference": "https://securelist.com/tr/daemon-tools-backdoor/119654/", "Timestamp": "2026-05-06T10:11:12.5000000Z" } ] } ``` ## 破坏指标 哈希值、网络 IoC 和文件路径的完整列表在 `docs/IOCS.md` 中。来源为 Kaspersky Securelist 的文章:`https://securelist.com/tr/daemon-tools-backdoor/119654/`。 ## 限制与注意事项 - 基于哈希的检测比较脆弱。木马化二进制文件中的单字节更改就会产生此扫描器无法识别的新 SHA1。 - QUIC RAT 检测仅限于派生工件(文件路径、进程、持久化条目)。本地套接字表不记录 UDP 流量的远程端点,因此无法从此扫描器直接观察到与 C2 的活动 QUIC 通道。 - PowerShell 操作日志检查要求在恶意活动发生之前已启用 Script Block Logging。在未启用 Script Block Logging 的主机上,即使系统已被入侵,此检查也不会产生任何信号。 - 读取 prefetch 目录通常需要管理员权限。非提升权限的运行会将 prefetch 检查报告为 `SKIPPED`。 - 某些检查(按用户安装程序搜索、其他用户拥有的计划任务、PowerShell 事件日志)在没有管理员权限的情况下会受到限制或被跳过。 - 从 `Get-NetTCPConnection` 推断 C2 流量的检查只能看到扫描时处于活动状态的连接。采用周期性信标通信的后门在扫描器运行时可能没有活动的套接字。 - 使用此工具进行干净的扫描并不代表系统绝对安全。请参阅上面的“本脚本不执行的操作”。 ## 贡献 欢迎提交 Issue 和 Pull Request。有两个不可妥协的原则: - 扫描器必须保持只读。不执行写操作,不进行修复,不收集遥测数据,不设选择性加入。脚本顶部的 `READ-ONLY GUARANTEE` 注释块是允许写入操作的规范枚举;请保持其与代码同步。 - 扫描器必须保持为单文件,没有外部依赖,也没有网络调用。仅使用嵌入式 IoC。 在提交更改之前,请在本地运行 PSScriptAnalyzer: ``` PS> Invoke-ScriptAnalyzer -Path .\Invoke-DaemonToolsIOCScan.ps1 -Severity Warning,Error ``` 该脚本有意使用 `Write-Host` 来显示彩色横幅和严重级别输出。PSScriptAnalyzer 的 `PSAvoidUsingWriteHost` 警告对于该 UX 界面是可以接受的;如有需要可在本地抑制它,但不要在整个项目中将其静音。 本仓库中没有 CI 配置。PSScriptAnalyzer 是一项本地开发人员检查。 ## 许可证 MIT。参见 `LICENSE`。 ## 鸣谢 原始研究和披露:Kaspersky GReAT (Igor Kuznetsov, Georgy Kucherin, Leonid Bezvershenko, Anton Kargin)。完整技术报告:`https://securelist.com/tr/daemon-tools-backdoor/119654/`。 扫描器作者:moltenbit (`https://moltenbit.net`)。 ## 免责声明 本软件按“原样”提供,不提供任何形式的明示或暗示保证。其仅旨在您拥有或被授权检查的系统上进行防御性使用。运行风险由您自行承担。
标签:AI合规, Conpot, DAEMON Tools, IoC扫描器, IPv6, IP 地址批量处理, Kaspersky, Libemu, OpenCanary, PowerShell, PowerShell脚本, Windows安全, Windows 调试器, 供应链攻击, 只读扫描, 后门, 哈希校验, 安全扫描, 库, 应急响应, 恶意软件, 持久化痕迹, 指标检测, 数据包嗅探, 无线安全, 时序注入, 木马, 离线扫描, 网络信息收集, 网络指标, 配置审计