【问题标题】:scapy sniff function doesnt seem to work in moniter mode?scapy 嗅探功能似乎在监控模式下不起作用?
【发布时间】:2021-01-24 17:01:12
【问题描述】:

我正在尝试编写一个数据包嗅探器,它将一个接口和一个正则表达式作为可选参数并搜索嗅探的数据包以查找匹配项,但它似乎根本无法嗅探数据包,整个代码是:

#!/home/khaled/PycharmProjects/networking/venv/bin/python3
# A regular expresion finder

from scapy.all import *
import re
import os
import argparse
import subprocess
import sys

def test(num):
    num = num.sprintf('%Raw.load%')
    print("Packet Data: {}".format(num))
    res = re.findall("TESTING", num)


def parser():
    parser = argparse.ArgumentParser(usage="command -i <interface>",
                                     description="Listen for incoming traffic on specified interface for specified"
                                                 "regex expresion")
    parser.add_argument("-i", help="The interface to listen on", dest="interface", required=True)
    parser.add_argument("-r", help="regex expresion to look for", dest="regex", required=False, default=False)
    env = parser.parse_args()
    global interface
    global regex
    interface = env.interface
    regex = env.regex

def start_sniff(interface):
    # Check if a
    print(conf.iface)
    print("[+] Started Sniffing For regex in HTTP data at interface {}".format(interface))
    sniff(prn=test, filter="tcp", iface=interface, count=0, monitor=True)


def start_moniter_interface(iface):

    try:
        # subprocess.run(['airmon-ng', "check", "kill"], check=True)
        rslt = subprocess.run(["airmon-ng", "start", iface], check=True, capture_output=True)
    except subprocess.CalledProcessError as e:
        print("[+] Error Has Occurred when putting Interface in monitor mode {}".format(e.stderr))
        sys.exit(1)
    else:
        print("[+] Started interface in moniter mode")
        interface_name = re.findall("wlp[0-9a-z]+mon", rslt.stdout.decode("utf-8"))[0]
        print("[+] Found interface Name is {}".format(interface_name))
        if interface_name:  # Found interface name
            return interface_name
        else:               # Else Run iwconfig
            # nfig manually
            print("Unable to determine interface name")
            print("Run iwconfig and rerun script with new interface name")
            sys.exit(1)


def main():
    parser()

    if os.getuid() != 0:    # Not running as root run with sudo
        print("Error Need to run script as root, run with sudo")
        sys.exit(1)
    else:   # running as root
        result = subprocess.run(["iwconfig", interface], capture_output=True, check=True)
        if "mode:moniter" in result.stdout.decode("utf-8").lower(): # Check Moniter mode
            start_sniff(interface)
        else:   # Else start Interface in moniter mode then sniff for packets
            moniter_interface = start_moniter_interface(interface)
            start_sniff(moniter_interface)


if __name__ == "__main__":
    main()

它使用airmon将网卡置于监控模式,然后在置于监控模式后使用iwconfig获取网卡名称。用户传递的正则表达式暂时被忽略。 test 函数似乎根本没有被调用,我不知道为什么,因为当无线网卡处于 managed 模式时,sniff 函数似乎工作。它只是无所事事

[+] Started Sniffing For regex in HTTP data at interface wlp2s0mon

嗅探函数调用如下:

    sniff(prn=card_type, filter="tcp", iface=interface, count=0, monitor=True)

同时运行iwconfig表明网卡处于监控模式。

【问题讨论】:

  • 你的操作系统是什么。检查您的卡是否也支持监控模式。
  • @Cukic0d 我正在运行 linux (ubuntu 20.0),是的,我的卡确实支持监控模式,因为 iwconfig 表示它处于监控模式,wire-shark 也确实捕获数据包。

标签: python python-3.x networking scapy sniffing


【解决方案1】:

您正在使用 BPF 过滤器在内核级别过滤 tcp。我敢打赌,您从受 WPA2 保护的网络中嗅探,这意味着 802.11 (Wi-Fi) 帧中的有效负载是加密的,因此您实际上无法查看帧内部。我建议尝试在没有监控模式的情况下进行嗅探,因此您可以捕获常规的 802.3 以太网帧,而不是像我提到的那样加密有效负载的原始 802.11。

【讨论】:

  • 哦,我根本没想到。非常感谢,但有没有办法在 scapy 中使用监控模式,只解密我自己的网络流量(输入 WIFI 密码),这样我就可以嗅探其他客户端的流量,或者 WPA2 对不同的连接客户端使用不同的密钥,因为我不熟悉WPA2 加密方案。
  • 如果你想解密动态帧(实时解密/解析),那么我不知道该怎么做。但是,如果您可以从离线 pcap 中查找 tcp,那么请查看 this thread 并解释如何使用 tshark 解密受 WPA 保护的帧,因为您知道 Wi-Fi 网络的密码。一旦你收集到的 pcap 被解密,你就可以用 scapy 解析它以获取有效负载特定的字段,如 TCP。
猜你喜欢
  • 1970-01-01
  • 2017-09-05
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 2016-09-24
  • 1970-01-01
相关资源
最近更新 更多