找尋你的社群用戶 – sherlock
在紅隊演練或 OSINT(Open Source Intelligence,公開來源情報)蒐集的初期階段,「使用者名稱」往往是最容易被忽略、卻又最有價值的線索。多數人習慣在不同平台重複使用同一組帳號名稱,因此只要掌握一個 username,就有機會串連出目標的社交圈、興趣、工作經歷,甚至是密碼提示題的答案。
Sherlock 就是為了這件事而生的工具:給它一個使用者名稱,它會同時向數百個社群網站查詢該名稱是否已被註冊,並把命中的網址一次列出來。原文提到的 298 個平台是舊版數字,目前官方 README 已宣稱支援 400 個以上的網站,涵蓋 Facebook、Instagram、X (Twitter)、GitHub、Reddit、Steam、Telegram、Pinterest、Twitch 等主流服務,也包含不少小眾論壇與國外社群。
至於命名由來,正是取自柯南·道爾筆下的名偵探 Sherlock Holmes(夏洛克·福爾摩斯)——畢竟專案首頁就是一位叼著菸斗的偵探剪影,意思再明顯不過了。
任務目標
已經獲取滲透目標的常用用戶名稱,紅隊 Leader 要求您探勘各大社群媒體找尋目標的相關訊息。
具體要交付的成果通常包含:目標在哪些平台有帳號、各平台的公開個人資料(頭像、自介、所在地、任職單位)、以及可以延伸利用的關聯資訊(其他帳號、電子郵件、暱稱習慣)。這些資料會成為後續社交工程劇本或密碼字典的素材。
運作原理
Sherlock 的核心其實不複雜,它靠的是一份 resources/data.json 站點清單,裡面針對每個網站定義了「查詢網址樣板」與「判斷帳號是否存在的方法」,主要有三種偵測模式:
- status_code:直接看 HTTP 回應碼,例如回 200 代表帳號存在、404 代表不存在。
- message:比對回應內容中的特定字串,例如頁面出現「User not found」就判定為未註冊。
- response_url:觀察是否被轉址到錯誤頁或首頁,藉此判斷帳號狀態。
由於是逐站發送 HTTP 請求,Sherlock 使用多執行緒並行查詢以縮短時間,實測查完全站大約需要數十秒到數分鐘,會受網路品質與目標網站回應速度影響。也因為原理是「檢查個人頁面是否存在」,本質上屬於被動偵查,不會對目標帳號本身留下登入或通知紀錄。
使用環境
本文演練環境:Win10 + Python 3.9。
Sherlock 官方要求 Python 3.6 以上,可跨平台執行於 Windows、Linux 與 macOS。若您使用 Kali Linux,套件庫中已內建 Sherlock,可直接以 sudo apt install sherlock 安裝。
使用工具
Sherlock
作者:Siddharth Dushantha
載點:https://github.com/sherlock-project/sherlock
授權:MIT License(免費開源)
簡介:跨社群平台的使用者名稱偵查工具,輸入一組 username 即可並行查詢 400 個以上的網站是否存在該帳號,並輸出可直接點擊的個人頁面連結,是 OSINT 情蒐流程中最常被使用的入門工具之一。
進行演練
Step 1. 下載 Github 上的專案。
git clone https://github.com/sherlock-project/sherlock.gitcd sherlock
若不想手動 clone,也可以直接用 pip 安裝官方套件,安裝後即可在任何路徑下使用 sherlock 指令:
pip install sherlock-project
另外官方也提供 Docker 映像,適合不想污染本機 Python 環境的情況:
docker run --rm -it sherlock/sherlock test1234
Step 2. 根據 requirements.txt 所要求的套件下載。
pip install -r requirements.txt
建議先建立虛擬環境再安裝,避免與系統既有套件版本衝突:執行 python -m venv venv 後,於 Windows 使用 venv\Scripts\activate 啟動(Linux/macOS 為 source venv/bin/activate)。
Step 3. 假設目標 username = test1234,開始像夏洛克一樣查詢。
python sherlock/sherlock.py test1234
執行結果會以 [+] 標示找到的帳號並附上網址,[-] 代表該站查無此帳號;預設也會在同目錄產生一份 <username>.txt 保存命中清單。至此,就能進入對應的社交平台上蒐集目標的相關資料了。
常用參數整理
| 參數 | 說明 |
|---|---|
username1 username2 ... | 一次查詢多個使用者名稱,適合比對目標的慣用命名變體。 |
--site SITE | 只針對指定網站查詢,可重複使用;適合已知目標活躍平台時節省時間。 |
--timeout N | 設定每站等待秒數(預設 60),調小可加快但誤判率上升。 |
--print-found | 只輸出命中的結果,畫面乾淨許多,實務上最常用。 |
--print-all | 連未命中的站點一起列出,方便確認掃描覆蓋率。 |
--csv | 將結果匯出為 CSV,便於整理成報告附錄。 |
--xlsx | 匯出為 Excel 檔案。 |
--folderoutput DIR | 指定輸出資料夾,多目標作業時方便歸檔。 |
--nsfw | 將成人性質網站一併納入掃描範圍(預設排除)。 |
--proxy URL | 透過指定 Proxy 發送請求,例如 --proxy socks5://127.0.0.1:9050。 |
--tor / --unique-tor | 經由 Tor 發送請求,後者每站更換一次出口節點;需本機已安裝 Tor。 |
--local | 使用本機的 data.json 而非線上版本,適合離線或自訂站點清單。 |
實務上最順手的組合大概是這樣,只看命中結果並直接匯出 CSV:
sherlock target_user --print-found --timeout 10 --csv
結果判讀與常見陷阱
Sherlock 的輸出不能直接當成結論,它只是一份需要人工複驗的候選清單。實際使用時最常遇到以下狀況:
- 誤判(False Positive):部分網站不論帳號是否存在都回傳 200,或以 JavaScript 動態渲染錯誤頁,導致 Sherlock 誤認為命中。每一筆結果都應該手動開啟網址確認。
- 漏判(False Negative):Facebook、Instagram 這類需要登入才能檢視個人頁的平台,或啟用 Cloudflare 人機驗證的網站,經常會查不到實際存在的帳號。
- 同名不同人:熱門的 username 很可能被多人使用,必須交叉比對頭像、自介、發文時間、關聯帳號等特徵,才能確認是同一個人。
- 站點清單過期:網站改版後判斷規則就會失效,建議每次作業前先
git pull更新到最新版本。 - 速率限制與封鎖:短時間大量請求可能觸發目標網站的 WAF 或 IP 封鎖,必要時搭配
--proxy或降低併發。
延伸工具
Sherlock 適合當作起點,若要做更完整的帳號情蒐,通常會再搭配下列工具交叉驗證:
- Maigret:由 Sherlock 概念延伸而來,支援站點數量更多,並會自動從命中頁面抽取姓名、地區、其他帳號等中繼資料,直接產生 HTML/PDF 報告。
- WhatsMyName:純網頁版的使用者名稱查詢服務,不需安裝環境,適合快速驗證單一名稱。
- Blackbird:同樣是 username 與 email 的跨平台搜尋工具,提供網頁式操作介面。
- theHarvester:從搜尋引擎與公開來源蒐集網域相關的郵件與主機名稱,適合把個人層級的線索擴展到組織層級。
法律與道德提醒
雖然 Sherlock 查詢的都是公開頁面,但把散落各處的個人資訊彙整成單一檔案,在許多法規(包含台灣的《個人資料保護法》與歐盟 GDPR)下已屬於個資的蒐集與處理行為。請務必確認:
- 演練前已取得客戶書面授權,且目標與範圍明確記載於 Rules of Engagement 中。
- 蒐集到的個人資料僅用於本次委任目的,報告交付後依約定期限銷毀。
- 不將工具用於跟蹤、騷擾、人身攻擊或未經授權的身分調查——這些行為在多數國家都可能構成犯罪。
參考資料
