實驗三 埠掃瞄實驗

2021-08-03 16:41:05 字數 3845 閱讀 6125

了解埠掃瞄的基本概念和工作原理

編寫乙個利用全連線的埠掃瞄程式,能顯示目標主機的埠開放情況。要求能在命令列輸入要掃瞄的目標主機和埠範圍。比如:scan  *.*.*.*   nnnn-mmmm

(一)實驗內容:

編寫乙個利用全連線的埠掃瞄程式,能顯示目標主機的埠開放情況。要求能在命令列輸入要掃瞄的目標主機和埠範圍。比如:scan  *.*.*.*   nnnn-mmmm

(二)背景知識

埠掃瞄原理

在「計算機網路」課程中,我們知道完成一次tcp連線需要完成三次握手才能建立。埠掃瞄正是利用了這個原理,通過假冒正常的連線過程,依次向目標主機的各個埠傳送連線請求,並根據目標主機的應答情況判斷目標主機埠的開放情況,從而分析並對一些重要埠實施攻擊。

埠掃瞄的方式有兩種,一種稱為完整掃瞄,一次連線過程如下圖所示:

圖1 完整掃瞄連線過程示意圖

另一種掃瞄方式稱為半開掃瞄,出於欺騙的目的,半開掃瞄在收到服務端的應答訊號(syn+ack)後,不再傳送響應訊號(ack)。一次連線過程如下圖所示:

圖2 半開掃瞄連線過程示意圖

1、字串處理

實驗要求的輸入格式是:scan  *.*.*.*   nnnn-mmmm,但考慮到使用及程式複雜性,所以微微調整輸入目的主機及埠號範圍的表達方式,詳細見實驗結果截圖。

2、設計主程式

(1)winsock程式設計框架;

(2)輸入目的ip位址以及埠範圍;

(3)設定獲取的使用者輸入ip位址為遠端ip位址;

(4)從開始埠到結束埠依次掃瞄,每掃瞄乙個埠建立乙個新的套接字;

(5)設定遠端位址資訊中的埠號為需要掃瞄的當前埠號;

(6)連線到當前埠號的目的位址;

(7)若連線成功( connect()函式返回0 )則輸出該埠為開啟狀態,否則輸出該埠為關閉狀態;

(8)關閉當前套接字。

(一)實驗結果

1、cmd命令(netstat –a -n)檢視本地埠開放情況

圖3 本地部分埠開放情況截圖

2、測試(測試結果可對比圖3檢視是否正確)

測試情況1:僅在初始化時候建立套接字

圖4 情況1(錯誤的結果)測試結果截圖1

圖5 情況1(錯誤的結果)測試結果截圖2

由圖4和圖5可看出,僅在初始化的時候建立乙個套接字,這種情況是錯誤的。 

測試情況2:每掃瞄乙個埠重新建立乙個新的套接字

圖6 情況2測試結果截圖1

圖7 情況2(正確的結果)測試結果截圖2

由圖4和圖5 看出每掃瞄乙個埠必須建立乙個新的套接字的情況下,結果才會正確。

(二)測試結果總結分析

每次掃瞄埠都要使用新的套接字,上次掃瞄的套接字在使用完之後應該關閉,避免套接字與埠保持連線而致使埠被占用,無法掃瞄其他埠。

1、闡述全連線掃瞄的原理。

全連線掃瞄是tcp埠掃瞄的基礎,現有的全連線掃瞄有tcp connect()掃瞄和tcp反向ident掃瞄等。其中tcp connect()掃瞄的實現原理如下所述:掃瞄主機通過tcp/ip協議的三次握手與目標主機的指定埠建立一次完整的連線。連線由系統呼叫connect開始。如果埠開放,則連線將建立成功;否則,若返回-1則表示埠關閉。

建立連線成功:響應掃瞄主機的syn/ack連線請求,這一響應表明目標埠處於監聽(開啟)的狀態。如果目標埠處於關閉狀態,則目標主機會向掃瞄主機傳送rst的響應。

2、你的程式是否考慮了掃瞄效率?如沒有考慮你準備如何改進?

我的程式使用的全連線掃瞄,沒有考慮掃瞄效率。考慮從以下兩方面改進:

(1)使用半連線掃瞄,若埠掃瞄沒有完成乙個完整的tcp連線,在掃瞄主機和目標主機的一指定埠建立連線時候只完成了前兩次握手,在第三步時,掃瞄主機中斷了        本次連線,使連線沒有完全建立起來,這樣的埠掃瞄稱為半連線掃瞄,也稱為間接掃瞄。使用這種連線的優點在於即使日誌中對掃瞄有所記錄,但是嘗試進行連線的記錄也要比全掃瞄少得多,從而提高了掃瞄效率。

(2)建立多個執行緒同時掃瞄,加快速度。

3、 主程式設計思路

(1)winsock程式設計框架;

(2)輸入目的ip位址以及埠範圍;

(3)設定獲取的使用者輸入ip位址為遠端ip位址;

(4)從開始埠到結束埠依次掃瞄,每掃瞄乙個埠建立乙個新的套接字;

(5)設定遠端位址資訊中的埠號為需要掃瞄的當前埠號;

(6)連線到當前埠號的目的位址;

(7)若連線成功( connect()函式返回0 )則輸出該埠為開啟狀態,否則輸出該埠為關閉狀態;

(8)關閉當前套接字。

4、 connect()函式的使用

connect()函式用於建立到socket的連線,該socket必須處於監聽狀態。本次實驗掃瞄埠是否開放的原理是模擬tcp建立連線的過程,用connect()函式依次連線目的主機埠,若函式呼叫成功,即connect()函式返回0,則表示該埠處於監聽狀態,為開放的埠,否則該埠處於關閉狀態。

本實驗最主要是使用函式connect()函式,用該函式去建立連線,如果連線成功,說明該埠處於開啟狀態,如果沒有連線成功說明埠處於關閉狀態。每次掃瞄埠都要使用新的套接字,上次掃瞄的套接字在使用完之後應該關閉,避免套接字與埠保持連線而致使埠被占用,無法掃瞄其他埠。

#include "stdafx.h"

#include #include#include#includeusing namespace std;

#pragma comment(lib,"wsock32.lib")

int _tmain(int argc, _tchar* argv)

// 填寫遠端位址資訊

sockaddr_in addr;

addr.sin_family = af_inet;

while (true)

//設定遠端位址資訊中的埠號為需要掃瞄的當前埠號

addr.sin_port = htons(i);

int ret = connect(s, (lpsockaddr)&addr, sizeof(addr));

if (ret ==0)

else

::closesocket(s);

} cout << endl;

} if (wsacleanup() == socket_error)

cout << "wsacleanup 出錯!" << endl;

return 0;

}

埠掃瞄原理

埠掃瞄原理分類 1 全tcp連線 這種掃瞄方法使用三次握手,與目標計算機建立標準的tcp連線。但是這種掃瞄方式很容易被目標主機記錄,不推薦使用。2 半開啟式掃瞄 syn掃瞄 在這種掃瞄技術中,掃瞄主機自動向目標計算機的指定埠傳送syn資料段,表示傳送建立連線請求。a,如果目標計算機的回應tcp報文中...

埠掃瞄詳解

tcpconnect掃瞄 tcp全連線掃瞄。使用系統提供的connect 函式來連線目標埠,如果目標埠正在監聽這個埠,那麼connect 函式將會被成功返回,否則,說明改埠不可訪問。通過完整的tcp三次握手 也即一次tcp連線 來判斷目標埠的狀態 tcpsyn掃瞄 半開啟掃瞄。首先客戶端向要掃瞄的埠...

埠掃瞄技術

目前主要的埠掃瞄技術有以下幾種 1 tcp connect scan tcp連線掃瞄 這種方法也稱之為 tcp全連線掃瞄 它是最簡單的一種掃瞄技術,所利用的是tcp協議的3次握手過程。它直接連到目標埠並完成乙個完整的3次握手過 程 syn syn ack和ack 作業系統提供的 connect 函式...