new: parsing UPNP discovery responses to get metadata about the endpoints

This commit is contained in:
evilsocket 2018-09-12 11:56:07 +02:00
parent 02f445c42c
commit 3d312a9cdf
No known key found for this signature in database
GPG key ID: 1564D7F30393A456
2 changed files with 37 additions and 11 deletions

View file

@ -166,19 +166,13 @@ func (q *Queue) TrackError() {
func (q *Queue) getPacketMeta(pkt gopacket.Packet) map[string]string {
meta := make(map[string]string)
if mdns := MDNSGetMeta(pkt); mdns != nil {
for k, v := range mdns {
meta[k] = v
meta = mdns
} else if nbns := NBNSGetMeta(pkt); nbns != nil {
meta = nbns
} else if upnp := UPNPGetMeta(pkt); upnp != nil {
meta = upnp
}
}
if nbns := NBNSGetMeta(pkt); nbns != nil {
for k, v := range nbns {
meta[k] = v
}
}
return meta
}

View file

@ -1,8 +1,18 @@
package packets
import (
"bufio"
"bytes"
"fmt"
"net"
"net/http"
// "net/url"
"strings"
"github.com/bettercap/bettercap/core"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
)
const (
@ -19,3 +29,25 @@ var (
"MX: 2\r\n" +
"\r\n")
)
func UPNPGetMeta(pkt gopacket.Packet) map[string]string {
if ludp := pkt.Layer(layers.LayerTypeUDP); ludp != nil {
if udp := ludp.(*layers.UDP); udp != nil && udp.SrcPort == UPNPPort && len(udp.Payload) > 0 {
request := &http.Request{}
reader := bufio.NewReader(bytes.NewReader(udp.Payload))
if response, err := http.ReadResponse(reader, request); err == nil {
meta := make(map[string]string)
for name, values := range response.Header {
if name != "Cache-Control" && len(values) > 0 {
if data := strings.Join(values, ", "); core.Trim(data) != "" {
meta["upnp:"+name] = data
}
}
}
return meta
}
}
}
return nil
}