From 7965cece7f5b9dd9ebd5447385409058c80cdf5f Mon Sep 17 00:00:00 2001 From: evilsocket Date: Sat, 13 Jan 2018 21:26:21 +0100 Subject: [PATCH] new: better net.show output --- Makefile | 1 + modules/net_recon.go | 97 ++++++++++++++++++++++++++++++++++++++++- session/targets.go | 8 ++++ session/targets_view.go | 44 ------------------- 4 files changed, 105 insertions(+), 45 deletions(-) delete mode 100644 session/targets_view.go diff --git a/Makefile b/Makefile index 2beb3c9d..098f7ed2 100644 --- a/Makefile +++ b/Makefile @@ -46,6 +46,7 @@ deps: @go get github.com/chzyer/readline @go get github.com/robertkrimen/otto @go get github.com/dustin/go-humanize + @go get github.com/olekukonko/tablewriter clean: @rm -rf $(TARGET) net/oui_compiled.go diff --git a/modules/net_recon.go b/modules/net_recon.go index f2a467a2..31bfe62e 100644 --- a/modules/net_recon.go +++ b/modules/net_recon.go @@ -1,11 +1,19 @@ package modules import ( + "fmt" + "os" + "sort" "time" + "github.com/evilsocket/bettercap-ng/core" "github.com/evilsocket/bettercap-ng/log" "github.com/evilsocket/bettercap-ng/net" + "github.com/evilsocket/bettercap-ng/packets" "github.com/evilsocket/bettercap-ng/session" + + "github.com/dustin/go-humanize" + "github.com/olekukonko/tablewriter" ) type Discovery struct { @@ -145,8 +153,95 @@ func (d *Discovery) Start() error { return nil } +type tSorter []*net.Endpoint + +func (a tSorter) Len() int { return len(a) } +func (a tSorter) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a tSorter) Less(i, j int) bool { return a[i].IpAddressUint32 < a[j].IpAddressUint32 } + func (d *Discovery) Show() error { - d.Session.Targets.Dump() + d.Session.Targets.Lock() + defer d.Session.Targets.Unlock() + + iface := d.Session.Interface + gw := d.Session.Gateway + + data := [][]string{ + []string{core.Green("interface"), core.Bold(iface.Name()), iface.IpAddress, iface.HwAddress, core.Dim(iface.Vendor)}, + []string{core.Green("gateway"), core.Bold(gw.Hostname), gw.IpAddress, gw.HwAddress, core.Dim(gw.Vendor)}, + } + + table := tablewriter.NewWriter(os.Stdout) + + table.AppendBulk(data) + table.Render() + + fmt.Println() + + nTargets := len(d.Session.Targets.Targets) + if nTargets == 0 { + fmt.Println(core.Dim("No endpoints discovered so far.")) + } else { + targets := make([]*net.Endpoint, 0, nTargets) + for _, t := range d.Session.Targets.Targets { + targets = append(targets, t) + } + + sort.Sort(tSorter(targets)) + + data = make([][]string, nTargets) + for i, t := range targets { + var traffic *packets.Traffic + var found bool + + if traffic, found = d.Session.Queue.Traffic[t.IpAddress]; found == false { + traffic = &packets.Traffic{} + } + + data[i] = []string{ + t.IpAddress, + t.HwAddress, + core.Yellow(t.Hostname), + t.Vendor, + humanize.Bytes(traffic.Sent), + humanize.Bytes(traffic.Received), + t.LastSeen.Format("2006-01-02 15:04:05"), + } + } + + table = tablewriter.NewWriter(os.Stdout) + + table.SetHeader([]string{"IP", "MAC", "Hostname", "Vendor", "Sent", "Recvd", "Last Seen"}) + table.AppendBulk(data) + table.Render() + + fmt.Println() + } + + row := []string{ + humanize.Bytes(d.Session.Queue.Sent), + humanize.Bytes(d.Session.Queue.Received), + fmt.Sprintf("%d", d.Session.Queue.PktReceived), + fmt.Sprintf("%d", d.Session.Queue.Errors), + } + + table = tablewriter.NewWriter(os.Stdout) + + table.SetHeader([]string{"Sent", "Sniffed", "# Packets", "Errors"}) + table.Append(row) + table.Render() + + fmt.Println() + + table = tablewriter.NewWriter(os.Stdout) + + for proto, hits := range d.Session.Queue.Protos { + table.Append([]string{proto, fmt.Sprintf("%d", hits)}) + } + + table.SetHeader([]string{"Proto", "# Packets"}) + table.Render() + return nil } diff --git a/session/targets.go b/session/targets.go index 4155258b..9a232cbe 100644 --- a/session/targets.go +++ b/session/targets.go @@ -23,6 +23,14 @@ func NewTargets(s *Session, iface, gateway *net.Endpoint) *Targets { } } +func (tp *Targets) Lock() { + tp.lock.Lock() +} + +func (tp *Targets) Unlock() { + tp.lock.Unlock() +} + func (tp *Targets) Remove(ip, mac string) { tp.lock.Lock() defer tp.lock.Unlock() diff --git a/session/targets_view.go b/session/targets_view.go deleted file mode 100644 index de9eed62..00000000 --- a/session/targets_view.go +++ /dev/null @@ -1,44 +0,0 @@ -package session - -import ( - "fmt" - "sort" - - "github.com/evilsocket/bettercap-ng/core" - "github.com/evilsocket/bettercap-ng/net" -) - -type tSorter []*net.Endpoint - -func (a tSorter) Len() int { return len(a) } -func (a tSorter) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a tSorter) Less(i, j int) bool { return a[i].IpAddressUint32 < a[j].IpAddressUint32 } - -func (tp *Targets) Dump() { - tp.lock.Lock() - defer tp.lock.Unlock() - - fmt.Println() - fmt.Printf(" " + core.GREEN + "interface" + core.RESET + "\n\n") - fmt.Printf(" " + tp.Interface.String() + "\n") - fmt.Println() - fmt.Printf(" " + core.GREEN + "gateway" + core.RESET + "\n\n") - fmt.Printf(" " + tp.Gateway.String() + "\n") - - if len(tp.Targets) > 0 { - fmt.Println() - fmt.Printf(" " + core.GREEN + "hosts" + core.RESET + "\n\n") - targets := make([]*net.Endpoint, 0, len(tp.Targets)) - for _, t := range tp.Targets { - targets = append(targets, t) - } - - sort.Sort(tSorter(targets)) - - for _, t := range targets { - fmt.Println(" " + t.String()) - } - } - - fmt.Println() -}