当前位置:   article > 正文

python抓包(sniff)-----实现wireshark抓包功能_python sniff

python sniff

python嗅探(sniff)

只用作学习,切莫做其他用途,技术无罪知己知彼百战不殆。

安装scapy模块

打开DOS命令行

python -m pip install scapy

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

简单应用

只捕获源地址为192.168.1.124且目的端口为80的流量:

from scapy.all import *
sniff(filter='src host 192.168.1.124 && dst port 80', prn=lambda x:x.summary())
  • 1
  • 2

image-20201031115143468

注意:必须要用管理员身份运行dos,否则无法获取网卡信息捕获失败。

  • 也可细化打印出的内容,更改lambda表达式

    只打印源IP和目的IP

    prn=lambda x:x[IP].src+'---->'+x[IP].dst

    image-20201031162528047

  • 为了不让sniff()函数太冗长,可以定义一个callback()函数让prn调用

    from scapy.all import *
    
    def Callback(packet):
        print('src:%s----->dst:%s'%(packet[IP].src, packet[IP].dst))
        print('TTL:%s'%packet[IP].ttl) 
        print(packet.show())  #内置的show()函数打印数据包内容
    
    
    sniff(filter='src host 192.168.1.124 && dst port 80', prn=Callback)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    image-20201031164448086

  • 我们可以将数据包保存为pcap格式,用wireshark查看分析

    from scapy.all import *
    packet=sniff(filter='src host 192.168.1.124 && dst port 80', count=4)   #捕获四个包
    wrpcap('data.pcap', packet)  #保存为pcap文件
    
    • 1
    • 2
    • 3

    image-20201031165200183

    image-20201031165235644

    可以用wireshark分析查看

工具源码

from scapy.all import *
import time
import optparse

#回调打印函数
def PackCallBack(packet):
    print('*'*30)
    #打印源IP,源端口,目的IP,目的端口
    print("[%s]Source:%s:%s---->Target:%s:%s"%(TimeStamp2Time(packet.time), packet[IP].src, packet.sport, packet[IP].dst, packet.dport))
    #打印数据包
    print(packet.show())
    print('*'*30)

#时间戳转换函数
def TimeStamp2Time(timeStamp):
    timeTmp = time.localtime(timeStamp)  #time.localtime()格式化时间戳为本地时间
    myTime = time.strftime("%Y-%m-%d %H:%M:%S", timeTmp)  #将本地时间格式化为字符串
return myTime

if __name__ == '__main__':
    parser = optparse.OptionParser("Example:python %prog -i 127.0.0.1 -c 5 -o data.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='data.pcap', type='string', help='save filename [default = data.pcap]')
    (options, args) = parser.parse_args()
    defFilter = "dst" + options.hostIP
    packets = sniff(filter=defFilter, prn=PackCallBack, count=options.packetCount)
    #保存输出文件
    wrpcap(options.fileName, packets)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • optparse模块

    功能:主要用来为脚本传递命令参数,采用预先定义好的选项来解析命令行参数。实例化一个 OptionParser 对象(可以带参,也可以不带参数),带参的话会把参数变量的内容作为帮助信息输出。

    参数dest,用于保存输入的临时变量,其值通过options属性访问(多个参数用逗号隔开); type,用于设置参数数据类型;help,设置帮助信息;default,给dest的默认值。

运行结果:

image-20201031201251519

image-20201031201314102

注:dos同样要用管理员身份运行。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/156845
推荐阅读
相关标签
  

闽ICP备14008679号