基於Linux環境下的Sniffer設計與實現

2021-04-01 00:08:40 字數 4132 閱讀 6294

一、sniffer原理分析

在實現嗅探器之前,我們先需要掌握tcp/ip協議。tcp協議和ip協議指兩個用在inter***上的網路協議(或資料傳輸的方法)。它們分別是傳輸控制協議和互連網協議。這兩個協議屬於眾多的tcp/ip 協議組中的一部分。

tcp/ip協議組中的協議保證inter***上資料的傳輸,提供了幾乎現在上網所用到的所有服務。這些服務包括:電子郵件的傳輸、檔案傳輸、新聞組的發布和訪問全球資訊網。

tcp協議在ip協議之上。與ip協議提供不可靠傳輸服務不同的是,tcp協議為其上的應用層提供了一種可靠傳輸服務。這種服務的特點是:可靠、全雙工、流式和無結構傳輸。tcp傳輸原理:

tcp協議使 用了乙個叫積極確認和重傳送(positive acknowledgement with retran**ission)的技術來實現可靠傳輸。接收者在收到傳送者傳送的資料後,必須傳送乙個相應的確認(ack)訊息,表示它已經收到了資料。 傳送者儲存傳送的資料的記錄,在傳送下乙個資料之前,等待這個資料的確認訊息。在它傳送這個資料的同時,還啟動了乙個記時器。如果在一定時間之內,沒有接 收到確認訊息,就認為是這個資料在傳送時丟失了,接著,就會重新傳送這個資料。

這種方法還產生了乙個問題,就是包的重複。如果網路傳 輸速度比較低,等到等待時間結束後,確認訊息才返回到傳送者,那麼,由於傳送者採用的傳送方法,就會出現重複的資料了。解決的乙個辦法是給每個資料乙個序 列號,並需要傳送者記住哪個序列號的資料已經確認了。為了防止由於延時或重複確認,規定確認訊息裡也要包含確認序列號。從而傳送者就能知道哪個包已經確認 了.

有 前面的描述可見,傳送者在傳送完乙個資料報之後,要等待確認。在它收到確認訊息之前的這段時間是空閒的。如果網路延時比較長,這個問題會相當明顯。滑動窗 口方法是在它收到確認訊息以前,傳送多個資料報。可以想象成有乙個視窗在乙個序列上移動。如果乙個包傳送出去之後還沒有確認,叫做未確認包。通常未確認的 包的個數就是視窗的大小。在接收端,也有乙個滑動視窗接收和確認乙個包。

使用tcp傳輸就是建立乙個連線。在tcp傳輸中乙個連線有 兩個端點組成。其實,乙個連線代表的是傳送和接收兩端應用程式的之間的乙個通訊。可以把他們想象成建立了乙個電路。通常乙個連線用下面的公式表示: (host,port),host是主機,port是埠。tcp埠能被幾個應用程式共享。對於程式設計師來講,可以這樣理解:乙個應用程式可以為不同的連 接提供服務。tcp傳輸的單位是段,在建立連線,傳送資料,確認訊息和告之視窗大小時均要進行段的交換。

tcp協議使 用乙個三次握手來建立乙個tcp連線的。握手過程的第乙個段的**位設定為syn,序列號為x,表示開始一次握手。接收方收到這個段後,向傳送者回發乙個 段。**位設定為syn和ack,序列號設定為y,確認序列號設定為x+1。傳送者在受到這個段後,知道就可以進行tcp資料傳送了,於是,它又向接收者 傳送乙個ack段,表示,雙方的連線已經建立。在完成握手之後,就開始正式的資料傳輸了。上面握手段中的序列號都是隨機產生的。

了解了tcp/ip協議後, 還要掌握網路程式設計。在linux網路程式設計中,我們可以認為套接字是將unix系統的檔案操作推廣到提供點對點的通訊。如果要操作檔案,應用程式會根據應用 程式的需要為之建立乙個套接字。作業系統返回乙個整數。應用程式通過引用這個正數來使用這個套接字。檔案描述符和套接字描述符的不同點在於,在程式呼叫 open()時,作業系統將乙個檔案描述符繫結到乙個檔案或裝置,但在建立乙個套接字時,可以不將它繫結到乙個目標位址。程式可以在任何想要用這個套接字 的時候指定目標位址。在點對點的通訊程式中,我們將請求服務或資料的程式叫做客戶端程式,提供資料或服務的軟體叫做伺服器程式。下面解釋一下乙個基本的套 接字系統呼叫函式,也是該嗅探器中要用到的函式:

socket()

#include < sys/types.h>

#include < sys/socket.h>

int socket(int family, int type, int protocol);

int family引數指定所要使用的通訊協議,取以下幾個值:

af_unix unix內部協議

af_i*** inter***協議

af_ns xerox ns協議

af_implink imp 連線層

int type 指定套接字的型別,取以下幾個值 :

sock_stream 流套接字

sock_dgram 資料報套接字

sock_raw 未加工套接字

sock_seqpacket 順序包套接字

int protocol 引數通常設定為0。

socket()系統呼叫返回乙個整數值,叫做套接字描述字sockfd,它的原理與檔案描述符一樣。網路i/o的第一步通常就是呼叫這個函式。

二、sniffer具體實現

現在具體介紹一下該嗅探器的實現。該嗅探器是在red hat linux6.2版本中,用c語言編寫的,以除錯並編譯通過。

sniffer是一種常用的收集有用資料方法,這些資料可以是使用者的帳號和密碼,可以是一些商用機密資料等等。sniffer是一種常用的收集有用資料的方法,這些資料可以是使用者的帳號和密碼,可以是一些商用機密資料等等。

以 太網sniffing 是指對乙太網裝置上傳送的資料報進行偵聽,發現感興趣的包。如果發現符合條件的包,就把它存到乙個log檔案中去。通常設定的這些條件是包含字 "username"或"password"的包。它的目的是將網路層放到promiscuous模式,從而能幹些事情。promiscuous模式是指 網路上的所有裝置都對匯流排上傳送的資料進行偵聽,並不僅僅是它們自己的資料。根據乙太網的工作原理,可以知道:乙個裝置要向某一目標傳送資料時,它是對以 太網進行廣播的。乙個連到乙太網匯流排上的裝置在任何時間裡都在接受資料。不過只是將屬於自己的資料傳給該計算機上的應用程式。利用這一點,可以將一台計算 機的網路連線設定為接受所有乙太網匯流排上的資料,從而實現sniffer。

sniffer通常執行在路由器,或有路由器功能的主機 上。這樣就能對大量的資料進行監控。sniffer屬第二層次的攻擊。通常是攻擊者已經進入了目標系統,然後使用sniffer這種攻擊手段,以便得到更 多的資訊。sniffer除了能得到口令或使用者名稱外,還能得到更多的其他資訊,比如乙個其他重要的資訊,在網上傳送的金融資訊等等。sniffer幾乎能 得到任何乙太網上的傳送的資料報。通常sniffer程式只看乙個資料報的前200-300個位元組的資料,就能發現想口令和使用者名稱這樣的資訊。

下面對該程式的實現作乙個介紹。結構etherpacket定義了乙個資料報。其中的ethhdr,iphdr,和tcphdr分別是三個結構,用來定義乙太網幀,ip資料報頭和tcp資料報頭的格式。

它們在標頭檔案中的定義如下:

struct ethhdr ;

struct iphdr ;

struct tcphdr ;

接下來,定義了乙個結構變數victim。隨後,看一下函式int openintf(char *d),它的作用是開啟乙個網路介面。在main中是將eth0作為引數來呼叫這個函式。在這個函式中,用到了下面的結構:

struct ifreq

ifr_ifrn;

union

ifr_ifru; };

這個結構叫介面請求結構,用來呼叫在i/o輸入輸出時使用。所有的介面i/o輸出必須有乙個引數,這個引數以ifr_name開頭,後面的引數根據使用不同的網路介面而不同。

如 果你要看看你的計算機有哪些網路介面,使用命令ifconfig即可。一般會看到兩個介面lo0和eth0。在ifreq結構中的各個域的含義與 ifconfig的輸出是一一對應的。在這裡,程式將eth0作為ifr_name來使用的。接著,該函式將這個網路介面設定成promiscuous模 式。請記住,sniffer是工作在這種模式下的。

再看一下函式read_tcp,它的作用是讀取tcp資料報,傳給filter處 理。filter函式是對上述讀取的資料報進行處理。接下來的程式是將資料輸出到檔案中去。函式clearup是在程式退出等事件時,在檔案中作個記錄, 並關閉檔案。否則,你剛才做的記錄都沒了。

三、執行結果及結論

執行這個程式的結果,計算機是 處於乙個由三十臺以上主機組成的區域網環境中,這個區域網中的所有主機通過**閘道器可以上inter***。經測試,在晚上上網高峰期,可以在幾分鐘之內 探測到5以上個不同ip位址的郵箱使用者名稱及密碼,當然,還可以探測到別的資訊,如使用者用web瀏覽器瀏覽的網頁內容、tel***登入名及密碼等有用信 息。預計如果該程式執行於閘道器,會擷取更多的資訊。

Ubuntu環境下基於Linux進行DOL配置

進入ubuntu下,開啟終端,依次輸入以下指令 sudo apt get update sudo apt get install ant sudo apt get install openjdk 7 jdk sudo apt get install unzip 安裝及更新有時會比較慢,主要是由於網速...

基於Linux系統環境下安裝Redis

簡述,本文安裝的是 redis 6.0.9 1.準備工作 1 linux系統,如需在本地安 vmware 裝虛擬機器部署基於centos7 的 linux 系統,下面連線 2.開始安裝 1 首先 cd 進入安裝包所在目錄 2 解壓安裝包 tar zxvf 安裝包名稱 例如 我的安裝包是 redis ...

基於Linux系統環境下安裝Nginx

1.準備工作wget http nginx.org download nginx 1.18.0.tar.gz2.安裝過程 1 安裝相關依賴 yum y install gcc zlib zlib devel pcre devel openssl openssl devel 2 解壓nginx安裝包 ...