Scapy概述
Scapy 是一個可以讓用戶發送、偵聽和解析並偽裝網絡報文的 Python 程序。這些功能可以用於制作偵測、掃描和攻擊網絡的工具。
預配置
如果在kali的終端使用scapy命令出現INFO
提示找不到PyX,則需要安裝:
apt install python3-pyx
定制ARP包
ARP包的格式
>>> ARP().display()
###[ ARP ]###
hwtype= 0x1 #硬件類型
ptype= IPv4 #協議類型
hwlen= None #硬件地址長度 MAC長度
plen= None #協議地址長度
op= who-has #who-has查詢
hwsrc= 00:0c:29:f6:26:6a # 源MAC
psrc= 192.168.3.53 # 源IP地址
hwdst= 00:00:00:00:00:00 # 目的MAC
pdst= 0.0.0.0 # 目的IP地址
>>>
sr1 函數作用:sr1 函數包含了發送數據包和接收數據包的功能。
>>> sr1(ARP(pdst="192.168.3.1"))
Begin emission:
Finished sending 1 packets.
*
Received 1 packets, got 1 answers, remaining 0 packets
<ARP hwtype=0x1 ptype=IPv4 hwlen=6 plen=4 op=is-at hwsrc=c4:2b:44:48:a3:99 psrc=192.168.3.1 hwdst=00:0c:29:f6:26:6a pdst=192.168.3.53 |<Padding load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>
>>> exit
可見ARP包發送成功並收到來自src=192.168.3.1的應答包。(大家根據自己本地存在的主機IP靈活改變pdst哈)
定制PING包
首先啟動scapy,獲取IP包和ICMP包的格式。
IP().display()
###[ IP ]###
version= 4 版本:4,即 IPv4
ihl= None 首部長度
tos= 0x0 服務
len= None 總長度
id= 1 標識
flags=
frag= 0 標志
ttl= 64 生存時間
proto= hopopt 傳輸控制協議 IPv6 逐跳選項
chksum= None 首部校驗和
src= 127.0.0.1 源地址
dst= 127.0.0.1 目的地址
ICMP().display()
###[ ICMP ]###
type= echo-request 類型,標識 ICMP 報文的類型
code= 0 代碼
chksum= None 校驗和
id= 0x0 標識
seq= 0x0
通過PING()來指定源IP和目的IP
通過ICMP()來指定為PING包的類型。
思路:
1、修改 IP 包頭的 dst,也就是我們的目的地址
2、拼接上 ICMP 的數據包類型
3、使用 sr1()進行發送數據包並接收數據包
>>> sr1(IP(dst="192.168.3.1")/ICMP(),timeout=1)
Begin emission:
Finished sending 1 packets.
.*
Received 2 packets, got 1 answers, remaining 0 packets
<IP version=4 ihl=5 tos=0x0 len=28 id=8377 flags= frag=0 ttl=64 proto=icmp chksum=0xd2a1 src=192.168.3.1 dst=192.168.3.53 |<ICMP type=echo-reply code=0 chksum=0xffff id=0x0 seq=0x0 |<Padding load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>>
>>>
定制TCP-SYN請求
首先查看TCP包格式。
>>> TCP().display()
###[ TCP ]###
sport= ftp_data TCP 源端口
dport= http TCP 目的端口
seq= 0 32 位序號
ack= 0 32 位確認序號
dataofs= None 4 位首部長度
reserved= 0 保留 6 位
flags= S 標志域,緊急標志、有意義的應答標志、推、重置連接標志、同步序列號標志、完成發送數據標志。
# 按照順序排列是:URG、ACK、PSH、RST、SYN、FIN
window= 8192 窗口大小
chksum= None 16 位校驗和
urgptr= 0 優先指針
options= [] 選項
>>> sr1(IP(dst="192.168.3.1")/TCP(flags="S",dport=80),timeout=1)
Begin emission:
Finished sending 1 packets.
.*
Received 2 packets, got 1 answers, remaining 0 packets
<IP version=4 ihl=5 tos=0x0 len=44 id=0 flags=DF frag=0 ttl=64 proto=tcp chksum=0xb345 src=192.168.3.1 dst=192.168.3.53 |<TCP sport=http dport=ftp_data seq=601526135 ack=1 dataofs=6 reserved=0 flags=SA window=29200 chksum=0xeac8 urgptr=0 options=[('MSS', 1460)] |<Padding load='\x00\x00' |>>>
>>>
flags=”S”表示 SYN 數據包
dport=80 表示目標端口 80
我們的到一個 flags=SA 的數據包。SA 標志即 SYN+ACK。我們收到服務器 tcp 三次握手中的第二個包,能收到回應,表示端口開放。
注:這種基於 tcp 的半鏈接掃描,更隱密,更不容易被發現。