網路資料包嗅探



嗅探或網路資料包嗅探是指使用嗅探工具監控和捕獲透過給定網路的所有資料包的過程。這是一種我們可以“竊聽電話線”並瞭解對話的方式。它也稱為竊聽,可以應用於計算機網路。

如果企業交換機埠開啟,則其員工之一可能會嗅探整個網路流量,這種可能性非常大。任何在同一物理位置的人都可以使用乙太網電纜連線到網路或無線連線到該網路並嗅探全部流量。

換句話說,嗅探允許您檢視各種流量,包括受保護的和不受保護的流量。在適當的條件下並實施適當的協議,攻擊方可能會收集資訊,這些資訊可用於進一步攻擊或為網路或系統所有者造成其他問題。

可以嗅探什麼?

可以從網路中嗅探以下敏感資訊:

  • 電子郵件流量
  • FTP密碼
  • Web流量
  • Telnet密碼
  • 路由器配置
  • 聊天會話
  • DNS流量

嗅探是如何工作的?

嗅探器通常將系統的NIC切換到混雜模式,以便它監聽在其段上傳輸的所有資料。

混雜模式是指乙太網硬體(特別是網路介面卡 (NIC))的獨特方式,它允許NIC接收網路上的所有流量,即使這些流量並非發往此NIC。預設情況下,NIC會忽略所有未發往它的流量,這是透過將乙太網資料包的目標地址與其裝置的硬體地址 (MAC) 進行比較來實現的。雖然這對於網路來說非常有意義,但非混雜模式使得難以使用網路監控和分析軟體來診斷連線問題或進行流量統計。

嗅探器可以透過解碼資料包中封裝的資訊,持續監控透過NIC傳輸到計算機的所有流量。

嗅探型別

嗅探可以是主動的,也可以是被動的。我們現在將學習不同型別的嗅探。

被動嗅探

在被動嗅探中,流量被捕獲,但不會以任何方式被更改。被動嗅探只允許監聽。它與集線器裝置一起使用。在集線器裝置上,流量被髮送到所有埠。在使用集線器連線系統的網路中,網路上的所有主機都可以看到流量。因此,攻擊者可以輕鬆捕獲透過的流量。

好訊息是集線器近來已幾乎淘汰。大多數現代網路使用交換機。因此,被動嗅探不再有效。

主動嗅探

在主動嗅探中,流量不僅被捕獲和監控,而且還可能以攻擊所確定的某種方式被更改。主動嗅探用於嗅探基於交換機的網路。它涉及將地址解析協議 (ARP) 資料包注入目標網路,以氾濫交換機的內容定址記憶體 (CAM) 表。CAM 跟蹤哪個主機連線到哪個埠。

以下是主動嗅探技術:

  • MAC泛洪
  • DHCP攻擊
  • DNS欺騙
  • 欺騙攻擊
  • ARP欺騙

嗅探對協議的影響

諸如久經考驗的TCP/IP之類的協議在設計時並未考慮安全性。此類協議對潛在入侵者幾乎沒有抵抗力。以下是易於嗅探的不同協議:

HTTP

它用於以明文形式傳送資訊,沒有任何加密,因此是一個真正的目標。

SMTP(簡單郵件傳輸協議)

SMTP用於傳輸電子郵件。該協議高效,但不包含任何防嗅探保護。

NNTP(網路新聞傳輸協議)

它用於所有型別的通訊。其主要缺點是資料甚至密碼都以明文形式透過網路傳送。

POP(郵局協議)

POP嚴格用於從伺服器接收電子郵件。該協議不包含防嗅探保護,因為它可以被攔截。

FTP(檔案傳輸協議)

FTP用於傳送和接收檔案,但它不提供任何安全功能。所有資料都以明文形式傳送,很容易被嗅探。

IMAP(網際網路訊息訪問協議)

IMAP的功能與SMTP相同,但它極易受到嗅探。

Telnet

Telnet 將所有內容(使用者名稱、密碼、擊鍵)以明文形式透過網路傳送,因此很容易被嗅探。

嗅探器並非只能檢視即時流量的簡單實用程式。如果您真的想分析每個資料包,請儲存捕獲的內容並在有時間時檢視。

使用 Python 實現

在實現原始套接字嗅探器之前,讓我們瞭解如下所述的struct方法:

struct.pack(fmt, a1,a2,…)

顧名思義,此方法用於返回根據給定格式打包的字串。字串包含值 a1、a2 等。

struct.unpack(fmt, string)

顧名思義,此方法根據給定格式解包字串。

在以下原始套接字嗅探器 IP 報頭示例中,它是資料包中的接下來的 20 個位元組,在這 20 個位元組中,我們只關注最後 8 個位元組。後面的位元組顯示源 IP 地址和目標 IP 地址是否正在解析:

現在,我們需要匯入一些基本的模組,如下所示:

import socket
import struct
import binascii

現在,我們將建立一個套接字,它將具有三個引數。第一個引數告訴我們資料包介面——針對 Linux 的 PF_PACKET 和針對 Windows 的 AF_INET;第二個引數告訴我們它是一個原始套接字;第三個引數告訴我們我們感興趣的協議——0x0800 用於 IP 協議。

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))

現在,我們需要呼叫recvfrom()方法來接收資料包。

while True:
   packet = s.recvfrom(2048)

在下面的程式碼行中,我們正在剝離乙太網報頭:

ethernet_header = packet[0][0:14]

使用下面的程式碼行,我們使用struct方法解析和解包報頭:

eth_header = struct.unpack("!6s6s2s", ethernet_header)

下面的程式碼行將返回一個包含三個十六進位制值的元組,這些值由binascii模組中的hexify轉換:

print "Destination MAC:" + binascii.hexlify(eth_header[0]) + " Source MAC:" + binascii.hexlify(eth_header[1]) + " Type:" + binascii.hexlify(eth_header[2])

我們現在可以透過執行下面的程式碼行來獲取 IP 報頭:

ipheader = pkt[0][14:34]
ip_header = struct.unpack("!12s4s4s", ipheader)
print "Source IP:" + socket.inet_ntoa(ip_header[1]) + " Destination IP:" + socket.inet_ntoa(ip_header[2])

同樣,我們也可以解析 TCP 報頭。

廣告