-
Notifications
You must be signed in to change notification settings - Fork 21
Expand file tree
/
Copy pathmain.go
More file actions
136 lines (121 loc) · 4.93 KB
/
main.go
File metadata and controls
136 lines (121 loc) · 4.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package main
import (
"flag"
"fmt"
"os"
"os/signal"
"strings"
"evals.mitre.org/control_server/config"
"evals.mitre.org/control_server/handlers"
"evals.mitre.org/control_server/handlers/handler_manager"
"evals.mitre.org/control_server/logger"
"evals.mitre.org/control_server/restapi"
"evals.mitre.org/control_server/sessions"
)
var testSession1 = sessions.Session{
GUID: "abcdef123456",
IPAddr: "127.0.0.1",
HostName: "myHostName",
User: "myUserName",
Dir: "C:\\MyDir\\",
PID: "1234",
PPID: "4",
SleepInterval: 60,
Jitter: 1.5,
}
var (
defaultRestConfigPath = "./config/restAPI_config.yml"
defaultPayloadDir = "../payloads"
defaultUsingDatabase = false
usingDatabase bool
usingExistingDatabase bool
restConfigFile string
handlerConfigFile string
)
func main() {
flag.StringVar(&restConfigFile, "rest-config", defaultRestConfigPath, "Path to the REST API config file. Default: ./config/restAPI_config.yml")
flag.StringVar(&restConfigFile, "r", defaultRestConfigPath, "Path to the REST API config file. Default: ./config/restAPI_config.yml")
flag.StringVar(&handlerConfigFile, "config", "", "REQUIRED. Path to the handler config file.")
flag.StringVar(&handlerConfigFile, "c", "", "REQUIRED. Path to the handler config file.")
flag.BoolVar(&usingDatabase, "db", defaultUsingDatabase, "Bool indicating if RestAPI will be started with the database.")
flag.BoolVar(&usingExistingDatabase, "existing-db", defaultUsingDatabase, "Bool indicating if the server will be initialized with an existing database.")
flag.Parse()
if len(handlerConfigFile) == 0 {
fmt.Fprintln(os.Stderr, "Required argument -c/--config NOT provided. Please provide a path to the handler config file using -c/--config")
os.Exit(1)
}
logger.Info("Initializing REST API from config file: ", restConfigFile)
err := config.SetRestAPIConfig(restConfigFile)
if err != nil {
logger.Fatal(err)
}
logger.Success("REST API configuration set")
loadHandlerConfig(handlerConfigFile)
payloadDirectories := GetPayloadDirectories()
if payloadDirectories == nil {
payloadDirectories = map[string]string{"": defaultPayloadDir}
}
logger.Info("Starting REST API server")
restAPIaddress := config.GetRestAPIListenAddress()
restapi.Start(restAPIaddress, payloadDirectories, usingDatabase)
logger.Success("REST API server is listening on: ", restAPIaddress)
logger.Info("Starting C2 handlers")
handlers.StartHandlers()
if usingDatabase || usingExistingDatabase {
logger.Info("Initializing database")
restapi.SetupDatabase(usingExistingDatabase)
} else {
logger.Info("Initializing REST API server without database")
}
logger.Info("Waiting for connections")
signalChannel := make(chan os.Signal, 1)
signal.Notify(signalChannel, os.Interrupt)
s := <-signalChannel
logger.Info(fmt.Sprintf("Received signal %s: stopping handlers.", s))
handlers.StopHandlers()
restapi.Stop()
}
// Load in the handler configuration.
func loadHandlerConfig(configFile string) {
logger.Info("Setting C2 handler configurations from config file: ", configFile)
err := config.HandlerConfig.SetHandlerConfig(configFile)
if err != nil {
logger.Fatal(err)
}
logger.Success("C2 Handler configuration set")
}
// Get the payload directories
func GetPayloadDirectories() map[string]string {
logger.Info("Retrieving payload directories")
payloadDirectories := map[string]string{}
handlerConfigMap := config.HandlerConfig.GetHandlerConfigMapLowercase()
if len(handlerConfigMap) == 0 {
return nil
}
if len(handler_manager.AvailableHandlers) == 0 {
logger.Fatal("No handlers available to retreive payload directories.")
return nil
}
for handlerName := range handler_manager.AvailableHandlers {
configEntry, ok := handlerConfigMap[strings.ToLower(handlerName)]
if !ok || strings.ToLower(handlerName) == "simplefileserver" {
continue
}
enabled, err := config.ConfigEntryEnabled(configEntry)
if err != nil {
logger.Error(fmt.Sprintf("Failed to check if handler %s is enabled: %s", handlerName, err.Error()))
continue
}
if enabled {
payloadDir, err := config.GetHandlerPayloadDir(configEntry)
if err != nil {
logger.Info(fmt.Sprintf("Using default payload directory for handler %s: %s", handlerName, err.Error()))
payloadDirectories[handlerName] = defaultPayloadDir
} else {
logger.Info(fmt.Sprintf("Handler %s payload directory: %s", handlerName, payloadDir))
payloadDirectories[handlerName] = payloadDir
}
}
}
return payloadDirectories
}