SuperAPI AI 工具集

dym-cti-expert-ci-monitoring

安全与审计

查看项目

更新于 10-18 01:24

技能介绍

用途

该技能的目标是在你自己的项目 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 判定。