python实现——数据包分析

有目标就不怕路远。年轻人.无论你现在身在何方.重要的是你将要向何处去。只有明确的目标才能助你成功。没有目标的航船.任何方向的风对他来说都是逆风。因此,再遥远的旅程,只要有目标.就不怕路远。没有目标,哪来的劲头?一车尔尼雷夫斯基

导读:本篇文章讲解 python实现——数据包分析,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

需求分析

工作中经常会碰到设备大量告警,收到成百上千的取证包,面对如此众多的数据包,如何确认这些取证包是不是正确告警的结果呢?只能打开数据包分析看有没有相关攻击特征。由此,可以使用snort进行检测,但是如果经常出门在外,还要继续搭建snort环境吗?这就需要一种便捷化的工具,能根据我提供的特征去海量数据包中匹配,所以,我用python写了这么一款工具,并打包成exe即可出门干活了。代码不大规范,见谅。

软件特点

你只需要提供存放数据包的文件夹和要检查的关键字即可。

  1. 脚本会检查提供的文件夹下的所有文件,对获取到的pcap、pcapng后缀的文件进行处理。
  2. 终端中会告诉你检查的大概情况,如数据包总计:13 成功:13 失败:0
  3. 测试结果会放到你桌面上
  4. 脚本直接运行即可,无需做任何修改。
  5. 不能正常运行的话,请检查是否安装相关的库文件。

核心代码

下面的代码只能实现检查1个数据包,接下来要做的就是让它可以检查更多数据包,并给出一些结果。

import logging

logging.getLogger("scapy.runtime").setLevel(logging.ERROR)  # 清除报错
from scapy.all import *
import re


def pcap_parser(filename, keyword):
    pkts = rdpcap(filename)
    for pkt in pkts.res:
        try:  # decode编码实体内容的时候容易出错,使用异常处理
            pkt_load = pkt.getlayer('Raw').fields['load'].decode().strip()  # 提取负载内容,即wireshatk追踪流看到的东西
            re_keyword = keyword
            if re.search(re_keyword, pkt_load):
                print("ok")
                break
        except:
            pass


if __name__ == "__main__":
    pcap_parser(r"D:\我的文档\抓包\XSS挑战pcap格式\xss13.pcap", r'alert')

完整代码

import logging

logging.getLogger("scapy.runtime").setLevel(logging.ERROR)  # 清除报错
from scapy.all import *
import re


def pcap_parser(filename, keyword):
    pkts = rdpcap(filename)
    for pkt in pkts.res:
        try:  # decode编码实体内容的时候容易出错,使用异常处理
            pkt_load = pkt.getlayer('Raw').fields['load'].decode().strip()  # 提取负载内容,即wireshatk追踪流看到的东西
            re_keyword = keyword  # 使用正则过滤出数据
            if re.search(re_keyword, pkt_load):
                successful_file_only_name.append(os.path.basename(filename))
            else:
                lost_file_only_name.append(os.path.basename(filename))
        except:
            pass


# 打印结果
def give_result():
    desktop_path = os.path.join(os.path.expanduser("~"), 'Desktop')  # 获取桌面路径
    if len(successful_file_only_name) > 0:
        path1 = os.path.join(desktop_path, '成功的数据包.txt')
        # 下面的代码用来把终端中的内容输出到一个文本中
        aa = open(path1, 'w', encoding='utf8')
        for r in successful_file_only_name:
            aa.write(r)
            aa.write('\n')
        aa.close()

    if len(lost_file_only_name) > 0:
        path2 = os.path.join(desktop_path, '失败的数据包.txt')
        # 下面的代码用来把终端中的内容输出到一个文本中
        bb = open(path2, 'w', encoding='utf8')
        for r in lost_file_only_name:
            bb.write(r)
            bb.write('\n')
        bb.close()


if __name__ == "__main__":
    print('''脚本功能:用来从海量数据包中筛选出包含指定关键字的数据包''')
    files_path = input(r"1. 请输入存放数据包的文件夹,或按回车键选择脚本所在路径:")
    if len(files_path):
        pass
    else:
        files_path = os.getcwd()
    word = input(r"2. 请输入检索的关键字:")

    # files_path = r"D:\我的文档\抓包\pikachu\XSS\新建文件夹"
    # word = r'script%3Ealert'
    successful_file_only_name = []  # 存储符合条件的数据包的名字
    lost_file_only_name = []  # 存储不符合条件的数据包的名字

    for current_folder, list_folders, files in os.walk(files_path):
        for f in files:  # 用来遍历所有的文件,只取文件名,不取路径名
            if f.endswith('pcap') or f.endswith('pcapng'):  # 操作数据包
                file_path = current_folder + '\\' + f  # 获取数据包的绝对路径
                pcap_parser(file_path, word)

    # 由于一个数据包存在多个负载,所以列表存在多个重复的数据,需要去重
    successful_file_only_name = list(set(successful_file_only_name))
    lost_file_only_name = list(set(lost_file_only_name))
    successful_file_only_name.sort()
    lost_file_only_name.sort()

    # 有的数据包,可能一部分负载匹配成功,进入了成功的列表,一部分匹配失败,进入了失败的列表,现在处理这种异常结果
    '''
    下面的单层for循环不能完全处理异常,使用双层for循环处理异常现象
    for i in lost_file_only_name:
    if i in successful_file_only_name:
        lost_file_only_name.remove(i)
    '''
    #
    for s in successful_file_only_name:
        for l in lost_file_only_name:
            if s == l:
                lost_file_only_name.remove(l)

    give_result()
    print('检查结束,请在桌面查看结果')
    print(
        "数据包总计:{}".format(len(successful_file_only_name) + len(lost_file_only_name)) + '\t' + "成功:{}".format(
            len(successful_file_only_name)) + '\t' + '失败:{}'.format(len(lost_file_only_name)))

    # os.system('pause')  # 在脚本中运行时可以删除此行

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/134301.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!