diff --git a/net/net.go b/net/net.go index 108b162b..dc13f983 100644 --- a/net/net.go +++ b/net/net.go @@ -4,20 +4,12 @@ import ( "fmt" "net" "regexp" - "runtime" "strconv" "strings" "github.com/evilsocket/bettercap-ng/core" ) -var IPv4RouteParser = regexp.MustCompile("^([\\d\\.]+)\\s+([\\d\\.]+)\\s+([\\d\\.]+)\\s+([A-Z]+)\\s+\\d+\\s+\\d+\\s+\\d+\\s+(.+)$") -var IPv4RouteTokens = 6 -var IPv4RouteParserMac = regexp.MustCompile("^([a-z]+)+\\s+(\\d+\\.+\\d+.\\d.+\\d)+\\s+([a-zA-z]+)+\\s+(\\d+)+\\s+(\\d+)+\\s+([a-zA-Z]+\\d+)$") -var IPv4RouteTokensMac = 7 -var IPv4RouteGWFlags = "UG" -var IPv4RouteGWFlagsMac = "UGSc" - func FindInterface(name string) (*Endpoint, error) { ifaces, err := net.Interfaces() if err != nil { @@ -75,35 +67,15 @@ func FindInterface(name string) (*Endpoint, error) { } func FindGateway(iface *Endpoint) (*Endpoint, error) { - var routeParser = IPv4RouteParser - var routeTokens = IPv4RouteTokens - var flagsIndex = 4 - var ifnameIndex = 5 - var gwFlags = IPv4RouteGWFlags - - if runtime.GOOS == "darwin" { - // "MacOS detected" - routeParser = IPv4RouteParserMac - routeTokens = IPv4RouteTokensMac - flagsIndex = 3 - ifnameIndex = 6 - gwFlags = IPv4RouteGWFlagsMac - } - - output, err := core.Exec("netstat", []string{"-n", "-r"}) + output, err := core.Exec(IPv4RouteCmd, IPv4RouteCmdOpts) if err != nil { return nil, err } for _, line := range strings.Split(output, "\n") { - m := routeParser.FindStringSubmatch(line) - if len(m) == routeTokens { - // destination := m[1] - // mask := m[3] - flags := m[flagsIndex] - ifname := m[ifnameIndex] - if ifname == iface.Name() && flags == gwFlags { - gateway := m[2] + m := IPv4RouteParser.FindStringSubmatch(line) + if len(m) == IPv4RouteTokens { + return IPv4RouteIsGateway(iface.Name(), m, func(gateway string) (*Endpoint, error) { if gateway == iface.IpAddress { return iface, nil } else { @@ -114,7 +86,7 @@ func FindGateway(iface *Endpoint) (*Endpoint, error) { } return NewEndpoint(gateway, mac), nil } - } + }) } } diff --git a/net/net_darwin.go b/net/net_darwin.go new file mode 100644 index 00000000..89c0ae7d --- /dev/null +++ b/net/net_darwin.go @@ -0,0 +1,20 @@ +package net + +import "regexp" + +var IPv4RouteParser = regexp.MustCompile("^([a-z]+)+\\s+(\\d+\\.+\\d+.\\d.+\\d)+\\s+([a-zA-z]+)+\\s+(\\d+)+\\s+(\\d+)+\\s+([a-zA-Z]+\\d+)$") +var IPv4RouteTokens = 7 +var IPv4RouteCmd = "netstat" +var IPv4RouteCmdOpts = []string{"-n", "-r"} + +func IPv4RouteIsGateway(ifname string, tokens []string, f func(gateway string) (*Endpoint, error)) (*Endpoint, error) { + ifname2 := tokens[6] + flags := tokens[3] + + if ifname == ifname2 && flags == "UGSc" { + gateway := tokens[2] + return f(gateway) + } + + return nil, nil +} diff --git a/net/net_linux.go b/net/net_linux.go new file mode 100644 index 00000000..179d26a5 --- /dev/null +++ b/net/net_linux.go @@ -0,0 +1,20 @@ +package net + +import "regexp" + +// only matches gateway lines +var IPv4RouteParser = regexp.MustCompile("^(default|[0-9\\.]+)\\svia\\s([0-9\\.]+)\\sdev\\s(\\w+)\\s.*$") +var IPv4RouteTokens = 4 +var IPv4RouteCmd = "ip" +var IPv4RouteCmdOpts = []string{"route"} + +func IPv4RouteIsGateway(ifname string, tokens []string, f func(gateway string) (*Endpoint, error)) (*Endpoint, error) { + ifname2 := tokens[3] + + if ifname == ifname2 { + gateway := tokens[2] + return f(gateway) + } + + return nil, nil +}