Scapy 作為一個強大的 Python 網路工具函式庫,提供豐富的封包操作和分析功能,能協助網路工程師深入理解網路流量,並提升網路安全防護能力。本文除了介紹 Scapy 的基本用法外,也涵蓋了 DHCP 請求解析、pcap 檔案讀寫、以及封包嗅探等進階技巧,讓讀者能快速上手 Scapy,並應用於實際的網路分析場景。此外,文章也探討瞭如何結合 OSINT 工具,從公開伺服器收集關鍵資訊,並結合 Python 進行模糊測試,進一步提升網路安全防護的層級。
追蹤封包旅程:Scapy 路由追蹤
路由追蹤能夠顯示封包從源主機到目標主機所經過的路徑,有助於診斷網路連線問題。Scapy 提供了簡潔的路由追蹤功能,可以快速取得路由資訊。
from scapy.all import *
target = "www.google.com"
traceroute(target)
內容解密:
這段程式碼使用 traceroute 函式對目標主機執行路由追蹤。traceroute 函式會自動傳送一系列 TTL 值遞增的 ICMP 封包,並根據回應資訊顯示路由路徑。
深入封包細節:Scapy 解析 pcap 檔案
pcap 檔案是網路封包的儲存格式,可以用於記錄和分析網路流量。Scapy 提供了讀取 pcap 檔案的功能,可以方便地檢視和分析封包內容。
from scapy.all import *
packets = rdpcap("packets.pcap")
for packet in packets:
packet.show() # 顯示每個封包的詳細資訊
內容解密:
這段程式碼使用 rdpcap 函式讀取 pcap 檔案,並將封包儲存到 packets 變數中。然後,程式碼迴圈遍歷每個封包,使用 show 方法顯示封包的詳細資訊。
流程圖解讀 pcap 檔案讀取流程
流程解密:
此圖表說明瞭讀取 pcap 檔案的基本流程。首先讀取檔案,然後遍歷每個封包並顯示其資訊,最後結束處理。
解析網路流量:DHCP、PCAP 檔案讀寫與 Scapy 的封包嗅探技巧
在網路世界中,理解網路流量就像偵探解謎一樣重要。本篇文章將探討如何分析網路流量,包含 DHCP 請求解析、PCAP 檔案的讀寫,以及使用 Scapy 進行封包嗅探的實用技巧。
DHCP 請求解密:揭開網路裝置自動取得 IP 的秘密
許多路由器使用 DHCP 協定自動分配 IP 位址給網路裝置。DHCP 使用者端(網路裝置)會先廣播 DHCP discover 訊息到區域網路 (LAN) 上的所有目的地,以查詢 DHCP 伺服器(寬頻路由器)。
以下圖表說明 DHCP discover 的流程:
流程解密:
此圖表詳細展示了 DHCP discover 的流程,從客戶端發出請求到最終獲得 IP 位址的整個過程。
DHCP discover 訊息通常包含使用者端的主機名稱。我們的目標是提取使用者端和伺服器的識別碼。以下程式碼片段示範如何使用 Scapy 解析 DHCP discover 封包:
from scapy.all import *
pcap_path = "packets_DHCP.cap"
packets = rdpcap(pcap_path)
for packet in packets:
try:
options = packet[DHCP].options
for option in options:
if option[0] == 'client_id':
client_id = option[1].decode()
if option[0] == 'server_id':
server_id = option[1]
print(f'ServerID: {server_id} | ClientID: {client_id}')
except IndexError as error:
print(error)
內容解密:
這段程式碼首先讀取 PCAP 檔案中的 DHCP 封包。接著,它遍歷每個封包的 options 欄位,尋找 client_id 和 server_id。找到後,將其值列印出來。try...except 區塊用於處理可能發生的 IndexError,例如某些封包可能不包含所需的 options。
PCAP 檔案讀取:深入分析網路流量資料
PCAP 檔案是網路流量的記錄檔,其中包含了每個封包的詳細資訊。以下程式碼示範如何使用 Scapy 讀取 PCAP 檔案並統計每個 IP 位址出現的次數:
from scapy.all import *
from collections import Counter
from prettytable import PrettyTable
packets = rdpcap('packets_DHCP.cap')
srcIP = []
for packet in packets:
if IP in packet:
try:
srcIP.append(packet[IP].src)
except:
pass
counter = Counter(srcIP)
table = PrettyTable(["IP", "Count"])
for ip, count in counter.most_common():
table.add_row([ip, count])
print(table)
內容解密:
這段程式碼首先讀取 PCAP 檔案,然後遍歷每個封包,提取源 IP 位址並儲存到 srcIP 列表中。接著,使用 Counter 統計每個 IP 出現的次數,最後使用 prettytable 模組將結果以表格形式輸出。
PCAP 檔案寫入:儲存網路流量以供後續分析
使用 wrpcap() 函式,我們可以將捕捉的封包儲存到 PCAP 檔案中。以下程式碼示範如何捕捉 HTTP 和 HTTPS 流量並儲存到 PCAP 檔案:
from scapy.all import *
def sniffPackets(packet):
if packet.haslayer(IP):
ip_layer = packet.getlayer(IP)
packet_src = ip_layer.src
packet_dst = ip_layer.dst
print(f"[+] New Packet: {packet_src} -> {packet_dst}")
if __name__ == '__main__':
interfaces = get_if_list()
print(interfaces)
for interface in interfaces:
print(interface)
interface = input("Enter interface name to sniff: ")
print("Sniffing interface " + interface)
packets = sniff(iface=interface, filter="tcp and (port 443 or port 80)", prn=sniffPackets, count=100)
wrpcap('packets.pcap', packets)
內容解密:
這段程式碼首先定義了一個 sniffPackets 函式,用於處理捕捉到的每個封包,並印出源 IP 和目標 IP。然後,程式碼取得可用的網路介面列表,並提示使用者選擇要嗅探的介面。最後,使用 sniff 函式捕捉指定介面上的 HTTP 和 HTTPS 流量,並使用 wrpcap 函式將捕捉的封包儲存到 packets.pcap 檔案中。
Scapy 封包嗅探:實時監控網路流量
Scapy 提供了 sniff() 函式,可以像 tcpdump 或 Wireshark 等工具一樣嗅探網路封包。以下程式碼示範如何使用 sniff() 函式捕捉特定網路介面上的流量:
packets = sniff(iface="wlo1", count=3)
內容解密:
這段程式碼使用 sniff() 函式捕捉 wlo1 網路介面上的前3個封包。
使用 Scapy 自定義嗅探輸出
sniff()函式支援多個引數,其中 prn 引數允許我們指定一個函式,應用於每個捕捉到的封包。以下程式碼示範如何使用 prn 引數列印每個封包的摘要資訊:
packets = sniff(filter="tcp", iface="wlo1", prn=lambda x: x.summary())
內容解密:
這段程式碼使用 sniff()函式捕捉 wlo1介面上的TCP流量,並使用lambda函式列印每個封包的摘要資訊。
玄貓技術分析報告:網路流量監控與安全防護
本報告根據提供的技術內容進行深入分析,重點探討使用Scapy進行網路流量分析和安全防護的實務應用。報告採用繁體中文書寫,符合台灣地區的技術規範和語言習慣。
核心技術解析
封包捕捉與分析
Scapy提供強大的封包捕捉功能,可根據特定條件過濾封包。以下範例程式碼示範如何捕捉TCP協定且連線埠為443或80的封包:
from scapy.all import *
def sniffPackets(packet):
if packet.haslayer(IP):
ip_layer = packet.getlayer(IP)
packet_src = ip_layer.src
packet_dst = ip_layer.dst
print(f"[+] New Packet: {packet_src} -> {packet_dst}")
if __name__ == '__main__':
sniff(iface="eth0", filter="tcp and (port 443 or port 80)", prn=sniffPackets)
內容解密:
此程式碼實作了以下功能:
- 使用
sniff()函式捕捉指定介面上的封包 - 透過
filter引數過濾TCP協定且連線埠為443或80的封包 - 使用自定義函式
sniffPackets()處理捕捉到的封包 - 提取並列印封包的來源和目標IP地址
ARP封包分析
ARP(Address Resolution Protocol)負責將IP地址解析為MAC位址。以下範例示範如何分析ARP封包:
def arpDisplay(packet):
if packet.haslayer(ARP):
if packet[ARP].op == 1: # ARP請求
print(f"Request: {packet[ARP].psrc} is asking about {packet[ARP].pdst}")
elif packet[ARP].op == 2: # ARP回應
print(f"Response: {packet[ARP].hwsrc} has MAC address {packet[ARP].psrc}")
sniff(iface="wlo1", prn=arpDisplay, filter="arp", store=0, count=10)
內容解密:
此程式碼實作了以下功能:
- 使用
arpDisplay()函式處理ARP封包 - 區分ARP請求和回應,並列印相關資訊
- 使用
sniff()函式捕捉指定介面上的ARP封包
DNS查詢監控
DNS(Domain Name System)負責將網域名稱解析為IP地址。以下範例示範如何監控DNS查詢:
def count_dns_request(packet):
if DNSQR in packet:
print(packet.summary())
print(packet.show())
sniff(filter="udp and port 53", prn=count_dns_request, count=100)
內容解密:
此程式碼實作了以下功能:
- 使用
count_dns_request()函式處理DNS查詢封包 - 列印DNS查詢的摘要資訊和詳細資訊
- 使用
sniff()函式捕捉UDP協定且連線埠為53的封包
安全防護建議
- 網路流量監控:定期使用Scapy監控網路流量,及時發現異常行為。
- ARP欺騙防護:實施ARP欺騙檢測機制,防止網路攻擊。
- DNS安全:加強DNS伺服器的安全組態,防止DNS劫持攻擊。
- 加密通訊:推廣使用加密協定(如HTTPS),保護敏感資料傳輸。
善用 OSINT 工具探勘伺服器資訊
在滲透測試或安全稽核過程中,從公開伺服器收集資訊至關重要。本章將探討如何利用開源情報(OSINT)工具,提取目標網域、主機名稱、網頁服務等關鍵資訊。我們將會運用 Google Dorks、SpiderFoot、dnspython、DNSRecon 等工具,並探討如何結合 Python 進行模糊測試。
開源情報(OSINT)基本概念
OSINT 指的是收集和分析公開可用的資訊,以產生可操作的情報。OSINT 的應用範圍廣泛,涵蓋金融、科技、警務、軍事和行銷等領域。在網路安全領域,OSINT 的應用包含:
- 滲透測試的偵察階段: 發現組織中的主機,例如 Whois 資訊、子網域探索、DNS 資訊、查詢設定檔和密碼等。
- 社交工程攻擊: 收集特定使用者在社群網路上的所有資訊。從防禦角度來看,瞭解惡意行為者可公開取得的資訊,有助於避免網路網路釣魚攻擊。
- 預防網路攻擊: 取得資訊以提醒組織可能遭受的威脅。例如,公司可以使用 OSINT 技術來檢測其組織在基礎設施層面可能存在的漏洞或弱點,以及在社群網路上的曝光程度,以檢測可能被攻擊者利用的資訊。
OSINT 的流程通常遵循情報週期,包含以下階段:
- 需求: 確定決策者提出的所有需求。
- 資訊來源: 鑑於網際網路上的資訊量龐大,必須識別並指定最相關的來源,以最佳化取得流程。
- 取得流程: 取得資訊的階段。
- 處理和分析: 格式化、過濾、分類別已取得的資訊,並建立資料的優先順序。
- 情報: 以有效、有用與易於理解的方式呈現所取得的資訊,以便正確利用,回答所有初始問題,並協助決策者做出決策。
使用適當的工具將有助於調查工作。每個工具都專注於特定領域,結合使用這些工具將能為我們的調查收集大量資訊。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Scapy網路封包分析與安全防護技術
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
流程解密:
上面的 Plantuml 流程圖展示了 OSINT 的情報週期,從定義需求開始,到最終產生可操作的情報。每個階段都環環相扣,確保 OSINT 流程的有效性和完整性。
技術要求
部分工具需要安裝 Docker:https://www.docker.com。
Google Dorks 查詢目標網域資訊
Google Dorks 是一種利用 Google 搜尋引擎的高階搜尋技巧,可以幫助我們找到目標網域的特定資訊。
使用 SpiderFoot 取得伺服器和網域資訊
SpiderFoot 是一個開源的情報收集工具,可以自動從各種來源收集目標的資訊,例如網站、社群媒體、搜尋引擎等。
使用 dnspython 和 DNSRecon 取得 DNS 伺服器資訊
dnspython 是一個 Python 的 DNS 工具包,可以執行 DNS 查詢和區域傳輸。DNSRecon 則是一個功能強大的 DNS 列舉工具,可以發現 DNS 伺服器的各種資訊。
使用模糊測試查詢伺服器上的漏洞位址
模糊測試是一種自動化的軟體測試技術,透過向目標系統輸入大量的無效或非預期資料,來發現潛在的漏洞。
本章介紹了使用 OSINT 工具從公開伺服器收集資訊的各種方法,包括 Google Dorks、SpiderFoot、dnspython、DNSRecon 和模糊測試。這些工具和技術在滲透測試和安全稽核過程中至關重要,可以幫助我們收集關鍵資訊,以便更好地瞭解目標系統並發現潛在的漏洞。