欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go實(shí)現(xiàn)自己的網(wǎng)絡(luò)流量解析和行為檢測(cè)引擎原理

 更新時(shí)間:2023年11月17日 09:54:21   作者:suntiger?二進(jìn)制空間安全  
這篇文章主要為大家介紹了Go實(shí)現(xiàn)自己的網(wǎng)絡(luò)流量解析和行為檢測(cè)引擎原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

最近有個(gè)在學(xué)校讀書的迷弟問(wèn)我:大德德, 有沒有這么一款軟件, 能夠批量讀取多個(gè)抓包文件,并把我想要的數(shù)據(jù)呈現(xiàn)出來(lái), 比如:源IP、目的IP、源mac地址、目的mac地址等等。我說(shuō):“這樣的軟件你要認(rèn)真找真能找出不少開源軟件, 但畢竟沒有你自己的靈魂在里面,要不咱自己用Go實(shí)現(xiàn)一個(gè)吧”, OK , Let's go。

摘要

能夠?qū)崿F(xiàn)網(wǎng)絡(luò)協(xié)議解析和分析的工具有很多,最有名使用最多的是基于圖形化界面的Wireshark, 除了能夠?qū)崿F(xiàn)網(wǎng)絡(luò)實(shí)時(shí)抓包,還能夠離線分析Pcap包文件, 雖然它通常用于手動(dòng)分析網(wǎng)絡(luò)數(shù)據(jù)包, 但也支持自動(dòng)化腳本和插件來(lái)提取元數(shù)據(jù)。而Wireshark還有一個(gè)基于命令行版本的Tshark, 可以用于自動(dòng)化任務(wù), 可以批量處理Pcap文件, 提取所需數(shù)據(jù)并導(dǎo)出到文件中。

本次用Go語(yǔ)言實(shí)現(xiàn)的網(wǎng)絡(luò)協(xié)議解析功能是基于Google公司開發(fā)一個(gè)開源庫(kù):gopacket, 該庫(kù)幫我們完成了網(wǎng)絡(luò)協(xié)議的一些底層封裝, 它允許我們能夠捕獲、解析和處理網(wǎng)絡(luò)數(shù)據(jù)包, 與Wireshark一樣,也支持對(duì)離線抓包文件的分析。gopacket庫(kù)提供了一系列功能,包括:數(shù)據(jù)包捕獲、解析和構(gòu)建, 以及對(duì)多種協(xié)議的支持,如:Ethernet、IP、TCP、UDP、HTTP等。它還提供了方便的API, 以幫助開發(fā)者操作和分析網(wǎng)絡(luò)數(shù)據(jù)包。

實(shí)現(xiàn)原理

谷歌公司開發(fā)的gopacket提供了5個(gè)子包接口供使用者調(diào)用,其中Layers子包負(fù)責(zé)協(xié)議解析;pcap子包實(shí)際是libpcap的包裝,主要用于數(shù)據(jù)包格式解析;pfring子包和afpacket用于快速數(shù)據(jù)庫(kù)包抓取;tcpassembly用于TCP流重組。在本篇文章中,主要利用gopacket提供的Layers和pcap接口實(shí)現(xiàn)上層業(yè)務(wù)邏輯。在流量解析引擎中,調(diào)用pcap接口對(duì)離線pcap抓包文件進(jìn)行數(shù)據(jù)包解析,并配合Layers接口實(shí)現(xiàn)協(xié)議解析,目前根據(jù)業(yè)務(wù)種類,實(shí)現(xiàn)的協(xié)議解析包括:HTTP協(xié)議、TCP/UDP協(xié)議、ICMP協(xié)議和802.11協(xié)議。流量解析引擎的整體架構(gòu)如下:

我們實(shí)現(xiàn)的流量解析引擎主要針對(duì)離線pcap包文件, 支持的協(xié)議類型包括:HTTP協(xié)議、TCP/UDP協(xié)議、ICMP協(xié)議、802.11(無(wú)線協(xié)議)

,通過(guò)對(duì)各類協(xié)議的解析,可以實(shí)現(xiàn)一些高級(jí)功能,例如: 特征庫(kù)匹配、漏洞掃描檢測(cè)、一些網(wǎng)絡(luò)攻擊檢測(cè)等等。

通過(guò)對(duì)gopacket開源包的研究,整理出其使用方法如下:

  • 利用pcap子包的OpenOffline方法加載離線數(shù)據(jù)包文件,加載成功返回離線數(shù)據(jù)包文件句柄。

  • 離線包文件句柄通過(guò)SetBPFFilter方法過(guò)濾數(shù)據(jù)類型,調(diào)用LinkType()方法獲取鏈路類型。

  • 將第2步中的文件句柄和LinkType作為參數(shù)調(diào)用方法NewPacketSource。

  • NewPacketSource調(diào)用Packet()方法獲取離線包文件中所有的數(shù)據(jù)包,通過(guò)遍歷每個(gè)數(shù)據(jù)包進(jìn)行下一步操作。

  • 每個(gè)數(shù)據(jù)包對(duì)象通過(guò)調(diào)用Layer()方法獲取數(shù)據(jù)對(duì)象層,參數(shù)為數(shù)據(jù)對(duì)象的種類,種類有很多種,根據(jù)不同的協(xié)議類型進(jìn)行區(qū)分。

  • 獲取的數(shù)據(jù)層級(jí)操作對(duì)象是數(shù)據(jù)包解析基礎(chǔ)方法需要達(dá)到的目的,即將解析的具體數(shù)據(jù)將在數(shù)據(jù)層級(jí)中進(jìn)行不同方法的篩選。

大致的調(diào)用關(guān)系整理如下圖:

功能代碼實(shí)現(xiàn)

在我們的工程項(xiàng)目中,首先要引入三個(gè)包,它們是:

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

因?yàn)槲覀儾僮鞯膶?duì)象主要是針對(duì)離線pcap包, 因此首先要加載離線包文件,代碼如下:

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

handle是加載離線包文件后返回的文件句柄,類型為:*pcap.Handle,接下來(lái)我們要設(shè)置一下過(guò)濾,只針對(duì)tcp連接的包,所以通過(guò)上面的文件句柄調(diào)用過(guò)濾函數(shù):

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

根據(jù)上面的調(diào)用關(guān)系圖,我們需要調(diào)用NewPacketSource方法,代碼如下:

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

packetSource.Packets()方法返回的是一個(gè)通道, 用來(lái)接收gopacket解析出來(lái)的每一個(gè)數(shù)據(jù)包,

因此這里需要做循環(huán)接收,并在循環(huán)內(nèi)容解析ethernet層, 解析大致過(guò)程如下:

下面我們根據(jù)上面的流程圖解析LayerTypeEthernet, 代碼如下:

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

下面涉及到協(xié)議的層級(jí),我們對(duì)照Wireshark的包對(duì)比看一下,如圖:

從上圖的協(xié)議結(jié)構(gòu)中我們可以看到,源IP地址和目的IP地址是在IPv4層上, 源端口和目的端口是在TCP層上, 而mac地址是在Ethernet層上, 因此要想獲取這6個(gè)元數(shù)據(jù),我們至少要解析三層協(xié)議, 添加以下代碼:

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協(xié)議層取源IP和目的IP數(shù)據(jù)
        ipInfo, _ := ipLayer.(*layers.IPv4)
        tcpLayer := packet.Layer(layers.LayerTypeTCP)
        if tcpLayer == nil { continue }
        // 這里從TCP協(xié)議層取TCP數(shù)據(jù),獲取源端口和目的端口數(shù)據(jù)
        tcpInfo, _ := tcpLayer.(*layers.TCP)
        //下面的代碼取具體的Payload
        applicationLayer := packet.ApplicationLayer()
        if applicationLayer == nil { continue }
        payload := string(applicationLayer.Payload())
        // 從GET或POST請(qǐng)求中取出元數(shù)據(jù)
        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))
        }
    }
}

行為檢測(cè)實(shí)現(xiàn)

這里我們以檢測(cè)數(shù)據(jù)庫(kù)的匿名登錄行為為例子, 首先在kali系統(tǒng)上對(duì)目標(biāo)數(shù)據(jù)庫(kù)嘗試匿名登錄,如圖:

在登錄過(guò)程中,使用Wireshark進(jìn)行網(wǎng)絡(luò)抓包,如圖:

從上面的抓包文件中,我們可以根據(jù)Payload偏移提取一些行為特征,例如:

將特征檢測(cè)的邏輯加入到代碼中:

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協(xié)議層取源IP和目的IP數(shù)據(jù)
        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("發(fā)現(xiàn)數(shù)據(jù)庫(kù)匿名登錄行為!")
          }
        }
    }
}

將上面的代碼編譯后加載離線pcap包跑一下,可以看到已經(jīng)匹配到行為特征,如圖:

可以看到,已經(jīng)成功命中行為特征。

以上就是Go實(shí)現(xiàn)自己的網(wǎng)絡(luò)流量解析和行為檢測(cè)引擎原理的詳細(xì)內(nèi)容,更多關(guān)于Go網(wǎng)絡(luò)流量解析行為檢測(cè)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang 的string與[]byte轉(zhuǎn)換方式

    golang 的string與[]byte轉(zhuǎn)換方式

    這篇文章主要介紹了golang 的string與[]byte轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • golang gorm 操作mysql及gorm基本用法

    golang gorm 操作mysql及gorm基本用法

    golang 官方的那個(gè)操作mysql的有點(diǎn)麻煩所以就使用了gorm,下面就gorm的使用做下簡(jiǎn)單介紹,感興趣的朋友跟隨小編一起看看吧
    2018-11-11
  • Golang基于Vault實(shí)現(xiàn)敏感數(shù)據(jù)加解密

    Golang基于Vault實(shí)現(xiàn)敏感數(shù)據(jù)加解密

    數(shù)據(jù)加密是主要的數(shù)據(jù)安全防護(hù)技術(shù)之一,敏感數(shù)據(jù)應(yīng)該加密存儲(chǔ)在數(shù)據(jù)庫(kù)中,降低泄露風(fēng)險(xiǎn),本文將介紹一下利用Vault實(shí)現(xiàn)敏感數(shù)據(jù)加解密的方法,需要的可以參考一下
    2023-07-07
  • go json數(shù)據(jù)轉(zhuǎn)發(fā)的實(shí)現(xiàn)代碼

    go json數(shù)據(jù)轉(zhuǎn)發(fā)的實(shí)現(xiàn)代碼

    這篇文章主要介紹了go json數(shù)據(jù)轉(zhuǎn)發(fā)的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Go語(yǔ)言如何生成PDF文件實(shí)例探究

    Go語(yǔ)言如何生成PDF文件實(shí)例探究

    這篇文章主要為大家介紹了Go語(yǔ)言生成PDF文件的實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Go語(yǔ)言實(shí)現(xiàn)UDP版聊天小工具的示例詳解

    Go語(yǔ)言實(shí)現(xiàn)UDP版聊天小工具的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Go語(yǔ)言實(shí)現(xiàn)聊天小工具(UDP版),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Go語(yǔ)言并發(fā)爬蟲的具體實(shí)現(xiàn)

    Go語(yǔ)言并發(fā)爬蟲的具體實(shí)現(xiàn)

    本文主要介紹了Go語(yǔ)言并發(fā)爬蟲的具體實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • GoLang反射機(jī)制深入講解

    GoLang反射機(jī)制深入講解

    這篇文章主要介紹了GoLang反射機(jī)制,反射是一種讓程序可以在運(yùn)行時(shí)( runtime )檢查其數(shù)據(jù)結(jié)構(gòu)的能力,通過(guò)反射可以獲取豐富的類型信息
    2022-12-12
  • 淺談beego默認(rèn)處理靜態(tài)文件性能低下的問(wèn)題

    淺談beego默認(rèn)處理靜態(tài)文件性能低下的問(wèn)題

    下面小編就為大家?guī)?lái)一篇淺談beego默認(rèn)處理靜態(tài)文件性能低下的問(wèn)題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Golang應(yīng)用程序性能優(yōu)化技巧分享

    Golang應(yīng)用程序性能優(yōu)化技巧分享

    隨著科技的進(jìn)步,人人都想要快速的應(yīng)用,這就需要優(yōu)化您的應(yīng)用程序性能。本文為大家整理了一些Golang應(yīng)用程序性能優(yōu)化的技巧,希望對(duì)大家有所幫助
    2023-04-04

最新評(píng)論