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 { func (q *Queue) getPacketMeta(pkt gopacket.Packet) map[string]string {
meta := make(map[string]string) meta := make(map[string]string)
if mdns := MDNSGetMeta(pkt); mdns != nil { if mdns := MDNSGetMeta(pkt); mdns != nil {
for k, v := range mdns { meta = mdns
meta[k] = v } 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 return meta
} }

View file

@ -1,8 +1,18 @@
package packets package packets
import ( import (
"bufio"
"bytes"
"fmt" "fmt"
"net" "net"
"net/http"
// "net/url"
"strings"
"github.com/bettercap/bettercap/core"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
) )
const ( const (
@ -19,3 +29,25 @@ var (
"MX: 2\r\n" + "MX: 2\r\n" +
"\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
}