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 的半链接扫描,更隐密,更不容易被发现。