2021-06-16 21:57:31 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2023-04-30 11:18:34 +00:00
|
|
|
"os"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
|
2022-08-21 02:07:54 +00:00
|
|
|
cli "git.tcp.direct/Mirrors/go-prompt"
|
2021-06-16 21:57:31 +00:00
|
|
|
. "github.com/logrusorgru/aurora"
|
|
|
|
"github.com/rs/zerolog"
|
|
|
|
"github.com/rs/zerolog/log"
|
2023-04-30 11:18:34 +00:00
|
|
|
|
2021-06-16 21:57:31 +00:00
|
|
|
"protomolecule/src/eros"
|
2023-04-30 11:18:34 +00:00
|
|
|
|
|
|
|
// "protomolecule/src/wrath"
|
|
|
|
projVars "protomolecule/src/config"
|
2021-08-16 19:16:05 +00:00
|
|
|
"protomolecule/src/deimos"
|
2021-06-16 21:57:31 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var suggestions = []cli.Suggest{
|
|
|
|
// Main Commands
|
|
|
|
// {"scan",
|
|
|
|
// "Start and stop scans"},
|
|
|
|
|
|
|
|
{"scan start",
|
|
|
|
"Start default scan"},
|
|
|
|
|
|
|
|
{"scan start attack",
|
|
|
|
"Start scan that also attempts to connect to all discovered BLE devices"},
|
|
|
|
|
|
|
|
{"scan start tracking",
|
|
|
|
"Start continuous RSSI tracking of all BLE devices within range"},
|
|
|
|
|
|
|
|
{"eros recall mac",
|
|
|
|
"Retrieve device info from database by MAC address"},
|
|
|
|
|
|
|
|
{"eros recall all",
|
|
|
|
"Retrieve info on all devices"},
|
2021-07-01 03:40:33 +00:00
|
|
|
|
|
|
|
{"eros backup",
|
|
|
|
"Backup all databases to the supplied directory"},
|
|
|
|
|
|
|
|
{"arboghast start",
|
|
|
|
"Start entropic fuzzing via advertising"},
|
|
|
|
/*
|
|
|
|
{"wrath",
|
|
|
|
"attack by address"},
|
|
|
|
*/
|
2021-06-16 21:57:31 +00:00
|
|
|
{"exit",
|
|
|
|
"Exit ProtoMolecule"},
|
|
|
|
|
|
|
|
{"debug",
|
|
|
|
"Toggle debug messages"},
|
|
|
|
|
|
|
|
{"help",
|
|
|
|
"in-app documentation"},
|
|
|
|
}
|
|
|
|
|
|
|
|
func completer(in cli.Document) []cli.Suggest {
|
2021-08-21 08:45:32 +00:00
|
|
|
c := in.CurrentLineBeforeCursor()
|
2021-06-16 21:57:31 +00:00
|
|
|
if c == "" {
|
|
|
|
return []cli.Suggest{}
|
|
|
|
}
|
|
|
|
|
|
|
|
return cli.FilterHasPrefix(suggestions, c, true)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Interpret is where we will actuall define our commands
|
|
|
|
func executor(cmd string) {
|
|
|
|
cmd = strings.TrimSpace(cmd)
|
|
|
|
|
|
|
|
var args []string
|
|
|
|
args = strings.Split(cmd, " ")
|
|
|
|
|
|
|
|
getArgs := func(args []string) string {
|
|
|
|
var ret string
|
|
|
|
for i, a := range args {
|
|
|
|
if i == 0 {
|
|
|
|
ret = a
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
ret = ret + " " + a
|
|
|
|
if i != len(args)-1 {
|
|
|
|
ret = ret + " "
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ret
|
|
|
|
}
|
|
|
|
|
|
|
|
switch args[0] {
|
|
|
|
|
|
|
|
case "exit":
|
|
|
|
fallthrough
|
|
|
|
|
|
|
|
case "quit":
|
|
|
|
eros.Slumber()
|
|
|
|
os.Exit(0)
|
|
|
|
|
|
|
|
case "debug":
|
2023-04-30 11:18:34 +00:00
|
|
|
switch log.Logger.GetLevel() {
|
|
|
|
case zerolog.DebugLevel:
|
2021-06-16 21:57:31 +00:00
|
|
|
zerolog.SetGlobalLevel(zerolog.InfoLevel)
|
|
|
|
log.Info().
|
|
|
|
Msg("Debug mode turned " + Sprintf(BrightRed("OFF\n").Bold()))
|
2023-04-30 11:18:34 +00:00
|
|
|
case zerolog.InfoLevel:
|
2021-06-16 21:57:31 +00:00
|
|
|
zerolog.SetGlobalLevel(zerolog.DebugLevel)
|
|
|
|
log.Debug().
|
|
|
|
Msg("Debug mode turned " + Sprintf(BrightGreen("ON\n").Bold()))
|
2023-04-30 11:18:34 +00:00
|
|
|
default:
|
|
|
|
return
|
2021-06-16 21:57:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
case "eros":
|
|
|
|
if len(args) < 2 {
|
|
|
|
getHelp("eros")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
switch args[1] {
|
|
|
|
case "recall":
|
|
|
|
if len(args) < 3 {
|
|
|
|
getHelp("eros recall")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
switch args[2] {
|
|
|
|
case "mac":
|
|
|
|
if len(args) < 4 {
|
|
|
|
getHelp("eros recall")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
fromEros, err := eros.Recall(args[3])
|
|
|
|
if err != nil {
|
|
|
|
log.Error().Err(err).Str("target", args[3]).
|
|
|
|
Msg("Failed to recall MAC")
|
|
|
|
println()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
log.Info().
|
|
|
|
Str("Name", fromEros.Name).
|
|
|
|
Str("Addr", fromEros.Addr).
|
2023-04-30 11:18:34 +00:00
|
|
|
Str("ManuF", fromEros.Manufacturer). // needs to be changed back to fromEros.Manufacturer
|
2021-06-16 21:57:31 +00:00
|
|
|
Int16("Current_RSSI", fromEros.RSSIlast).
|
|
|
|
Int("Service_Count", len(fromEros.Services)).
|
|
|
|
Msg("EROS_RECALL")
|
2021-07-01 03:40:33 +00:00
|
|
|
|
|
|
|
case "backup":
|
|
|
|
if len(args) < 3 {
|
|
|
|
getHelp("eros backup")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if err := eros.Backup(args[3]); err != nil {
|
|
|
|
log.Error().Err(err).Msg("Failed to backup databases!")
|
|
|
|
}
|
2021-06-16 21:57:31 +00:00
|
|
|
}
|
2021-07-01 03:40:33 +00:00
|
|
|
|
2021-06-16 21:57:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
case "help":
|
|
|
|
if len(args) < 2 {
|
|
|
|
getHelp("meta")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
getHelp(getArgs(args))
|
|
|
|
|
|
|
|
case "loadnames":
|
|
|
|
if len(args) < 2 {
|
|
|
|
log.Error().Msg("missing argument: path to json file with manufacturer UUIDs")
|
|
|
|
println()
|
|
|
|
}
|
|
|
|
|
2023-04-30 11:18:34 +00:00
|
|
|
projVars.GlobalConfig.ManuFile = args[1]
|
2021-06-16 21:57:31 +00:00
|
|
|
eros.ManufLoad()
|
|
|
|
|
|
|
|
case "adapter":
|
|
|
|
if len(args) > 1 {
|
|
|
|
switch args[1] {
|
|
|
|
case "list":
|
2021-08-16 19:16:05 +00:00
|
|
|
deimos.PrintBlueDevices()
|
|
|
|
case "sniff":
|
|
|
|
var (
|
|
|
|
err error
|
|
|
|
devint int
|
|
|
|
)
|
|
|
|
if len(args) < 2 {
|
|
|
|
log.Error().Msg("not enough parameters, missing adapter ID")
|
|
|
|
println()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if devint, err = strconv.Atoi(args[2]); err != nil {
|
|
|
|
log.Error().Msg("invalid parameter, must be integer of adapter ID")
|
|
|
|
println()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
deimos.Sniff(devint)
|
2021-06-16 21:57:31 +00:00
|
|
|
default:
|
|
|
|
log.Error().Msg("unknown sub-command: " + args[1])
|
|
|
|
println()
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
getHelp(getArgs(args))
|
|
|
|
}
|
|
|
|
case "scan":
|
|
|
|
if len(args) > 1 {
|
|
|
|
switch args[1] {
|
|
|
|
|
|
|
|
case "list":
|
|
|
|
fallthrough
|
|
|
|
|
|
|
|
case "status":
|
|
|
|
fmt.Println(getArgs(args) + ": start new default BLE scan")
|
|
|
|
|
|
|
|
case "start":
|
|
|
|
if len(args) > 2 {
|
|
|
|
switch args[2] {
|
|
|
|
case "tracking":
|
2023-04-30 11:18:34 +00:00
|
|
|
*projVars.GlobalConfig.CooleanFlags.Tracking = true
|
|
|
|
*projVars.GlobalConfig.CooleanFlags.Attack = false
|
2021-06-16 21:57:31 +00:00
|
|
|
case "attack":
|
2023-04-30 11:18:34 +00:00
|
|
|
*projVars.GlobalConfig.CooleanFlags.Tracking = false
|
|
|
|
*projVars.GlobalConfig.CooleanFlags.Attack = true
|
2021-06-16 21:57:31 +00:00
|
|
|
default:
|
|
|
|
// getHelp(getArgs(args))
|
|
|
|
log.Error().Msg("unknown sub command: " + args[2])
|
|
|
|
println()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bleScan()
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
getHelp(getArgs(args))
|
|
|
|
}
|
|
|
|
|
|
|
|
case "rpc":
|
|
|
|
if len(args) > 1 {
|
|
|
|
switch args[1] {
|
|
|
|
|
|
|
|
case "status":
|
|
|
|
fmt.Println(getArgs(args) + ": ")
|
|
|
|
|
|
|
|
case "server":
|
|
|
|
fmt.Println(getArgs(args) + ": ")
|
|
|
|
|
|
|
|
case "client":
|
|
|
|
fmt.Println(getArgs(args) + ": ")
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
getHelp(getArgs(args))
|
|
|
|
}
|
|
|
|
|
2021-06-21 21:52:09 +00:00
|
|
|
/*
|
2021-07-01 03:40:33 +00:00
|
|
|
case "wrath":
|
|
|
|
if len(args) < 2 {
|
|
|
|
getHelp("wrath")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
wrath(args[1])
|
2021-06-21 21:52:09 +00:00
|
|
|
*/
|
|
|
|
|
2021-06-16 21:57:31 +00:00
|
|
|
case "clear":
|
|
|
|
print("\033[H\033[2J")
|
2023-04-30 11:18:34 +00:00
|
|
|
// termenv.ClearScreen()
|
2021-06-16 21:57:31 +00:00
|
|
|
|
|
|
|
default:
|
|
|
|
log.Error().Msg("unknown command: " + cmd)
|
|
|
|
println()
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
func getHelp(target string) {
|
2021-08-21 08:45:32 +00:00
|
|
|
fmt.Println("pRaNkeD! (help not available just yet.)")
|
|
|
|
fmt.Println()
|
|
|
|
return
|
|
|
|
/*
|
2021-08-28 10:36:48 +00:00
|
|
|
var lines []string
|
2021-06-16 21:57:31 +00:00
|
|
|
|
2021-08-28 10:36:48 +00:00
|
|
|
lines = append(lines, "help: "+target)
|
2021-06-16 21:57:31 +00:00
|
|
|
|
2021-08-28 10:36:48 +00:00
|
|
|
switch target {
|
2021-06-16 21:57:31 +00:00
|
|
|
|
2021-08-28 10:36:48 +00:00
|
|
|
case "meta":
|
|
|
|
var list string
|
|
|
|
for _, cmd := range cmds {
|
|
|
|
list = list + cmd + ", "
|
|
|
|
}
|
2021-06-16 21:57:31 +00:00
|
|
|
|
2021-08-28 10:36:48 +00:00
|
|
|
fmt.Println("Enabled commands: ")
|
|
|
|
list = strings.TrimSuffix(list, ", ")
|
|
|
|
fmt.Println(list)
|
|
|
|
fmt.Println()
|
2021-06-16 21:57:31 +00:00
|
|
|
|
2021-08-28 10:36:48 +00:00
|
|
|
default:
|
|
|
|
log.Error().Msg("Help entry not found!")
|
|
|
|
fmt.Println()
|
|
|
|
}
|
2021-08-21 08:45:32 +00:00
|
|
|
*/
|
2021-06-16 21:57:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func StartCLI() {
|
|
|
|
var hist []string
|
|
|
|
|
|
|
|
p := cli.New(
|
|
|
|
executor,
|
|
|
|
completer,
|
|
|
|
cli.OptionPrefix("ProtoMolecule"+"> "),
|
2023-04-30 11:18:34 +00:00
|
|
|
// cli.OptionPrefixBackgroundColor(cli.Black),
|
2021-06-16 21:57:31 +00:00
|
|
|
cli.OptionPrefixTextColor(cli.Cyan),
|
|
|
|
cli.OptionHistory(hist),
|
|
|
|
cli.OptionSuggestionBGColor(cli.Black),
|
|
|
|
cli.OptionSuggestionTextColor(cli.White),
|
|
|
|
cli.OptionSelectedSuggestionBGColor(cli.Black),
|
|
|
|
cli.OptionSelectedSuggestionTextColor(cli.Cyan),
|
2023-04-30 11:18:34 +00:00
|
|
|
// prompt.OptionLivePrefix
|
2021-06-16 21:57:31 +00:00
|
|
|
cli.OptionTitle("ProtoMolecule"),
|
|
|
|
)
|
|
|
|
|
|
|
|
p.Run()
|
|
|
|
|
|
|
|
}
|