1、打开DOS命令行
python -m pip install scapy
2、sniff()函数
功能:数据嗅探
参数:
iface: 指定在哪个网络接口上抓包
count: 表示要捕获数据包的数量。默认为0(不限制数量)
filter: 流量的过滤规则。使用的是 BPF 的语法
prn: 定义回调函数,使用lambda表达式来写回调函数(当符合filter的流量被捕获时,就会执行回调函数)
【BPF过滤语法举例】
只捕获某个IP主机进行交互的流量:host 192.168.1.124
只捕获某个MAC地址主机的交互流量:ether src host 00:87:df:98:65:d8
只捕获来源于某一IP的主机流量:src host 192.168.1.125
只捕获去往某一IP的主机流量:dst host 192.168.1.154
只捕获80端口的流量:port 80
只捕获除80端口以外的其他端口流量:!port 80
只捕获ICMP流量:ICMP
只捕获源地址为192.168.1.125且目的端口为80的流量:src host 192.168.1.125 && dst port 80
安装: https://www.wireshark.org/download.html
打开主界面,选择对应的网卡,右键,会出现Start Capture(开始捕获),点击即可进行捕获该网络信息,开始抓取网络包
执行需要抓包的操作,如ping www.baidu.com。
说明:ip.addr == 180.101.49.11 and icmp 表示只显示ICPM协议且源主机IP或者目的主机IP为119.75.217.26的数据包。
类型Type(host、net、port)
方向Dir(src 源端 、dst 目的端)
协议Proto(ether、ip、tcp、udp、http、icmp、ftp等)
逻辑运算符(&& 与、|| 或、!非)
序列号:Sequence Number
确认应答信号:Acknowledgement Number
(1)协议过滤:直接在抓包过滤框中直接输入协议名即可。
tcp,只显示TCP协议的数据包列表
http,只查看HTTP协议的数据包列表
icmp,只显示ICMP协议的数据包列表
(2)IP过滤
host 192.168.1.104
src host 192.168.1.104
dst host 192.168.1.104
(3)端口过滤
port 80
src port 80
dst port 80
(4)逻辑运算符&&与、|| 或、!非
src host 192.168.1.104 &&dst port 80 抓取主机地址为192.168.1.80、目的端口为80的数据包
host 192.168.1.104 || host 192.168.1.102 抓取主机为192.168.1.104或者192.168.1.102的数据包
!broadcast 不抓取广播数据包
(1)比较操作符
== 等于、!= 不等于、> 大于、< 小于、>= 大于等于、<=小于等于
(2)协议过滤
直接在Filter框中直接输入协议名即可。注意:协议名称需要输入小写。
tcp,只显示TCP协议的数据包列表
http,只查看HTTP协议的数据包列表
icmp,只显示ICMP协议的数据包列表
(3) ip过滤
ip.src ==112.53.42.42 显示源地址为112.53.42.42的数据包列表
ip.dst==112.53.42.42, 显示目标地址为112.53.42.42的数据包列表
ip.addr == 112.53.42.42 显示源IP地址或目标IP地址为112.53.42.42的数据包列表
(4)端口过滤
tcp.port ==80, 显示源主机或者目的主机端口为80的数据包列表。
tcp.srcport == 80, 只显示TCP协议的源主机端口为80的数据包列表。
tcp.dstport == 80,只显示TCP协议的目的主机端口为80的数据包列表。
(5) http模式过滤
http.request.method==“GET”, 只显示HTTP GET方法的。
(6)逻辑运算符为 and/or/not
过滤多个条件组合时,使用and/or。比如获取IP地址为192.168.0.104的ICMP数据包表达式为ip.addr == 192.168.0.104 and icmp
(7)按照数据包内容过滤
假设我要以ICMP层中的内容进行过滤,可以单击选中界面中的码流,在下方进行选中数据。
数据链路层:
筛选mac地址为04:f9:38:ad:13:26的数据包
eth.src == 04:f9:38:ad:13:26
筛选源mac地址为04:f9:38:ad:13:26的数据包----
eth.src == 04:f9:38:ad:13:26
网络层:
筛选ip地址为192.168.1.1的数据包
ip.addr == 192.168.1.1
筛选192.168.1.0网段的数据
ip contains “192.168.1”
传输层:
筛选端口为80的数据包
tcp.port == 80
筛选12345端口和80端口之间的数据包
tcp.port == 12345 &&tcp.port == 80
筛选从12345端口到80端口的数据包
tcp.srcport == 12345 &&tcp.dstport == 80
应用层:
特别说明: http中http.request表示请求头中的第一行(如GET index.jsp HTTP/1.1) http.response表示响应头中的第一行(如HTTP/1.1 200 OK),其他头部都用http.header_name形式。
筛选url中包含.php的http数据包
http.request.uri contains “.php”
筛选内容包含username的http数据包
http contains “username”
读取 pcapng 文件有两种方式:
from scapy.all import *
pkts = rdpcap(‘test.pcap’)
//循环读
for pkt in pkts:
if IP in pkt and TCP in pkt:
if pkt[IP].dst == tcp_ip and pkt[TCP].dport == tcp_port:
# print("666")
print(pkt['TCP'].dport)
pkt 中有多个数据包。pkt可当做列表顺序访问。
例如,访问第n个包:pkts[n]
访问每层里的内容pkt[‘每层的名字’].内容名,如pkt[‘IP’].dport pkt[‘TCP’].sport 等
pr = PcapReader('./tcp.pcapng')
pkt = pr.read_packet()
pkt.show() #//显示格式化数据包
IP = pkt['IP']
print(IP)
每次调用read_packet() 都会读入下一个新的包到内存中,
现在一个数据包装入了pkt变量中。
print(raw(pkt)) # 获取数据包的原始字节
print(bytes(pkt))
print(bytes_hex(pkt)) # 以可读格式打印数据包的原始字节
print(bytes_hex(pkt)[24:28])