宋來建
摘 要 端口掃描技術(shù)作為一種工作和學(xué)習(xí)中的重要技術(shù),對于測試網(wǎng)絡(luò)、構(gòu)建網(wǎng)絡(luò)布局有著十分重要的作用,基于Python的端口掃描更是將這種掃描技術(shù)精細(xì)化,提高了驗算效率,是現(xiàn)今許多代碼工作所傾向使用的重要技術(shù),然而在這一技術(shù)的使用過程中有許多細(xì)節(jié)之處需要使用者注意。基于此,本文對基于Python的端口掃描技術(shù)進(jìn)行了探究,旨在為同行業(yè)者提供有益參考。
關(guān)鍵詞 端口掃描技術(shù) 縮進(jìn)掃描 連接掃描 秘密掃描 間接掃描
中圖分類號:TP3 文獻(xiàn)標(biāo)識碼:A 文章編號:1007-0745(2022)02-0007-03
端口在計算機(jī)發(fā)展和使用過程中起著十分重要的作用,端口能夠連接計算機(jī)與外界,實(shí)現(xiàn)兩者之間信息的交互。通常情況下,客戶并不關(guān)心使用的端口號,只需要保證該端口在本機(jī)上是唯一的即可。
1 端口掃描技術(shù)概述
1.1 TCP/IP工作原理
TCP/IP參考模型來源于20世紀(jì)60年代末美國的一個網(wǎng)絡(luò)分組交換研究項目,是一系列網(wǎng)絡(luò)協(xié)議的總稱。這些協(xié)議的存在能夠促使計算機(jī)之間的信息交換變得更加方便和容易。TCP/IP參考模型一共分為四層,每一層都負(fù)責(zé)不同的通信功能,從上到下分別為:應(yīng)用層、傳輸層、Internet層、網(wǎng)絡(luò)接入層。TCP/IP參考模型的傳輸層包括TCP和UDP兩種,前者是指傳輸控制協(xié)議,主要面向受控對象,提供可靠的、面向連接的傳輸任務(wù),在傳送數(shù)據(jù)前務(wù)必先要建立連接,在確認(rèn)信息到達(dá)目的之后,再開始對錯誤的檢查與修復(fù)、順序和流量的控制等。后者是指用戶數(shù)據(jù)報送協(xié)議,這一傳輸層主要提供不可靠、無連接的傳輸服務(wù),在傳送數(shù)據(jù)錢無需提前建立連接,也不需要確認(rèn)信息是否送達(dá)。
1.2 端口的定義
端口專門為計算機(jī)而設(shè)計的,負(fù)責(zé)計算機(jī)通信,可以說,離開了端口計算機(jī)通信就無法進(jìn)行。在計算機(jī)網(wǎng)絡(luò)中,一般分為以下兩種端口:硬件端口和軟件端口。集線器、交換機(jī)、路由器等網(wǎng)絡(luò)設(shè)備由于可以連接到其他網(wǎng)絡(luò)設(shè)備上使用,故被稱為硬件端口。軟件端口通常有套接字中的端口。套接字是由IP地址和端口兩部分組成。軟件端口通常而言是邏輯概念,定義了計算機(jī)之間通過軟件通信的方式。
1.3 端口掃描技術(shù)
端口掃描是一種通過連接到目標(biāo)計算機(jī)的TCP和UDP端口來確定目標(biāo)計算機(jī)上運(yùn)行的服務(wù)方法?,F(xiàn)階段,端口掃描主要用于識別計算機(jī)上啟用的服務(wù)和開放的端口;識別計算機(jī)上操作系統(tǒng)類型和系統(tǒng)信息;識別在線的一臺計算機(jī)或多臺計算機(jī)組成個網(wǎng)絡(luò)。
1.4 端口掃描的目的
端口掃描技術(shù)的出現(xiàn)主要是為了滿足網(wǎng)絡(luò)管理員、網(wǎng)絡(luò)技術(shù)人員以及普通計算機(jī)用戶的需求而誕生的一種科學(xué)技術(shù)。每個用戶進(jìn)行端口掃描的目的也有所不同,所以不同的用戶對網(wǎng)絡(luò)的使用方式不同。普通用戶使用端口掃描是為了了解某一特定的服務(wù)器是否可以提供自己需要的服務(wù);網(wǎng)絡(luò)技術(shù)人員進(jìn)行端口掃描是為了利用已經(jīng)打開的窗口來獲取對自己有用的信息;而網(wǎng)絡(luò)管理員進(jìn)行端口掃描主要是為了關(guān)閉不在繼續(xù)使用的端口,進(jìn)而安裝有漏洞的端口補(bǔ)丁程序。
2 通過掃描主機(jī)端口建立循環(huán)嵌套構(gòu)
我們都知道,C、Python等語言都可以利用來編寫端口掃描器。(大部分互聯(lián)網(wǎng)應(yīng)用使用的都是TCP協(xié)議,如HTTP在TCP80端口上,SMTP在TCP25端口上等等)。這種掃描方式可用來檢測端口是否被過濾。TCPFIN掃描一一請求服務(wù)的一方發(fā)送一個FIN=1的數(shù)據(jù)包,這種掃描方式大多用于判斷操作類型。此外,還有很多種掃描方式,對應(yīng)于不同的網(wǎng)絡(luò)環(huán)境,選擇不同的掃描方式,往往會達(dá)到比較理想的效果。Scan函數(shù)引入IP和端口通過套接字進(jìn)行連接并打印相關(guān)信息,在函數(shù)中通過發(fā)送一個數(shù)據(jù)串從而獲取到使用對應(yīng)端口的服務(wù)回應(yīng)的banner。再介紹下for循環(huán):使用內(nèi)建socket模塊建立一個socket連接:準(zhǔn)備環(huán)境ubuntu(ip:192.168.213.20)主機(jī)win10(ip:192.168.213.16)開著ssh服務(wù)kali(ip:192.168.213.19),筆者使用的是vim編輯器,上面這個例子先引用socket模塊然后調(diào)用co-nnect()函數(shù)連接ip與端口。它會與tcp連接,并且這樣就不會出現(xiàn)錯誤,一行很簡單的代碼就可以讓程序繼續(xù)執(zhí)行下去。接下來使用for循環(huán)來寫一個簡單的端口掃描器:使用“try/except”循環(huán)來處理當(dāng)socket連接的時候遇到端口關(guān)閉的錯誤,另外打印出來連接成功的端口以及對應(yīng)的服務(wù)信息。下面創(chuàng)建一個自己指定的端口進(jìn)行掃描,接下來筆者就可以嘗試一下循環(huán)嵌套構(gòu)。[1-2]
比如說,筆者知道在服務(wù)器的端口上運(yùn)行著相應(yīng)的服務(wù),這些服務(wù)有其版本。筆者在服務(wù)器上執(zhí)行端口掃描有兩個目的:第一個是確定服務(wù)器上啟用了哪些服務(wù);第二個是確定使用哪個版本的服務(wù)。這兩個目的都是縮小行動范圍,提高其效率和準(zhǔn)確性。例如,如果筆者知道主機(jī)上啟用了端口80,它很可能提供Web服務(wù),筆者可以根據(jù)主機(jī)用于Web服務(wù)的語言(如PHP)、框架(如WordPress)和框架版本(如4.8.2)進(jìn)一步搜索相應(yīng)的漏洞;筆者經(jīng)常使用SSH遠(yuǎn)程登錄服務(wù)器,例如,默認(rèn)運(yùn)行在端口22上,如果筆者掃描服務(wù)器打開此端口,服務(wù)器很可能會打開遠(yuǎn)程連接的功能,如果筆者獲取banner獲取其服務(wù)版本的SSH則存在一個版本的安全漏洞,因此有一個新的測試攻擊點(diǎn)。接觸網(wǎng)絡(luò)技術(shù)的讀者大概知道端口是什么,沒有接觸過的讀者,經(jīng)過下面的簡單介紹也應(yīng)該能夠了解端口是什么。在網(wǎng)絡(luò)上,筆者將使用各種服務(wù)(不是所有類型的網(wǎng)站,當(dāng)然網(wǎng)站提供Web服務(wù)),例如瀏覽網(wǎng)站、發(fā)送電子郵件、使用FTP下載某些資源、使用SSH或Telnet連接到遠(yuǎn)程服務(wù)器等。這些服務(wù)可能都由同一臺服務(wù)器提供。同一臺服務(wù)器上有這么多服務(wù),如何區(qū)分它們?端口用于區(qū)分和唯一標(biāo)識它們,每個服務(wù)使用不同的端口,就像建筑物中的不同房間一樣。筆者常用的Web服務(wù)默認(rèn)使用端口80;用于上傳和下載文件的FTP使用端口21;筆者通過域名或IP地址找到相應(yīng)的服務(wù)器,然后通過端口號找到相應(yīng)的服務(wù)。[3-4]
3 基于for循環(huán)的縮進(jìn)掃描
為了實(shí)現(xiàn)這一目標(biāo),筆者將引入一個新概念,即for循環(huán):請注意,在上面的代碼片段中,for循環(huán)的主體是縮進(jìn)的。通常人們用2個空格或用制表符縮進(jìn),只要在整個劇本中保持一致就沒關(guān)系。要制作簡單的端口掃描程序,筆者將使用創(chuàng)建套接字連接的代碼片段替換print語句。下面的代碼顯示了如何使用內(nèi)置套接字模塊建立套接字連接:上面筆者導(dǎo)入套接字模塊并調(diào)用connect()函數(shù)連接到給定的IP地址和端口號。這將建立TCP連接(SYN/SYN-ACK/ACK),筆者實(shí)際上使用send()函數(shù)將數(shù)據(jù)發(fā)送到給定服務(wù),并使用recv()打印響應(yīng)?,F(xiàn)在,如果端口未打開,socket將拋出異常:這可以通過多種方式解決?,F(xiàn)在筆者將使用一種非常簡單的方法并使用“try/except”循環(huán)并傳遞異常:注意沒有錯誤。現(xiàn)在讓筆者結(jié)合所有這些概念并制作一個快速的循環(huán)端口掃描程序:上面筆者演示了“try/except”循環(huán)的基本用法,以便在端口關(guān)閉時傳遞socket拋出的異常。筆者還展示了如何利用帶有“if”的基本條件語句,如果端口響應(yīng)筆者的探測器,則僅嘗試打印端口打開。創(chuàng)建端口掃描程序的另一種方法是定義一個希望用數(shù)組掃描的端口列表,然后遍歷該數(shù)組:如果筆者想要一次處理多個主機(jī),就要利用嵌套的for循環(huán)。這將涉及循環(huán)通過主機(jī)的外層for循環(huán)和將循環(huán)通過端口的內(nèi)部for循環(huán)。下面是如何利用嵌套for循環(huán)來制作稍微復(fù)雜的掃描程序的基本示例:正如在輸出中看到的那樣,它會循環(huán)hosts數(shù)組并嘗試ports數(shù)組中的每個端口,然后繼續(xù)前進(jìn)到下一個主機(jī)。對于最終端口掃描程序,可能希望將print語句修改為僅打印已打開的端口。在一天結(jié)束時,會發(fā)現(xiàn)Nmap仍然是端口掃描的更好選擇,但筆者將在后面的文章中構(gòu)建這些概念,以完成一些更實(shí)際的用例。我們可以花一些時間來探索插座模塊“dir(socket)”中可用的各種功能。[5]
4 深度測試TCP連接掃描
TCP連接掃描使用完整的三方握手來確定服務(wù)器或端口是否可用。筆者將腳本分為幾個單獨(dú)的步驟,首先輸入主機(jī)名和以逗號分隔的端口列表并開始掃描,然后將主機(jī)名轉(zhuǎn)換為IPv4地址,再與每個端口建立TCP連接并捕獲目標(biāo)端口應(yīng)用程序的標(biāo)題信息。首先,來看看OptParse模塊。由于optParse模塊主要用于將命令參數(shù)傳遞給腳本,因此它使用預(yù)定義的選項來解析命令行參數(shù)。需要導(dǎo)入OptParser模塊,初始化它,實(shí)例化OptionParser對象(帶或不帶參數(shù)),并向命令行添加選項。其次,筆者需要定制兩個函數(shù),每個函數(shù)一個。第一個功能是創(chuàng)建一個socket對象,將測試信息發(fā)送到端口,然后接收主機(jī)返回的信息并打印;第二個功能是將從主機(jī)參數(shù)獲得的目標(biāo)值轉(zhuǎn)換為標(biāo)準(zhǔn)xxx.xxx.xxx。XXX表單,主要使用socket gethostbyname函數(shù)將域名值轉(zhuǎn)換為四點(diǎn)基表單。最后,筆者在main函數(shù)中使用OptParse模塊創(chuàng)建實(shí)例對象,確定當(dāng)前主機(jī)和端口是否為空,如果為空,則打印實(shí)例對象。那么,筆者如何使用Python進(jìn)行端口識別和掃描呢?[6]
比如說,在Python中,有一個名為socket的內(nèi)置模塊,該模塊提供網(wǎng)絡(luò)套接字操作,并包含以下函數(shù)以支持套接字連接的實(shí)現(xiàn)。要使用源地址創(chuàng)建鏈接并設(shè)置連接超時,筆者可以使用此模塊的socket()函數(shù)創(chuàng)建一個socket對象以連接到服務(wù)器的指定端口,如下代碼所示:筆者使用了socket()套接字模塊的功能是建立到IP地址192.168.223.152端口22的套接字連接,然后關(guān)閉連接。當(dāng)然,無法成功連接。運(yùn)行此代碼甚至沒有輸出信息:如何獲取套接字連接的輸出信息?套接字對象中的方法Recv()可能會有所幫助:它從套接字連接返回指定大小的字節(jié)。讓筆者測試這個方法:筆者在這里測試的IP地址是Intranet主機(jī)的IP地址。筆者使用Metasploitable2作為目標(biāo)主機(jī),Metasploit是一個著名的滲透測試框架,提供了一個目標(biāo)虛擬機(jī),它是一個易受攻擊的Linux虛擬機(jī)。該虛擬機(jī)可用于安全培訓(xùn)、測試安全工具和實(shí)踐常見的滲透測試技術(shù)。運(yùn)行代碼,筆者得到套接字返回的第一個1024字節(jié)(通常是服務(wù)消息的標(biāo)題):從返回的標(biāo)題消息中,筆者知道服務(wù)器的端口22是打開的,服務(wù)版本是Ubuntu上的OpensSH4.7。由此可見,使用recv()方法,筆者可以獲得有關(guān)端口服務(wù)的最基本信息,但是如果相應(yīng)的端口未啟用或具有其他限制,則可能會報告錯誤。
5 秘密掃描與間接掃描
端口掃描的第一步是將探測數(shù)據(jù)包發(fā)送到目標(biāo)主機(jī)的TCP/UDP端口,然后確定端口是否在對方響應(yīng)后打開。由于不同的網(wǎng)絡(luò)環(huán)境以及操作系統(tǒng)沒有響應(yīng)連接請求,為確保掃描的準(zhǔn)確性和速度,通常在端口掃描中支持多種掃描方式。由于該技術(shù)不包含標(biāo)準(zhǔn)的TCP3次握手協(xié)議的任何部分,因此無法記錄,從而比SYN掃描隱蔽得多。另外,F(xiàn)IN數(shù)據(jù)包能夠通過只監(jiān)測SYN包的包過濾器。秘密掃描技術(shù)使用FIN數(shù)據(jù)包來探聽端口。當(dāng)FIN數(shù)據(jù)包到達(dá)關(guān)閉的端口,數(shù)據(jù)包會丟掉,并且會返回一個RST數(shù)據(jù)包;當(dāng)FIN數(shù)據(jù)包到達(dá)打開的端口,數(shù)據(jù)包也丟掉,但不返回RST。Xmas和l Null掃描是秘密掃描的2個變種。Xmas掃描打開FIN、URG和PUISH標(biāo)記,而 Null 掃描關(guān)閉所有標(biāo)記。這些組合的目的是為了通過FIN標(biāo)記監(jiān)測器的過濾。跟SYN掃描類似,秘密掃描也需要自己構(gòu)造IP包。間接掃描是利用第三方的IP(欺騙主機(jī))來隱藏真正掃描者的IP。間接掃描時,使用第三方IP地址(主機(jī)錯誤)來隱藏實(shí)際掃描儀的IP地址。
6 使用Pyhton進(jìn)行端口掃描
計算機(jī)之間通過端口和IP地址進(jìn)行通信的方式稱為SOCKET通信,HTTP、FTP、DNS等都是通過SOCK ET通信方式實(shí)現(xiàn)的。這一通信方式中提供服務(wù)的一方被稱之為SOCKET服務(wù)端,而被服務(wù)的一端則被稱之為socket客戶端。Python可以直接調(diào)用SOCKET對象,通過socket套接字向目標(biāo)主機(jī)的端口發(fā)送TCP connect()請求,如果目標(biāo)主機(jī)上的指定端口處于偵聽狀態(tài),那么便可以建立連接請求,但相反若該目標(biāo)主機(jī)并未開放端口,則connect()操作失敗,產(chǎn)生異常。
在進(jìn)行掃描之前首先需要建立TCP連接,關(guān)鍵就是要利用socket對象tcps對目標(biāo)主機(jī)進(jìn)行connect連接,connect()函數(shù)只能接受一個參數(shù)。如果目標(biāo)主機(jī)指定的端口并未開啟,則需要返回到connect refuse結(jié)果,并查收能connect操作失敗的指示。在實(shí)現(xiàn)程序的過程中,需要定義一個連接判斷函數(shù),這一函數(shù)的主要功能是根據(jù)ip和port參數(shù)指定的ip地址和端口號,連接目標(biāo)主機(jī)的相應(yīng)端口,若顯示連接失敗或者直接不顯示,則表明主機(jī)的端口并未開放。
7 總結(jié)
在探測一個區(qū)域的網(wǎng)絡(luò)布局時,端口掃描是黑客經(jīng)常使用的一種輔助攻擊手段,掃描主機(jī)端口并不能直接對主機(jī)直接造成危害,但是可以獲取到主機(jī)的一些信息,借此來對目標(biāo)主機(jī)進(jìn)行分析,為進(jìn)一步入侵做好準(zhǔn)備。這是每一位計算機(jī)從業(yè)人員都需要格外注意的細(xì)節(jié)。
參考文獻(xiàn):
[1] 楊迎.基于Python語言的網(wǎng)絡(luò)傳輸層UDP協(xié)議攻擊性行為研究[J].數(shù)字技術(shù)與應(yīng)用,2021,39(02):196-198.
[2] 孟彬,智云壘,鐘翡.基于Python的端口掃描技術(shù)研究[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2021(01):42-43.
[3] 周耀鵬,王暉,陳嘉倫.基于Python的網(wǎng)絡(luò)空間安全掃描系統(tǒng)的設(shè)計與實(shí)現(xiàn)[J].電腦知識與技術(shù),2020, 16(31):59-61.
[4] 侯美靜. 基于智能爬行算法的網(wǎng)絡(luò)掃描技術(shù)研究及實(shí)現(xiàn)[D].西安電子科技大學(xué),2018.
[5] 朱欣嘉.利用網(wǎng)絡(luò)回溯分析技術(shù)進(jìn)行端口掃描行為分析[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2013(04):5-6.
[6] 李樹軍.反射式TCP端口掃描技術(shù)的研究[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2006(09):29-30,37.