端口掃描的方法

編寫端口掃描器(C++)2007-12-13 14:47一、端口掃描器功能簡介: 
服務器上所開放的端口就是潛在的通信通道,也就是一個入侵通道。對目標計算機進行端口掃描,能得到許多有用的信息,進行端口掃描的方法很多,可以是手工進行掃描、也可以用端口掃描軟件進行。 
掃描器通過選用遠程TCP/IP不同的端口的服務,並記錄目標給予的回答,通過這種方法可以蒐集到很多關於目標主機的各種有用的信息,例如遠程系統是否支持匿名登陸、是否存在可寫的FTP目錄、是否開放TELNET服務和HTTPD服務等。 
二、常用端口掃描技術: 
1、TCP connect()掃描: 
這 是最基本的TCP掃描,操作系統提供的connect()系統調用可以用來與每一個感興趣的目標計算機的端口進行連接。如果端口處於偵聽狀態,那麼 connect()就能成功。否則,這個端口是不能用的,即沒有提供服務。這個技術的一個最大的優點是,你不需要任何權限。系統中的任何用戶都有權利使用 這個調用。另一個好處就是速度,如果對每個目標端口以線性的方式,使用單獨的connect()調用,那麼將會花費相當長的時間,使用者可以通過同時打開 多個套接字來加速掃描。使用非阻塞I/O允許你設置一個低的時間用盡週期,同時觀察多個套接字。但這種方法的缺點是很容易被察覺,並且被防火牆將掃描信息 包過濾掉。目標計算機的logs文件會顯示一連串的連接和連接出錯消息,並且能很快使它關閉。 
2、TCP SYN掃描: 
這種技術通常認爲 是“半開放”掃描,這是因爲掃描程序不必要打開一個完全的TCP連接。掃描程序發送的是一個SYN數據包,好象準備打開一個實際的連接並等待反應一樣(參 考TCP的三次握手建立一個TCP連接的過程)。一個SYN|ACK的返回信息表示端口處於偵聽狀態:返回RST表示端口沒有處於偵聽態。如果收到一個 SYN|ACK,則掃描程序必須再發送一個RST信號,來關閉這個連接過程。這種掃描技術的優點在於一般不會在目標計算機上留下記錄,但這種方法的缺點是 必須要有root權限才能建立自己的SYN數據包。 
3、TCP FIN 掃描: 
SYN掃描雖然是“半開放”方式掃描,但在某些時候也不能 完全隱藏掃描者的動作,防火牆和包過濾器會對管理員指定的端口進行監視,有的程序能檢測到這些掃描。相反,FIN數據包在掃描過程中卻不會遇到過多問題, 這種掃描方法的思想是關閉的端口會用適當的RST來回復FIN數據包。另一方面,打開的端口會忽略對FIN數據包的回覆。這種方法和系統的實現有一定的關 系,有的系統不管端口是否打開都會回覆RST,在這種情況下此種掃描就不適用了。另外這種掃描方法可以非常容易的區分服務器是運行Unix系統還是NT系 統。 
4、IP段掃描: 
這種掃描方式並不是新技術,它並不是直接發送TCP探測數據包,而是將數據包分成兩個較小的IP段。這樣就將一個TCP頭分成好幾個數據包,從而過濾器就很難探測到。但必須小心:一些程序在處理這些小數據包時會有些麻煩。 
5、TCP 反向 ident掃描: 
ident 協議允許(rfc1413)看到通過TCP連接的任何進程的擁有者的用戶名,即使這個連接不是由這個進程開始的。例如掃描者可以連接到http端口,然後 用identd來發現服務器是否正在以root權限運行。這種方法只能在和目標端口建立了一個完整的TCP連接後才能看到。 
6、FTP 返回攻擊: 
FTP 協議的一個有趣的特點是它支持代理(proxy)FTP連接,即入侵者可以從自己的計算機self.com和目標主機target.com的 FTP server-PI(協議解釋器)連接,建立一個控制通信連接。然後請求這個server-PI激活一個有效的server-DTP(數據傳輸進 程)來給Internet上任何地方發送文件。對於一個User-DTP,儘管RFC明確地定義請求一個服務器發送文件到另一個服務器是可以的,但現在這 個方法並不是非常有效。這個協議的缺點是“能用來發送不能跟蹤的郵件和新聞,給許多服務器造成打擊,用盡磁盤,企圖越過防火牆”。 
7、UDP ICMP端口不能到達掃描: 
這 種方法與上面幾種方法的不同之處在於使用的是UDP協議,而非TCP/IP協議。由於UDP協議很簡單,所以掃描變得相對比較困難。這是由於打開的端口對 掃描探測並不發送確認信息,關閉的端口也並不需要發送一個錯誤數據包。幸運的是許多主機在向一個未打開的UDP端口發送數據包時,會返回一個 ICMP_PORT_UNREACH錯誤,這樣掃描者就能知道哪個端口是關閉的。UDP和ICMP錯誤都不保證能到達,因此這種掃描器必須還實現在一個包 看上去是丟失的時候能重新傳輸。這種掃描方法是很慢的,因爲RFC對ICMP錯誤消息的產生速率做了規定。同樣這種掃描方法也需要具有root權限。 
8、UDP recvfrom()和write() 掃描: 

當 非root用戶不能直接讀到端口不能到達錯誤時,Linux能間接地在它們到達時通知用戶。比如,對一個關閉的端口的第二個write()調用將失敗。在 非阻塞的UDP套接字上調用recvfrom()時,如果ICMP出錯還沒有到達時回返回EAGAIN-重試。如果ICMP到達時,返回 ECONNREFUSED-連接被拒絕。這就是用來查看端口是否打開的技術。

轉載地址:http://wenda.tianya.cn/question/7058fbd6d42db225 

發佈了13 篇原創文章 · 獲贊 14 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章