使用n8n達成自動化賞金獵人(無程式碼撰寫)-4個模板

BB Tip Harvestor


BB Tip Harvestor 是一個 n8n 自動化流程,每 4 小時透過 Twitter API 搜尋含 #bugbountytips、#bugbounty 等標籤的最新推文,並排除寫作、折扣、釣魚等雜訊內容。流程會整理推文的 ID、內容、連結與發文時間(可排序格式),最後寫入 Google Sheets;若遇到相同 TweetID 會更新而非重複新增,方便你建立可搜尋、可整理的 Bug Bounty 技巧資料庫。
notion image

流程說明:

  1. 觸發器:每 4 小時跑一次
    1. Node:Schedule Trigger(scheduleTrigger)
      • 設定 hoursInterval: 4
      • 意思是:每 4 小時觸發一次整個流程
      • 只要 Workflow 啟用(active=true),就會一直定時跑
  1. 呼叫 Twitter API:搜尋最新推文
    1. Node:HTTP Request(httpRequest)
      它會打這個 API:
      • GET https://api.twitterapi.io/twitter/tweet/advanced_search
      並帶上 query 參數:
      • query = "(#bugbountytips OR #bugbounty OR #bugbountytip) -Writeups -discount -phishing -fuck"
        • (#bugbountytips OR #bugbounty OR #bugbountytip):找包含這些 hashtag 的推文
        • Writeups -discount -phishing -fuck:排除包含這些字的推文(減少雜訊)
      • queryType = "Latest":偏向拿「最新」結果
      驗證方式:
      • 使用 httpHeaderAuth(HTTP Header Auth)
  1. Code 節點:把 API 回傳資料整理成「一筆筆推文」的格式
    1. Node:Code(code node, JavaScript)
      這段 JS 的核心目的:

      A. 同時支援「多筆推文」和「單筆推文」兩種回傳格式

      • 如果 API 回傳長這樣:
        • $input.item.json.tweets 是陣列(多筆)
        • 就會 map 每一筆 tweet,轉成 n8n 的 item 格式 { json: {...} }
      • 否則當作單筆 tweet(直接從 $input.item.json 抽欄位)

      B. 抽出的欄位

      它會把每筆推文整理成這些欄位(你後面 Sheets 會用到其中一部分):
      • tweetId
      • url
      • content(tweet text)
      • likeCount
      • retweetCount
      • replyCount
      • quoteCount
      • viewCount
      • createdAt(格式化後的字串)

      C. createdAt 會被格式化成人看的字串

      toLocaleString('en-US', ...) 產生像這種:
      • "July 7, 2025 at 04:43 AM"
      並且程式碼也會 console.log 一些 debug 訊息(只影響 log,不影響資料流)
  1. Google Sheets:寫入或更新(用 TweetID 去重)
    1. Node:Append or update row in sheet(googleSheets)

      A. 寫入模式:appendOrUpdate

      • 不是單純 append(一直加新列)
      • 而是:如果 matchingColumns 找到已存在的列,就更新;找不到就新增

      B. 去重方式:matchingColumns = TweetID

      • 設定:
        • "matchingColumns": ["TweetID"]
      • 意思是:同一個 TweetID 只會有一列
        • 這樣就算每 4 小時抓到重複的推文,也不會一直重複新增

      C. 寫入欄位 mapping(你表格需要這些欄位)

      它實際寫進表格的欄位是:
      • Created At = {{$json.createdAt}}(人類可讀字串)
      • TweetID = {{$json.tweetId}}
      • Content = {{$json.content}}
      • Url = {{$json.url}}
      • Date = 一段 n8n expression,把 Created At 再轉成可排序的時間字串(YYYY-MM-DD HH:MM:SS

      Date 欄位在幹嘛?

      因為 Created At"July 7, 2025 at 04:43 AM" 這種字串,排序不一定好用
      所以它用一段 expression:
      • 把月份英文轉成數字月
      • 把 AM/PM 轉 24 小時
      • 組出類似:
        • 2025-07-07 04:43:00
      這樣 Google Sheets 就能比較穩定地排序、篩選、做時間相關分析。
 

中文化json檔案:


H1 reports


H1 reports 是一個 n8n 自動化流程,透過公開的 Chat 介面接收使用者輸入的 HackerOne 報告 .json 連結,並由 AI Agent 自動呼叫 HTTP 工具抓取報告 JSON 內容。流程使用 Google Gemini(gemini-2.5-pro)進行分析,聚焦萃取高價值且不重複的技術洞察(如 payload、繞過技巧、鏈式利用方式與根因),再依固定模板輸出 Summary、Techniques(含 Context/Technique/Impact)與可選 Pro Tip,讓 bug bounty hunter 能快速把報告轉成可直接實作的測試方法與筆記。
notion image

流程說明:

  1. 入口:Chat Trigger(聊天介面 / webhook)
    1. Node:When chat message received
      類型:@n8n/n8n-nodes-langchain.chatTrigger
      它在做的事:
      • public: true:這個聊天 webhook 是公開可用的(等於你可以分享連結給別人使用)。
      • initialMessages:使用者一進來看到的開場白:
        • "Hey! Send your report's link down below"
      • customCss:那段 CSS 是用來把聊天 UI 做成偏「pentester theme」的樣式(字型、配色、code block 外觀、視窗大小等)。
      輸入是什麼?
      • 使用者在聊天輸入框貼一段文字(預期是 H1 report URL)
      • 這段文字會在後面以 $json.chatInput 的形式交給 AI agent
  1. LLM:Google Gemini Chat Model
    1. Node:Google Gemini Chat Model
      類型:lmChatGoogleGemini
      • modelName: models/gemini-2.5-pro
      • 使用 googlePalmApi 憑證(你在 n8n 裡配置的 Gemini/PaLM API Key)
      它的角色:提供 AI agent “腦力”,用來理解報告、提煉重點、生成你指定格式的輸出。
  1. 工具:HTTP Request Tool(抓 HackerOne 報告 JSON)
    1. Node:GET H1 report
      類型:httpRequestTool
      它是給 AI agent 使用的「工具」(tool),專門做這件事:
      • 用 GET 去抓https://hackerone.com/reports/<id>.json
      • url 是動態的:
        • ={{ $fromAI('URL', ``, 'string') }}
          意思是:讓 agent 從對話內容抽出 URL,塞到這個 HTTP 工具裡去呼叫
      另外它也寫了 toolDescription,告訴 agent:URL 長什麼樣、舉例哪些是合法輸入。
      前面 sticky note 寫的「No hardcoded credentials」也符合這裡:它只是做公開 JSON 的 GET,不需要把帳密硬寫在裡面。
  1. 核心:AI Agent(負責協調 + 產出格式)
    1. Node:H1 report summarizer
      類型:@n8n/n8n-nodes-langchain.agent
      這顆是整個 workflow 的「總控」。

      它怎麼運作?

      • text: ={{ $json.chatInput }}
        • → 使用者在聊天輸入的內容就是 agent 的輸入
      • systemMessage 裡有非常關鍵的規則(你寫得很嚴格):
          1. 在寫任何東西之前
          1. 必須先呼叫工具 GET H1 report 一次且只能一次,並把使用者給的完整 URL 傳進去
          1. 解析回來的 JSON,從報告內容萃取「高價值技術洞察」
          1. 不要寫背景知識、不要一般性摘要,要偏 advanced hunter 角度

      輸出格式被你固定成:

    2. Summary(1–2 句 BLUF)
    3. Techniques(每條包含 Name / Context / Technique / Impact,且 Technique 會偏 payload/steps/code)
    4. Pro Tip(可選)
  1. 連線關係(connections)代表什麼
    1. 你的 connections 讓整個鏈路變成:
    2. When chat message received →(main)→ H1 report summarizer
    3. Google Gemini Chat Model →(ai_languageModel)→ H1 report summarizer
    4. GET H1 report →(ai_tool)→ H1 report summarizer
    5. 意思是:Agent 同時拿得到「LLM」和「HTTP 工具」,可以先抓資料再分析。

中文化json檔案:


etxNuclei Template Generator


etxNuclei Template Generator - from CVE/POC 是一個 n8n 自動化流程,透過表單收集 CVE ID、漏洞描述與 PoC 檔案(.py/.txt/.sh),並自動將 PoC 內容抽取成文字後整理成標準輸入。流程會交由 AI Agent(優先使用 OpenAI GPT-4o,必要時切換 Gemini 模型)依 Nuclei 規範產出可直接使用的 YAML 模板,包含合適的請求結構、payload/placeholder、matchers 與降低誤報的條件設定,同時強制標記 metadata.verified=false 以利人工覆核。生成後會自動清理多餘的 markdown、修正常見語法問題,將模板轉成以 CVE 命名的 .yaml 檔並上傳到指定 Slack 頻道,方便團隊快速取得與分發測試模板。
notion image

流程說明:

  1. 表單入口:收集 CVE / 描述 / PoC 檔
    1. notion image
      Node:Form Submission Trigger (formTrigger)
      • 會產生一個表單頁面(有自訂 CSS)
      • 表單欄位:
          1. CVE ID(必填)
          1. CVE description(必填)
          1. POC(必填檔案,上傳 .py/.txt/.sh
      使用者填完送出後,才會觸發後續流程。
  1. 讀取 PoC 檔案內容(把檔案變成文字)
    1. Node:Extract POC Content (extractFromFile)
      • operation: "text"
      • binaryPropertyName: "POC"
      • 意思是:把使用者上傳的 PoC 檔(binary)轉成文字內容,輸出到 $json.data
  1. 整理成固定欄位:cve_id / cve_description / poc
    1. Node:Prepare Template Data (set)
      把資料統一整理成:
      • cve_id ← 表單的 CVE ID
      • cve_description ← 表單的 CVE description
      • poc$json.data(剛剛抽出的 PoC 文字)
      這樣下一步 LLM 才能用一致的欄位讀資料。
  1. 核心:AI Agent 產生 Nuclei YAML
    1. Node:Generate Nuclei Template (langchain.agent)
      它把輸入拼成一段 prompt:
      • CVE ID
      • CVE description
      • PoC(包在 code block 裡)
      並搭配超長的 systemMessage 規則,要求 LLM:
      • 只輸出有效 YAML(不能有 markdown、不能有解釋)
      • metadata.verified: false 必須永遠存在
      • 用 Nuclei 的現代語法、placeholder([[BaseURL]] / [[Hostname]]…)
      • 對多 payload 要選對 clusterbomb/pitchfork/batteringram
      • matcher 要盡量降低誤報
      • 甚至包含「baseline + exploit」兩段 request 的建議模式等

      模型配置(Primary + Fallback)

      你接了兩個語言模型到同一個 Agent:
      • OpenAI Model (Fallback):gpt-4o(temperature 0.2)
      • Google Gemini AI Model:gemini-2.0-flash-exp
      而且 Agent 設了 needsFallback: true
      → 代表它會優先用主要模型,失敗/不可用時再用 fallback(實際優先順序會依 n8n/節點設定的 index 與執行行為;你的 wiring 看起來就是「一主一備」的設計)。
  1. 把 Agent 的輸出欄位抽出來
    1. Node:Extract Generated Template (set)
      • template = {{$json.output}}
      也就是把 LLM 輸出的 YAML 字串放到 template 這個欄位,方便後續處理。
  1. 清理 + 基本校驗 + 生成「可上傳的 YAML 檔案」
    1. Node:Validate and Format Template (code)
      這段 JS 做了幾件很實用的事:
    2. 去掉可能出現的 ```yaml code fence(有些模型會不小心包 markdown)
    3. 修常見符號錯誤:把 [[ ]] 替換成 {{ }}(避免模板語法混亂)
    4. 從內容抓 CVE-YYYY-NNNNN 當檔名:例如 CVE-2025-12345.yaml
    5. 把 YAML 字串轉成 base64 binary,讓 n8n 能當「檔案」處理(mimeType: text/yaml
    6. 最後輸出會包含:
      • json: cveId / filename / message / timestamp
      • binary.data: 真正要上傳的檔案內容
  1. 發送:上傳檔案到 Slack
    1. Node:Upload Template File (slack)
      • resource: file
      • 上傳到指定 channel:C08HWT4RHGV
      • 使用你設定的 Slack Bot 憑證
      結果就是:Slack 會收到一個以 CVE 命名的 .yaml 檔。

中文化json檔案:


The_Warden_CVE_Shoten


CVE Shoten 是一個 n8n 自動化流程,每小時透過 NIST NVD 公開 CVE API 抓取「過去一小時內新發布」的 CVE(最多 20 筆),並將每筆資料拆分後萃取關鍵欄位(CVE 編號、UTC 發布時間、漏洞描述、CVSS 嚴重度分數 v2–v4、參考連結)。流程會交由 Google Gemini(gemini-2.5-pro)依 bug bounty hunter 視角進行相關性評估,輸出精簡且可直接貼到 Slack 的格式(含可點擊的 CVE 連結、Bug Bounty Relevance 等級與一條可實作的測試策略),最後自動發送到指定 Slack 頻道,讓你即時掌握值得優先追蹤的 CVE 與可複用的測試方向。
notion image
簡單來說:每小時 → 抓最新 CVE → 拆分整理關鍵欄位 → 用 Gemini 判斷 bug bounty 相關性並給測試策略 → 發 Slack 通知。

流程說明:

  1. 定時觸發:每小時跑一次
    1. Schedule Trigger
      • 設定是 field: hours(沒有指定間隔數字時,通常代表每 1 小時)
      • 作用:每小時自動啟動整條流程
  1. 從 NIST NVD API 抓「最近一小時」新發布的 CVE
    1. HTTP Request
      • 打的是 NVD 的 CVE 2.0 API:
        • https://services.nvd.nist.gov/rest/json/cves/2.0
      • Query 參數:
        • pubStartDate = 現在時間 - 1 小時
        • pubEndDate = 現在時間
        • resultsPerPage = 20(每次最多抓 20 筆)
        • startIndex = 0
      意思是:每次執行都去抓「過去一小時內發布的 CVE」,最多 20 筆。
  1. 把回傳的 CVE 清單拆成「一筆一筆」方便後面處理
    1. Split Out
      • fieldToSplitOut: vulnerabilities
      • NVD API 回傳通常是一包資料,裡面有 vulnerabilities: [...]
      • 這步會把陣列拆開,變成 n8n 裡的多個 items:一個 item = 一個 CVE
  1. 萃取重點欄位並格式化
    1. Edit Fields (Set)
      它把每個 CVE item 轉成你要的欄位:
      • cve:CVE ID(例如 CVE-2025-12345)
      • published:把 cve.published 轉成 UTC 的可讀時間字串(en-GB 格式 + (UTC)
      • cve_descriptions:拿第一段描述 descriptions[0].value
      • severity:依序嘗試 CVSS v4.0 → v3.1 → v3.0 → v2
        • 找到就輸出像 HIGH (8.8),找不到就 Unknown
      • references:取第一個 reference URL
      目的:把原始 JSON 裡雜亂的欄位統一整理好,方便丟給 AI。
  1. AI 分析:判斷「對 bug bounty 值不值得做」並輸出 Slack 格式
    1. CVE Summarizer (LangChain Agent + Gemini)
      • 使用 Google Gemini Chat Modelgemini-2.5-pro
      • 你在 system prompt 裡規定它要:
        • 以「菁英 bug bounty hunter」角度評估
        • 只講能幫你決策、能直接測試的內容
        • 不要科普
        • 輸出必須是 Slack-ready(含 Slack hyperlink <url|text>、總長不超過 5 行)
        • 一定要包含原始 CVE 描述
        • 給一條可執行的策略(例如掃哪些端點、找哪些 pattern)
      它收到的輸入大概長這樣(由你 prompt 組的):
      • CVE
      • Severity
      • Published
      • Description
      • Ref
      輸出則是你要的格式,例如:
      • CVE:* <link|CVE-ID> | *Severity:* ...
      • 🎯 Bug Bounty Relevance: HIGH/MEDIUM/LOW/NONE
      • 1-2 行精準原因
      • Strategy:* ...
  1. 把 AI 產出的評估送到 Slack 指定頻道
    1. Send a message (Slack)
      • text = {{$json.output}}(直接把 AI 的輸出送出)
      • channelId 目前是空的(你需要填你的目標 Slack 頻道)
      • includeLinkToWorkflow: false(不附上 workflow 連結)

中文化json檔案:


The_Warden_etxHackerone_Scope_Monitor


etxHackerOne Scope Monitor 是一個 n8n 自動化流程,每 20 分鐘透過 HackerOne GraphQL API 以分頁批次方式抓取提供賞金的最新計畫清單(依 launched_at 排序、每頁 100 筆),並彙整出各計畫的 handle 與最新 structured scope version。流程會將結果與 Supabase 資料庫中的既有紀錄比對,偵測新上架計畫與 scope version 更新,並自動建立或更新資料庫欄位以保持與 HackerOne 即時資料同步;若發現版本變動,會進一步抓取最新 scope 明細(in-scope / out-of-scope)與資料庫舊資料比較,整理出新增的資產範圍與變更摘要。最後透過 Discord webhook 發送結構化通知(含計畫名稱、連結、scope version 與新增項目清單),讓研究員能即時掌握計畫上線與 scope 演進,快速調整掃描與測試優先順序。
notion image
簡單來說: 它會每 20 分鐘同步 HackerOne bounty 計畫清單與 scope 版本到 Supabase,並在偵測到新計畫scope 版本/範圍更新時,透過 Discord webhook送出結構化通知(含 program handle、連結與新增的 scope 項目)

流程說明:

  1. 排程:每 20 分鐘跑一次同步
    1. Schedule Trigger (20min)
      • 每 20 分鐘觸發一次整條資料同步與比對流程。
        • (另外還有一個「每小時」的 Schedule Trigger 節點,但在這份連線圖中沒有接到主流程,比較像保留/備用節點。)
  1. 抓 HackerOne 計畫清單(GraphQL + 分頁批次)
    1. Pagination Setup (100–300) → Split Pagination Values

      • 先產生 numbers = [100, 200, 300]
      • 再把 numbers 拆成多筆 item,當作分頁用的 from offset

      Parallel Fetch Programs(from=0)+ Fetch HackerOne Programs(from=100/200/300)

      • 兩個 HTTP POST 都打 https://hackerone.com/graphql
      • DiscoveryQuery 去抓 offers_bounties=true 的計畫,並排除 Engagements::Assessment
      • 每次 size = 100,所以總共大概抓 0–399 這四頁(最多約 400 個計畫,依排序 launched_at DESC)

      Merge Program Data → Extract Program Handles

      • 把多頁結果合併
      • 抽出每個計畫的 handle,最後得到一個 handles 陣列
  1. 取得每個計畫的「最新 scope version」
    1. Split Program Handles → Get Scope Versions(批次 batching)

      • 把 handles 拆成一個 handle 一筆
      • 用 GraphQL ScopeVersionQuery 查:
        • team(handle).structured_scope_versions(first:1).edges[0].node.id
      • 有設定 batching:每批 25 個、每 5 秒一批(避免一次打太猛)

      Extract Scope Versions → Remove Duplicates

      • 把結果整理成 { handle, latest_scope_version_id }
      • 去重,避免重複 handle 造成後面比對干擾
  1. 與 Supabase 資料庫比對:找「新計畫」與「scope 版本更新」
    1. Get Existing Programs → Prepare DB Data

      • 從 Supabase 的 hackerone-programs 撈出已存的紀錄
      • 整理欄位成 { handle, latest_scope_version_id } 方便比對

      Compare with Database(compareDatasets)

      依照 handle 合併比對後,分成兩條主要路徑:

      A) 新計畫(DB 沒有)

      • Create New Program:寫入 Supabase(program_name + latest_scope_version_id)
      • Format New Program Alert1 → Discord New Program Alert:發 Discord「🗽 NEW Program ADDED」通知

      B) 既有計畫但 scope version 變了

      • Update Scope Version:更新 Supabase 該計畫的 latest_scope_version_id
      • Program Scope Update → Discord SCOPE-VERSION Alert:發 Discord「㊙️ SCOPE-VERSION Changed」通知
      • 接著進入「scope 內容差異」的深入比對(下一段)
  1. scope 內容差異比對:抓新 scope、跟舊 scope 對照,列出新增項
    1. Extract Handle for Lookup

      • 從比對結果取出 handle,準備查 scope 細節

      Fetch Updated Scope Details(GraphQL)

      • getProgramScopesstructured_scopes(first: 100, archived:false) 的 scope 清單
      • 取出每個 asset 的:
        • asset_identifier、eligible_for_bounty、eligible_for_submission、max_severity、instruction…
      • 注意:這裡是 first:100,沒有做 after 分頁的迴圈,所以 scope 超過 100 筆的計畫可能會被截斷。

      Get Previous Scope(Supabase)→ Prepare Previous Scope

      • 從資料庫讀出舊的 inscope / outofscope 清單,整理成可比對格式

      Format Scope Update Data

      • 把剛抓到的 scope 轉成:
        • inscopeeligible_for_bounty === true 的 asset_identifier
        • outofscope:其他的 asset_identifier
      • 變成 { handle, inscope: [...], outofscope: [...] }

      Compare Scope Changes → Update Program Scope

      • 把新舊 scope 清單做 dataset compare
      • 若有差異:
        • Update Program Scope:把新的 inscope/outofscope 寫回 Supabase(讓 DB 永遠跟線上同步)

      Process Scope Changes → Discord In-Scope Update Alert

      • 用 code node 做字串 normalize(去掉奇怪空白、引號、大小寫差異等)
      • 只挑「新增的項目」(added),如果沒新增就靜默不通知
      • 有新增才發 Discord「🛡️ Program Updated」訊息,列出:
        • 🟢 In-Scope Added
        • 🔴 Out-of-Scope Added

中文化json檔案:


來源: YouTubeYouTubeNo Code Bug Bounty Automation Using n8n
作者:SecBeater
著作權聲明:本文使用 CC BY-NC-SA 4.0 著作權許可,使用請標注出處。

Previous

考試資源

Next

AI基礎篇_Agent

留言