Anthropic-Cybersecurity-Skills 实战指南:基于 TLS 证书透明性日志(CT Logs)的钓鱼域名、影子 IT 与品牌仿冒检测
【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATT&CK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF & MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI & 20+ platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills
导读
本指南基于开源仓库 Anthropic-Cybersecurity-Skills 中的analyzing-tls-certificate-transparency-logs技能文档,系统讲解如何通过 crt.sh 证书透明性(Certificate Transparency, CT)日志库与pycrtsh、certstream等工具,主动发现仿冒企业品牌的钓鱼域名、未经授权的证书签发以及影子 IT(Shadow IT)资产。读完本文后,你将掌握 CT 日志的查询方法、typosquatting 相似度检测算法、异常 CA 识别、通配符证书监控等完整实战能力,并能够直接运行仓库提供的 agent.py 自动化检测脚本。
证书透明性日志:为什么值得监控
Certificate Transparency 是一项公开、只能追加(append-only)的互联网安全标准,所有公共可信的 SSL/TLS 证书在签发后都会被提交到多个 CT 日志中。这意味着攻击者一旦为仿冒域名申请了证书(无论来自哪个 CA),该证书记录就会在公开日志中留下痕迹,而且出现时间往往早于钓鱼攻击正式投放,为防御方提供了宝贵的"提前量"。
这一监控场景在本仓库中被归类为security-operations(安全运营)子域,并映射到多个主流威胁框架:
- MITRE ATT&CK:
T1583.001(获取基础设施:域名)、T1583.006(获取基础设施:Web 服务)、T1566.002(鱼叉式钓鱼链接)、T1598.003(针对性的钓鱼信息收集); - NIST CSF 2.0:
DE.CM-01(持续监控)、RS.MA-01(事件响应维护)、GV.OV-01(治理/监督)、DE.AE-02(异常事件分析); - MITRE ATLAS:
AML.T0073、AML.T0052。
可参考 MITRE ATT&CK 映射说明 了解该技能在仓库框架覆盖体系中的位置。
适用场景(When to Use)
根据 SKILL.md 的定义,该技能适用于以下四类典型场景:
- 安全事件调查:需要分析 TLS 证书透明性日志来还原攻击者基础设施时;
- 检测规则与威胁狩猎:为"域名仿冒/证书异常签发"这一检测域构建检测规则或狩猎查询时;
- SOC 结构化分析:安全运营分析师需要一套可重复、结构化的分析流程时;
- 安全监控覆盖验证:验证针对相关攻击技术的监控覆盖率是否完备时。
前置条件(Prerequisites)
- 熟悉安全运营的基本概念与常见工具;
- 拥有可用于安全测试的测试或实验环境,且所有测试活动已获得适当授权;
- Python 3.8+,并已安装
pycrtsh、requests等依赖; - 能访问 crt.sh 证书透明性数据库。
核心方法:用 pycrtsh 查询 crt.sh
该技能的核心工作流是:查询 crt.sh CT 数据库,找出与组织品牌域名相似的所有已签发证书,进而定位钓鱼基础设施。
SKILL.md 给出的最小可用示例:
from pycrtsh import Crtsh c = Crtsh() # 按域名搜索证书 certs = c.search("example.com") for cert in certs: print(cert["id"], cert["name_value"]) # 获取完整证书详情 details = c.get(certs[0]["id"], type="id")通配符搜索是发现子域名资产的关键用法——c.search("%.example.com")会返回所有匹配该域模式(含子域名)的证书记录:
from pycrtsh import Crtsh c = Crtsh() certs = c.search("%.example.com") for cert in certs: print(f"Issuer: {cert.get('issuer_name')}, Domain: {cert.get('name_value')}")更完整的 API 能力
仓库配套的 API 参考文档 对 pycrtsh 的接口能力进行了扩展说明:
from pycrtsh import Crtsh c = Crtsh() # 按域名搜索证书 certs = c.search("example.com") # 精确匹配 certs = c.search("%.example.com") # 通配子域名 # 按 ID 获取证书详情 details = c.get(cert_id, type="id") # 也支持按证书指纹查询 details = c.get(sha1_hash, type="sha1") details = c.get(sha256_hash, type="sha256")直连 crt.sh REST API
当需要更灵活地控制查询参数(如 JSON 输出)时,可以直接调用 crt.sh 的 REST 接口:
import requests # JSON 输出 resp = requests.get("https://crt.sh/?q=%.example.com&output=json") records = resp.json() # 字段: id, issuer_ca_id, issuer_name, common_name, # name_value, not_before, not_after, serial_numbercertstream:实时 CT 监控
历史查询只能看到"过去",实时监控则能捕捉"此刻"新签发的证书。通过 certstream 接入 WebSocket 实时证书流:
import certstream def callback(message, context): if message["message_type"] == "certificate_update": all_domains = message["data"]["leaf_cert"]["all_domains"] print(all_domains) certstream.listen_for_events(callback, url="wss://certstream.calidog.io/")关键证书字段速查
分析 CT 记录时,以下字段是判读的核心依据(见 api-reference.md):
| 字段 | 说明 |
|---|---|
common_name | 证书上的主域名(CN) |
name_value | SAN(主题备用名称)列表,通常按换行分隔多个域名 |
issuer_name | 签发该证书的证书颁发机构(CA) |
not_before | 证书签发时间 |
not_after | 证书过期时间 |
判读思路:common_name决定该证书"名义上"属于谁;name_value决定它实际覆盖了哪些域名(识别多域名证书);issuer_name用于区分"可信 CA"与"可疑 CA";not_before/not_after用于判断证书是否仍有效,以及是否存在"新近批量签发"的异常聚集。
关键分析步骤(五步法)
SKILL.md 明确给出了五步核心分析流程:
- 查询匹配目标域名模式的所有证书——用
search("%.example.com")覆盖品牌主域与全部子域; - 识别 typosquatting 变体——基于 Levenshtein(编辑距离)算法找出与品牌域名高度相似但并非原样的域名(如
examp1e.com、example.co); - 标记来自意外 CA 的证书——企业通常有明确的白名单 CA 列表,任何来自列表外 CA 的、覆盖品牌域的证书都值得警惕;
- 监控可疑子域上的通配符证书——
*.example.com这类通配符证书一旦被恶意获取,意味着攻击者可覆盖任意子域; - 与已知钓鱼基础设施交叉关联——将疑似域名与威胁情报平台、已知 IOC 进行比对,确认其归属与信誉。
源码级实战:深入 agent.py 自动化检测脚本
为了让上述流程可落地,仓库在 scripts/agent.py 中提供了一个完整的命令行检测 Agent。它把"搜索、typosquat 检测、异常 CA 检测、新证书监控、通配符发现"整合为一次全量扫描,并输出 JSON 报告。下面按模块拆解其实现原理。
证书搜索与有效期过滤
search_certificates负责调用 pycrtsh 搜索,并可选地过滤掉已过期证书——它通过解析not_after并与当前 UTC 时间比较来实现:
def search_certificates(domain, include_expired=False): c = Crtsh() certs = c.search(domain) if not include_expired: now = datetime.utcnow() certs = [cert for cert in certs if cert.get("not_after") and datetime.strptime(str(cert["not_after"]), "%Y-%m-%dT%H:%M:%S") > now] return certsget_certificate_details则对应 pycrtsh 的按 ID 详情查询:
def get_certificate_details(cert_id): c = Crtsh() return c.get(cert_id, type="id")search_crtsh_api演示了不依赖 pycrtsh、直接请求 crt.sh REST API 的替代路径:
def search_crtsh_api(domain): url = f"https://crt.sh/?q={domain}&output=json" resp = requests.get(url, timeout=30) resp.raise_for_status() return resp.json()核心算法:Levenshtein 距离与 typosquatting 检测
levenshtein_distance用经典动态规划实现编辑距离(插入、删除、替换三种操作的代价均为 1):
def levenshtein_distance(s1, s2): if len(s1) < len(s2): return levenshtein_distance(s2, s1) if len(s2) == 0: return len(s1) prev_row = range(len(s2) + 1) for i, c1 in enumerate(s1): curr_row = [i + 1] for j, c2 in enumerate(s2): insertions = prev_row[j + 1] + 1 deletions = curr_row[j] + 1 substitutions = prev_row[j] + (c1 != c2) curr_row.append(min(insertions, deletions, substitutions)) prev_row = curr_row return prev_row[-1]detect_typosquatting将其应用于 CT 记录:以目标主域(去掉 TLD 的第一级标签)为基准,对每条记录的common_name/name_value去重后计算编辑距离,命中0 < dist <= max_distance(默认最大距离 3)的即为疑似仿冒域名,并按距离升序返回:
def detect_typosquatting(target_domain, ct_records, max_distance=3): base = target_domain.split(".")[0] suspicious = [] seen = set() for record in ct_records: domain = record.get("common_name", "") or record.get("name_value", "") if not domain or domain in seen: continue seen.add(domain) candidate_base = domain.split(".")[0].lstrip("*").lstrip(".") if candidate_base == base: continue dist = levenshtein_distance(base, candidate_base) if 0 < dist <= max_distance: suspicious.append({ "domain": domain, "distance": dist, "issuer": record.get("issuer_name", ""), "not_before": record.get("not_before", ""), "not_after": record.get("not_after", ""), }) return sorted(suspicious, key=lambda x: x["distance"])实现细节值得注意:candidate_base = domain.split(".")[0].lstrip("*").lstrip(".")会先剥掉通配符前缀*.,确保*.examp1e.com这类通配证书也能被正确纳入相似度计算。
异常 CA 检测
detect_unauthorized_cas根据白名单比对签发者:只要issuer_name中不包含任何允许的 CA 关键字,即判定为"未授权 CA 签发的证书":
def detect_unauthorized_cas(ct_records, allowed_cas): unauthorized = [] for record in ct_records: issuer = record.get("issuer_name", "") if issuer and not any(ca.lower() in issuer.lower() for ca in allowed_cas): unauthorized.append({ "domain": record.get("common_name", ""), "issuer": issuer, "not_before": record.get("not_before", ""), "cert_id": record.get("id"), }) return unauthorized新证书实时监控
monitor_new_certificates通过 REST API 拉取通配查询结果,并筛出最近 N 小时内签发的证书(默认 24 小时),用于捕捉"刚出现"的钓鱼基础设施:
def monitor_new_certificates(domain, hours_back=24): records = search_crtsh_api(f"%.{domain}") cutoff = datetime.utcnow().timestamp() - (hours_back * 3600) recent = [] for r in records: not_before = r.get("not_before", "") if not_before: try: cert_time = datetime.strptime(not_before, "%Y-%m-%dT%H:%M:%S") if cert_time.timestamp() > cutoff: recent.append({ "domain": r.get("common_name", ""), "issuer": r.get("issuer_name", ""), "not_before": not_before, "name_value": r.get("name_value", ""), }) except ValueError: continue return recent通配符证书发现
find_wildcard_certificates简单地以*.前缀为判据,找出所有可能覆盖大量子域的证书——这类证书风险面最大:
def find_wildcard_certificates(ct_records): wildcards = [] for r in ct_records: name = r.get("common_name", "") or r.get("name_value", "") if name.startswith("*."): wildcards.append({ "domain": name, "issuer": r.get("issuer_name", ""), "not_before": r.get("not_before", ""), "not_after": r.get("not_after", ""), }) return wildcardsCLI 入口与运行方式
main()将上述能力整合为命令行工具,关键参数包括:
--domain(必填):要监控的目标域名;--allowed-cas:允许的 CA 白名单,默认包含Let's Encrypt、DigiCert、Sectigo、Amazon、Google Trust Services等主流 CA;--output:JSON 报告输出路径,默认ct_report.json;--action:执行模式,可选search、typosquat、unauthorized_ca、monitor、full_scan,默认full_scan全量扫描。
运行示例:
python skills/analyzing-tls-certificate-transparency-logs/scripts/agent.py \ --domain example.com \ --action full_scan \ --output ct_report.json全量扫描会依次完成:统计总证书数 → 检测 typosquatting 域名 → 检测未授权 CA 证书(最多记录 50 条)→ 统计最近 24 小时新签发证书 → 列出通配符证书,最终将所有findings汇总写入 JSON 报告,并在终端输出[+]前缀的进度摘要。
把自动化流程与五步法对应起来
agent.py 的实现与 SKILL.md 的五大分析步骤是一一对应的:search_crtsh_api+search_certificates对应步骤 1(全面查询);detect_typosquatting对应步骤 2(编辑距离识别仿冒);detect_unauthorized_cas对应步骤 3(意外 CA 标记);find_wildcard_certificates对应步骤 4(通配符监控);monitor_new_certificates与最终报告则服务于步骤 5(与已知情报交叉关联与留档)。因此该脚本既是学习 CT 分析的标准参考实现,也可以直接接入 SOC 的定时任务作为持续性监控基线。
运营落地建议
在完成上述技术分析后,建议将结果纳入安全运营闭环:
- 将确认的仿冒域名加入 DNS sinkhole / Web 代理黑名单,阻断终端访问;
- 对确认为钓鱼的基础设施发起下架(takedown)请求;
- 将 CT 监控做成定时任务(如每日全量扫描 + 实时 certstream 告警),形成持续覆盖;
- 为自有域名配置 CAA DNS 记录,从签发环节限制 CA,压缩"意外 CA 签发"的窗口;
- 结合 DMARC 等邮件安全机制,防止仿冒域名被用于邮件钓鱼。
总结
TLS 证书透明性日志是"攻击者在动手前就留下痕迹"的少数公开数据源之一。本文以 SKILL.md 为核心骨架,完整覆盖了 pycrtsh 查询、crt.sh REST API、certstream 实时流、五步分析法,并结合 scripts/agent.py 从源码层面剖析了 Levenshtein 仿冒检测、CA 白名单校验、新证书监控与通配符发现的具体实现。读者可在此基础上直接构建属于自己的"钓鱼域名早期预警系统"。该技能遵循 Apache-2.0 许可(见 LICENSE),可自由用于企业安全运营与合规建设。
【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATT&CK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF & MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI & 20+ platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考