返回文章列表

Scapy網路封包分析與安全防護技術

本文探討使用 Scapy 進行網路封包分析和安全防護的技術,涵蓋路由追蹤、pcap 檔案讀寫、DHCP 請求解析、封包嗅探等實用技巧。同時,文章也介紹瞭如何利用 OSINT 工具,如 Google Dorks、SpiderFoot、dnspython 和 DNSRecon,從公開伺服器收集資訊,並結合 Python

網路安全 Python

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_idserver_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)

內容解密:

此程式碼實作了以下功能:

  1. 使用sniff()函式捕捉指定介面上的封包
  2. 透過filter引數過濾TCP協定且連線埠為443或80的封包
  3. 使用自定義函式sniffPackets()處理捕捉到的封包
  4. 提取並列印封包的來源和目標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)

內容解密:

此程式碼實作了以下功能:

  1. 使用arpDisplay()函式處理ARP封包
  2. 區分ARP請求和回應,並列印相關資訊
  3. 使用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)

內容解密:

此程式碼實作了以下功能:

  1. 使用count_dns_request()函式處理DNS查詢封包
  2. 列印DNS查詢的摘要資訊和詳細資訊
  3. 使用sniff()函式捕捉UDP協定且連線埠為53的封包

安全防護建議

  1. 網路流量監控:定期使用Scapy監控網路流量,及時發現異常行為。
  2. ARP欺騙防護:實施ARP欺騙檢測機制,防止網路攻擊。
  3. DNS安全:加強DNS伺服器的安全組態,防止DNS劫持攻擊。
  4. 加密通訊:推廣使用加密協定(如HTTPS),保護敏感資料傳輸。

善用 OSINT 工具探勘伺服器資訊

在滲透測試或安全稽核過程中,從公開伺服器收集資訊至關重要。本章將探討如何利用開源情報(OSINT)工具,提取目標網域、主機名稱、網頁服務等關鍵資訊。我們將會運用 Google Dorks、SpiderFoot、dnspython、DNSRecon 等工具,並探討如何結合 Python 進行模糊測試。

開源情報(OSINT)基本概念

OSINT 指的是收集和分析公開可用的資訊,以產生可操作的情報。OSINT 的應用範圍廣泛,涵蓋金融、科技、警務、軍事和行銷等領域。在網路安全領域,OSINT 的應用包含:

  • 滲透測試的偵察階段: 發現組織中的主機,例如 Whois 資訊、子網域探索、DNS 資訊、查詢設定檔和密碼等。
  • 社交工程攻擊: 收集特定使用者在社群網路上的所有資訊。從防禦角度來看,瞭解惡意行為者可公開取得的資訊,有助於避免網路網路釣魚攻擊。
  • 預防網路攻擊: 取得資訊以提醒組織可能遭受的威脅。例如,公司可以使用 OSINT 技術來檢測其組織在基礎設施層面可能存在的漏洞或弱點,以及在社群網路上的曝光程度,以檢測可能被攻擊者利用的資訊。

OSINT 的流程通常遵循情報週期,包含以下階段:

  1. 需求: 確定決策者提出的所有需求。
  2. 資訊來源: 鑑於網際網路上的資訊量龐大,必須識別並指定最相關的來源,以最佳化取得流程。
  3. 取得流程: 取得資訊的階段。
  4. 處理和分析: 格式化、過濾、分類別已取得的資訊,並建立資料的優先順序。
  5. 情報: 以有效、有用與易於理解的方式呈現所取得的資訊,以便正確利用,回答所有初始問題,並協助決策者做出決策。

使用適當的工具將有助於調查工作。每個工具都專注於特定領域,結合使用這些工具將能為我們的調查收集大量資訊。

@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 和模糊測試。這些工具和技術在滲透測試和安全稽核過程中至關重要,可以幫助我們收集關鍵資訊,以便更好地瞭解目標系統並發現潛在的漏洞。