1. 程式人生 > >TCP空閒掃描原理

TCP空閒掃描原理

判斷一個TCP埠是否開放,其中一種方法是向該埠傳送一個 SYN(建立會話) 資料包,如果該埠是開放的,則它會返回一個 SYN/ACK(會話確認) 資料包;如果該埠是關閉的,則它返回 RST(重置) 資料包;如果埠是被過濾狀態,則它什麼都不返回。一般來說我們通過這種方法判斷掃描的主機埠是否開放。

還需要另一個背景知識:網際網路上的每個IP資料包都有一個分段身份識別號(IP ID)。許多作業系統只是簡單的把該識別號遞增,因此分析最後一次的IPID就可以告訴攻擊者已經此主機發送了多少資料包。

現在我們想象:已知一臺主機 Z ,他是空閒的,不在網路上與其他主機進行網路通訊。我們直接向他傳送一個 SYN/ACK 包。因為他沒有向我們傳送過 SYN 包,所以接受到 SYN/ACK 包之後不知道我們是什麼意思,就回給我們一個 RST 包,包裡會附有 IP ID,就假設是31337吧。

現在我們製作一個IP地址偽裝成主機 Z 的 SYN 資料包,將它傳送到要掃描的真實主機 T 的某個埠(為方便描述,我們假設想掃描 T 的 21 號埠)。注意,這個包是我們傳送的,主機 Z 並不知道有人假裝它傳送了資料包,它的 IP ID 不會受到影響。然後我們等一會,再向主機 Z 傳送一個 SYN/ACK 的資料包,Z 會返回一個 RST ,我們檢視裡面的 IP ID。

要分析此時得到的 IP ID 可能是多少,就要先分析我們傳送了偽造的資料包後發生了什麼。

可想而知,根據主機 T 的 21 號埠的狀態,可能有三種情況發生:

21 埠開啟 這種情況下主機 T 收到我們的 SYN 包,由於 21 埠開放,他要返回一個 SYN/ACK。它檢視 SYN 包裡的來源 IP,那裡寫著的是 Z 的 IP 地址,於是它向主機 Z 傳送了一個 SYN/ACK 包。主機 Z 接到這個包之後就傻了,它心想我沒想連線你的 21 埠啊,然後 Z 傳送了一個 RST 給 T, Z T 之間通訊結束。 注意加粗的部分,Z 主動傳送一個 RST 包的時候,IP ID 需要加一,這個包裡的 IP ID 為 31338。所以我們接受到的那個 RST 包的 IP ID 就會是 31339。 idle-scan-open.png 21 埠關閉 這種情況下主機 T 機收到我們的 SYN 包,由於他沒開這個埠,所以準備返回一個 RST 包。和 1 中情形類似,他把這個 RST 包發給了 Z 。Z 不明所以,就沒管。 因為這個過程中 Z 沒有傳送任何資料包,所以我們接受收到來自 Z 的 RST 包中的 IP ID 會是31338。

idle-scan-cloesd.png 21埠被過濾 這種情況呢 T 收到 SYN 之後,會直接無視這個包。同情況2,我們接受到的來自 Z 的 RST 包中的 IP ID 會是 31338。

idle-scan-filtered

綜上所述:

21 埠狀態 收到的 RST 包中的 IP ID OPEN 31339 (+2) CLOSED 31338 (+1) FILTERED 31338 (+1) 所以通過檢查收到的 RST 包中的 IP ID,就可以判斷我們需要探查的主機的特定埠是否開啟。

這種掃描的好處就是,被掃描主機 T 並不知道我們在掃描他,T 並不知道我們的真實 IP。缺點是速度慢而且並不能判斷埠到底是關閉還是被過濾。

但是這種掃描還可能反映出主機間的信任關係。

想象以下情況:老闆讓網路管理員在防火牆上開啟一個埠,以便他可以使用家裡的 IP 地址來訪問公司內部的網路資源。這經常發生在高管不想或不會用 VPN (或類似產品)的情況下。

空閒掃描有時候能夠映射出這種信任關係。因為空閒掃描列出的開放埠是相對於殭屍主機而言。若對上述資料庫伺服器進行一次常規的掃描,可能顯示未開放任何埠,但是使用老闆家裡主機的 IP 作為殭屍主機,進行空閒掃描卻顯示該資料庫相關的服務埠是開放的,由此可以斷定他們之間存在信任關係。

若能映射出他們之間的信任關係,將對攻擊者非常有用,可以優先把它當成攻擊目標。如果不能注意到連帶的資料庫訪問,那麼上述討論的殭屍主機對於攻擊者而言就是一個非常普通伺服器。