当前位置: 首页 > news >正文

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

1.前言

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

2.摘要

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

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

3.实现原理

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

我们实现的流量解析引擎主要针对离线pcap包文件, 支持的协议类型包括:HTTP协议、TCP/UDP协议、ICMP协议、802.11(无线协议)

,通过对各类协议的解析,可以实现一些高级功能,例如: 特征库匹配、漏洞扫描检测、一些网络攻击检测等等。

通过对gopacket开源包的研究,整理出其使用方法如下:

  • 利用pcap子包的OpenOffline方法加载离线数据包文件,加载成功返回离线数据包文件句柄。

  • 离线包文件句柄通过SetBPFFilter方法过滤数据类型,调用LinkType()方法获取链路类型。

  • 将第2步中的文件句柄和LinkType作为参数调用方法NewPacketSource。

  • NewPacketSource调用Packet()方法获取离线包文件中所有的数据包,通过遍历每个数据包进行下一步操作。

  • 每个数据包对象通过调用Layer()方法获取数据对象层,参数为数据对象的种类,种类有很多种,根据不同的协议类型进行区分。

  • 获取的数据层级操作对象是数据包解析基础方法需要达到的目的,即将解析的具体数据将在数据层级中进行不同方法的筛选。

大致的调用关系整理如下图:

4.功能代码实现

在我们的工程项目中,首先要引入三个包,它们是:

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

因为我们操作的对象主要是针对离线pcap包, 因此首先要加载离线包文件,代码如下:

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

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

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

根据上面的调用关系图,我们需要调用NewPacketSource方法,代码如下:

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

packetSource.Packets()方法返回的是一个通道, 用来接收gopacket解析出来的每一个数据包,

因此这里需要做循环接收,并在循环内容解析ethernet层, 解析大致过程如下:

下面我们根据上面的流程图解析LayerTypeEthernet, 代码如下:

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

下面涉及到协议的层级,我们对照Wireshark的包对比看一下,如图:


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

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)//下面的代码取具体的PayloadapplicationLayer := 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系统上对目标数据库尝试匿名登录,如图:

在登录过程中,使用Wireshark进行网络抓包,如图:

从上面的抓包文件中,我们可以根据Payload偏移提取一些行为特征,例如:

将特征检测的逻辑加入到代码中:

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包跑一下,可以看到已经匹配到行为特征,如图:

可以看到,已经成功命中行为特征。

相关文章:

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

1.前言 最近有个在学校读书的迷弟问我:大德德, 有没有这么一款软件, 能够批量读取多个抓包文件,并把我想要的数据呈现出来, 比如:源IP、目的IP、源mac地址、目的mac地址等等。我说:“这样的软件你要认真找真能找出不少开源软件, 但毕竟没有你自己的灵魂在里面,要不…...

Mysql数据备份 — mysqldump

一 备份类型 - 逻辑备份(mysqldump): - 优点: - 恢复简单,可以使用管道将他们输入到mysql。 - 与存储引擎无关,因为是从MySQL服务器中提取数据而生成的,所以消除了底层数据…...

vue使用Echarts5实现词云图

先上官网 词云图有些特殊,它属于Echarts 的扩展,需要额外安装Echarts-wordcloud包。 Echarts 官网 Echarts-wordcloud 词云图官网 先安装 npm install echarts npm install echarts-wordcloud再引入 echarts选一个引入就行;4或5版本都可以 …...

带有密码的Excel只读模式,如何取消?

Excel文件打开之后发现是只读模式,想要退出只读模式,但是只读模式是带有密码的,该如何取消带有密码的excel只读文件呢? 带有密码的只读模式,是设置了excel文件的修改权限,取消修改权限,我们需要…...

Linux下基本操作命令

一、基础命令 1. pwd 命令 pwd命令用于显示当前所在的工作目录的全路径名称。该命令无需任何参数,只需在终端窗口中输入 pwd 命令即可使用。 2. cd 命令 cd命令用于更改当前工作目录。该命令需要一个参数:目标目录名称。例如,若要进入 Do…...

JVS低代码表单自定义按钮的使用说明和操作示例

在普通的表单设计中,虽然自带的【提交】、【重置】、【取消】按钮可以满足基本操作需求,但在面对更多复杂的业务场景时,这些按钮的显示控制就显得有些力不从心。为了更好地满足用户在表单操作过程中的个性化需求,JVS低代码推出了表…...

C++--二叉树经典例题

本文,我们主要讲解一些适合用C的数据结构来求解的二叉树问题,其中涉及了二叉树的遍历,栈和队列等数据结构,递归与回溯等知识,希望可以帮助你进一步理解二叉树。 目录​​​​​​​ 1.二叉树的层序遍历 2.二叉树的公…...

软件测试需要学习什么?好学吗?需要学多久?到底是报班好还是自学好?

前言: 我发现很多的小伙伴刚刚毕业和想转行的小伙伴对于软件测试很陌生,其中很有很多的小伙伴还踩不少的坑,花费了大量的精力和时间去探索,结果还是一无所获。这里给大家出一期关于软件测试萌新的疑惑,看完这篇文章你就…...

Ubuntu搭建AI画图工具stable diffusion-webui

Ubuntu搭建 安装依赖项 安装以下依赖项: # Debian-based: sudo apt install wget git python3 python3-venv libgl1 libglib2.0-0# Red Hat-based: sudo dnf install wget git python3# Arch-based: sudo pacman -S wget git python3下载并安装WebUI 进入您想要安…...

智能优化算法(一):伪随机数的产生

文章目录 1.伪随机数介绍1.1.伪随机产生的意义1.2.伪随机产生的过程 2.产生U(0,1)的乘除同余法2.1.原始的乘同余法2.2.改进的乘同余法 3.产生正态分布的伪随机数4.基于逆变法产生伪随机数 1.伪随机数介绍 1.1.伪随机产生的意义 1.随机数的产生是进行随机优化的第一步也是最重要…...

python 调用Oracle有返回参数的存储过程

python 调用Oracle有返回参数的存储过程 1. 存储过程 create or replace procedure pro_test_args(a in integer,b in integer, c out integer) is beginc: a * b ;end pro_test_args;2. Python调用存储过程 import cx_Oracle import os import sys# 连接数据库 #conn cx_O…...

700. 二叉搜索树中的搜索

原题链接700. 二叉搜索树中的搜索 思路: 给定的就是一个二叉搜索树 二叉搜索树是一个有序树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结…...

GO学习之 互斥锁、读写锁该如何取舍

GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…...

Internet的特点

Internet是一个全球性的计算机网络系统,它将全世界各个地方已有的各种网络(如计算机网、数据通信网以及公用电话交换网等)互联起来,组成一个跨越国界范围的庞大的互联网,因此,也称为“网络的网络”。Internet在很短的时间内风靡全…...

Rust4.2 Common Collections

Rust学习笔记 Rust编程语言入门教程课程笔记 参考教材: The Rust Programming Language (by Steve Klabnik and Carol Nichols, with contributions from the Rust Community) Lecture 8: Common Collections fn main() {//Vectorlet mut v: Vec<i32> Vec::new();//…...

芸鹰蓬飞:抖音投流以后还有自然流量吗?

随着抖音平台的普及&#xff0c;企业和个人纷纷加入到这个短视频的热潮中。然而&#xff0c;一旦投入抖音投流&#xff0c;是否还能依赖自然流量&#xff1f;这是许多用户和品牌关心的问题。本文将深入剖析这一话题&#xff0c;探讨抖音投流与自然流量之间的关系。 一、抖音投…...

CTFhub-RCE-php://input

我们需要使用php://input来构造发送的指令 查看phpinfo&#xff0c;找到一下字段 证明是可以使用php://input 1. 使用Burpsuite抓包并转至Repeater 2. 构造包 方法&#xff1a;POST 目标&#xff1a;/?filephp://input Body&#xff1a;<?php system("ls /"…...

RISC-V处理器设计(五)—— 在 RISC-V 处理器上运行 C 程序

目录 一、前言 二、从 C 程序到机器指令 三、实验 3.1 实验环境 3.11 Windows 平台下环境搭建 3.12 Ubuntu 平台下环境搭建 3.13 实验涉及到的代码或目录 3.2 各文件作用介绍 3.2.1 link.lds 3.2.2 start.S 3.2.3 lib 和 include 目录 3.2.4 common.mk 3.2.5 demo …...

【PIE-Engine 数据资源】全球250米LAI产品

文章目录 一、 简介二、描述三、波段四、示例代码参考资料 一、 简介 数据名称全球250米LAI产品时间范围2015年空间范围全球数据来源北京师范大学肖志强教授团队代码片段var images pie.ImageCollection(“BNU/LAI/GLOBAL-250”) 二、描述 全球 250 米叶面指数产品由北京师范…...

vcomp120.dll丢失怎么办?vcomp120.dll丢失的解决方法分享

vcomp120.dll丢失”。这个错误通常会导致某些应用程序无法正常运行&#xff0c;给用户带来困扰。那么&#xff0c;当我们遇到这个问题时&#xff0c;应该如何修复呢&#xff1f;下面我将为大家介绍四个修复vcomp120.dll丢失的方法。 一、使用dll修复程序修复 可以通过百度或许…...

【书生·浦语】internlm2-chat-1.8b部署避坑指南:模型拉取失败/响应延迟/中文乱码全解

【书生浦语】internlm2-chat-1.8b部署避坑指南&#xff1a;模型拉取失败/响应延迟/中文乱码全解 1. 环境准备与快速开始 在开始使用internlm2-chat-1.8b之前&#xff0c;我们先来了解一下这个模型的基本情况。这是一个拥有18亿参数的中文对话模型&#xff0c;专门针对聊天场景…...

Pixel Script Temple多场景落地:政务宣传短视频、乡村振兴纪录片脚本生成

Pixel Script Temple多场景落地&#xff1a;政务宣传短视频、乡村振兴纪录片脚本生成 1. 专业剧本创作工具介绍 Pixel Script Temple&#xff08;像素剧本圣殿&#xff09;是一款基于Qwen2.5-14B-Instruct大模型深度优化的专业剧本创作工具。它将先进的AI推理能力与独特的8-B…...

避开PLC烧毁陷阱:FX3S晶体管输出必须知道的7个细节(含虚设电阻计算)

避开PLC烧毁陷阱&#xff1a;FX3S晶体管输出必须知道的7个细节&#xff08;含虚设电阻计算&#xff09; 在工业自动化现场&#xff0c;FX3S系列PLC的晶体管输出模块烧毁问题堪称"隐形杀手"。去年某汽车生产线因一个0.5A保险丝选型错误导致全线停产8小时&#xff0c;损…...

OpenClaw权限管控:安全使用SecGPT-14B的5条黄金法则

OpenClaw权限管控&#xff1a;安全使用SecGPT-14B的5条黄金法则 1. 为什么需要特别关注OpenClaw的权限安全&#xff1f; 去年我在调试一个自动整理文档的OpenClaw任务时&#xff0c;曾不小心让AI助手误删了整个工作目录——仅仅因为我在配置时勾选了"允许文件删除"…...

FMCW激光雷达深度剖析:从硅光芯片到车载落地的技术跃迁

1. FMCW激光雷达的技术本质&#xff1a;从硅光芯片到系统集成 第一次拆解FMCW激光雷达时&#xff0c;我被它的内部结构震撼到了——这哪里是传统意义上的激光雷达&#xff1f;分明是一个高度集成的光通信模块。与传统TOF激光雷达相比&#xff0c;FMCW最核心的突破在于它把测距原…...

学术研究利器:OpenClaw+gemma-3-12b-it自动整理文献综述

学术研究利器&#xff1a;OpenClawgemma-3-12b-it自动整理文献综述 1. 为什么需要自动化文献整理工具 作为一名经常需要阅读大量文献的研究者&#xff0c;我深刻体会到手动整理文献的痛点。每次写论文前&#xff0c;我需要花费数小时甚至数天时间从几十篇PDF中提取关键信息&a…...

Unity游戏开发:Highlight Plus 8.0在URP渲染管线下的完整配置指南(含常见问题解决)

Unity游戏开发&#xff1a;Highlight Plus 8.0在URP渲染管线下的完整配置指南&#xff08;含常见问题解决&#xff09; 在Unity游戏开发中&#xff0c;模型高亮效果是提升交互体验的关键技术之一。Highlight Plus作为一款功能强大的高亮插件&#xff0c;能够为3D模型添加轮廓光…...

10点滑动平均滤波器:嵌入式零依赖高效实现

1. 项目概述MovingAverageFilter 是一个轻量级、零依赖的嵌入式数字滤波器实现&#xff0c;专为资源受限的微控制器环境设计。其核心功能是执行固定长度&#xff08;10点&#xff09;的滑动平均&#xff08;Moving Average&#xff09;运算&#xff0c;并在每次新采样输入后立即…...

如何高效解析HTTP头?JSON-java中HTTP与HTTPTokener的终极指南

如何高效解析HTTP头&#xff1f;JSON-java中HTTP与HTTPTokener的终极指南 【免费下载链接】JSON-java A reference implementation of a JSON package in Java. 项目地址: https://gitcode.com/gh_mirrors/js/JSON-java JSON-java作为Java平台上处理JSON数据的权威库&am…...

pe_to_shellcode测试验证:如何确保PE转换后的功能完整性

pe_to_shellcode测试验证&#xff1a;如何确保PE转换后的功能完整性 【免费下载链接】pe_to_shellcode Converts PE into a shellcode 项目地址: https://gitcode.com/gh_mirrors/pe/pe_to_shellcode pe_to_shellcode是一款专业的PE转shellcode工具&#xff0c;能够将可…...