◆孟彬 智云壘 鐘翡
基于Python的端口掃描技術(shù)研究
◆孟彬 智云壘 鐘翡
(96822部隊 云南 650000)
本文研究了計算機端口掃描技術(shù),介紹了常用端口掃描技術(shù)的原理,并利用Python的socket模塊實現(xiàn)遠程計算機TCP端口的全連接掃描,通過掃描發(fā)現(xiàn)處于開放狀態(tài)的高危端口,提醒網(wǎng)絡運維人員合理的關(guān)閉高危端口可提高計算機的安全性。
全連接掃描;Python;socket
端口在計算機中有非常重要的意義,端口是計算機與外界交互信息的通道??梢赃@樣理解,計算機端口在傳輸層上用來標識同一臺計算機的不同進程??蛻舳送ǔλ褂玫亩丝谔柌魂P(guān)心,只需要保障該端口在本機上是唯一的即可,客戶端與服務端通信時常用動態(tài)端口,服務端使用固定的知名端口,客戶端的端口號與服務端的端口號不需要一一對應。IP地址和端口號的組合成為套接字Socket,在一個主機上是唯一的,一條連接由客戶端和服務器的套接字組成[1]。
計算機端口在網(wǎng)絡安全方面有極重要的意義,黑客和一些木馬程序會利用端口漏洞實施入侵活動。對目標主機進行掃描可以得到其端口的開放情況,根據(jù)主機運行的業(yè)務,合理的關(guān)閉不需要的高危端口,就可以防止木馬與黑客利用這些端口開展攻擊的活動,從而提高計算機的安全性。常見的高危端口有135、137、138、139、445等端口,135端口用于RPC(遠程過程調(diào)用)服務、137端口用于NetBIOS名稱服務,138和139端口用于局域網(wǎng)中的共享服務,445用于文件夾和打印機共享服務[2]。
常見端口掃描技術(shù)有全連接掃描、半連接掃描、FIN掃描、ACK掃描和NULL掃描等。
TCP Connect掃描又稱全連接掃描,TCP connect()函數(shù)會調(diào)用系統(tǒng)提供的傳輸層接口API,嘗試通過三次握手與目標的指定端口建立TCP連接,根據(jù)連接的建立情況判斷目標端口是否開放。優(yōu)點是易于實現(xiàn),掃描速度快,可同時掃描多個用戶,無須管理員權(quán)限。缺點是會在目標主機的日志中記錄大量的連接建立與關(guān)閉信息。
TCP SYN掃描又稱半連接掃描,掃描時與目標機指定端口建立TCP連接時僅完成前兩次握手,在第三次握手時不發(fā)送確認報文,使TCP連接無法確認。優(yōu)點是目標主機日志中記錄的連接信息較少,缺點是實現(xiàn)較為復雜且需要較高的權(quán)限。
FIN掃描,不依賴TCP的三次握手,向目標端口發(fā)送一個設(shè)置了FIN標記的報文,根據(jù)系統(tǒng)返回或不返回報文判斷端口的開放情況。缺點是掃描結(jié)果不準確,容易得到錯誤結(jié)論。
ACK掃描,發(fā)送的報文只設(shè)置ACK標志位,若收到目標主機返回的RST標記的報文,只能判斷目標主機未被防火墻保護不能判斷端口是否開放。若未收到任何報文或收到ICMP不可達報文,說明端口受到防火墻保護。ACK掃描判斷端口是否開放容易出錯,更適合確定目標是否在線。
NULL掃描又稱空掃描,將發(fā)送的報文中所有標記都置為0,若目標返回RST報文表示端口關(guān)閉,若目標沒返回報文,表示端口開放或被防火墻保護[3]。缺點是掃描結(jié)果不準確。
綜上所述,TCP Connect掃描因具有掃描速度快、掃描結(jié)果準確、權(quán)限要求低等優(yōu)點,得到了較廣泛的應用。
計算機間通過IP地址與端口號進行通信的方式稱為socket通信,HTTP、FTP、DNS等應用都是通過socket通信實現(xiàn)的,socket通信中提供服務的一方稱為socket服務端,調(diào)用socket服務的一方稱為socket客戶端。Socket服務端用自己的IP地址、指定端口號和連接方式創(chuàng)建服務并啟動服務并等待客戶端的連接請求,socket客戶端向服務端發(fā)起連接請求,連接請求被服務端接受后,客戶端和服務端就可以進行通信了。
Python可直接調(diào)用socket對象,通過socket套接字向目標主機的端口發(fā)送TCP connect()請求,若目標主機上的指定端口處于偵聽狀態(tài),就可以建立連接[4]。若目標主機未開放該端口,則connect()操作失敗,產(chǎn)生異常。
在掃描前要先建立TCP連接,關(guān)鍵代碼如下:
import socket #導入socket模塊
tcps=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #建立TCP套接字
tcps.connect((ip,port))#連接指定主機的目標端口
tcps.shutdown(2)
tcps就是建立的socket對象,利用socket對象tcps對目標主機進行connect連接,connect()函數(shù)只能接受一個參數(shù),ip地址與端口號要用元組表示,ip與端口號在函數(shù)調(diào)用時傳入。tcps.shutdown(2)表示tcps套接字不允許傳輸數(shù)據(jù),只能用于掃描端口。
若目標主機指定端口未開啟,則返回connect refuse結(jié)果,會產(chǎn)生connect操作失敗異常,可以用try except捕捉connect異常,通過對連接異常的捕捉可判斷目標主機端口的開啟情況。
定義連接判斷函數(shù):
def TcpOpen(ip,port):
tcps=socket.socket(socket.AF_INET,
socket.SOCK_STREAM)
try:
tcps.connect((ip,int(port)))
tcps.shutdown(2)
result.insert('insert','TCP端口{}isopen!!! '.format(port))
tcps.close()
except Exception as e:
return None
連接判斷函數(shù)的主要功能是:根據(jù)ip和port參數(shù)指定的IP地址和端口號,去連接目標主機的相應端口,若連接成功在Text窗體result上顯示端口開放信息,表示端口是開放的,連接失敗的端口不顯示,表示端口未開放。
定義掃描函數(shù):
def scanport():
begin = input1.get() #變量begin表示起始掃描端口
end=input2.get() #變量end表示終止掃描端口
ip =show_ip.get() #變量ip是要掃描的目標主機IP
for i in range(eval(begin), eval(end)):
TcpOpen(ip,i)
掃描主機的ip地址由用戶填寫,ip地址默認為”127.0.0.1”,,既可以掃描遠程計算機也可以掃描本地計算機。用戶可任意指定開始端口號和終止端口號,知名端口、注冊端口和動態(tài)端口號均可,但要注意的是端口范圍越大掃描的時間就越長。
界面設(shè)計采用Python自帶的Tkinter模塊,運行的界面如下:
圖1 端口掃描器的界面
指定掃描端口范圍是0-1024,指定目標主機的ip是28.90.31.182,程序執(zhí)行完畢后就會輸出在1-1024范圍里的所有的開放的端口,如下圖2所示。
圖2 目標主機的端口掃描結(jié)果
通過端口掃描可看到110、135、139、443、902、912等知名端口是處于開放狀態(tài)的,網(wǎng)絡運維人員可以根據(jù)主機的實際運行情況關(guān)閉部分開放的端口,可提高計算機的安全性。這里以掃描TCP知名端口為例,對于動態(tài)端口和注冊端口也同樣適用。
端口掃描技術(shù)對于計算機安全有重要的意義,隨著計算機網(wǎng)絡的發(fā)展,計算機面臨的網(wǎng)絡攻擊與日俱增,端口掃描是網(wǎng)絡防御的重要環(huán)節(jié)。本文介紹了5種常用的端口掃描技術(shù),并編寫了端口掃描工具,實現(xiàn)了對目標主機TCP端口的掃描功能,得到了開放的TCP端口列表,及時關(guān)閉不使用的高危端口可提高計算機的安全性。下一步,將重點研究如何快捷高效的掃描UDP端口,同時端口掃描工具有較強的可擴展性,還需進一步豐富掃描工具的功能、提高可用性。
[1]Brandon Rhodes John Goerzen. Python網(wǎng)絡編程[M].北京:人民郵電出版社,2016:18-19.
[2]裴志斌,李斌勇,王星程.IP及端口掃描體系的邏輯處理設(shè)計[J]. 網(wǎng)絡安全技術(shù)與應用,2017(10):26-27.
[3]梁劍非.多線程端口掃描軟件設(shè)計與實現(xiàn)[D].成都:電子科技大學,2011
[4]趙宏,包廣斌,馬棟林.Python網(wǎng)絡編程(Linux)[M].北京:清華大學出版社,2018:108-111.