diff --git a/packets/queue.go b/packets/queue.go index 2642bd0a..94aef1a1 100644 --- a/packets/queue.go +++ b/packets/queue.go @@ -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 } diff --git a/packets/upnp.go b/packets/upnp.go index 39748efa..0b75866b 100644 --- a/packets/upnp.go +++ b/packets/upnp.go @@ -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 +}