Scapy库
解决三个问题:
-
监听流量(与wireshark相同)
-
分析流量
-
编辑流量数据包(链路层 网络层 传输层),应用层也可以编辑 意义不大
提供两种操作方式
-
基于命令进行交互
-
python代码调用
基于命令进行交互
1、sniff流量嗅探
# 显示所有的网卡
show_interfaces()
# count指定抓取包的个数 iface指定网卡 filter过滤条件 prn回调函数 sprimtf()函数控制输入信息
pkg = sniff(count=10,iface='xx')
pkg[0].show() # 详细信息
pkg[3][Raw].load # 查看字段信息
pkg[15].summary() # 查看标识信息
2、读写流量文件
# 写
wrpcap('./test.cap',pkg)
# 读
pkg = rdpacp('./test.cap')
3、发送数据包
# / 代表从左到右 一层一层的 最左边是最底层的
# 发送最基本的ICMP数据包
send(IP(dst='192.168.xx.xx')/ICMP())
# 发送带载荷的ICMP数据包(带有payload的标准ping)
pkg=send(IP(src='192.168.xx.xx',dst='192.168.xx.xx')/ICMP()/'JHHHHHHHHHHHHHHHHHHHHH')
# 发送五次相同的数据包 每次间隔1秒
send(pkg,inter=1,count=5)
# 发送数据包并接受响应
pkg = sr1(IP(dst='192.168.xx.xx')/ICMP()/'xxxxxxx')
# 可以使用 []. 的方式获取下面的属性
pkg[ICMP].type
# 发送ARP
pkg = sr1(ARP(psrc='192.168.xx.xx',pdst='192.168.xx.xx'),timeout=3)
pkg = ARP(psrc='192.168.10.22',pdst='192.168.10.1')
reply = sr1(pkg,timeout=3,verbose=False) # verbose不回显详细信息
# 半连接 TCP组包
pkg = IP(dst='192.168.xxx.xxx')/TCP(dport=80)
python代码调用
和命令行一样
from scapy.layers.l2 import ARP
from scapy.sendrecv import sr1
try:
pkg = ARP(psrc='192.168.10.22',pdst='192.168.10.1')
reply = sr1(pkg,timeout=3,verbose=False) # verbose不回显详细信息
print(reply[ARP].hwsrc)
except TypeError:
print(0)
模拟TCP请求
# scapy 模拟一次完整的三次握手:五元组--源ip 目的ip 源port 目的port 协议 S SA RA seq ack
ip = '192.168.10.231'
sport = random.randint(20000, 30000) # 源端口
seq = random.randint(10000, 20000) # 序列号
pkg_1 = IP(dst=ip) / TCP(sport=sport,dport=5555,flags='S',seq=seq)
reply_1 = sr1(pkg_1, timeout=3, verbose=False)
seq = reply_1[TCP].ack
ack = reply_1[TCP].seq + 1
pkg_2 = IP(dst=ip) / TCP(sport=sport, dport=5555, flags='A', seq=seq, ack=ack)
sr1(pkg_2, timeout=3, verbose=False)
# 三次握手完成之后发送消息
reply_3 = sr1(IP(dst=ip) / TCP(sport=sport, dport=5555, flags='PA',seq=seq,ack=ack) / "你好吗?")
time.sleep(1)
print(reply_3[Raw].load.decode())