mwnickerson/certighost-bof

GitHub: mwnickerson/certighost-bof

针对 CVE-2026-54121 的最小化 Windows x64 Beacon Object File,在内存中通过 COM 接口向 AD CS 提交 PKCS#10 证书请求并返回签发结果。

Stars: 8 | Forks: 0

# Certighost BOF 此仓库包含一个极简的 Windows x64 Beacon Object File,用于 Certighost / CVE-2026-54121 实验链中仅涉及注册(enrollment)的部分。该 BOF 通过 `ICertRequest::Submit` 提交调用方提供的内存中 PKCS#10 请求(使用 `CR_IN_BINARY | CR_IN_PKCS10 | CR_IN_RPC` 参数),随后通过 Beacon 输出返回配置结果(disposition)、请求 ID 以及已签发证书的 base64 文本。 运行:`certighost-bof-20260727T143312Z` 这是 REDANTONETTA 仅限实验室的工作。未经授权,严禁推送、发布、部署或针对实时目标执行。 ## 范围 该 BOF 仅实现 AD CS 注册追踪(chase)触发器。它不会创建计算机帐户,不会托管恶意的 SMB/LSA 或 LDAP 回调服务,不会生成 CSR,不会执行 PKINIT,不会写入 PFX/ccache 文件,不会恢复哈希,不会派生进程,也不会在目标侧写入任何文件。CSR、请求属性、返回的证书以及临时的 BSTR/base64 缓冲区均保留在内存中;分配的缓冲区在实际情况允许下会在释放前被清除。 [研究笔记](docs/research/CVE-2026-54121.md) 中描述的恶意 SMB/LDAP 回调服务是外部内存中的实验室先决条件。PKINIT 以及任何证书签发后的操作也是外部先决条件,在此特意不予实现。 ## 参数结构(Schema) `go` 入口点需要标准的 Beacon `bof_pack` 帧:一个小端序的 `u32` 有效载荷(payload)长度,后跟六个小端序且带有长度前缀的二进制字段。Apollo `execute_coff` v3 会原封不动地传递该帧: ``` $args = bof_pack($bid, "bbbbbb", $csr_der, $ca_config, $template, $san_dns, $cdc, $rmd); ``` 字段按以下顺序排列: | 字段 | 含义 | 验证 | | --- | --- | --- | | `csr_der` | DER PKCS#10 请求字节 | 非空,最多 256 KiB,有界的外部 DER `SEQUENCE` | | `ca_config` | CA 配置字符串,例如 `ca01.lab.local\LAB-CA` | ASCII `host\CAName`,最多 512 字节 | | `template` | 证书模板值 | 可打印的 ASCII,不含 `:`/换行符,最多 128 字节 | | `san_dns` | 不含 `dns=` 前缀的 DNS SAN 值 | 可选的空字段,否则为类似 DNS/IP 的 ASCII,最多 255 字节 | | `cdc` | 追踪回调主机/IP 值 | 必须为类似 DNS/IP 的 ASCII,最多 255 字节 | | `rmd` | 远程域/主体查找 DNS 值 | 必须为类似 DNS/IP 的 ASCII,最多 255 字节 | 可移植解析器会验证规范的外部载荷长度、六个内部字段长度前缀、确切的字段数量以及尾部数据,然后 BOF 才会将完整帧传递给 `BeaconDataParse`/`BeaconDataExtract`。BOF 会在内存中构造以下确切的属性字符串: ``` CertificateTemplate: