学习Python渗透第五天:用scapy编写网络嗅探

本文介绍了如何使用Scapy库在Python中捕获、保存数据包,以及如何通过Wireshark工具查看数据包结构。同时,还展示了如何通过Scapy提取HTTP中的敏感信息,如登录凭证,以进行安全分析。
摘要由CSDN通过智能技术生成

在前面,我们学习过了scapy中有一个sniff()函数,可以用来过滤你想要的IP或者端口的数据,但是过滤后这些数据包的内容并没有进行保存,如果需要对这些数据包进行深入的研究,那我们需要对其进行保存。

scapy查看数据包:

scapy中的wrpcap()可以实现对捕获数据包的保存,保存的格式有很多,我们通常选择pacp格式,下面上代码:

from scapy.all import sniff,wrpcap,show
pkt = sniff(count = 5)
#捕获五个数据包
wrpcap=("d:\\test.pcap",pkt)
#将pkt命名为test.pcap,放在d盘下
show(pkt)
#可以使用show函数输出数据包的详细内容

你想读取文件中的数据包的内容可以使用rdpcap()函数,每一个数据包都有自己的结构,因此可以通过索引下标来获得数据包中的值:

from scapy.all import rdpcap
pcaps = rdpacp("d:\\test.pcap")
print(len(pcaps))
for pkt in pcaps:
    print("源mac地址为:"+pkt[Ether].src)
    print("目的mac地址为:"+pkt[Ether].dst)
    print("源IP地址为:"+pkt[IP].src)
    print("目的IP地址为:"+pkt[IP].dst)

数据包含五个部分,以太网帧(源mac地址,目的mac地址,以太网类型),IP头部(源IP地址,目的IP地址,版本,标识,标志,等等),TCP/UDP头部(源端口号,目的端口号),ICMP头部(类型,代码,校验和),数据部分(数据传输的内容)。但是一般都值用得到源mac。目的mac和源IP,目的IP。

Wireshark查看数据包:

scapy里面虽然可以查看数据包,但是这还是需要代码,下面我们介绍一个工具来更加方便的查看数据包的具体结构。这个工具是非常重要的一个工具————Wireshark

这是下载地址,根据自己的操作系统选择合适的安装包就行:

https://www.wireshark.org/download.html

wireshark分为这三个部分,分组列表,分组详情,分组字节流

分组详情就能看到数据包的结构,点开这些相关的协议,就能看到协议里面的内容,比如Internet Protocol version 4就是ipv4,也就是ip协议,点开就能看到源ip和目的ip

对敏感信息的提取:

当黑客完成攻击后,可以将流量劫持到自己的主机上,这些流量可以使用sniff函数进行捕获并查看,但是考虑到现在网络流量非常大,这时就需要一个过滤机制来过滤敏感的信息,从而达到获得想要信息的目的。假设将用户登录一些网站时的登录凭证作为敏感信息,那么我们可以按照以下步骤进行敏感信息的提取:

sniff(iface="网卡名字",filter="tcp port 80)

接下来,我们需要从过滤之后的流量中找到那些包含用户名的数据包,但是scapy中并没有包含处理http的功能,也就是说我们不能像处理其他协议那样来处理HTTP,考虑到HTTP部分的字段是以TCP的数据部分存在的,所以可以使用sprintf("%Raw.load%')实现提取TCP数据段,并将其转化为字符串,sprintf()函数是用来输出某一层中某个参数的取值的,不存在就输出??,具体格式是%[[fmt][r],][layer[:nb].]field%"

layer:协议层的名字,如Ether,IP,Dot11,TCP等。

field:需要显示的参数

nb:当有两个协议层有相同的参数名时,nb用于达到想要的协议层

r:当使用r标志时,意味着显示的是参数的原始值

例如,当我们捕获到一个数据包pkt之后,可以使用pkt.spintf('%Raw.load%')来提取其中的HTTP部分,提取到HTTP部分之后,我们可以用python里面的re模块,进行正则匹配,匹配到我们想要的关于用户登录的数据。这里我们使用re模块里面的findall()函数,匹配到则返回一个列表,没有匹配到则返回空列表。

username=re.findall('(?i)username=(.*?)',content)
#这个语句表示匹配username=后面的内容,()内表示要匹配的内容,.*?表示非贪婪匹配任意字符,就是尽可能的少匹配,知道下一个匹配项,(?i)表示不区分大小写的匹配,这里可以根据实际情况进行调整,如果登录用户名是customer,那就是(?i)customer=(.*?)

完整代码如下:

import re
from scapy.all import sniff
def httpsniff(pkt):
    dest = pkt.getlayer(IP).dst
    content = pkt.sprintf('%Raw.load%')
    username=re.findall('(?i)username=(.*?)',content)
    
sniff(filter='tcp port 80',iface='网卡名字',prn=httpsniff)
#这里最后的prn=httpsniff没有传入参数是因为在调用回调函数的时候,会直接将抓到的数据包当成sniff的pkt参数进行传入,所以这里不写参数也行

  • 45
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值