From a2b3ee79fbe45ab5c8f8cdc72a7e5a342419aa8e Mon Sep 17 00:00:00 2001 From: evilsocket Date: Sat, 6 Oct 2018 14:57:40 +0200 Subject: [PATCH] new: net.show now accepts a comma separated list of ip, macs or aliases to filter for --- modules/net_recon.go | 4 ++-- modules/net_recon_show.go | 28 +++++++++++----------------- network/lan.go | 26 +++++++++++++------------- network/net.go | 26 ++++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 32 deletions(-) diff --git a/modules/net_recon.go b/modules/net_recon.go index 46754df1..11bd21ab 100644 --- a/modules/net_recon.go +++ b/modules/net_recon.go @@ -57,8 +57,8 @@ func NewDiscovery(s *session.Session) *Discovery { return d.Show("rcvd", "") })) - d.AddHandler(session.NewModuleHandler("net.show ADDRESS", `net.show ([\d\.]+)`, - "Show information about a specific address.", + d.AddHandler(session.NewModuleHandler("net.show ADDRESS1, ADDRESS2", `net.show (.+)`, + "Show information about a specific list of addresses (by IP or MAC).", func(args []string) error { return d.Show("address", args[0]) })) diff --git a/modules/net_recon_show.go b/modules/net_recon_show.go index b8e5a667..e73b2e82 100644 --- a/modules/net_recon_show.go +++ b/modules/net_recon_show.go @@ -109,13 +109,16 @@ func (d *Discovery) getRow(e *network.Endpoint, withMeta bool) [][]string { return rows } -func (d *Discovery) Show(by string, addr string) error { - err, showMeta := d.BoolParam("net.show.meta") - if err != nil { - return err +func (d *Discovery) Show(by string, expr string) (err error) { + var targets []*network.Endpoint + if expr != "" { + if targets, err = network.ParseEndpoints(expr, d.Session.Lan); err != nil { + return err + } + } else { + targets = d.Session.Lan.List() } - targets := d.Session.Lan.List() if by == "seen" { sort.Sort(BySeenSorter(targets)) } else if by == "sent" { @@ -134,19 +137,10 @@ func (d *Discovery) Show(by string, addr string) error { targets = append([]*network.Endpoint{d.Session.Interface, d.Session.Gateway}, targets...) } - if addr != "" { - tmp := make([]*network.Endpoint, 0) - pad = 0 - for _, t := range targets { - if t.IP.String() == addr { - tmp = append(tmp, t) - } - } - targets = tmp - } - hasMeta := false - if showMeta { + if err, showMeta := d.BoolParam("net.show.meta"); err != nil { + return err + } else if showMeta { for _, t := range targets { if !t.Meta.Empty() { hasMeta = true diff --git a/network/lan.go b/network/lan.go index b89866d0..d2e56bac 100644 --- a/network/lan.go +++ b/network/lan.go @@ -81,6 +81,19 @@ func (lan *LAN) Get(mac string) (*Endpoint, bool) { return nil, false } +func (lan *LAN) GetByIp(ip string) *Endpoint { + lan.Lock() + defer lan.Unlock() + + for _, e := range lan.hosts { + if e.IpAddress == ip { + return e + } + } + + return nil +} + func (lan *LAN) List() (list []*Endpoint) { lan.Lock() defer lan.Unlock() @@ -169,19 +182,6 @@ func (lan *LAN) EachHost(cb func(mac string, e *Endpoint)) { } } -func (lan *LAN) GetByIp(ip string) *Endpoint { - lan.Lock() - defer lan.Unlock() - - for _, e := range lan.hosts { - if e.IpAddress == ip { - return e - } - } - - return nil -} - func (lan *LAN) AddIfNew(ip, mac string) *Endpoint { lan.Lock() defer lan.Unlock() diff --git a/network/net.go b/network/net.go index 71e8725a..a69a6bde 100644 --- a/network/net.go +++ b/network/net.go @@ -118,6 +118,32 @@ func ParseTargets(targets string, aliasMap *Aliases) (ips []net.IP, macs []net.H return } +func ParseEndpoints(targets string, lan *LAN) ([]*Endpoint, error) { + ips, macs, err := ParseTargets(targets, lan.Aliases()) + if err != nil { + return nil, err + } + + tmp := make(map[string]*Endpoint) + for _, ip := range ips { + if e := lan.GetByIp(ip.String()); e != nil { + tmp[e.HW.String()] = e + } + } + + for _, mac := range macs { + if e, found := lan.Get(mac.String()); found { + tmp[e.HW.String()] = e + } + } + + ret := make([]*Endpoint, 0) + for _, e := range tmp { + ret = append(ret, e) + } + return ret, nil +} + func buildEndpointFromInterface(iface net.Interface) (*Endpoint, error) { addrs, err := iface.Addrs() if err != nil {