当前位置:首页 > 科技  > 软件

用Go实现自己的网络流量解析和行为检测引擎

来源: 责编: 时间:2024-01-02 09:30:08 134观看
导读1.前言最近有个在学校读书的迷弟问我:大德德, 有没有这么一款软件, 能够批量读取多个抓包文件,并把我想要的数据呈现出来, 比如:源IP、目的IP、源mac地址、目的mac地址等等。我说:“这样的软件你要认真找真能找出不少

1.前言

最近有个在学校读书的迷弟问我:大德德, 有没有这么一款软件, 能够批量读取多个抓包文件,并把我想要的数据呈现出来, 比如:源IP、目的IP、源mac地址、目的mac地址等等。我说:“这样的软件你要认真找真能找出不少开源软件, 但毕竟没有你自己的灵魂在里面,要不咱自己用Go实现一个吧”, OK , Let's go。dgh28资讯网——每日最新资讯28at.com

dgh28资讯网——每日最新资讯28at.com

2.摘要

能够实现网络协议解析和分析的工具有很多,最有名使用最多的是基于图形化界面的Wireshark, 除了能够实现网络实时抓包,还能够离线分析Pcap包文件, 虽然它通常用于手动分析网络数据包, 但也支持自动化脚本和插件来提取元数据。而Wireshark还有一个基于命令行版本的Tshark, 可以用于自动化任务, 可以批量处理Pcap文件, 提取所需数据并导出到文件中。dgh28资讯网——每日最新资讯28at.com

本次用Go语言实现的网络协议解析功能是基于Google公司开发一个开源库:gopacket, 该库帮我们完成了网络协议的一些底层封装, 它允许我们能够捕获、解析和处理网络数据包, 与Wireshark一样,也支持对离线抓包文件的分析。gopacket库提供了一系列功能,包括:数据包捕获、解析和构建, 以及对多种协议的支持,如:Ethernet、IP、TCP、UDP、HTTP等。它还提供了方便的API, 以帮助开发者操作和分析网络数据包。dgh28资讯网——每日最新资讯28at.com

3.实现原理

谷歌公司开发的gopacket提供了5个子包接口供使用者调用,其中Layers子包负责协议解析;pcap子包实际是libpcap的包装,主要用于数据包格式解析;pfring子包和afpacket用于快速数据库包抓取;tcpassembly用于TCP流重组。在本篇文章中,主要利用gopacket提供的Layers和pcap接口实现上层业务逻辑。在流量解析引擎中,调用pcap接口对离线pcap抓包文件进行数据包解析,并配合Layers接口实现协议解析,目前根据业务种类,实现的协议解析包括:HTTP协议、TCP/UDP协议、ICMP协议和802.11协议。流量解析引擎的整体架构如下:dgh28资讯网——每日最新资讯28at.com

dgh28资讯网——每日最新资讯28at.com

我们实现的流量解析引擎主要针对离线pcap包文件, 支持的协议类型包括:HTTP协议、TCP/UDP协议、ICMP协议、802.11(无线协议),通过对各类协议的解析,可以实现一些高级功能,例如: 特征库匹配、漏洞扫描检测、一些网络攻击检测等等。dgh28资讯网——每日最新资讯28at.com

通过对gopacket开源包的研究,整理出其使用方法如下:dgh28资讯网——每日最新资讯28at.com

  • 利用pcap子包的OpenOffline方法加载离线数据包文件,加载成功返回离线数据包文件句柄。
  • 离线包文件句柄通过SetBPFFilter方法过滤数据类型,调用LinkType()方法获取链路类型。
  • 将第2步中的文件句柄和LinkType作为参数调用方法NewPacketSource。
  • NewPacketSource调用Packet()方法获取离线包文件中所有的数据包,通过遍历每个数据包进行下一步操作。
  • 每个数据包对象通过调用Layer()方法获取数据对象层,参数为数据对象的种类,种类有很多种,根据不同的协议类型进行区分。
  • 获取的数据层级操作对象是数据包解析基础方法需要达到的目的,即将解析的具体数据将在数据层级中进行不同方法的筛选。

大致的调用关系整理如下图:dgh28资讯网——每日最新资讯28at.com

dgh28资讯网——每日最新资讯28at.com

4.功能代码实现

在我们的工程项目中,首先要引入三个包,它们是:dgh28资讯网——每日最新资讯28at.com

import(  "github.com/google/gopacket"  "github.com/google/gopacket/layers"  "github.com/google/gopacket/pcap")

因为我们操作的对象主要是针对离线pcap包, 因此首先要加载离线包文件,代码如下:dgh28资讯网——每日最新资讯28at.com

handle, err = pcap.OpenOffline(pcapFilePath)if err != nil {    log.Panic(err)}

handle是加载离线包文件后返回的文件句柄,类型为:*pcap.Handle,接下来我们要设置一下过滤,只针对tcp连接的包,所以通过上面的文件句柄调用过滤函数:dgh28资讯网——每日最新资讯28at.com

err = handle.SetBPFFilter("tcp")  if err != nil {  log.Panic(err)}

根据上面的调用关系图,我们需要调用NewPacketSource方法,代码如下:dgh28资讯网——每日最新资讯28at.com

packetSource := gopacket.NewPacketSource(handle, handle.LinkType())packets := packetSource.Packets()

packetSource.Packets()方法返回的是一个通道, 用来接收gopacket解析出来的每一个数据包,dgh28资讯网——每日最新资讯28at.com

因此这里需要做循环接收,并在循环内容解析ethernet层, 解析大致过程如下:dgh28资讯网——每日最新资讯28at.com

dgh28资讯网——每日最新资讯28at.com

下面我们根据上面的流程图解析LayerTypeEthernet, 代码如下:dgh28资讯网——每日最新资讯28at.com

for packet := range packetSource.Packets() {    ethernetLayer := packet.Layer(layers.LayerTypeEthernet)    if ethernetLayer == nil {        continue    }    ethernetPacket, _ := ethernetLayer.(*layers.Ethernet)}

下面涉及到协议的层级,我们对照Wireshark的包对比看一下,如图:dgh28资讯网——每日最新资讯28at.com

dgh28资讯网——每日最新资讯28at.com

从上图的协议结构中我们可以看到,源IP地址和目的IP地址是在IPv4层上, 源端口和目的端口是在TCP层上, 而mac地址是在Ethernet层上, 因此要想获取这6个元数据,我们至少要解析三层协议, 添加以下代码:dgh28资讯网——每日最新资讯28at.com

for packet := range packetSource.Packets() {    ethernetLayer := packet.Layer(layers.LayerTypeEthernet)    if ethernetLayer == nil {        continue    }    ethernetPacket, _ := ethernetLayer.(*layers.Ethernet)    if ethernetPacket.EthernetType.String() == "IPv4" {        ipLayer := packet.Layer(layers.LayerTypeIPv4)        if ipLayer == nil { continue }                // 这里从IPv4协议层取源IP和目的IP数据        ipInfo, _ := ipLayer.(*layers.IPv4)                        tcpLayer := packet.Layer(layers.LayerTypeTCP)        if tcpLayer == nil { continue }                // 这里从TCP协议层取TCP数据,获取源端口和目的端口数据        tcpInfo, _ := tcpLayer.(*layers.TCP)                //下面的代码取具体的Payload        applicationLayer := packet.ApplicationLayer()        if applicationLayer == nil { continue }        payload := string(applicationLayer.Payload())                // 从GET或POST请求中取出元数据        if strings.HasPrefix(payload, "GET") || strings.HasPrefix(payload, "POST") {            fmt.Println("源mac地址:", ethernetPacket.SrcMAC.String())            fmt.Println("目的Mac地址:", ethernetPacket.DstMAC.String())            fmt.Println("源IP地址:", ipInfo.SrcIP.String())            fmt.Println("目的IP地址:", ipInfo.DstIP.String())            fmt.Println("源端口:", int(tcpInfo.SrcPort))            fmt.Println("目的端口:", int(tcpInfo.DstPort))        }    }}

5.行为检测实现

这里我们以检测数据库的匿名登录行为为例子, 首先在kali系统上对目标数据库尝试匿名登录,如图:dgh28资讯网——每日最新资讯28at.com

dgh28资讯网——每日最新资讯28at.com

在登录过程中,使用Wireshark进行网络抓包,如图:dgh28资讯网——每日最新资讯28at.com

dgh28资讯网——每日最新资讯28at.com

从上面的抓包文件中,我们可以根据Payload偏移提取一些行为特征,例如:dgh28资讯网——每日最新资讯28at.com

dgh28资讯网——每日最新资讯28at.com

将特征检测的逻辑加入到代码中:dgh28资讯网——每日最新资讯28at.com

for packet := range packetSource.Packets() {    ethernetLayer := packet.Layer(layers.LayerTypeEthernet)    if ethernetLayer == nil {        continue    }    ethernetPacket, _ := ethernetLayer.(*layers.Ethernet)    if ethernetPacket.EthernetType.String() == "IPv4" {        ipLayer := packet.Layer(layers.LayerTypeIPv4)        if ipLayer == nil { continue }                // 这里从IPv4协议层取源IP和目的IP数据        ipInfo, _ := ipLayer.(*layers.IPv4)                if ipInfo.Protocol.String() == "TCP" {          tcpLayer := packet.Layer(layers.LayerTypeTCP)          tcp, _ := tcpLayer.(*layers.TCP)          if (len(tcp.Payload) > 36 && bytes.Equal(tcp.Payload[13:37], []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})) || (len(tcp.Payload) > 39 && bytes.Equal(tcp.Payload[13:40], []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 111, 111, 116})) {            fmt.Println("发现数据库匿名登录行为!")          }        }    }}

将上面的代码编译后加载离线pcap包跑一下,可以看到已经匹配到行为特征,如图:dgh28资讯网——每日最新资讯28at.com

dgh28资讯网——每日最新资讯28at.com

可以看到,已经成功命中行为特征。dgh28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-55078-0.html用Go实现自己的网络流量解析和行为检测引擎

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 又崩了?盘点2023年十大线上事故!

下一篇: [备忘录]Markdown最常用的20个语法

标签:
  • 热门焦点
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • Rust中的高吞吐量流处理

    Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 分布式系统中的CAP理论,面试必问,你理解了嘛?

    分布式系统中的CAP理论,面试必问,你理解了嘛?

    对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测。而且看了很多书和视频还是一脸懵逼。这篇文章主要使用大白话的方式,带你理解一下分布式系统
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • Python异步IO编程的进程/线程通信实现

    Python异步IO编程的进程/线程通信实现

    这篇文章再讲3种方式,同时讲4中进程间通信的方式一、 Python 中线程间通信的实现方式共享变量共享变量是多个线程可以共同访问的变量。在Python中,可以使用threading模块中的L
  • 零售大模型“干中学”,攀爬数字化珠峰

    零售大模型“干中学”,攀爬数字化珠峰

    文/侯煜编辑/cc来源/华尔街科技眼对于绝大多数登山爱好者而言,攀爬珠穆朗玛峰可谓终极目标。攀登珠峰的商业路线有两条,一是尼泊尔境内的南坡路线,一是中国境内的北坡路线。相
  • 小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    作者:黄河懂运营一条性教育视频,被54万人“珍藏”是什么体验?最近,情感博主@公主是用鲜花做的,火了!仅仅凭借一条视频,光小红书就有超过128万人,为她疯狂点赞!更疯狂的是,这
  • 腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    作者:无锈钵来源:财经无忌7月16日晚,上海1862时尚艺术中心。伴随着幻象的精准命中,硕大的荧幕之上,比分被定格在了14:12,被寄予厚望的EDG战队以绝对的优势战胜了BLG战队,拿下了总决
  • OPPO K11样张首曝:千元机影像“卷”得真不错!

    OPPO K11样张首曝:千元机影像“卷”得真不错!

    一直以来,OPPO K系列机型都保持着较为均衡的产品体验,历来都是2K价位的明星机型,去年推出的OPPO K10和OPPO K10 Pro两款机型凭借各自的出色配置,堪称有
Top