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(无线协议)
,通过对各类协议的解析,可以实现一些高级功能,例如: 特征库匹配、漏洞扫描检测、一些网络攻击检测等等。
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)
//下面的代码取具体的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系统上对目标数据库尝试匿名登录,如图:
从上面的抓包文件中,我们可以根据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包跑一下,可以看到已经匹配到行为特征,如图:
可以看到,已经成功命中行为特征。
原文地址:https://blog.csdn.net/suntiger/article/details/134336903
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_24036.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!