packet.proxy

A module that relies on NFQUEUEs in order to actively filter packets, using Go native plugins (plugins for this module can be found in this repository).

This module is only supported on GNU/Linux.

Commands

packet.proxy on

Start the NFQUEUE based packet proxy.

packet.proxy off

Stop the NFQUEUE based packet proxy.

Parameters

parameter default description
packet.proxy.queue.num 0 NFQUEUE number to create and bind to.
packet.proxy.chain OUTPUT Chain name of the iptables rule.
packet.proxy.rule Any additional iptables rule to make the queue more selective (ex. --destination 8.8.8.8).
packet.proxy.plugin Go plugin file to load and call for every packet.

Plugins

Instead of using Javascript extensions like the HTTP and HTTPS proxies, this module requires the plugins to be natively written in Go in order to avoid adding too much overhead for each incoming packet. The packet.proxy.plugin parameter is mandatory and needs to be filled with the path of a shared object built as a Go plugin and exporting an OnPacket callback like the following:

package main

import (
	"github.com/bettercap/bettercap/log"

	"github.com/chifflier/nfqueue-go/nfqueue"
)

func OnPacket(payload *nfqueue.Payload) int {
	log.Info("We got a packet: %v", payload)
        // this will accept the packet, use NF_DROP to 
        // drop the packet instead.
	payload.SetVerdict(nfqueue.NF_ACCEPT)
	return 0
}

A more complex example using the gopacket library to parse and dump all the layers of the packet:

package main

import (
	"github.com/bettercap/bettercap/log"

	"github.com/chifflier/nfqueue-go/nfqueue"
	"github.com/google/gopacket"
	"github.com/google/gopacket/layers"
)

func OnPacket(payload *nfqueue.Payload) int {
	packet := gopacket.NewPacket(payload.Data, layers.LayerTypeIPv4, gopacket.Default)
	log.Info("%s", packet.Dump())
	payload.SetVerdict(nfqueue.NF_ACCEPT)
	return 0
}

This test.go file can be compiled like so:

go build -buildmode=plugin test.go

Once the test.so file is generated, it can be used for the packet.proxy.plugin parameter.

In order to be compiled correctly, plugin .go files need to be copied inside bettercap’s source folder and compiled from there, otherwise you might have issues compiling due to dependency conflicts with the vendor folder.