首页 > 其他分享 >网御守护者

网御守护者

时间:2024-11-26 11:59:21浏览次数:6  
标签:ip dpkt tcp data 网御 守护者 pcap 数据包

import dpkt
import argparse
import socket

# 定义阈值,用于判断是否存在攻击行为,初始值设为500,后续可通过命令行参数修改
THRESH = 500

# 函数功能:在给定的pcap数据包中查找是否有下载LoIc相关文件(.zip格式且包含'loic')的行为
# 参数:pcap是通过dpkt.pcap.Reader读取的数据包对象,包含了多个时间戳和对应的数据缓冲区
def findDownload(pcap):
    for (ts, buf) in pcap:
        try:
            # 从以太网帧数据缓冲区解析出以太网数据包对象
            eth = dpkt.ethernet.Ethernet(buf)
            # 获取以太网数据包中的IP数据部分
            ip = eth.data
            # 将IP源地址从网络字节序转换为点分十进制格式
            src = socket.inet_ntoa(ip.src)
            # 获取IP数据包中的TCP数据部分
            tcp = ip.data
            # 判断是否是TCP协议类型的数据包
            if isinstance(tcp, dpkt.tcp.TCP):
                # 尝试从TCP数据部分解析出HTTP请求对象
                http = dpkt.http.Request(tcp.data)
                # 判断HTTP请求方法是否为GET
                if http.method == 'GET':
                    # 将请求的URI转换为小写字母形式
                    uri = http.uri.lower()
                    # 判断URI中是否包含.zip并且包含'loic',如果是则打印相应提示信息
                    if '.zip' in uri and 'loic' in uri:
                        print('[!] ' + src + ' Downloaded LoIc.')
        except Exception as e:
            print(f"Error in findDownload at time {ts}: {e}")

# 函数功能:在给定的pcap数据包中查找是否存在DDoS蜂巢命令(通过特定端口和特定关键字判断)
# 参数:pcap是通过dpkt.pcap.Reader读取的数据包对象,包含了多个时间戳和对应的数据缓冲区
def findHivemind(pcap):
    for (ts, buf) in pcap:
        try:
            eth = dpkt.ethernet.Ethernet(buf)
            ip = eth.data
            src = socket.inet_ntoa(ip.src)
            dst = socket.inet_ntoa(ip.dst)
            tcp = ip.data
            if isinstance(tcp, dpkt.tcp.TCP):
                # 获取TCP目标端口号和源端口号
                dport = tcp.dport
                sport = tcp.sport
                # 判断目标端口或源端口是否为6667(特定的用于识别的端口号)
                if dport == 6667 or sport == 6667:
                    # 判断TCP数据中是否包含特定关键字'!lazor'(用于识别相关命令),如果是则打印相关提示信息
                    if '!lazor' in tcp.data.lower():
                        print('[!] DDoS hivemind issued by: ' + src)
                        print('[+] Target CMD: ' + tcp.data)
        except Exception as e:
            print(f"Error in findHivemind at time {ts}: {e}")

# 函数功能:在给定的pcap数据包中查找是否存在攻击行为,通过统计特定流的数据包数量并与阈值比较来判断
# 参数:pcap是通过dpkt.pcap.Reader读取的数据包对象,包含了多个时间戳和对应的数据缓冲区
def findAttack(pcap):
    pktCount = {}
    for (ts, buf) in pcap:
        try:
            eth = dpkt.ethernet.Ethernet(buf)
            ip = eth.data
            src = socket.inet_ntoa(ip.src)
            dst = socket.inet_ntoa(ip.dst)
            tcp = ip.data
            if isinstance(tcp, dpkt.tcp.TCP):
                dport = tcp.dport
                # 构建一个表示流的字符串,格式为源IP:目的IP:目的端口号
                stream = src + ':' + str(dst) + ':' + str(dport)
                # 如果该流已经在统计字典中,则数据包数量加1
                if stream in pktCount:
                    pktCount[stream] = pktCount[stream] + 1
                else:
                    # 如果是新的流,则初始化为1
                    pktCount[stream] = 1
        except Exception as e:
            print(f"Error in findAttack at time {ts}: {e}")
    for stream in pktCount:
        pktsSent = pktCount[stream]
        # 判断该流的数据包发送数量是否超过设定的阈值,如果是则打印相应的攻击提示信息
        if pktsSent > THRESH:
            src = stream.split(':')[0]
            dst = stream.split(':')[1]
            dport = int(stream.split(':')[2])
            print('[+] ' + src + ' attacked ' + dst + ':' + str(dport) + ' with ' + str(pktsSent) + ' pkts.')

# 函数功能:在给定的pcap数据包中查找是否存在FTP相关活动(通过检测FTP相关命令关键字和端口号判断)
# 参数:pcap是通过dpkt.pcap.Reader读取的数据包对象,包含了多个时间戳和对应的数据缓冲区
def findFTP(pcap):
    for (ts, buf) in pcap:
        try:
            eth = dpkt.ethernet.Ethernet(buf)
            ip = eth.data
            tcp = ip.data
            if isinstance(tcp, dpkt.tcp.TCP):
                # 判断是否是FTP相关端口(21端口用于FTP服务)
                if tcp.dport == 21 or tcp.sport == 21:
                    data = tcp.data
                    # 判断FTP数据中是否包含常见的FTP命令关键字(USER、PASS、RETR),如果是则打印相应提示信息
                    if data and ('USER' in data or 'PASS' in data or 'RETR' in data):
                        src = socket.inet_ntoa(ip.src)
                        dst = socket.inet_ntoa(ip.dst)
                        print(f'[!] FTP activity detected between {src} and {dst}')
        except Exception as e:
            print(f"Error in findFTP at time {ts}: {e}")

# 函数功能:在给定的pcap数据包中查找是否存在HTTP相关请求(通过检测端口号和解析HTTP请求对象判断)
# 参数:pcap是通过dpkt.pcap.Reader读取的数据包对象,包含了多个时间戳和对应的数据缓冲区
def findHTTP(pcap):
    for (ts, buf) in pcap:
        try:
            eth = dpkt.ethernet.Ethernet(buf)
            ip = eth.data
            tcp = ip.data
            if isinstance(tcp, dpkt.tcp.TCP):
                # 判断是否是HTTP或HTTPS相关端口(80用于HTTP,443用于HTTPS)
                if tcp.dport == 80 or tcp.sport == 80 or tcp.dport == 443 or tcp.sport == 443:
                    data = tcp.data
                    if data:
                        http = dpkt.http.Request(data)
                        # 如果能成功解析出HTTP请求的方法和URI,则打印详细的请求信息
                        if http.method and http.uri:
                            print(f'[!] HTTP {http.method} request from {socket.inet_ntoa(ip.src)} to {socket.inet_ntoa(ip.dst)} for {http.uri}')
                        else:
                            # 如果只能检测到有HTTP相关流量但无法解析出详细请求信息,则打印基本的流量提示信息
                            print(f'[!] HTTP traffic detected between {socket.inet_ntoa(ip.src)} and {socket.inet_ntoa(ip.dst)}')
        except Exception as e:
            print(f"Error in findHTTP at time {ts}: {e}")

# 函数功能:解析给定的pcap数据包,打印出基本的数据包信息,如时间戳、以太网帧、IP地址、TCP端口等,并简单提示可能的FTP和HTTP相关流量
# 参数:pcap是通过dpkt.pcap.Reader读取的数据包对象,包含了多个时间戳和对应的数据缓冲区
def parse_packet(pcap):
    for (ts, buf) in pcap:
        try:
            eth = dpkt.ethernet.Ethernet(buf)
            print(f"Time: {ts}, Ethernet Frame")
            ip = eth.data
            if isinstance(ip, dpkt.ip.IP):
                src = socket.inet_ntoa(ip.src)
                dst = socket.inet_ntoa(ip.dst)
                print(f"IP: {src} -> {dst}")
                if ip.p == dpkt.ip.IP_PROTO_TCP:
                    tcp = ip.data
                    print(f"TCP: {tcp.sport} -> {tcp.dport}")
                    if tcp.dport == 21 or tcp.sport == 21:
                        print("[!] Possible FTP traffic detected")
                    if tcp.dport == 80 or tcp.sport == 80 or tcp.dport == 443 or tcp.sport == 443:
                        print("[!] Possible HTTP/HTTPS traffic detected")
        except Exception as e:
            print(f"Error parsing packet at time {ts}: {e}")

# 主函数,程序的入口点,负责解析命令行参数,读取pcap文件并调用各个分析函数来分析数据包内容
def main():
    # 创建命令行参数解析器对象,用于解析输入的参数
    parser = argparse.ArgumentParser(description='Analyze pcap file for network attacks.')
    # 添加-p/--pcap参数,用于指定要分析的pcap文件名,该参数是必需的
    parser.add_argument('-p', '--pcap', dest='pcapFile', type=str, required=True, help='specify pcap filename')
    # 添加-t/--thresh参数,用于指定判断攻击行为的阈值数量,该参数是可选的
    parser.add_argument('-t', '--thresh', dest='thresh', type=int, required=False, help='specify threshold count')
    args = parser.parse_args()

    # 如果通过命令行参数指定了阈值,则更新全局的阈值变量THRESH
    if args.thresh is not None:
        THRESH = args.thresh

    pcapFile = args.pcapFile
    with open(pcapFile, 'rb') as f:
        # 使用dpkt.pcap.Reader读取pcap文件,获取数据包对象
        pcap = dpkt.pcap.Reader(f)
        # 调用解析数据包基本信息的函数
        parse_packet(pcap)
        # 调用查找下载LoIc相关文件行为的函数
        findDownload(pcap)
        # 调用查找DDoS蜂巢命令的函数
        findHivemind(pcap)
        # 调用查找攻击行为的函数
        findAttack(pcap)
        # 调用查找FTP相关活动的函数
        findFTP(pcap)
        # 调用查找HTTP相关请求的函数
        findHTTP(pcap)

if __name__ == '__main__':
    main()
运行命令:

返回结果:

标签:ip,dpkt,tcp,data,网御,守护者,pcap,数据包
From: https://blog.csdn.net/qq_68809241/article/details/144055426

相关文章

  • 护栏碰撞监测传感器:公路安全守护者
        ​    ​在现代纵横交错的交通体系中,高速公路扮演着至关重要的角色。为了确保高速公路的安全畅通,各种先进的技术手段不断被应用。其中,护栏碰撞监测传感器正逐渐成为公路养护单位的新宠。    ​    ​护栏碰撞监测传感器是一种高科技设备,它通过先进的传感......
  • 揭秘SSL:如何成为您的在线隐私守护者
    2021年11月1日,在公民个人信息保护领域国家正式实施了一部具有重要意义的法律——《中华人民共和国个人信息保护法》,该部法律在个人信息保护方面做了相关规定,使得公民个人信息保护走上了法治的轨道,公民在保护个人信息方面开始有法可依。国家颁布实施的这部法律一方面彰显了在保......
  • 自动驾驶系列—LDW(车道偏离预警):智能驾驶的安全守护者
    ......
  • 耐碎石冲击试验机:汽车品质的守护者
    在汽车工业中,一款车型从研发到上市,需经历无数严苛的测试,以确保其安全性和可靠性。其中,耐碎石冲击试验机扮演着至关重要的角色,它是检验车辆外部材料抗冲击能力的利器,尤其在验证前大灯、后视镜、挡风玻璃等部位的耐碎石性能方面,发挥着不可替代的作用。上海和晟HS-SS-1A耐碎石冲击试......
  • 文心智能体-心灵守护者
    这是一个扮演心灵倾听者的AI助手,为用户提供情感支持和心理疏导。人物设定:你是一个心灵守护者,一个专心的倾听者,致力于为用户提供情感支持和心理疏导。在用户遇到情感困扰或心理压力时,你能够通过专业的知识和技巧,帮助用户理解自己的情感,探索问题的本质,并寻找积极的解决方案。你的目标......
  • 利士策分享,致敬创业者背后的守护者们
    利士策分享,致敬创业者背后的守护者们在这个光鲜亮丽的创业舞台上,聚光灯下往往站立着那些敢于梦想、勇于探索的创业者,他们的故事激励着无数人。然而,在这辉煌的背后,有一群人,他们如同夜空中最不起眼的星辰,却以无声的力量,照亮了创业者前行的道路。他们是创业者背后默默付出的守......
  • 数据库守护者:揭秘MySQL组复制的高可用魔法
    mysql高可用之组复制(MGR)(数据库守护者:揭秘MySQL组复制的高可用魔法)什么是MySQLGroupReplication?MySQLGroupReplication是一个基于组通信的复制解决方案,它允许将多个MySQL实例组织成一个组,在该组内进行事务的一致性复制。这样可以确保即使某个实例发生故障,其他实例......
  • 未来浏览器的守护者:CSS @supports 规则全解析
    标题:未来浏览器的守护者:CSS@supports规则全解析摘要随着CSS语言的不断发展,新特性层出不穷,但并非所有浏览器都同步支持这些特性。@supports规则是CSS中用于检测浏览器是否支持特定CSS特性的一种条件性规则。本文将详细介绍@supports规则的使用方法,并通过代码示例展示如何......
  • Ftrans跨网文件安全交换系统:企业数据安全的守护者!
    近年来全球网络安全威胁态势的加速严峻,使得企业对于网络安全有了前所未有的关注高度。在严峻的安全态势之下,企业的网络安全体系建设正从“以合规为导向”转变到“以风险为导向”,从原来的“保护安全边界”转换到“保护核心数据资产”的思路上来。  网络隔离已成为很多企业首......
  • 深度体验:可道云teamOS的私密保险箱,你的数据安全守护者
    自从我开始使用可道云teamOS,我就被它丰富的功能和便捷的操作深深吸引。而其中,最让我印象深刻的莫过于它的私密保险箱功能了。个人数据保险箱说实话,作为一个经常需要在网上处理各种文件和数据的人,数据安全问题一直是我非常关心的问题。而可道云teamOS的私密保险箱,就像是我个......