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