嗯... 今天來聊聊 Shodan 這個東西。很多人聽過,但... 說真的,大部分人可能只是把它當成一個駭客工具的清單在看。你知道嗎,就是那種... 複製貼上一堆指令,然後看看會跳出什麼,沒跳出東西就算了。
我自己是覺得,這樣用有點可惜。它不只是一堆指令。它... 它更像是一種看待網路世界的方式。一種... 嗯... 從上帝視角,或者說,從一個維修工的視角,去看整個網際網路的基礎設施。對,重點不是你會不會背那些指令,而是你知不知道「為什麼」要這樣下指令。
重點一句話
簡單講,Shodan 就是... 嗯... 網路設備版的 Google。但它搜尋的不是網頁內容,而是所有連上網路的「東西」的「特徵」。像是路由器、攝影機、紅綠燈、工廠機具... 甚至是沒人知道的測試伺服器。如果你不知道怎麼跟它溝通,那它對你來說就只是一個空白的搜尋框。
所以... 用這個到底能翻出什麼鬼東西?
在我們講那些... 像咒語一樣的查詢語法之前,先看看實際能找到什麼,你可能比較有感覺。這些東西,真的都只是在網路上「公開」的資訊,只是... 只是沒人把它們整理在一起而已。
最常見的,大概就是那種完全沒設密碼、直接裸奔在網路上的資料庫。想想看,MongoDB、Redis 這些,很多人裝好了就忘了要設權限,或者密碼就用預設的 `admin`。用 Shodan 找,大概就像這樣:
product:"MongoDB" port:27017
一行指令下去,你可能會看到... 嗯... 幾千幾萬個可以直接連進去的資料庫。裡面有什麼?客戶資料、訂單紀錄、程式碼... 什麼都有可能。真的很可怕。
還有啊,就是網路攝影機。很多人以為攝影機在內網就安全,但... 常常因為設定錯誤,或者路由器有漏洞,結果整個被掛到公網上。標題打個 `webcam` 搜尋,都能找到一堆客廳、辦公室、甚至是臥室的即時影像。更不用說那種有特定漏洞的品牌,一找就是一大片。
我自己是覺得,最讓人冒冷汗的,其實是工業控制系統(ICS)。就是控制工廠產線、發電廠、水壩那種東西。這些設備本來應該是完全隔離在實體網路裡的,但... 總是會有人為了方便遠端維護,給它接了個小小的對外網路。結果呢?整個工廠的控制台中控畫面,就這麼出現在 Shodan 的搜尋結果裡。你可以看到壓力值、溫度、轉速... 雖然你可能無法操作,但光是「看到」,就已經夠嚇人了。
OK,那這些咒語... 啊不是,是查詢語法,到底怎麼用?
感覺到它的威力之後,我們回頭來講講「怎麼用」。Shodan 的語法,其實就是一堆「過濾器」(Filter)。你告訴它你想看的東西「具備什麼特徵」,它就把符合的結果給你。很直覺。
我把它分成... 嗯... 基礎跟進階兩種思維。就像玩樂高,你可以只用基本磚塊,也可以混搭一些特殊零件,蓋出更複雜的東西。
| 查詢思維 | 常用語法範例 | 你能得到什麼(白話文) |
|---|---|---|
| 基礎思維:廣泛撒網 | port:3389 |
就... 直接找所有開著遠端桌面服務的電腦。量很大,但雜訊也超多,什麼國家的、什麼類型的都有。 |
| 基礎思維:廣泛撒網 | product:"Apache" |
找所有自稱是 Apache 伺服器的東西。但版本新舊、在哪裡、安不安全,你通通不知道。 |
| 基礎思維:廣泛撒網 | http.title:"Dashboard" |
找網頁標題有 "Dashboard" 這個字的。可能會找到一堆系統後台登入頁面,但大部分應該都有密碼啦。 |
| 進階思維:精準打擊 | port:3389 org:"Specific Company" country:"TW" |
這樣就精準多了。鎖定某個特定組織,在台灣地區,而且開著遠端桌面的電腦。嗯... 這就有點針對性了,要小心用。 |
| 進階思維:精準打擊 | product:"Apache" version:"2.4.49" |
不只找 Apache,我還要指定版本是 2.4.49 這個已知的舊版本。這通常是用來找特定漏洞的前奏。 |
| 進階思維:精準打擊 | ssl:"Example Inc" http.html:"Powered by" |
找 SSL 憑證是某家公司,而且網頁內容包含特定字眼的。這能幫你找出同一個老闆但放在不同地方的所有網站,做資產盤點超實用。 |
你看,差別就在於「疊加條件」。就像你跟 Google 說,我不要只找「餐廳」,我要找「台北市信義區、有停車位、評價四顆星以上、而且還在營業的義大利餐廳」。條件越多,結果越精準。Shodan 也是一樣的道理。
進階玩法:當你想找些更特別的東西...
學會基本組合之後,就可以來玩一些... 更有趣的。這些通常也是資安研究員最愛用的。
1. 找特定漏洞 [vuln]
這是 Shodan 最強大的功能之一。它會去整合 CVE(通用漏洞披露)的資料庫。你可以直接搜尋某個 CVE 編號,找出網路上所有「可能」有這個漏洞的設備。注意,是「可能」,不代表 100% 有,但... 範圍已經縮小非常多了。
vuln:"<a href="https://nvd.nist.gov/vuln/detail/CVE-2019-19781" target="_blank" class="blogHightLight_css nobox">CVE-2019-19781</a>"
像這個,當年 Citrix 的大漏洞,一堆企業中招。用這個語法,你就可以看到當時全球還有多少系統沒更新,門戶大開。
2. 地理位置轟炸 [geo, city, country]
有時候,你關心的不是「什麼設備」,而是「哪個地方」。比如,你想知道某個城市裡,有多少交通號誌系統連上了網。你可以用國家代碼 `country:"JP"` 找日本的設備,或用城市名 `city:"Taipei"`。甚至,它還支援經緯度搜尋 `geo:"25.0330,121.5654"`,你可以畫一個圈,找出這個圈圈裡的所有連網裝置。
3. 組織和網路區段 [org, net]
這個功能通常是給企業的資安人員(藍隊)用來做自我檢測的。你可以用 `org:"Google LLC"` 找出登記在 Google 名下的所有 IP 和設備,看看有沒有什麼不該對外開放的服務被打開了。或者用 `net:"1.1.1.0/24"` 來掃描一個完整的網段。
對,這個功能... 也常被攻擊方(紅隊)拿來做前期偵查,先摸清楚目標有哪些資產暴露在外。
在台灣用 Shodan,有什麼不一樣嗎?
說到這個,大部分的教學都是國外的,但其實在不同地方用,因為網路環境不同,有些觀察點會不太一樣。這點跟我們在台灣看到的情況很不一樣,主要是因為 ISP(網路服務提供商)和使用者習慣的關係。
比方說,在美國,很多網路設備的資訊會被登記在大型雲端服務商下面,像是 AWS、Google Cloud。所以你用 `org:"Amazon"` 常常會撈到一堆東西。但在台灣,特別是家用網路,很多設備會直接顯示是 `org:"Chunghwa Telecom"` 或 `org:"Hoshin Multimedia Center"`(反正就是中華電信、凱擘大寬頻這些)。這代表什麼?這代表很多家用路由器、監視器,如果設定不當,就是直接暴露在這些 ISP 的 IP 段下面。
另外,像是一些資安通報,全球性的警告可以看美國 CISA 發的,他們會針對像 Log4j 這種大漏洞發出全球警示。但在台灣,我自己是覺得,更應該去關注我們本地的 TWCERT/CC(台灣電腦網路危機處理暨協調中心)發的月報或季報。他們會整理出在台灣比較常見的攻擊手法和受駭系統類型,有時候你會發現,國外流行打的漏洞,在台灣不一定最多;反而是一些在地的系統、或是國人愛用的 NAS 品牌(對,就是那幾個大牌子),更容易成為目標。
所以,當你在用 Shodan 找靈感時,除了看國外的 dorks 列表,不妨也結合 TWCERT/CC 的報告,看看最近台灣流行什麼樣的資安問題,再去組合你的查詢條件,效果會好很多。
最重要的事:道德跟法律的界線
好,最後一定要講這個。說真的,這條線真的很模糊。Shodan 就像一把菜刀,你可以用來切菜,也可以... 嗯... 你知道的。當你用 Shodan 看到一個沒有密碼的資料庫,你只是「看」到它存在,這就像你走在路上看到一棟房子的門沒關。但如果你試圖連線進去,哪怕只是 `ls` 一下看看裡面有什麼檔案,那就等於你一腳踩進了那棟房子。這就是入侵了。
法律上,每個國家的規定不一樣,但在大部分地方,「未經授權的連線嘗試」本身就可能觸法。這跟你有沒有造成破壞無關。所以,千萬記得,Shodan 是用來「偵查」和「研究」的,不是用來「驗證」和「存取」的。
對白帽駭客或企業資安人員來說,他們所有的掃描和測試,都是在拿到「書面授權」之後才能進行的。如果你只是出於好奇,那請把你的好奇心限制在「觀察」這個層級就好。看到有趣的東西,分析它的特徵,了解它為什麼會暴露,這就很有價值了。千萬不要手癢去試密碼,或者去連線。
玩上癮了?想自動化?用 API 吧
如果你跟我一樣有點懶... 或者說,想做大規模的研究,比如你想持續追蹤某個特定漏洞在台灣的修補狀況,每次都手動查太累了。這時候就要用 API。
Shodan 有提供 API,讓你可以用程式去自動化查詢。免費帳號好像有一些限制,但付費之後功能就蠻完整的。下面是一個... 嗯... 很簡單的 Python 範例,讓你知道大概是怎麼運作的。
import shodan
import time
# 這邊要換成你自己的 API 金鑰
API_KEY = "YOUR_SHODAN_API_KEY"
try:
api = shodan.Shodan(API_KEY)
# 試著搜尋所有自稱是 Apache 的伺服器
query = 'product:"Apache"'
# 進行搜尋
results = api.search(query)
print(f"查詢 '{query}' 找到 {results['total']} 筆結果")
# 把結果一個個印出來
for result in results['matches']:
print(f"IP: {result['ip_str']}")
print(f"主機名稱: {result.get('hostnames', 'N/A')}")
print(f"組織: {result.get('org', 'N/A')}")
print("-" * 20)
time.sleep(0.1) # 禮貌一點,不要太快
except shodan.APIError as e:
print(f"發生錯誤了...: {e}")
對,大概就是這樣。你可以把查詢結果存到檔案裡,做成圖表,或者設定成每天自動跑一次,然後有新發現就寄信通知你。玩法很多,就看你的想像力了。
總之,Shodan 是個很棒的工具,但它考驗的不是你的記憶力,而是你的洞察力跟... 嗯... 自制力。希望今天這樣聊,能讓你對它有更深一層的認識。
小互動: 除了我提到的這些,你有沒有用 Shodan 找到過什麼讓你覺得「哇,這也行?」的驚奇發現?或是有什麼獨門的查詢技巧?在下面留言分享一下吧,不用太詳細,點到為止就好!
