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