用途
该技能的目标是在你自己的项目 CI 中运行 cti-expert,把免费、无需密钥的操作变成定期监控任务,例如品牌仿冒域名(typosquat)和 CT 日志中新出现的证书,从而不必依赖手动执行。
它会生成:仓库中的一个工作流、被提交的状态文件,以及用于排查的 JSON 产物。
资料说明,示例是为使用者场景新写的,并非 cti-expert 仓库中 .github/workflows/audit.yml 或 smoke.yml 的复制;后两者用于把关工具本身的开发(结构漂移、从干净机器安装),对使用者没有直接作用,建议阅读理解而非复制。
适合 CI 的操作
资料给出的判断条件是:不需要密钥、不需要 .venv、退出码能表达信息。三个候选:
impersonate <domain>:通过 crt.sh + DNS 生成并检查 typosquat 变体。免费(加--fofa/--urlscan才消耗 credit)。ct-monitor watch --state <file> <pattern>:轮询 CT 日志,过滤匹配品牌的新证书。免费。hash-id、sensitive-paths、email-hygiene:纯本地、不联网。免费。
使用方式
离线验证
在接入 CI 前可先离线验证(不触网):
python3 scripts/backend/intel.py impersonate example.com --generate-only --max 5
输出示例:
{"seed":"example.com","label":"example","tld":"com","variants":[
{"domain":"xample.com","technique":"omission"},
{"domain":"eeexample.com","technique":"repetition"},
{"domain":"wxample.com","technique":"replacement"},
{"domain":"wexample.com","technique":"insertion"},
{"domain":"rxample.com","technique":"replacement"}],
"count":5,"truncated":true}
--generate-only 是完全离线模式,可用于验证“CI 能否跑起来”而不依赖网络。
GitHub Actions 示例
放在你的仓库 .github/workflows/brand-watch.yml:
name: brand-watch
on:
schedule:
- cron: '0 6 * * *' # 06:00 UTC 每天
workflow_dispatch:
permissions:
contents: write # 用于提交 ct-monitor 的状态文件
jobs:
watch:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
# cti-expert 的 stdlib 层无需安装 — clone 即可运行。
- name: Fetch cti-expert
run: git clone --depth 1 https://github.com/7onez/cti-expert.git "$RUNNER_TEMP/cti"
- name: Typosquat sweep
run: |
set -euo pipefail
python3 "$RUNNER_TEMP/cti/scripts/backend/intel.py" \
impersonate "${{ vars.BRAND_DOMAIN }}" --pretty > impersonate.json
- name: CT-log watch (state 被提交,以便只报告“新”内容)
run: |
set -euo pipefail
mkdir -p .brandwatch
python3 "$RUNNER_TEMP/cti/scripts/backend/intel.py" \
ct-monitor watch "${{ vars.BRAND_KEYWORD }}" \
--state .brandwatch/ct-state.json --json > ct-new.json
- uses: actions/upload-artifact@v4
if: always()
with:
name: brand-watch-${{ github.run_number }}
path: |
impersonate.json
ct-new.json
- name: Persist CT state
run: |
git config user.name github-actions
git config user.email github-actions@github.com
git add .brandwatch/ct-state.json
git diff --cached --quiet || git commit -m "chore(brand-watch): 更新 CT state"
git push
资料强调两个有意为之的细节:
--state会被提交回去。没有它,每次运行都会把所有证书视为新证书,任务会变成垃圾信息生成器。- 工作流中没有任何密钥。两个操作都是 keyless 运行。若某天加入
--fofa/--urlscan,那时才需要 secret。
按退出码分支
资料提醒不要写 || echo "failed",dispatcher 的退出码有具体含义:
set +e
python3 "$CTI/scripts/backend/intel.py" impersonate "$DOMAIN" --pretty > out.json
rc=$?
set -e
case "$rc" in
0) : ;; # 运行完成 — 读取 out.json 再决定
2) echo "::error::操作名错误 — 运行 intel.py list"; exit 1 ;;
3) echo "::error::找不到 backend — clone 损坏或缺少 intel_engine"; exit 1 ;;
4) echo "::error::该操作所需组件未安装"; exit 1 ;;
5) echo "::error::解释器无法 exec — 设置 INTEL_PY"; exit 1 ;;
*) echo "::error::脚本引擎退出 $rc"; exit 1 ;;
esac
重要:0 表示操作执行完成,不表示没有发现。判定结果在 JSON 中,不在退出码中。若要 gate,需自行读取 JSON:
python3 - <<'PY'
import json
d = json.load(open("impersonate.json"))
imp = d["artifacts"]["impersonation"]
print(f'::notice::生成 {imp["generated"]} 个变体 | '
f'{imp["existing_count"]} 个已存在 | {imp["candidate_count"]} 个未注册')
confirmed = [p for p in d["pivots"] if p.get("kind") == "impersonation:candidate"]
if confirmed:
print(f"::warning::{len(confirmed)} 个 lookalike 已存在")
for p in confirmed[:20]:
print(" -", p.get("value"), "|", p.get("confidence"))
PY
资料说明,上述字段(artifacts.impersonation.generated / existing_count / candidate_count,以及 pivots[].kind)来自 intel_engine/WebPivot/tools/wp_impersonate.py 中的 build_impersonation_result,并非猜测。重要区分:existing = 有 DNS 解析或已在 CT/FOFA/urlscan 中出现;candidate = 生成的变体尚无任何证据,属于待观察的 watchlist,而非已确认的基础设施。
不应放入 CI 的内容
资料列出以下不应放入 CI:
- 任何在 outbound gate 列表中的操作:
engage、engage-harvest、--submit、misp push/publish。actionguard.py钩子在 CI 中不会运行——它是 Claude Code 的钩子,不是 shell 的。在 CI 中只剩代码内的 gate,而misp publish没有撤销按钮。 - 带
--serp/--whois-reverse/--fofa-full的完整 case 流水线(pipeline open):每次运行消耗真实 credit,而 cron 会一直运行。 - 任何写入
intel_engine/cases/后提交的内容——那是调查数据,RULE 1 正是为此存在。
适用场景与限制
适用场景:希望在自有 CI 中定期监控品牌仿冒域名和 CT 日志新证书,且只使用免费、无需密钥的操作。
限制:资料未提供该技能的收费、价格、平台支持范围等更多信息;部分操作需要密钥或消耗 credit,不应放入 CI;退出码 0 不代表无发现,需自行解析 JSON 判定。