iT邦幫忙

0

資安 3:釣魚樣本蒐集與分類(建立可重現的資料庫)

o 2025-10-05 17:26:36116 瀏覽
  • 分享至 

  • xImage
  •  

一、今日目標

建立一套可重現且合乎倫理的「釣魚/社交詐騙」樣本蒐集流程,並設計標註(labeling)規範,使樣本能支援後續的 rule-based 檢測、特徵工程與機器學習訓練。

具體產出:

樣本來源清單與取得方式(含 API、公開資料、模擬樣本)。

標註欄位規範(CSV schema)。

初步自動擷取腳本(示例:從公開網頁擷取文案與 URL)。

至少 30 則去識別化(anonymized)釣魚樣本(模擬或公開來源),並存成 CSV。

二、可用樣本來源(與倫理說明)

公開通報與新聞案例:使用公開媒體報導或資安通報,並在資料中去識別化(移除個人資料、替換真實帳號)。

公開論壇/留言板(僅抓公開可見內容):例如公開討論串、留言(遵守該網站 robots.txt 與使用條款)。

開源倉庫或研究資料集:查找現有公開釣魚資料集(使用前請確認授權與用途)。

模擬樣本(建議首選):自行設計多種釣魚樣本(不同誘因、不同短網址、不同語言風格),完全在測試環境下產出,避免對真實使用者造成影響。

測試平台(Gophish)產出:僅在你擁有權限或受試者同意的情況下執行,所有測試須取得書面同意與倫理審查(如適用)。

倫理與合規要點:

嚴禁對未經同意的真實使用者發送釣魚訊息。

使用公開案例時進行去識別化(anonymization)。

若需實測,提前取得被試者同意並告知風險與回饋機制。

三、標註欄位(CSV schema 建議)

建議欄位(每欄說明):

id:樣本唯一識別碼(自訂)。

source:資料來源(news/forum/simulated/gophish等)。

date:擷取或創建日期(YYYY-MM-DD)。

raw_text:原始訊息內容(去識別化後)。

extracted_urls:擷取出的 URL(以分號分隔)。

domains:URL 對應之主域名(以分號分隔)。

has_shorturl:是否包含短網址(true/false)。

urgent_flag:是否含緊迫性關鍵字(true/false)。

social_engineering_type:主要誘因類型(authority/urgency/reciprocity/social_proof/familiarity/other)。

phishing_target:攻擊目標類型(credentials/financial/info/other)。

label:是否為釣魚(phishing/benign/unknown/simulated)。

notes:備註(例如去識別處理說明)。

四、自動擷取示例(Python + BeautifulSoup)

下列示例為從公開網頁擷取文字並萃取 URL 的基礎腳本。請確認目標網站允許擷取(robots.txt)且遵守使用條款;此範例僅供學術/測試用途。

requirements: pip install requests beautifulsoup4 tldextract pandas

import requests
from bs4 import BeautifulSoup
import re
import tldextract
import pandas as pd
from datetime import datetime
import uuid

URL_PATTERN = re.compile(r'(https?://[^\s"'>]+)', re.IGNORECASE)

def extract_urls(text):
return URL_PATTERN.findall(text)

def get_domains(urls):
domains = []
for u in urls:
te = tldextract.extract(u)
domain = ".".join(part for part in [te.domain, te.suffix] if part)
domains.append(domain)
return list(set(domains))

def fetch_public_page(url):
headers = {"User-Agent": "Mozilla/5.0 (compatible; sample-bot/1.0)"}
r = requests.get(url, headers=headers, timeout=10)
r.raise_for_status()
soup = BeautifulSoup(r.text, "html.parser")
# 取正文(視網站而定,此處簡化取所有段落文字)
paragraphs = [p.get_text(separator=" ", strip=True) for p in soup.find_all("p")]
return "\n".join(paragraphs)

def create_sample_record(raw_text, source="public", date=None):
if date is None:
date = datetime.utcnow().strftime("%Y-%m-%d")
urls = extract_urls(raw_text)
domains = get_domains(urls)
rec = {
"id": str(uuid.uuid4()),
"source": source,
"date": date,
"raw_text": raw_text,
"extracted_urls": ";".join(urls),
"domains": ";".join(domains),
"has_shorturl": any("bit.ly" in d or "tinyurl" in d for d in domains),
"urgent_flag": any(k in raw_text.lower() for k in ["urgent","immediately","verify","limited","expire","24 hour","24小時","立即","限時","驗證"]),
"social_engineering_type": "",
"phishing_target": "",
"label": "",
"notes": ""
}
return rec

範例:擷取新聞頁面中的文本並建立樣本

if name == "main":
seed_pages = [
"https://example.com/sample-article-1", # 請替換為允許擷取的頁面
]
records = []
for page in seed_pages:
try:
text = fetch_public_page(page)
rec = create_sample_record(text, source="news")
records.append(rec)
except Exception as e:
print("fetch error:", page, e)

df = pd.DataFrame(records)
df.to_csv("phishing_samples_initial.csv", index=False)
print("Saved", len(df), "records.")

說明:

extract_urls 與 tldextract 協助萃取與標準化域名,便於後續比對黑名單或白名單。

urgent_flag 同時支援英文與中文關鍵詞(可依需要擴充)。

對於社群貼文或 API(例如 Reddit、Twitter/X),請使用官方 API(並遵守速率限制與授權)。

五、標註作業流程(手動 + 半自動)

初步自動化擷取:使用上述腳本或 API 抓取文字、URL、Metadata(發文者、時間、回覆數等)。

去識別化:移除或替換個資(email、手機、真實姓名、帳號 ID)。

人工標註:依照 CSV schema 填寫 social_engineering_type、phishing_target、label 與 notes。建議至少兩位標註者交叉標註以提升一致性(inter-annotator agreement)。

匯出檢視:將標註結果匯成 CSV,並生成簡易統計(例如各類型樣本數、短網址比例、緊迫性比例)。

版本控管:將樣本與標註檔上傳至私人或團隊的 GitHub(private repo)或壓縮檔備份,紀錄版本與變更說明。

六、今日實作任務(步驟化)

決定三個公開可抓取的資料來源(或三個模擬樣本範例)。

執行腳本抓取至少 30 則文本(模擬或公開),並產出初始 CSV。

用表格工具(Excel/Google Sheets)開啟 CSV,對前 10 則進行人工標註(social_engineering_type 與 label)。

上傳 CSV 至你的專案資料夾(或 GitHub private repo),並在 iT 邦幫忙發文附上樣本摘要(不貼原始敏感內容)。

七、範例輸出(CSV 範例列)
id,source,date,raw_text,extracted_urls,domains,has_shorturl,urgent_flag,social_engineering_type,phishing_target,label,notes
uuid1,simulated,2025-10-03,"您的帳號將在24小時內被停用,請點擊 https://bit.ly/xyz 重新驗證","https://bit.ly/xyz","bit.ly",true,true,"authority;urgency","credentials","phishing","模擬樣本"

八、風險控管與備註

若使用第三方 API(例如 Twitter/X API、Reddit API),請確認 API 使用授權與速率限制。

不要在未經許可的情況下使用爬蟲對大量私人資料進行擷取。

標註過程中若發現可疑真實詐騙案例,僅紀錄摘要與去識別化資訊,不要主動揭露或轉發該詐騙連結給未經同意的人。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言