1. 程式人生 > >Python實現埠掃描,只需做這幾步走戰略

Python實現埠掃描,只需做這幾步走戰略

一、常見埠掃描的原理

0、祕密掃描

祕密掃描是一種不被審計工具所檢測的掃描技術。

它通常用於在通過普通的防火牆或路由器的篩選(filtering)時隱藏自己。

祕密掃描能躲避IDS、防火牆、包過濾器和日誌審計,從而獲取目標埠的開放或關閉的資訊。由於沒有包含TCP 3次握手協議的任何部分,所以無法被記錄下來,比半連線掃描更為隱蔽。

但是這種掃描的缺點是掃描結果的不可靠性會增加,而且掃描主機也需要自己構造IP包。現有的祕密掃描有TCP FIN掃描、TCP ACK掃描、NULL掃描、XMAS掃描和SYN/ACK掃描等。

1、Connect()掃描

此掃描試圖與每一個TCP埠進行“三次握手”通訊。如果能夠成功建立接連,則證明埠開發,否則為關閉。準確度很高,但是最容易被防火牆和IDS檢測到,並且在目標主機的日誌中會記錄大量的連線請求以及錯誤資訊。

TCP connect埠掃描服務端與客戶端建立連線成功(目標埠開放)的過程:

① Client端傳送SYN;

② Server端返回SYN/ACK,表明埠開放;

③ Client端返回ACK,表明連線已建立;

④ Client端主動斷開連線。

建立連線成功(目標埠開放)

TCP connect埠掃描服務端與客戶端未建立連線成功(目標埠關閉)過程:

① Client端傳送SYN;

② Server端返回RST/ACK,表明埠未開放。

優點:實現簡單,對操作者的許可權沒有嚴格要求(有些型別的埠掃描需要操作者具有root許可權),系統中的任何使用者都有權力使用這個呼叫,而且如果想要得到從目標埠返回banners資訊,也只能採用這一方法。

另一優點是掃描速度快。如果對每個目標埠以線性的方式,使用單獨的connect()呼叫,可以通過同時開啟多個套接字,從而加速掃描。

缺點:是會在目標主機的日誌記錄中留下痕跡,易被發現,並且資料包會被過濾掉。目標主機的logs檔案會顯示一連串的連線和連接出錯的服務資訊,並且能很快地使它關閉。

2、SYN掃描

掃描器向目標主機的一個埠傳送請求連線的SYN包,掃描器在收到SYN/ACK後,不是傳送的ACK應答而是傳送RST包請求斷開連線。這樣,三次握手就沒有完成,無法建立正常的TCP連線,因此,這次掃描就不會被記錄到系統日誌中。這種掃描技術一般不會在目標主機上留下掃描痕跡。但是,這種掃描需要有root許可權。

埠開放:1、Client傳送SYN 2、Server端傳送SYN/ACK 3、Client傳送RST斷開(只需要前兩步就可以判斷埠開放)

埠關閉:1、Client傳送SYN 2、Server端回覆RST(表示埠關閉)

優點:SYN掃描要比TCP Connect()掃描隱蔽一些,SYN僅僅需要傳送初始的SYN資料包給目標主機,如果埠開放,則相應SYN-ACK資料包;如果關閉,則響應RST資料包;

3、NULL掃描

反向掃描—-原理是將一個沒有設定任何標誌位的資料包傳送給TCP埠,在正常的通訊中至少要設定一個標誌位,根據FRC 793的要求,在埠關閉的情況下,若收到一個沒有設定標誌位的資料欄位,那麼主機應該捨棄這個分段,併發送一個RST資料包,否則不會響應發起掃描的客戶端計算機。也就是說,如果TCP埠處於關閉則響應一個RST資料包,若處於開放則無相應。但是應該知道理由NULL掃描要求所有的主機都符合RFC 793規定,但是windows系統主機不遵從RFC 793標準,且只要收到沒有設定任何標誌位的資料包時,不管埠是處於開放還是關閉都響應一個RST資料包。但是基於Unix(*nix,如Linux)遵從RFC 793標準,所以可以用NULL掃描。 經過上面的分析,我們知道NULL可以辨別某臺主機執行的作業系統是什麼作業系統。

埠開放:Client傳送Null,server沒有響應

埠關閉:1、Client傳送NUll 2、Server回覆RST

說明:Null掃描和前面的TCP Connect()和SYN的判斷條件正好相反。在前兩種掃描中,有響應資料包的表示埠開放,但在NUll掃描中,收到響應資料包表示埠關閉。反向掃描比前兩種隱蔽性高些,當精確度也相對低一些。

用途:判斷是否為Windows系統還是Linux。

4、FIN掃描

與NULL有點類似,只是FIN為指示TCP會話結束,在FIN掃描中一個設定了FIN位的資料包被髮送後,若響應RST資料包,則表示埠關閉,沒有響應則表示開放。此類掃描同樣不能準確判斷windows系統上埠開發情況。

埠開放:傳送FIN,沒有響應

埠關閉:1、傳送FIN 2、回覆RST

5、ACK掃描

掃描主機向目標主機發送ACK資料包。根據返回的RST資料包有兩種方法可以得到埠的資訊。方法一是: 若返回的RST資料包的TTL值小於或等於64,則埠開放,反之埠關閉。

6、Xmas-Tree掃描

通過傳送帶有下列標誌位的tcp資料包。

URG:指示資料時緊急資料,應立即處理。

PSH:強制將資料壓入緩衝區。

FIN:在結束TCP會話時使用。

正常情況下,三個標誌位不能被同時設定,但在此種掃描中可以用來判斷哪些埠關閉還是開放,與上面的反向掃描情況相同,依然不能判斷windows平臺上的埠。

埠開放:傳送URG/PSH/FIN,沒有響應

埠關閉:1、傳送URG/PSH/FIN,沒有響應 2、響應RST

XMAS掃描原理和NULL掃描的類似,將TCP資料包中的ACK、FIN、RST、SYN、URG、PSH標誌位置1後傳送給目標主機。在目標埠開放的情況下,目標主機將不返回任何資訊。

7、Dump掃描

也被稱為Idle掃描或反向掃描,在掃描主機時應用了第三方殭屍計算機掃描。由殭屍主機向目標主機發送SYN包。目標主機埠開發時迴應SYN|ACK,關閉時返回RST,殭屍主機對SYN|ACK迴應RST,對RST不做迴應。從殭屍主機上進行掃描時,進行的是一個從本地計算機到殭屍主機的、連續的ping操作。檢視殭屍主機返回的Echo響應的ID欄位,能確定目標主機上哪些埠是開放的還是關閉的。

二、Python 程式碼實現

1、利用Python的Socket包中的connect方法,直接對目標IP和埠進行連線並且嘗試返回結果,而無需自己構建SYN包。

2、對IP埠進行多執行緒掃描,注意的是不同的電腦不同的CPU每次最多建立的執行緒是不一樣的,如果建立過多可能會報錯,需要根據自己電腦情況修改每次掃描的個數或者將seelp的時間加長都可以。