Golang:如何检查HTTP请求是否在TCP负载字节中。

huangapple go评论106阅读模式
英文:

Golang: how to check if an HTTP request is in the TCP payload bytes

问题

我正在使用gopacket包,每当我有一个TCP数据包时,我想检查负载是否包含HTTP请求。有没有一种简单的方法来做到这一点,而不是编写自己的解析器?还有一个函数(参见:func ReadRequest(b *bufio.Reader)),它返回一个Request结构体,但我不知道应该使用什么样的输入。tcp.Payload是一个字节数组,似乎包含了我需要解析的信息(请参考以下示例):

// 从数据包中获取TCP层
if tcpLayer := packet.Layer(layers.LayerTypeTCP); tcpLayer != nil {
    fmt.Printf("TCP ")
    // 从该层获取实际的TCP数据
    tcp, _ := tcpLayer.(*layers.TCP)
    srcPort = tcp.SrcPort
    dstPort = tcp.DstPort
    if tcp.SYN {
        fmt.Print("[SYN] ")
    }
    if tcp.ACK {
        fmt.Print("[ACK] ")
    }
    if tcp.FIN {
        fmt.Print("[FIN] ")
    }
    fmt.Printf("%s:%d > %s:%d ", srcIP, srcPort, dstIP, dstPort)

    fmt.Println(string(tcp.Payload))
}

发送HTTP请求后,我得到以下输出:

PKT [001] TCP [SYN] 192.168.2.6:59095 > 192.168.3.5:80
PKT [002] TCP [SYN] [ACK] 192.168.3.5:80 > 192.168.2.6:59095
PKT [003] TCP [ACK] 192.168.2.6:59095 > 192.168.3.5:80
PKT [004] TCP [ACK] 192.168.2.6:59095 > 192.168.3.5:80 GET /certificates/test.pdf HTTP/1.1
User-Agent: Wget/1.15 (linux-gnu)
Accept: */*
Host: 192.168.3.5
Connection: Keep-Alive

欢迎提出任何建议...

英文:

I am using the gopacket package and every time I have a TCP packet I want to check if the payload contains an HTTP request. Is there an easy way to do that instead of writing my own parser? There is also a function (see: func ReadRequest(b *bufio.Reader)) which returns a Request struct but I do not know what kind of input I should use. tcp.Payload is the byte[] array that seems to have the information I need to parse (see the following example):

// Get the TCP layer from this packet
if tcpLayer := packet.Layer(layers.LayerTypeTCP); tcpLayer != nil {
	fmt.Printf("TCP ")
	// Get actual TCP data from this layer
	tcp, _ := tcpLayer.(*layers.TCP)
	srcPort = tcp.SrcPort
	dstPort = tcp.DstPort
	if tcp.SYN {
		fmt.Print("[SYN] ")
	}
	if tcp.ACK {
		fmt.Print("[ACK] ")
	}
	if tcp.FIN {
		fmt.Print("[FIN] ")
	}
	fmt.Printf("%s:%d > %s:%d ", srcIP, srcPort, dstIP, dstPort)

	fmt.Println(string(tcp.Payload))
}

After sending an HTTP request I get the following output:

PKT [001] TCP [SYN] 192.168.2.6:59095 > 192.168.3.5:80
PKT [002] TCP [SYN] [ACK] 192.168.3.5:80 > 192.168.2.6:59095
PKT [003] TCP [ACK] 192.168.2.6:59095 > 192.168.3.5:80
PKT [004] TCP [ACK] 192.168.2.6:59095 > 192.168.3.5:80 GET /certificates/test.pdf HTTP/1.1
User-Agent: Wget/1.15 (linux-gnu)
Accept: */*
Host: 192.168.3.5
Connection: Keep-Alive

Any suggestions are welcome...

答案1

得分: 1

通过这个问题的帮助:https://stackoverflow.com/questions/22561661/how-to-parse-http-headers-in-go,使用http.ReadRequest()的以下尝试是有效的...

if tcpLayer := packet.Layer(layers.LayerTypeTCP); tcpLayer != nil {
   tcp, _ := tcpLayer.(*layers.TCP)
   if len(tcp.Payload) != 0 {
      reader := bufio.NewReader(bytes.NewReader(tcp.Payload))
      httpReq, err := http.ReadRequest(reader)
      ...
  }
}
英文:

With help from this question: https://stackoverflow.com/questions/22561661/how-to-parse-http-headers-in-go the following attempt with http.ReadRequest() works...

if tcpLayer := packet.Layer(layers.LayerTypeTCP); tcpLayer != nil {
   tcp, _ := tcpLayer.(*layers.TCP)
   if len(tcp.Payload) != 0 {
      reader := bufio.NewReader(bytes.NewReader(tcp.Payload))
      httpReq, err := http.ReadRequest(reader)
      ...
  }
}

huangapple
  • 本文由 发表于 2016年8月22日 22:40:18
  • 转载请务必保留本文链接:https://go.coder-hub.com/39082404.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定