我正在尝试使用 SCAPY 创建一个嗅探程序来演示 802.11 设备关联 [s] 和 802.11 网络中的角色。
SCAPY 具有识别 Beacon 帧、探测请求和探测响应的简单功能。我正在尝试更深入地挖掘,并根据 DS 状态进行自己的评估,以显示所有其他流量关联 [s]。
我不能做什么决定了如何获得 DS 状态的值(00、01、10、11)。如果确定,那么我可以相应地处理帧以获得 SOURCE、BSSID、RECEIVER、TRANSMITTER 和 DESTINATION 以适合我的代码。
我发现我应该能够使用 tshark (wlan.fc.ds) 获取 DS 状态,因此,如果需要,我可以将帧传递给 tshark 派生进程;但我首先想尝试使用 SCAPY 来完成这一切,因为我刚刚开始使用 SCAPY 和 PYTHON 进行编码,我不想在第一个障碍时跳到其他 MAC 帧分析程序。
除了创建我的程序来演示设备关联;我还将它用作一种工具,让我了解更多关于 802.11、PYTHON 和 SCAPY 的信息,因此我希望深入研究每一帧,将它们按 DS 状态分组。谢谢,鲍勃
我在更新变量方面遇到了一个不寻常的问题。我已经构建了一个简单的类对象来帮助我进行一些网络嗅探。我想做一个并行进程,它允许我运行一些网络测试并捕获使用 python 生成的流量,这样我就可以扩展程序来做一些了不起的事情。我正在使用 scapy 的嗅探功能来帮助进行界面嗅探。
Scapy 的嗅探器允许您将一个函数传递给它自己的函数,该函数允许您创建“停止嗅探”条件。在我的例子中,我已经创建了函数stop_filter,我希望通过简单地更新self.stop_sniffing实例变量来停止 Scapy sniff 函数。我在下面展示了程序输出,它显示self.stop_sniffing在 Function 中设置为 True stop,但在stop_filter. 我不知道为什么会发生这种情况,也没有想到解决方案,因为这是一个如此奇怪的问题。
如果任何有新鲜眼光的人都能看到我在这里做了什么疯狂的事情,将不胜感激!
from scapy.all import *
from multiprocessing import Process
class DatasetSniffer:
def __init__(self, iface, local_dir='.'):
self.iface = iface
self.master = None
self.local_dir = local_dir
self.stop_sniffing = False # Never updates! why!?
self.writer = PcapWriter(local_dir+"/master.pcap", append=True, sync=True)
def stop_filter(self, p):
# Note: 'p' gets passed in by Scapy function 'sniff'
print self.stop_sniffing
# Return 'True' to stop …Run Code Online (Sandbox Code Playgroud) 有什么方法可以提取通过原始套接字解析的 Scapy 原始负载吗?我可以通过指定 ip[scapy.IP] 和 ip[scapy.TCP] 来提取 TCP 和 IP 标头,但不能指定原始负载。
当我尝试通过指定 ip[raw.load] 提取原始负载时,它给我一个错误,指出未找到原始图层。
import sys
import socket
from scapy.all import *
#from scapy import all as scapy
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
while 1:
packet = s.recvfrom(2000);
packet = packet[0]
ip = IP(packet)
print(ip.show())
#print(str(ip[IP]))
#print(ip[scapy.IP].src)
#print(ip[scapy.Raw].load)
Run Code Online (Sandbox Code Playgroud)
我可以使用此代码提取 Scapy TCP 标头中的源端口号。
import sys
import socket
from scapy.all import *
#from scapy import all as scapy
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
while 1:
packet = s.recvfrom(2000);
packet = packet[0] …Run Code Online (Sandbox Code Playgroud) 我有一些代码尝试通过从数据包中获取字符串值(我相信它返回一个字节串作为字符串)来将数据包有效负载提取为字节数组。我怎样才能以字节数组的形式获取原始有效负载?
packets = rdpcap(pcapFile)
p = packets[0]
if TCP in p:
pdata = str(p[TCP].payload)
elif Raw in p:
pdata = str(p[Raw].load)
elif TLS in p:
pdata = str(p[TLS].msg)
else:
pdata = ""
Run Code Online (Sandbox Code Playgroud)
当我打印 pdata 时,它看起来像这样
b'\x17\x03\x01\x00 a\xb9j\x17#\xb9uX\xdf\xe3\x08\xe0\xbc\xc3\xce\xa2=\xda\xc9\xd7\x1d7*\xad\xc9Y\xcer1\xdc\xb2\xd1\x17\x03\x01\x00
Run Code Online (Sandbox Code Playgroud)
但似乎,这是一个字符串,而不是字节串,ad pdata[0] 返回'b'
我怎样才能得到“有效负载”作为bytes或bytearray?
我花了一整天等待一个循环,没有希望退出!我知道python在性能方面不是那么高效,我真的很感激任何加速建议来解决我的问题.
我使用wireshark捕获了大量数据包(大约500,000个)并将它们保存到.pcap文件中.之后,我使用Scapy rdpcap()函数从保存的文件中读取数据包,然后在循环中访问每个数据包以提取源IP地址.我的代码如下:
from scaly.all import *
srcList =[]
Packets = rdpcap("pcapfile")
for pkt in Packets:
src = Packets[Packets.index(pkt)][1].src
srcList.append(src)
Run Code Online (Sandbox Code Playgroud)
注意:我已经做了一些挖掘,我发现Cython用于加速嵌套循环,但老实说我不知道如何在我的情况下使用它.任何见解都会很棒
如何计算使用该数据包捕获的数据包数量
packets = sniff(filter='udp and host fe80::xx:xx:xx:xx',count=0)
Run Code Online (Sandbox Code Playgroud)
功能?这可能吗?
编辑:
我实际上一直在尝试使用这个函数的prn:
def packetCount(packets):
global counter
counter += 1
Run Code Online (Sandbox Code Playgroud)
我在程序开头定义了计数器变量.但我需要将它重置为0,每次嗅探().我尝试过的任何东西都无法工作......
我的代码我尝试过如下:
from scapy.all import *
def PacketHandler(pkt) :
if pkt.haslayer == 2 and pkt.subtype==0:
if pkt.haslayer(IP) :
ip=pkt.getlayer(IP)
print ip.dst
if pkt.haslayer(UDP):
udp=pkt.getlayer(UDP)
print udp.dport
if pkt.haslayer(TCP) :
tcp=pkt.getlayer(TCP)
print tcp.port
sniff(iface="mon0", prn=PacketHandler)
Run Code Online (Sandbox Code Playgroud)
使用这个,我想捕获所有无线数据包,但我只获得多播(IP/UDP)数据包.那么如何才能在我的无线网络中获取所有DATA数据包?我已经在我的接入点上禁用了加密(暂时),因此我可以访问数据包中的数据.
对于实例我在python中有三个函数和一个for循环,我希望顺序执行所有这些函数,例如在第一次迭代时应该执行函数1和在第二次迭代函数2上执行等等
这三个功能是:
from scapy.all import *
from random import randint
import threading
import time
from datetime import datetime
import multiprocessing
from itertools import count
#pktList = []
#pktsInt = 0
#def Packets():
# Generate packet
#for run_no in range(0,1)
p = raw_input('Enter PACKETs to send: ')
pktsInt = int(p)
pkts = IP(src="10.0.0.1",dst="10.0.0.2")/TCP()/"GET /HTTP/1.0\r\n\r\n"/Raw(RandString(size=120))
#print pkts
pkts[TCP].flags = "UFP"
pktList = []
for pktNum in range(0,pktsInt):
pktList.extend(pkts)
pktList[pktNum][TCP].dport = 80
#randint(1,65535) # Pkt has Ran PortNo.
print pktList[pktNum].summary()
#print len(pktList[pktNum])
#wrpcap('tcp-packets.pcap',pktList[pktNum]) …Run Code Online (Sandbox Code Playgroud) 刚开始在我的 virutalenv 中使用 scapy,但我无法在其中运行 'sudo scapy'。我正进入(状态:
sudo: scapy: command not found
Run Code Online (Sandbox Code Playgroud)
如果我只是运行 scapy,当我尝试发送一个简单的数据包时
send(IP(dst="www.google.com"/ICMP())
Run Code Online (Sandbox Code Playgroud)
我得到了permissionError 操作的许可。我如何让它工作?
我正在编写一个程序来捕获 Dot11 数据包以进行网络安全测试,在这些捕获的数据包中,我获取的数据如下所示:
<RadioTap version=0 pad=0 len=36 present=TSFT+Flags+Rate+Channel+dBm_AntSignal+b14+b29+Ext notdecoded=' \x08\x00\x00\x00\x00\x00\x00\xd5~\xbb*\x00\x00\x00\x00\x10\x02\x99\t\xa0\x00\xbd\x00\x00\x00\xbd\x00' |<Dot11 subtype=11L type=Management proto=0L FCfield=retry ID=14849 addr1=48:ee:0c:f4:b7:ea addr2=00:26:82:8e:9a:d4 addr3=48:ee:0c:f4:b7:ea SC=46176 addr4=None |<Dot11Auth algo=open seqnum=1 status=success |<Dot11Elt ID=220 len=46 info='7\x94' |>>>>
Run Code Online (Sandbox Code Playgroud)
我想更好地理解以下部分:
\x08\x00\x00\x00\x00\x00\x00\xd5~\xbb*\x00\x00\x00\x00\x10\x02\x99\t\xa0\x00\xbd\x00\x00\x00\xbd\x00
Run Code Online (Sandbox Code Playgroud)
我在许多不同的捕获中获得这些类型的数据包,我希望能够“解码”它们以读取数据。有没有办法做到这一点,也许是代码示例?
我正在尝试使用 pyshark 从远程计算机上本地托管的网站(测试目的)获取数据包。
这是我的代码:
import pyshark
def print_live_dns():
capture = pyshark.LiveCapture("wlan0")
for packet in capture:
# print(packet)
with open('packets.txt', 'a') as f:
f.write(str(packet))
if "DNS" in packet and not packet.dns.flags_response.int_value:
print(packet.dns.qry_name)
if __name__ == "__main__":
print_live_dns()
Run Code Online (Sandbox Code Playgroud)
使用此代码,我只能从 Internet 获取数据包。这不是我需要的。我如何实现这一目标?使用pyshark, scapy, nmap 等
scapy ×12
python ×11
python-2.7 ×2
cython ×1
networking ×1
performance ×1
pyshark ×1
python-3.x ×1
security ×1
sniffing ×1
sudo ×1
traffic ×1
ubuntu ×1
wifi ×1
wireless ×1