mirror of
https://github.com/bettercap/bettercap
synced 2025-08-19 13:09:49 -07:00
new: working on win32 user space packet routing
This commit is contained in:
parent
ebcd59f4ba
commit
d54cac6355
2 changed files with 42 additions and 2 deletions
|
@ -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)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue