需要使用Scapy模块来编写流量嗅探工具,用到Scapy中的sniff()函数,该函数中比较重要的参数如下:
关于filter:
表达式常用的有以下三种限定词:
表达式常用逻辑运算符:
案例:
python终端中运行下面的命令,cmd中发出默认的4个ping包,python终端中按Ctrl+c取消捕获,终端中才会显示结果。
加上prn选项,来实时显示捕获到的数据包。
prn的内容用lambda(匿名函数)表达式来编写,具体内容为:prn=**lambda **x: x.summary()
python终端中按Ctrl+c取消捕获
优化显示结果:
改进之后的prn:prn=**lambda **x: x[IP].src + **"---->" **+ x[IP].dst
更详细的输出:
写一个回调函数,然后让prn调用即可。
截图中可以看到右上角有报错,因为[IP]
,这个不用管
from scapy.all import *
# 定义一个回调函数
def callback(packet):
print("Source:%s---->Target:%s" % (packet[IP].src, packet[IP].dst))
print("TTL:%s" % packet[IP].ttl)
print(packet.show())
print(sniff(filter='dst 192.168.86.155', prn=callback))
wrpcap
函数保存数据包,设置保存为pcap格式的from scapy.all import *
packet = sniff(filter='dst 192.168.86.155', count=4)
wrpcap('python.pcap', packet)
第44行和51行那段注释的代码,主要是为了解释(options, args) = parser.parse_args()
是什么,并进而得知传进去的参数是如何工作的。
from scapy.all import *
import time
import optparse
# 回调打印函数
def pack_call_back(packet):
print('*' * 30)
# 打印源IP、源端口、目睹IP、目的端口
print('[%s]Source:%s:%s---->Target:%s:%s' % (
time2time(packet.time), packet[IP].src, packet.sport, packet[IP].dst, packet.dport))
# 打印数据包
print(packet.show())
print('*' * 30)
# 时间戳转换
def time2time(packet_time):
localtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(packet_time))
return localtime
if __name__ == '__main__':
parser = optparse.OptionParser('案例:python %prog -i 127.0.0.1 -c 5 -o test.pcap\n')
# 添加IP参数-i
parser.add_option('-i', '--IP', dest='hostIP',
default='127.0.0.1', type='string',
help='IP address [default = 127.0.0.1]')
# 添加数据包总数参数 -c
parser.add_option('-c', '--count', dest='packetCount',
default=5, type='int',
help='Packet count [default = 5]')
# 添加保存文件名参数 -o
parser.add_option('-o', '--output', dest='fileName',
default='pythonGet.pcap', type='string',
help='save filename [default = pythonGet.pcap]')
(options, args) = parser.parse_args()
# print(type(parser.parse_args())) #
# print(parser.parse_args()) # (, [])
#
# print(type(options)) #
# print(options) # {'hostIP': '127.0.0.1', 'packetCount': 5, 'fileName': 'pythonGet.pcap'}
#
# print(type(args)) #
# print(args) # []
defFilter = 'dst ' + options.hostIP # 包过滤规则
packets = sniff(filter=defFilter, prn=pack_call_back, count=options.packetCount)
# 保存输出文件
wrpcap(options.fileName, packets)