bettercap/modules/tcp_proxy_script.go

105 lines
2.3 KiB
Go

package modules
import (
"io/ioutil"
"net"
"strings"
"github.com/bettercap/bettercap/log"
"github.com/bettercap/bettercap/session"
"github.com/robertkrimen/otto"
)
type TcpProxyScript struct {
*ProxyScript
onDataScript *otto.Script
}
func LoadTcpProxyScriptSource(path, source string, sess *session.Session) (err error, s *TcpProxyScript) {
err, ps := LoadProxyScriptSource(path, source, sess)
if err != nil {
return
}
s = &TcpProxyScript{
ProxyScript: ps,
onDataScript: nil,
}
if s.hasCallback("onData") {
s.onDataScript, err = s.VM.Compile("", "onData(from, to, data)")
if err != nil {
log.Error("Error while compiling onData callback: %s", err)
return
}
}
return
}
func LoadTcpProxyScript(path string, sess *session.Session) (err error, s *TcpProxyScript) {
log.Info("loading TCP proxy script %s ...", path)
raw, err := ioutil.ReadFile(path)
if err != nil {
return
}
return LoadTcpProxyScriptSource(path, string(raw), sess)
}
func (s *TcpProxyScript) doDefines(from, to net.Addr, data []byte) (err error) {
addrFrom := strings.Split(from.String(), ":")[0]
addrTo := strings.Split(to.String(), ":")[0]
if err = s.VM.Set("from", addrFrom); err != nil {
log.Error("Error while defining from: %s", err)
return
} else if err = s.VM.Set("to", addrTo); err != nil {
log.Error("Error while defining to: %s", err)
return
} else if err = s.VM.Set("data", data); err != nil {
log.Error("Error while defining data: %s", err)
return
}
return
}
func (s *TcpProxyScript) OnData(from, to net.Addr, data []byte) []byte {
if s.onDataScript != nil {
s.Lock()
defer s.Unlock()
err := s.doDefines(from, to, data)
if err != nil {
log.Error("Error while running bootstrap definitions: %s", err)
return nil
}
ret, err := s.VM.Run(s.onDataScript)
if err != nil {
log.Error("Error while executing onData callback: %s", err)
return nil
}
// do we have any return value to override the buffer with?
if !ret.IsNull() && !ret.IsUndefined() {
exported, err := ret.Export()
if err != nil {
log.Error("Error while exporting results: %s", err)
return nil
}
array, ok := exported.([]byte)
if !ok {
log.Error("Error while casting exported value to array of byte: value = %s", exported)
return nil
}
return array
}
}
return nil
}