misc: small fix or general refactoring i did not bother commenting

This commit is contained in:
evilsocket 2018-02-17 06:04:16 +01:00
commit eb5a72a44c
9 changed files with 234 additions and 220 deletions

View file

@ -154,7 +154,7 @@ func (s *DHCP6Spoofer) dhcpAdvertise(pkt gopacket.Packet, solicit dhcp6.Packet,
} }
var ip net.IP var ip net.IP
if t, found := s.Session.Targets.Targets[target.String()]; found == true { if t, found := s.Session.Lan.Hosts[target.String()]; found == true {
ip = t.IP ip = t.IP
} else { } else {
log.Warning("Address %s not known, using random identity association address.", target.String()) log.Warning("Address %s not known, using random identity association address.", target.String())
@ -312,7 +312,7 @@ func (s *DHCP6Spoofer) dhcpReply(toType string, pkt gopacket.Packet, req dhcp6.P
addr = net.IP(raw[0]) addr = net.IP(raw[0])
} }
if t, found := s.Session.Targets.Targets[target.String()]; found == true { if t, found := s.Session.Lan.Hosts[target.String()]; found == true {
log.Info("[%s] IPv6 address %s is now assigned to %s", core.Green("dhcp6"), addr.String(), t) log.Info("[%s] IPv6 address %s is now assigned to %s", core.Green("dhcp6"), addr.String(), t)
} else { } else {
log.Info("[%s] IPv6 address %s is now assigned to %s", core.Green("dhcp6"), addr.String(), target) log.Info("[%s] IPv6 address %s is now assigned to %s", core.Green("dhcp6"), addr.String(), target)

View file

@ -111,7 +111,7 @@ func (s *DNSSpoofer) dnsReply(pkt gopacket.Packet, peth *layers.Ethernet, pudp *
redir := fmt.Sprintf("(->%s)", s.Address) redir := fmt.Sprintf("(->%s)", s.Address)
who := target.String() who := target.String()
if t, found := s.Session.Targets.Targets[target.String()]; found == true { if t, found := s.Session.Lan.Hosts[target.String()]; found == true {
who = t.String() who = t.String()
} }

View file

@ -71,19 +71,19 @@ func (d Discovery) Author() string {
func (d *Discovery) runDiff(cache network.ArpTable) { func (d *Discovery) runDiff(cache network.ArpTable) {
// check for endpoints who disappeared // check for endpoints who disappeared
var rem network.ArpTable = make(network.ArpTable) var rem network.ArpTable = make(network.ArpTable)
for mac, t := range d.Session.Targets.Targets { for mac, t := range d.Session.Lan.Hosts {
if _, found := cache[mac]; found == false { if _, found := cache[mac]; found == false {
rem[mac] = t.IpAddress rem[mac] = t.IpAddress
} }
} }
for mac, ip := range rem { for mac, ip := range rem {
d.Session.Targets.Remove(ip, mac) d.Session.Lan.Remove(ip, mac)
} }
// now check for new friends ^_^ // now check for new friends ^_^
for ip, mac := range cache { for ip, mac := range cache {
d.Session.Targets.AddIfNew(ip, mac) d.Session.Lan.AddIfNew(ip, mac)
} }
} }

View file

@ -53,7 +53,7 @@ func (d *Discovery) getRow(e *network.Endpoint) []string {
addr := e.IpAddress addr := e.IpAddress
mac := e.HwAddress mac := e.HwAddress
if d.Session.Targets.WasMissed(e.HwAddress) == true { if d.Session.Lan.WasMissed(e.HwAddress) == true {
// if endpoint was not found in ARP at least once // if endpoint was not found in ARP at least once
addr = core.Dim(addr) addr = core.Dim(addr)
mac = core.Dim(mac) mac = core.Dim(mac)
@ -113,7 +113,7 @@ func (d *Discovery) showTable(header []string, rows [][]string) {
} }
func (d *Discovery) Show(by string) error { func (d *Discovery) Show(by string) error {
targets := d.Session.Targets.List() targets := d.Session.Lan.List()
if by == "seen" { if by == "seen" {
sort.Sort(BySeenSorter(targets)) sort.Sort(BySeenSorter(targets))
} else if by == "sent" { } else if by == "sent" {

View file

@ -23,9 +23,9 @@ func vIP(ip net.IP) string {
} }
address := ip.String() address := ip.String()
host, found := session.I.Targets.Targets[address] host := session.I.Lan.Get(address)
if found == true { if host != nil {
if host.Hostname != "" { if host.Hostname != "" {
return host.Hostname return host.Hostname
} }

214
network/lan.go Normal file
View file

@ -0,0 +1,214 @@
package network
import (
"bufio"
"fmt"
"io/ioutil"
"net"
"os"
"strings"
"sync"
"github.com/evilsocket/bettercap-ng/core"
)
const LANDefaultTTL = 10
const LANAliasesFile = "~/bettercap.aliases"
type EndpointNewCallback func(e *Endpoint)
type EndpointLostCallback func(e *Endpoint)
type LAN struct {
sync.Mutex
Interface *Endpoint
Gateway *Endpoint
Hosts map[string]*Endpoint
TTL map[string]uint
Aliases map[string]string
newCb EndpointNewCallback
lostCb EndpointLostCallback
aliasesFileName string
}
func NewLAN(iface, gateway *Endpoint, newcb EndpointNewCallback, lostcb EndpointLostCallback) *LAN {
lan := &LAN{
Interface: iface,
Gateway: gateway,
Hosts: make(map[string]*Endpoint),
TTL: make(map[string]uint),
Aliases: make(map[string]string),
newCb: newcb,
lostCb: lostcb,
}
lan.aliasesFileName, _ = core.ExpandPath(LANAliasesFile)
if core.Exists(lan.aliasesFileName) {
if err := lan.loadAliases(); err != nil {
fmt.Printf("%s\n", err)
}
}
return lan
}
func (lan *LAN) List() (list []*Endpoint) {
lan.Lock()
defer lan.Unlock()
list = make([]*Endpoint, 0)
for _, t := range lan.Hosts {
list = append(list, t)
}
return
}
func (lan *LAN) loadAliases() error {
file, err := os.Open(lan.aliasesFileName)
if err != nil {
return err
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
parts := strings.SplitN(line, " ", 2)
mac := core.Trim(parts[0])
alias := core.Trim(parts[1])
lan.Aliases[mac] = alias
}
return nil
}
func (lan *LAN) saveAliases() {
data := ""
for mac, alias := range lan.Aliases {
data += fmt.Sprintf("%s %s\n", mac, alias)
}
ioutil.WriteFile(lan.aliasesFileName, []byte(data), 0644)
}
func (lan *LAN) SetAliasFor(mac, alias string) bool {
lan.Lock()
defer lan.Unlock()
if t, found := lan.Hosts[mac]; found == true {
if alias != "" {
lan.Aliases[mac] = alias
} else {
delete(lan.Aliases, mac)
}
t.Alias = alias
lan.saveAliases()
return true
}
return false
}
func (lan *LAN) WasMissed(mac string) bool {
if mac == lan.Interface.HwAddress || mac == lan.Gateway.HwAddress {
return false
}
lan.Lock()
defer lan.Unlock()
if ttl, found := lan.TTL[mac]; found == true {
return ttl < LANDefaultTTL
}
return true
}
func (lan *LAN) Remove(ip, mac string) {
lan.Lock()
defer lan.Unlock()
if e, found := lan.Hosts[mac]; found {
lan.TTL[mac]--
if lan.TTL[mac] == 0 {
delete(lan.Hosts, mac)
delete(lan.TTL, mac)
lan.lostCb(e)
}
return
}
}
func (lan *LAN) shouldIgnore(ip string) bool {
// skip our own address
if ip == lan.Interface.IpAddress {
return true
}
// skip the gateway
if ip == lan.Gateway.IpAddress {
return true
}
// skip broadcast addresses
if strings.HasSuffix(ip, ".255") {
return true
}
// skip everything which is not in our subnet (multicast noise)
addr := net.ParseIP(ip)
return lan.Interface.Net.Contains(addr) == false
}
func (lan *LAN) Has(ip string) bool {
lan.Lock()
defer lan.Unlock()
for _, e := range lan.Hosts {
if e.IpAddress == ip {
return true
}
}
return false
}
func (lan *LAN) Get(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()
if lan.shouldIgnore(ip) {
return nil
}
mac = NormalizeMac(mac)
if t, found := lan.Hosts[mac]; found {
if lan.TTL[mac] < LANDefaultTTL {
lan.TTL[mac]++
}
return t
}
e := NewEndpoint(ip, mac)
if alias, found := lan.Aliases[mac]; found {
e.Alias = alias
}
lan.Hosts[mac] = e
lan.TTL[mac] = LANDefaultTTL
lan.newCb(e)
return nil
}

View file

@ -38,7 +38,7 @@ type Session struct {
Gateway *network.Endpoint `json:"gateway"` Gateway *network.Endpoint `json:"gateway"`
Firewall firewall.FirewallManager `json:"-"` Firewall firewall.FirewallManager `json:"-"`
Env *Environment `json:"env"` Env *Environment `json:"env"`
Targets *Targets `json:"targets"` Lan *network.LAN `json:"lan"`
WiFi *network.WiFi `json:"wifi"` WiFi *network.WiFi `json:"wifi"`
Queue *packets.Queue `json:"packets"` Queue *packets.Queue `json:"packets"`
Input *readline.Instance `json:"-"` Input *readline.Instance `json:"-"`
@ -295,7 +295,7 @@ func (s *Session) startNetMon() {
addr := event.IP.String() addr := event.IP.String()
mac := event.MAC.String() mac := event.MAC.String()
existing := s.Targets.AddIfNew(addr, mac) existing := s.Lan.AddIfNew(addr, mac)
if existing != nil { if existing != nil {
existing.LastSeen = time.Now() existing.LastSeen = time.Now()
} }
@ -376,9 +376,13 @@ func (s *Session) Start() error {
s.Gateway = s.Interface s.Gateway = s.Interface
} }
s.WiFi = network.NewWiFi(s.Interface)
s.Targets = NewTargets(s, s.Interface, s.Gateway)
s.Firewall = firewall.Make(s.Interface) s.Firewall = firewall.Make(s.Interface)
s.WiFi = network.NewWiFi(s.Interface)
s.Lan = network.NewLAN(s.Interface, s.Gateway, func(e *network.Endpoint) {
s.Events.Add("endpoint.new", e)
}, func(e *network.Endpoint) {
s.Events.Add("endpoint.lost", e)
})
s.setupEnv() s.setupEnv()

View file

@ -185,7 +185,7 @@ func (s *Session) aliasHandler(args []string, sess *Session) error {
mac := args[0] mac := args[0]
alias := core.Trim(args[1]) alias := core.Trim(args[1])
if s.Targets.SetAliasFor(mac, alias) == true { if s.Lan.SetAliasFor(mac, alias) == true {
return nil return nil
} else { } else {
return fmt.Errorf("Could not find endpoint %s", mac) return fmt.Errorf("Could not find endpoint %s", mac)
@ -298,7 +298,7 @@ func (s *Session) registerCoreHandlers() {
readline.PcItem("alias", readline.PcItemDynamic(func(prefix string) []string { readline.PcItem("alias", readline.PcItemDynamic(func(prefix string) []string {
prefix = core.Trim(prefix[5:]) prefix = core.Trim(prefix[5:])
macs := []string{""} macs := []string{""}
for mac := range s.Targets.Targets { for mac := range s.Lan.Hosts {
if prefix == "" || strings.HasPrefix(mac, prefix) == true { if prefix == "" || strings.HasPrefix(mac, prefix) == true {
macs = append(macs, mac) macs = append(macs, mac)
} }

View file

@ -1,204 +0,0 @@
package session
import (
"bufio"
"fmt"
"io/ioutil"
"net"
"os"
"strings"
"sync"
"github.com/evilsocket/bettercap-ng/core"
"github.com/evilsocket/bettercap-ng/network"
)
const TargetsDefaultTTL = 10
const TargetsAliasesFile = "~/bettercap.aliases"
type Targets struct {
sync.Mutex
Session *Session `json:"-"`
Interface *network.Endpoint
Gateway *network.Endpoint
Targets map[string]*network.Endpoint
TTL map[string]uint
Aliases map[string]string
aliasesFileName string
}
func NewTargets(s *Session, iface, gateway *network.Endpoint) *Targets {
t := &Targets{
Session: s,
Interface: iface,
Gateway: gateway,
Targets: make(map[string]*network.Endpoint),
TTL: make(map[string]uint),
Aliases: make(map[string]string),
}
t.aliasesFileName, _ = core.ExpandPath(TargetsAliasesFile)
if core.Exists(t.aliasesFileName) {
if err := t.loadAliases(); err != nil {
s.Events.Log(core.ERROR, "%s", err)
}
}
return t
}
func (tp *Targets) List() (list []*network.Endpoint) {
tp.Lock()
defer tp.Unlock()
list = make([]*network.Endpoint, 0)
for _, t := range tp.Targets {
list = append(list, t)
}
return
}
func (tp *Targets) loadAliases() error {
tp.Session.Events.Log(core.INFO, "Loading aliases from %s ...", tp.aliasesFileName)
file, err := os.Open(tp.aliasesFileName)
if err != nil {
return err
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
parts := strings.SplitN(line, " ", 2)
mac := core.Trim(parts[0])
alias := core.Trim(parts[1])
tp.Session.Events.Log(core.DEBUG, " aliases[%s] = '%s'", mac, alias)
tp.Aliases[mac] = alias
}
return nil
}
func (tp *Targets) saveAliases() {
data := ""
for mac, alias := range tp.Aliases {
data += fmt.Sprintf("%s %s\n", mac, alias)
}
ioutil.WriteFile(tp.aliasesFileName, []byte(data), 0644)
}
func (tp *Targets) SetAliasFor(mac, alias string) bool {
tp.Lock()
defer tp.Unlock()
if t, found := tp.Targets[mac]; found == true {
if alias != "" {
tp.Aliases[mac] = alias
} else {
delete(tp.Aliases, mac)
}
t.Alias = alias
tp.saveAliases()
return true
}
return false
}
func (tp *Targets) WasMissed(mac string) bool {
if mac == tp.Session.Interface.HwAddress || mac == tp.Session.Gateway.HwAddress {
return false
}
tp.Lock()
defer tp.Unlock()
if ttl, found := tp.TTL[mac]; found == true {
return ttl < TargetsDefaultTTL
}
return true
}
func (tp *Targets) Remove(ip, mac string) {
tp.Lock()
defer tp.Unlock()
if e, found := tp.Targets[mac]; found {
tp.TTL[mac]--
if tp.TTL[mac] == 0 {
tp.Session.Events.Add("endpoint.lost", e)
delete(tp.Targets, mac)
delete(tp.TTL, mac)
}
return
}
}
func (tp *Targets) shouldIgnore(ip string) bool {
// skip our own address
if ip == tp.Interface.IpAddress {
return true
}
// skip the gateway
if ip == tp.Gateway.IpAddress {
return true
}
// skip broadcast addresses
if strings.HasSuffix(ip, ".255") {
return true
}
// skip everything which is not in our subnet (multicast noise)
addr := net.ParseIP(ip)
return tp.Session.Interface.Net.Contains(addr) == false
}
func (tp *Targets) Has(ip string) bool {
tp.Lock()
defer tp.Unlock()
for _, e := range tp.Targets {
if e.IpAddress == ip {
return true
}
}
return false
}
func (tp *Targets) AddIfNew(ip, mac string) *network.Endpoint {
tp.Lock()
defer tp.Unlock()
if tp.shouldIgnore(ip) {
return nil
}
mac = network.NormalizeMac(mac)
if t, found := tp.Targets[mac]; found {
if tp.TTL[mac] < TargetsDefaultTTL {
tp.TTL[mac]++
}
return t
}
e := network.NewEndpoint(ip, mac)
/*
e.ResolvedCallback = func(e *network.Endpoint) {
tp.Session.Events.Add("endpoint.resolved", e)
}
*/
if alias, found := tp.Aliases[mac]; found {
e.Alias = alias
}
tp.Targets[mac] = e
tp.TTL[mac] = TargetsDefaultTTL
tp.Session.Events.Add("endpoint.new", e)
return nil
}