0x00 前言
最近閑的沒事,抽空了解下地表最強的嗅探和收發包的工具:scapy。scapy是一個python模塊,使用簡單,並且能靈活地構造各種數據包,是進行網絡安全審計的好幫手。
0x01 安裝
因為2020年python官方便不再支持python2,所以使用python3安裝。
0x02 構造數據包
在構造數據包之前首先導入scapy模塊: from scapy.all import *
scapy構造數據包也非常簡單,例如使用 IP() 就可以創建一個默認的數據包。使用 ls(IP()) 可以查看IP數據包可以有哪些參數。
其他數據包同理
使用IP(dst="114.114.114.114") 來創建一個目的地址是 114.114.114.114 的數據包,再使用 ls() 可以看到數據包的目的地址已經修改。
也可以使用 show 方法來查看數據包信息。
使用summary()方法查看概要信息。
使用hexdump(pkt)開查看數據包的字節信息
使用 '/' 操作符來給數據包加上一層。例如構造一個TCP數據包,在IP層指明數據包的目的地址。在TCP層可以設定數據包的目的端口等等。UDP數據包同理。
數據包的目標端口可以用范圍來表示,發送的時候就會發送dport 不同的多個數據包。
如果設置了多個參數為范圍的,最后發送的數據包就是笛卡爾積。
0x03 發送數據包
發送數據包可能需要管理員權限,使用sudo python3 進入python即可。
構造完數據包,就可以發送了。
scapy發送數據包有常用的如下幾種方法:
send(pkt) 發送三層數據包,但不會受到返回的結果。
sr(pkt) 發送三層數據包,返回兩個結果,分別是接收到響應的數據包和未收到響應的數據包。
sr1(pkt) 發送三層數據包,僅僅返回接收到響應的數據包。
sendp(pkt) 發送二層數據包。
srp(pkt) 發送二層數據包,並等待響應。
srp1(pkt) 發送第二層數據包,並返回響應的數據包
例如,使用sr發送一個數據包,ans為響應的數據包,uans為未響應的數據包。
0x04 應用
1)可以構造數據包來實現一個簡單的SYN端口掃描,flags="S" 表示發送SYN數據包。
可以看到在發返回的數據包中,22,445,3389端口返回的flag位為SA,表示這些端口是開放的。而RA表示reset ack, 說明這些端口是關閉的。
2)實現一個基於TCP的traceroute
3) 模擬TCP的三次握手
最后可以看到握手成功后,服務器返回信息中包含了當前端口開放的服務
0x05 其他
scapy 還可以用來讀取網絡流量包或監聽網卡流量。
使用函數rdpcap("/abc/def/xxxx.pcap") 可以讀取包的內容,再使用haslayer(TCP)或haslayer(ICMP)等等來判斷數據包的類型。
使用sniff(iface="wlan1",count=100,filter="tcp xxxx") 可以監聽網卡流量,iface聲明監聽的網卡,filter是過濾條件,count是符合過濾條件的數據包的個數,達到指定的數據包個數后會停止監聽,不設count則沒有限制,按ctrl-c 結束監聽。
sniff也支持無線網卡的監聽模式。