from scapy.all import * import re def packet_callback(packet): # 过滤MySQL流量 if packet.haslayer(TCP) and packet.haslayer(Raw) and packet[TCP].dport == 3306: # 解码MySQL协议 payload = str(packet[TCP].payload, 'utf-8', errors='ignore') if re.search(r'(\bUNION\b|\bSELECT\b.*\bFROM\b)', payload, re.IGNORECASE): # 检测到SQL注入攻击 print('[!] SQL Injection detected from {}:{}'.format(packet[IP].src, packet[TCP].sport)) # 开始抓包 sniff(filter='tcp port 3306', prn=packet_callback)代码中没有引用TCP和IP
时间: 2023-12-26 13:06:22 浏览: 170
这是因为 Scapy 库中的 Packet 类已经自动解析了 TCP 和 IP 层,可以在 packet[TCP] 和 packet[IP] 中直接访问它们的字段。因此,我们可以直接使用 packet.haslayer(TCP) 和 packet.haslayer(IP) 来检查是否存在 TCP 和 IP 层。同时,payload 字段也可以通过 packet[TCP].payload 直接访问。
相关问题
import sys import os from scapy.all import * from scapy.layers.dot11 import Dot11 # 设置网络接口为监视模式的函数 def set_monitor_mode(iface): try: comm = subprocess.Popen(['sudo','ifconfig',iface,'down'],stdout=subprocess.PIPE,stderr=subprocess.PIPE) output,error = comm.communicate() comm = subprocess.Popen(['sudo','iwconfig',iface,'mode', 'monitor'], stdout=subprocess.PIPE,stderr=subprocess.PIPE) output, error = comm.communicate() comm = subprocess.Popen(['sudo', 'ifconfig',iface,'up'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, error = comm.communicate() except Exception as e: print("Error: {0}".format(e)) sys.exit(1) # 定义处理数据包的回调函数 def packet_callback(packet, q): # 过滤数据包中的MAC地址 if packet.haslayer(Dot11): if packet.addr2 and (packet.addr2.lower() != 'ff:ff:ff:ff:ff:ff'): # 将连接的MAC地址存入队列 q.put(packet.addr2) # 处理数据包的线程 def process_packets(q): while True: if not q.empty(): # 输出连接的MAC地址 print("Device connected: %s" % q.get()) # 主程序 if __name__ == '__main__': # 设置网络接口为监视模式 set_monitor_mode('wlan0') # 创建队列对象 q = Queue() # 创建并启动处理数据包的线程 t = Thread(target=process_packets, args=(q,)) t.daemon = True t.start() # 开始抓取数据包 sniff(prn=lambda packet: packet_callback(packet, q), iface='wlan0', filter='arp')
这段代码是一个使用 Python 的 Scapy 库来嗅探 WiFi 数据包的程序。具体来说,它实现了以下功能:
1. 将网络接口设置为监视模式;
2. 通过 Scapy 库捕获 ARP 数据包;
3. 过滤掉广播数据包;
4. 提取连接到网络上的设备的 MAC 地址,并将其存入一个队列中;
5. 启动一个线程来处理队列中的 MAC 地址,输出连接的设备的 MAC 地址。
需要注意的是,这段代码需要在 Linux 操作系统下运行,并且需要使用管理员权限来执行。
import sys import os from queue import Queue from threading import Thread from scapy.all import * from scapy.layers.dot11 import Dot11 # 设置网络接口为监视模式的函数 def set_monitor_mode(iface): try: comm = subprocess.Popen(['netsh', 'interface', 'set', 'interface', iface, 'admin=disable'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, error = comm.communicate() comm = subprocess.Popen(['netsh', 'interface', 'set', 'interface', iface, 'admin=enable'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, error = comm.communicate() except Exception as e: print("Error: {0}".format(e)) sys.exit(1) # 定义处理数据包的回调函数 def packet_callback(packet, q): # 过滤数据包中的MAC地址 if packet.haslayer(Dot11): if packet.addr2 and (packet.addr2.lower() != 'ff:ff:ff:ff:ff:ff'): # 将连接的MAC地址存入队列 q.put(packet.addr2) # 处理数据包的线程 def process_packets(q): while True: if not q.empty(): # 输出连接的MAC地址 print("Device connected: %s" % q.get()) # 主程序 if __name__ == '__main__': # 设置网络接口为监视模式 set_monitor_mode('Wi-Fi') # 创建队列对象 q = Queue() # 创建并启动处理数据包的线程 t = Thread(target=process_packets, args=(q,)) t.daemon = True t.start() # 开始抓取数据包 sniff(prn=lambda packet: packet_callback(packet, q), iface='Wi-Fi', filter='arp')报错OSError: Error opening adapter: 文件名、目录名或卷标语法不正确。 (123) �g‘銆� (123)
这段代码是使用 Python 和 Scapy 库来监视 Wi-Fi 接口的网络流量,并识别连接到网络的设备的 MAC 地址。在运行该脚本之前需要确认 Wi-Fi 接口名称正确,并在管理员权限下运行。报错可能是因为接口名不正确,或者权限不足导致无法打开接口。建议仔细检查接口名和权限,并在确保正确的前提下重新运行该脚本。
阅读全文