diff --git a/.gitignore b/.gitignore index b5b43555..6c17bbe1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ *.sw* *.tar.gz *.prof* -betterbot.js +_example/config.js pcaps build bettercap diff --git a/_example/config.example.js b/_example/config.example.js new file mode 100644 index 00000000..38a6a2ee --- /dev/null +++ b/_example/config.example.js @@ -0,0 +1,3 @@ +var wifiInterface = 'put the wifi interface to put in monitor mode here'; +var telegramToken = 'put your telegram bot token here'; +var telegramChatId = 'put your telegram chat id here'; diff --git a/example.js b/_example/example.js similarity index 77% rename from example.js rename to _example/example.js index 37f42410..10cadb3d 100644 --- a/example.js +++ b/_example/example.js @@ -1,17 +1,5 @@ -var wifiInterface = 'put the wifi interface to put in monitor mode here'; -var telegramToken = 'put your telegram bot token here'; -var telegramChatId = 'put your telegram chat id here'; - -function sendMessage(message) { - var url = 'https://api.telegram.org/bot' + telegramToken + - '/sendMessage?chat_id=' + telegramChatId + - '&text=' + http.Encode(message); - - var resp = http.Get(url, {}); - if( resp.Error ) { - log("error while running sending telegram message: " + resp.Error.Error()); - } -} +require("config.js") +require("telegram.js") function onDeauthentication(event) { var data = event.Data; diff --git a/_example/telegram.js b/_example/telegram.js new file mode 100644 index 00000000..3420c315 --- /dev/null +++ b/_example/telegram.js @@ -0,0 +1,10 @@ +function sendMessage(message) { + var url = 'https://api.telegram.org/bot' + telegramToken + + '/sendMessage?chat_id=' + telegramChatId + + '&text=' + http.Encode(message); + + var resp = http.Get(url, {}); + if( resp.Error ) { + log("error while running sending telegram message: " + resp.Error.Error()); + } +} \ No newline at end of file diff --git a/session/script.go b/session/script.go index c3db7b43..7306bef6 100644 --- a/session/script.go +++ b/session/script.go @@ -1,20 +1,93 @@ package session import ( + "fmt" + "github.com/bettercap/bettercap/caplets" _ "github.com/bettercap/bettercap/js" + "github.com/evilsocket/islazy/fs" "github.com/evilsocket/islazy/plugin" + "github.com/evilsocket/islazy/str" + "io/ioutil" + "path/filepath" + "regexp" + "strings" ) +// require("telegram.js") +var requireParser = regexp.MustCompile(`(?msi)^\s*require\s*\(\s*["']([^"']+)["']\s*\);?\s*$`) + type Script struct { *plugin.Plugin } -func LoadScript(fileName string, ses *Session) (*Script, error) { - if p, err := plugin.Load(fileName); err != nil { +// yo! we're doing c-like preprocessing on a javascript file from go :D +func preprocess(basePath string, code string, level int) (string, error) { + if level >= 255 { + return "", fmt.Errorf("too many nested includes") + } + + matches := requireParser.FindAllStringSubmatch(code, -1) + for _, match := range matches { + expr := match[0] + fileName := str.Trim(match[1]) + + if fileName[0] != '/' { + searchPaths := []string{ + filepath.Join(basePath, fileName), + filepath.Join(caplets.InstallBase, fileName), + } + + if strings.Contains(fileName, ".js") == false { + searchPaths = append(searchPaths, []string{ + filepath.Join(basePath, fileName) + ".js", + filepath.Join(caplets.InstallBase, fileName) + ".js", + }...) + } + + found := false + for _, fName := range searchPaths { + if fs.Exists(fName) { + fileName = fName + found = true + break + } + } + if !found { + return "", fmt.Errorf("file %s not found in any of %#v", fileName, searchPaths) + } + } + + raw, err := ioutil.ReadFile(fileName) + if err != nil { + return "", fmt.Errorf("%s: %v", fileName, err) + } + + if includedBody, err := preprocess(filepath.Dir(fileName), string(raw), level+1); err != nil { + return "", fmt.Errorf("%s: %v", fileName, err) + } else { + code = strings.ReplaceAll(code, expr, includedBody) + } + } + + return code, nil +} + +func LoadScript(fileName string) (*Script, error) { + raw, err := ioutil.ReadFile(fileName) + if err != nil { + return nil, err + } + + basePath := filepath.Dir(fileName) + if code, err := preprocess(basePath, string(raw), 0); err != nil { + return nil, err + } else if p, err := plugin.Parse(code); err != nil { return nil, err } else { + p.Path = fileName + p.Name = strings.Replace(basePath, ".js", "", -1) return &Script{ - Plugin: p, + Plugin: p, }, nil } -} \ No newline at end of file +} diff --git a/session/session.go b/session/session.go index 7d38d4ab..dd470f15 100644 --- a/session/session.go +++ b/session/session.go @@ -311,7 +311,7 @@ func (s *Session) Start() error { // load the script here so the session and its internal objects are ready if *s.Options.Script != "" { - if s.script, err = LoadScript(*s.Options.Script, s); err != nil { + if s.script, err = LoadScript(*s.Options.Script); err != nil { return fmt.Errorf("error loading %s: %v", *s.Options.Script, err) } log.Debug("session script %s loaded", *s.Options.Script)