我是Pyhon的新手(主要来自Java),我正在学习Pytohon的课程,该课程适用于Udemy上的安全性,在该课程中提供了一个使用scapy模块实现数据包嗅探器的示例。我正在使用Python 3,这是我的Python项目的结构,其中突出显示了scapy版本:
看来可行,但是我对此应用程序的输出有一些疑问。
这是我脚本的源代码:
#!usr/bin/env python
# INSTALL THE FOLLOWING PYTHON MODULES:
# - pip3 install scapy
# - pip3 install scapy_http
import scapy.all as scapy
from scapy.layers import http
#
def sniff(interface):
scapy.sniff(iface=interface, store=False, prn=process_sniffed_packet)
def process_sniffed_packet(packet):
#print(packet)
# Check if our packet has HTTP layer. If our packet has the HTTP layer and it is HTTPRequest.
# In this way I am excluding some garbage information in which I am not interested into.
if packet.haslayer(http.HTTPRequest):
print(packet)
sniff("eth0")
因此,此脚本通过以下if语句的内容来监听eth0端口上的流量:
if packet.haslayer(http.HTTPRequest):
print(packet)
它只打印与HTTP层相关的数据包,从而避免打印我不感兴趣的其他垃圾信息。
因此,我执行了脚本,将以下命令启动到我的Linux shell中:
python3 packet_sniffer.py
和脚本等到我在浏览器中打开网站并获得如下输出:
root@kali:~/Documents/PycharmWS/packet_sniffer# python3 packet_sniffer.py
b"\x00PV\xfd\xa9B\x00PV)\x97\xc7\x08\x00E\x00\x01\x9d\xdb\x84@\x00@\x06\x18*\xc0\xa8\xdf\x85\xd8:\xcdC\x90$\x00Pe\xa7\xb3\x8eM\xf9Y\xd6P\x18\xf9\x8aG
在这里我有些怀疑:
1)为什么我得到这个奇怪的字符串作为输出?在Udemy教程上,有一个更易理解的输出,以更清晰的方式显示了包的信息,例如Refereres,User-Agent,Host。我的输出中所有这些\ x ..值是什么?在我看来,它是以某种方式编码的,但是我对此绝对不确定。
2)打开不同的网站有时会在打开特定网站后为我提供输出,但在另一些时间却没有任何输出。这怎么可能?
3)是仅通过HTTP起作用还是通过HTTPS进行嗅探?
怎么了?我想念什么?怎么修复它?
解决方案
问题1
什么是Python字节数组?
那就是包的字节数组。“ \ x55”表示01010101。在python中,字节对象就像一个字符串,但前面带有blikeb"bytes"或b'bytes'。
例如,如果我们获取打印的字节数组的前4个字节,并将其写入文件,则可以根据xxd看到字节表示。
$ python -c 'f=open("temp", "wb");f.write(b"\x00PV\xfd");f.close()'
$ xxd temp
00000000: 0050 56fd .PV.
这里,
b"\x00P"=>0050
b"V\xfd"=>56fd
P字节数组中的第二个char是ASCII char 的十六进制表示P。
因此,您将获得此输出,因为您正在打印数据包的字节。如果要打印其他表示形式。
如何在Scapy中打印数据包
使用packet.show()而不是print(packet)让Scapy为您分析它。
输出将如下所示:
$ python script.py
###[ Ethernet ]###
dst = cc:65:ad:da:39:70
src = 6c:96:cf:d8:7f:e7
type = IPv6
###[ IPv6 ]###
version = 6
tc = 2
fl = 131466
...
###[ HTTP 1 ]###
###[ HTTP Request ]###
Method = 'GET'
Path = '/online'
Http_Version= 'HTTP/1.1'
...
您可以改用print(packet.summary())每个数据包获取如下内容:
Ether / IPv6 / TCP / HTTP / 'GET' '/online' 'HTTP/1.1'
Scapy包对象文档在这里,要查看Python中对象的方法/属性,请使用dir(Object)。
问题2
HTTP与HTTPS是不同的协议。Scapy使用该过滤器监听HTTP,并丢弃HTTPS。
问题3
正确。见2。
最终,如果您想捕获所有数据包,请不要使用过滤器。有一些方法可以解密HTTPS数据包,但这是一个不同的问题;)