1. 程式人生 > >滲透測試之服務掃描

滲透測試之服務掃描

服務掃描:識別開放埠上執行的應用

識別目標作業系統,Windows,Linux等

掃描方法:

Banner捕獲:掃描埠,通過工具識別埠對應的服務,不準確,僅作參考

服務識別:基於指紋資訊判斷

作業系統識別

SNMP分析:通過SNMP識別目標系統,SNMP通過系統內部資訊進行探測,結果比較準確

防火牆識別:識別邊界防火牆,繞過防火牆

Banner捕獲:通過軟體開發商,軟體名稱,服務型別,版本號(直接發現已知的漏洞和弱點),還需要結合另類的服務識別方法,通過特徵行為和相應欄位,不同的相應也可用於識別底層作業系統,如ping Windows和ping Linux得到的TTL值就有所不同

使用Ncat去掃描埠獲得其服務名:nc -nv 192.168.45.129 22(主動連線該IP地址的22號埠)

使用ncat去掃描連線80號埠,命令get獲取其伺服器資訊,可知其系統為Metasploitable2,開啟了80埠,其賬戶名為msfadmin這裡寫圖片描述通過python語言獲取banner資訊:(scapy主要用於三四層網路資料包的注入,劫持,嗅探,對應用層操作比較困難,在應用層操作使用的是python的socket模組)

socket模組:用於與目標系統建立TCP連線,並且與目標伺服器進行應用層的會話傳輸

用python進行網路程式設計,就是在python程式本身這個程序內,連線別的伺服器程序的通訊埠進行通訊

socket又稱”套接字”,應用程式通常通過”套接字”向網路發出請求或者應答網路請求,使主機間或者一臺計算機上的進場間進行通訊

在Python中,我們使用socket模組的socket函式建立一個socket物件,通過呼叫bind(hostname,port)函式來指定服務的port(埠);接著,我們呼叫socket物件的accept方法,該方法等待客戶端的連線,並返回connection物件,表示已連線到客戶端

python提供了兩個級別的網路服務:

低級別的網路服務支援基本的socket,它提供了標準的BSD socket API,可以訪問底層作業系統socket介面的全部方法

高級別的網路服務模組socket server,它提供了伺服器中心化,可以簡化網路伺服器的開發

socket()函式

python中,使用socket()函式來建立套接字,語法格式如下:

socket.socket([family[,type[,protocal]]])

引數:

family:套接字家族可以使用AF_UNIX或者AF_INET(表示使用的是ipv4地址和埠號的組合)

type:套接字型別可以根據是面向物件連線的還是非面向物件分為SOCK_STREAM或者SOCK_DGRAM

protocol:指定協議,TCP,UDP,STCP協議,TIPC協議,設定protocal為0時,python會自動選擇type型別對應的預設協議

connect方法:connect用於客戶端和伺服器建立連線,使用方法為

socket.socket():使用socket模組中的socket函式

客戶端在呼叫connect之前不必非得呼叫bind函式,核心會確定源IP地址,並選擇一個臨時埠作為源埠.如果使用TCP協議,connect將激發TCP的三次握手過程,TCP狀態由CLOSED變成SYN_SEND,最終變為ESTABLISHED

bind方法:用於把一個本地協議地址賦予給一個套接字,格式和connect格式相同

在不呼叫bind的情況下,核心會確定IP地址,並分配臨時埠,這種情況很適合客戶端,因此客戶端在呼叫connect之前不呼叫bind方法,而服務端需要一個確定的IP和埠,因此需要呼叫bind指定地址和埠.一般情況下,伺服器都有多個IP地址,除了環路地址127.0.0.1外,還有區域網和公網地址,如果bind繫結的是環路地址127.0.0.1,則只有本機通過環路地址才能訪問,如果需要通過任意IP都可以訪問,可以繫結統配地址0.0.0.0,當指定的埠為0時,核心會分配一個臨時埠

listen方法:

當建立一個套接字時,預設為主動套接字,也就是說,是一個將呼叫

connect發起連線的客戶套接字。listen方法把一個未連線的套接字轉換為一個

被動套接字,指示核心應接受指向該套接字的狀態請求。根據TCP狀態轉換圖,

呼叫listen導致套接字從CLOSED狀態轉換到LISTEN狀態。此方法引數規定了

核心應該為相應套接字排隊的最大連線個數,在bind之後,並在accept之前呼叫

accent方法:

accept用於從已完成連線佇列頭返回下一個已完成連線,如果已完成連

接佇列為空,那麼程序會被投入睡眠(套接字為阻塞方式)。

accept會自動生成一個全新的檔案描述符,代表與所返回客戶的TCP連線。

需要注意的是,此處有兩個套接字物件,一個是監聽套接字,一個返回的已連

接套接字。

區分這兩個套接字很重要,一個伺服器通常僅僅建立一個監聽套接字,它

在該伺服器的生命週期內一直存在,核心為每個由伺服器程序接受的客戶連線

建立一個已連線套接字(也就是說TCP三次握手已經完成),當伺服器完成對

某個給定客戶的服務時,相應的已連線套接字會被關閉。

close方法:close方法用來關閉套接字,

需要注意的是,close方法並不一定會觸發TCP的四分組連線終止序列,當一個已連線套

接字被多個程序開啟時,關閉套接字只會導致此程序相應描述符的計數值減1,只有所有程序

都將該套接字關閉後,套接字的引用計數值小於1以後,系統核心才會開始終止連線操作,這

一點在多程序開發過程中需要格外注意。如果確實想在某個TCP連線上傳送FIN觸發主動關閉,

可以呼叫shutdown方法。

send方法:用來發送TCP資料,

每一個TCP套接字都有一個傳送緩衝區,預設大小通socket.SO_SNDBUF

檢視,當某個程序呼叫send時,核心從該應用程序的緩衝區複製所有資料到所

寫套接字的傳送緩衝區,如果該套接字的傳送緩衝區容不下該應用程序的所有

資料(或是應用程序的緩衝區大小大於套接字的傳送緩衝區,或是套接字的發

送緩衝區已有其他資料),該應用程序將被投入睡眠(套接字阻塞的情況),

核心將不從系統呼叫返回,直到應用程序緩衝區的所有資料都複製到套接字發

送快取區。當對端確認收到資料後,會發送ACK分節,隨著對端ACK的不斷到

達,本端TCP才能從套接字傳送快取區中丟棄已確認的資料。

recv方法:用來進行TCP接收資料這裡寫圖片描述例項:這裡寫圖片描述有些banner資訊不允許被抓取,那麼recv函式無返回被掛起

sys模組:sys模組提供了許多函式和變數來處理python執行時環境的不同部分

處理命令列引數:在直譯器啟動後,argv列表包含了傳遞給指令碼的所有的引數,列表的第一個元素為指令碼自身的名稱,如sys.argv[0]表示指令碼的名稱,sys.argv[1]表示第一個引數

select模組:select是監聽觸發機制,監聽可讀和可寫佇列。當有事件發生時,進行遍歷輪詢事件發生的物件然後返回

比如在服務端啟動之後把服務端新增到select的可讀監聽佇列中,當有客戶端請求連線服務端時,select函式會返回一個可讀事件再讓服務端接受客戶端的連線。

select的返回方式可以是阻塞或者是非阻塞,非阻塞式的select處理方式是輪詢的,會不斷詢問佔用Cpu太多的資源和時間,所以建議使用阻塞等待返回的方式去使用select,簡單說就是讓一個執行緒去處理多個連線,在連線有事情做的時候才去處理,沒事做的話執行緒就掛起,讓執行緒的利用率更高

使用dmitry進行服務掃描常見的150個埠,判斷其服務:dmitry -pb 192.168.45.129 引數-p表示進行TCP掃描,引數-b表示從埠去判斷開啟的服務這裡寫圖片描述使用nmap去掃描埠,判斷其開放的服務nmap -sT 192.168.45.129 -p 22 –script=banner,nmap的指令碼存放在/usr/share/nmap/scripts這裡寫圖片描述這裡寫圖片描述banner資訊抓取能力有限

所以使用nmap進行掃描,nmap相應特徵分析識別服務,向目標傳送系列複雜的探測,並且依據相應特徵的指紋資訊判斷開放的服務這裡寫圖片描述