首页 > 解决方案 > 用 scapy 和正则表达式嗅探网络流量?

问题描述

我第一眼看到了 python 的 scapy 包,想测试我的第一个小脚本。为了测试下面的代码,我给自己发了一封电子邮件,其中包含这个字符串“10000000000000”。我的期望是,以下最小示例(我的网卡处于监视模式并以 su 执行)会专门为该电子邮件提供命令行输出,但事实并非如此。我确信这是由于我自己对网络流量和 tcp 的误解造成的——有人能解释一下吗?

我设置的虚拟环境是 Python 3.6.8

(我已经测试过,我可以使用注释掉的行来嗅探网络流量,只有当我尝试通过正则表达式过滤它们的内容时,结果才不像我预期的那样。)

import optparse

import scapy.all as sca
import re

from scapy import packet
from scapy.layers.dns import DNS
from scapy.layers.dot11 import Dot11Beacon, Dot11ProbeReq
from scapy.layers.inet import TCP


class SniffDataTraffic:
    @staticmethod
    def find_expr(pack: packet) -> str:
        regex_dict = {'foo': r"1[0-9]{13}",'bar': r"2[1-5]{14}"}
        raw_pack = pack.sprintf('%Raw.load%')
        found = {iter: re.findall(regex_dict[iter], raw_pack) for iter in regex_dict.keys()}

        for name, value in found.items():
            if value:
                return "[+] found {}: {}".format(name, value[0])


def main():
    try:
        print("[*] Starting sniffer")
        #sca.sniff(iface="xxxxxmon", prn=lambda x: x.summary(), store=False)
        sca.sniff(prn=SniffDataTraffic.find_expr, filter='tcp', iface="xxxxxmon", store=False)
    except KeyboardInterrupt:
        exit(0)


if __name__ == '__main__':
    main()

标签: pythonregextcppython-requestsscapy

解决方案


推荐阅读