new: net.probe on uses both NBNS and MDNS queries to fetch endpoints metadata and hostnames

This commit is contained in:
evilsocket 2018-09-09 12:35:00 +03:00
parent 36999813c4
commit e2cc4574c4
No known key found for this signature in database
GPG key ID: 1564D7F30393A456
8 changed files with 127 additions and 106 deletions

View file

@ -60,7 +60,7 @@ func (p *Prober) sendProbe(from net.IP, from_hw net.HardwareAddr, ip net.IP) {
wg.Add(1)
go func(w *sync.WaitGroup) {
p.sendProbeUDP(from, from_hw, ip)
p.sendProbeNBNS(from, from_hw, ip)
w.Done()
}(&wg)
@ -110,6 +110,9 @@ func (p *Prober) Start() error {
} else if p.Session.Skip(ip) {
log.Debug("Skipping address %s from UDP probing.", ip)
continue
} else if p.Session.Lan.GetByIp(ip.String()) != nil {
log.Debug("Skipping address %s from UDP probing (already in the arp cache).", ip)
continue
}
p.sendProbe(from, from_hw, ip)

View file

@ -12,10 +12,9 @@ func (p *Prober) sendProbeMDNS(from net.IP, from_hw net.HardwareAddr) {
if err != nil {
log.Error("error while sending mdns probe: %v", err)
return
}
log.Debug("sending %d bytes of mdns probe query", len(raw))
if err := p.Session.Queue.Send(raw); err != nil {
} else if err := p.Session.Queue.Send(raw); err != nil {
log.Error("error sending mdns packet: %s", err)
} else {
log.Debug("sent %d bytes of MDNS probe", len(raw))
}
}

25
modules/net_probe_nbns.go Normal file
View file

@ -0,0 +1,25 @@
package modules
import (
"fmt"
"net"
"github.com/bettercap/bettercap/log"
"github.com/bettercap/bettercap/packets"
)
func (p *Prober) sendProbeNBNS(from net.IP, from_hw net.HardwareAddr, ip net.IP) {
name := fmt.Sprintf("%s:%d", ip, packets.NBNSPort)
if addr, err := net.ResolveUDPAddr("udp", name); err != nil {
log.Debug("could not resolve %s.", name)
} else if con, err := net.DialUDP("udp", nil, addr); err != nil {
log.Debug("could not dial %s.", name)
} else {
defer con.Close()
if wrote, _ := con.Write(packets.NBNSRequest); wrote > 0 {
p.Session.Queue.TrackSent(uint64(wrote))
} else {
p.Session.Queue.TrackError()
}
}
}

View file

@ -1,52 +0,0 @@
package modules
import (
"fmt"
"net"
"github.com/bettercap/bettercap/log"
)
// NBNS port
const NBNSPort = 137
// NBNS hostname resolution request buffer.
var NBNSRequest = []byte{
0x82, 0x28, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x20, 0x43, 0x4B, 0x41, 0x41, 0x41, 0x41,
0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x0,
0x0, 0x21, 0x0, 0x1,
}
func (p *Prober) sendProbeUDP(from net.IP, from_hw net.HardwareAddr, ip net.IP) {
name := fmt.Sprintf("%s:%d", ip, NBNSPort)
if addr, err := net.ResolveUDPAddr("udp", name); err != nil {
log.Debug("could not resolve %s.", name)
} else if con, err := net.DialUDP("udp", nil, addr); err != nil {
log.Debug("could not dial %s.", name)
} else {
log.Debug("udp connection to %s enstablished.", name)
buffer := make([]byte, 0xff)
defer con.Close()
wrote, _ := con.Write(NBNSRequest)
log.Info("wrote %d bytes", len(NBNSRequest))
read, _, _ := con.ReadFrom(buffer)
log.Info("got %d bytes of buffer", len(buffer))
if wrote > 0 {
p.Session.Queue.TrackSent(uint64(wrote))
} else {
p.Session.Queue.TrackError()
}
if read > 0 {
p.Session.Queue.TrackPacket(uint64(read))
}
}
}