|
|
|
package sgfw
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"net"
|
|
|
|
"sync"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/godbus/dbus"
|
|
|
|
"github.com/subgraph/go-procsnitch"
|
|
|
|
)
|
|
|
|
|
|
|
|
type virtualPkt struct {
|
|
|
|
pol *Policy
|
|
|
|
name string
|
|
|
|
pinfo *procsnitch.Info
|
|
|
|
optstring string
|
|
|
|
prompting bool
|
|
|
|
prompter *prompter
|
|
|
|
guid string
|
|
|
|
timestamp time.Time
|
|
|
|
is_socks bool
|
|
|
|
_proto string
|
|
|
|
srcip net.IP
|
|
|
|
sport uint16
|
|
|
|
dstip net.IP
|
|
|
|
dport uint16
|
|
|
|
}
|
|
|
|
|
|
|
|
var tdb *dbusObjectP
|
|
|
|
var tdbMutex = &sync.Mutex{}
|
|
|
|
var tdbInit = false
|
|
|
|
|
|
|
|
func InitVirtual() {
|
|
|
|
fmt.Println("Initializing virtual packet test subsystem...")
|
|
|
|
|
|
|
|
conn, err := dbus.SystemBus()
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("Error setting up server on test DBus path:", err)
|
|
|
|
tdb = &dbusObjectP{nil}
|
|
|
|
}
|
|
|
|
|
|
|
|
tdb = &dbusObjectP{conn.Object("com.subgraph.FirewallTest", "/com/subgraph/FirewallTest")}
|
|
|
|
tdbInit = true
|
|
|
|
}
|
|
|
|
|
|
|
|
func sendSGFWTestAlert(accepted int, guid string, other string) bool {
|
|
|
|
var dres bool
|
|
|
|
|
|
|
|
if !tdbInit {
|
|
|
|
fmt.Println("Skipping over invocation of SGFWTestAlert(); DBus method was not properly bound")
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
tdbMutex.Lock()
|
|
|
|
defer tdbMutex.Unlock()
|
|
|
|
|
|
|
|
call := tdb.Call("com.subgraph.FirewallTest.SGFWTestAlert", 0, int32(accepted), guid, other)
|
|
|
|
err := call.Store(&dres)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("Error sending DBus SGFWTestAlert() notification:", err)
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) sandbox() string {
|
|
|
|
return vp.pinfo.Sandbox
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) getTimestamp() string {
|
|
|
|
return vp.timestamp.Format("15:04:05.00")
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) socks() bool {
|
|
|
|
return vp.is_socks
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) policy() *Policy {
|
|
|
|
return vp.pol
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) procInfo() *procsnitch.Info {
|
|
|
|
if vp.pinfo == nil {
|
|
|
|
return getEmptyPInfo()
|
|
|
|
}
|
|
|
|
|
|
|
|
return vp.pinfo
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) getOptString() string {
|
|
|
|
return vp.optstring
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) hostname() string {
|
|
|
|
return vp.name
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) src() net.IP {
|
|
|
|
return vp.srcip
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) dst() net.IP {
|
|
|
|
return vp.dstip
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) proto() string {
|
|
|
|
return vp._proto
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) srcPort() uint16 {
|
|
|
|
return vp.sport
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) dstPort() uint16 {
|
|
|
|
return vp.dport
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) accept() {
|
|
|
|
fmt.Println("VIRTUAL PACKET ACCEPTED")
|
|
|
|
sendSGFWTestAlert(1, vp.getGUID(), "")
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) acceptTLSOnly() {
|
|
|
|
fmt.Println("VIRTUAL PACKET ACCEPTED (TLSONLY)")
|
|
|
|
sendSGFWTestAlert(1, vp.getGUID(), "tls")
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) drop() {
|
|
|
|
fmt.Println("VIRTUAL PACKET DROPPED")
|
|
|
|
sendSGFWTestAlert(0, vp.getGUID(), "")
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) setPrompter(val *prompter) {
|
|
|
|
vp.prompter = val
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) getPrompter() *prompter {
|
|
|
|
return vp.prompter
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) getGUID() string {
|
|
|
|
if vp.guid == "" {
|
|
|
|
vp.guid = genGUID()
|
|
|
|
}
|
|
|
|
|
|
|
|
return vp.guid
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) getPrompting() bool {
|
|
|
|
return vp.prompting
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) setPrompting(val bool) {
|
|
|
|
vp.prompting = val
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) print() string {
|
|
|
|
desc := fmt.Sprintf("virtualPkt { src %s:%u, dst %s:%u (%s) proto %s",
|
|
|
|
vp.srcip, vp.sport, vp.dstip, vp.dport, vp.hostname, vp._proto)
|
|
|
|
|
|
|
|
// pinfo excluded
|
|
|
|
desc += fmt.Sprintf(" socks=%v [policy=%s]", vp.is_socks, vp.pol.application)
|
|
|
|
desc += fmt.Sprintf(" prompting=%v ts=%s", vp.prompting, vp.getTimestamp())
|
|
|
|
desc += fmt.Sprintf(" guid=%s [optstring=%s] }", vp.getGUID(), vp.optstring)
|
|
|
|
return desc
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vp *virtualPkt) SetPacket(proto string, srcip net.IP, sport uint16, dstip net.IP, dport uint16, hostname string) bool {
|
|
|
|
vp._proto = proto
|
|
|
|
vp.srcip = srcip
|
|
|
|
vp.dstip = dstip
|
|
|
|
vp.sport = sport
|
|
|
|
vp.dport = dport
|
|
|
|
vp.name = hostname
|
|
|
|
return true
|
|
|
|
}
|