new: working on win32 user space packet routing

This commit is contained in:
evilsocket 2018-02-12 19:05:32 +01:00
commit d54cac6355
2 changed files with 42 additions and 2 deletions

View file

@ -1,8 +1,10 @@
package modules package modules
import ( import (
"bytes"
"fmt" "fmt"
"net" "net"
"runtime"
"time" "time"
"github.com/evilsocket/bettercap-ng/log" "github.com/evilsocket/bettercap-ng/log"
@ -10,6 +12,8 @@ import (
"github.com/evilsocket/bettercap-ng/packets" "github.com/evilsocket/bettercap-ng/packets"
"github.com/evilsocket/bettercap-ng/session" "github.com/evilsocket/bettercap-ng/session"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
"github.com/malfunkt/iprange" "github.com/malfunkt/iprange"
) )
@ -135,6 +139,20 @@ func (p *ArpSpoofer) unSpoof() error {
return nil return nil
} }
func (p *ArpSpoofer) pktRouter(eth *layers.Ethernet, ip4 *layers.IPv4, pkt gopacket.Packet) {
if eth == nil || ip4 == nil {
return
}
for _, target := range p.addresses {
if bytes.Compare(ip4.SrcIP, target) == 0 {
// TODO: get real mac && patch
} else if bytes.Compare(ip4.DstIP, target) == 0 {
// TODO: get real mac && patch
}
}
}
func (p *ArpSpoofer) Configure() error { func (p *ArpSpoofer) Configure() error {
var err error var err error
var targets string var targets string
@ -153,8 +171,14 @@ func (p *ArpSpoofer) Configure() error {
log.Warning("Running in BAN mode, forwarding not enabled!") log.Warning("Running in BAN mode, forwarding not enabled!")
p.Session.Firewall.EnableForwarding(false) p.Session.Firewall.EnableForwarding(false)
} else if p.Session.Firewall.IsForwardingEnabled() == false { } else if p.Session.Firewall.IsForwardingEnabled() == false {
log.Info("Enabling forwarding.") if runtime.GOOS == "windows" {
p.Session.Firewall.EnableForwarding(true) log.Info("Using user space packet routing, disable forwarding.")
p.Session.Firewall.EnableForwarding(false)
p.Session.Queue.Route(p.pktRouter)
} else {
log.Info("Enabling forwarding.")
p.Session.Firewall.EnableForwarding(true)
}
} }
return nil return nil
@ -186,5 +210,6 @@ func (p *ArpSpoofer) Stop() error {
<-p.done <-p.done
p.unSpoof() p.unSpoof()
p.ban = false p.ban = false
p.Session.Queue.Route(nil)
}) })
} }

View file

@ -32,6 +32,8 @@ type Stats struct {
Errors uint64 Errors uint64
} }
type PacketHandler func(eth *layers.Ethernet, ip4 *layers.IPv4, pkt gopacket.Packet)
type Queue struct { type Queue struct {
sync.Mutex sync.Mutex
@ -45,6 +47,7 @@ type Queue struct {
handle *pcap.Handle handle *pcap.Handle
source *gopacket.PacketSource source *gopacket.PacketSource
active bool active bool
router PacketHandler
} }
func NewQueue(iface *bnet.Endpoint) (q *Queue, err error) { func NewQueue(iface *bnet.Endpoint) (q *Queue, err error) {
@ -55,6 +58,7 @@ func NewQueue(iface *bnet.Endpoint) (q *Queue, err error) {
iface: iface, iface: iface,
active: true, active: true,
router: nil,
} }
if q.handle, err = pcap.OpenLive(iface.Name(), 1024, true, pcap.BlockForever); err != nil { if q.handle, err = pcap.OpenLive(iface.Name(), 1024, true, pcap.BlockForever); err != nil {
@ -115,6 +119,13 @@ func (q *Queue) trackActivity(eth *layers.Ethernet, ip4 *layers.IPv4, address ne
} }
} }
func (q *Queue) Route(r PacketHandler) {
q.Lock()
defer q.Unlock()
q.router = r
}
func (q *Queue) worker() { func (q *Queue) worker() {
for pkt := range q.source.Packets() { for pkt := range q.source.Packets() {
if q.active == false { if q.active == false {
@ -135,6 +146,10 @@ func (q *Queue) worker() {
eth := leth.(*layers.Ethernet) eth := leth.(*layers.Ethernet)
ip4 := lip4.(*layers.IPv4) ip4 := lip4.(*layers.IPv4)
if q.router != nil {
q.router(eth, ip4, pkt)
}
// coming from our network // coming from our network
if bytes.Compare(q.iface.IP, ip4.SrcIP) != 0 && q.iface.Net.Contains(ip4.SrcIP) { if bytes.Compare(q.iface.IP, ip4.SrcIP) != 0 && q.iface.Net.Contains(ip4.SrcIP) {
q.trackActivity(eth, ip4, ip4.SrcIP, pktSize, true) q.trackActivity(eth, ip4, ip4.SrcIP, pktSize, true)