From 01113551fbe659e85d48382a5d5e4cea78948ce8 Mon Sep 17 00:00:00 2001 From: Evan Hosinski Date: Sun, 12 Oct 2025 18:46:59 -0400 Subject: [PATCH 1/7] Add web server implementation for RMM-Hunter with API endpoints and WebSocket support --- cmd/root.go | 6 +- go.mod | 2 + go.sum | 4 + internal/web/webserver.go | 224 +++++++++++++++++++++++++++++++++++++- main.go | 14 +++ 5 files changed, 245 insertions(+), 5 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index 5efa5bd..5f03673 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -6,6 +6,7 @@ import ( "rmm-hunter/internal/pkg" "rmm-hunter/internal/pkg/hunter" "rmm-hunter/internal/tui" + "rmm-hunter/internal/web" scurvy "github.com/Kraken-OffSec/Scurvy" "github.com/Kraken-OffSec/Scurvy/core/escalator" @@ -145,9 +146,8 @@ func runHunt() { func runEliminate() { if webUI { - // Launch the web UI for elimination flow - // TODO: Launch web UI - fmt.Println("Web UI not implemented yet") + fmt.Println("Starting Web UI on http://127.0.0.1:8080 ...") + web.StartWebServer() return } else if cliUI { // Launch the TUI for elimination flow diff --git a/go.mod b/go.mod index 0cb8b12..944169c 100644 --- a/go.mod +++ b/go.mod @@ -30,6 +30,7 @@ require ( github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect github.com/ethereum/go-ethereum v1.14.12 // indirect github.com/go-ole/go-ole v1.3.0 // indirect + github.com/gorilla/websocket v1.5.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect @@ -49,6 +50,7 @@ require ( github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/net v0.27.0 // indirect golang.org/x/text v0.21.0 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect howett.net/plist v1.0.1 // indirect diff --git a/go.sum b/go.sum index 0295d34..be8cd78 100644 --- a/go.sum +++ b/go.sum @@ -57,6 +57,8 @@ github.com/ethereum/go-ethereum v1.14.12 h1:8hl57x77HSUo+cXExrURjU/w1VhL+ShCTJrT github.com/ethereum/go-ethereum v1.14.12/go.mod h1:RAC2gVMWJ6FkxSPESfbshrcKpIokgQKsVKmAuqdekDY= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= @@ -102,6 +104,8 @@ golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= +golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= +golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/internal/web/webserver.go b/internal/web/webserver.go index 212ae57..5649e49 100644 --- a/internal/web/webserver.go +++ b/internal/web/webserver.go @@ -1,5 +1,225 @@ package web -func StartWebServer() { - // TODO: Start web server +import ( + "bufio" + "context" + "embed" + "encoding/json" + "fmt" + "log" + "net/http" + "os" + "path/filepath" + "strings" + "sync" + "time" + + "rmm-hunter/internal/pkg" + "rmm-hunter/internal/pkg/hunter" + + "github.com/gorilla/websocket" +) + +//go:embed templates/* +var contentFS embed.FS + +// broadcaster for hunt logs +type wsHub struct { + mu sync.Mutex + conns map[*websocket.Conn]struct{} +} + +func newHub() *wsHub { return &wsHub{conns: make(map[*websocket.Conn]struct{})} } +func (h *wsHub) add(c *websocket.Conn) { h.mu.Lock(); h.conns[c] = struct{}{}; h.mu.Unlock() } +func (h *wsHub) rm(c *websocket.Conn) { h.mu.Lock(); delete(h.conns, c); h.mu.Unlock() } +func (h *wsHub) send(msg string) { + h.mu.Lock() + for c := range h.conns { + _ = c.WriteMessage(websocket.TextMessage, []byte(msg)) + } + h.mu.Unlock() +} + +// JSONReportMeta is a lightweight descriptor for previous hunts +type JSONReportMeta struct { + File string `json:"file"` + ReportName string `json:"reportName"` + GeneratedAt string `json:"generatedAt"` +} + +type server struct { + hub *wsHub + http *http.Server + quitCh chan struct{} +} + +func StartWebServer() { + h := newHub() + s := &server{hub: h, quitCh: make(chan struct{})} + + mux := http.NewServeMux() + mux.HandleFunc("/", s.handleIndex) + mux.HandleFunc("/logo", s.handleLogo) + mux.HandleFunc("/api/hunts", s.handleListHunts) + mux.HandleFunc("/api/hunt/start", s.handleStartHunt) + mux.HandleFunc("/api/report", s.handleGetReport) + mux.HandleFunc("/api/quit", s.handleQuit) + mux.HandleFunc("/ws/hunt", s.handleWS) + + s.http = &http.Server{Addr: ":8080", Handler: logRequests(mux)} + go func() { + log.Printf("[web] starting on http://127.0.0.1:8080\n") + if err := s.http.ListenAndServe(); err != nil && err != http.ErrServerClosed { + log.Fatalf("listen: %v", err) + } + }() + + // block until quit + <-s.quitCh + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + defer cancel() + _ = s.http.Shutdown(ctx) + os.Exit(0) +} + +func logRequests(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + log.Printf("%s %s", r.Method, r.URL.Path) + next.ServeHTTP(w, r) + }) +} + +func (s *server) handleIndex(w http.ResponseWriter, r *http.Request) { + b, err := contentFS.ReadFile("templates/index.html") + if err != nil { + http.Error(w, "template missing", 500) + return + } + w.Header().Set("Content-Type", "text/html; charset=utf-8") + _, _ = w.Write(b) +} + +// serve logo from repo .img; fallback to 404 +func (s *server) handleLogo(w http.ResponseWriter, r *http.Request) { + path := filepath.Join(".img", "rmm-hunter.png") + f, err := os.Open(path) + if err != nil { + http.NotFound(w, r) + return + } + defer f.Close() + w.Header().Set("Content-Type", "image/png") + http.ServeContent(w, r, "rmm-hunter.png", time.Now(), f) +} + +func (s *server) handleListHunts(w http.ResponseWriter, r *http.Request) { + files, _ := filepath.Glob("*.json") + var out []JSONReportMeta + for _, f := range files { + // read small head of file to verify + b, err := os.ReadFile(f) + if err != nil { + continue + } + var env struct { + ReportName string `json:"reportName"` + GeneratedAt string `json:"generatedAt"` + } + if json.Unmarshal(b, &env) == nil && (env.ReportName != "" || strings.Contains(string(b), "\"findings\"")) { + out = append(out, JSONReportMeta{File: f, ReportName: env.ReportName, GeneratedAt: env.GeneratedAt}) + } + } + w.Header().Set("Content-Type", "application/json") + _ = json.NewEncoder(w).Encode(out) +} + +func (s *server) handleGetReport(w http.ResponseWriter, r *http.Request) { + f := r.URL.Query().Get("file") + if f == "" || strings.Contains(f, "..") { + http.Error(w, "bad file", 400) + return + } + b, err := os.ReadFile(f) + if err != nil { + http.Error(w, "not found", 404) + return + } + w.Header().Set("Content-Type", "application/json") + w.Write(b) +} + +func (s *server) handleStartHunt(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + http.Error(w, "use POST", 405) + return + } + name := fmt.Sprintf("hunt-%s", time.Now().Format("20060102-150405")) + go s.runHunt(name) + w.Header().Set("Content-Type", "application/json") + _ = json.NewEncoder(w).Encode(map[string]string{"reportName": name}) +} + +func (s *server) runHunt(name string) { + // redirect stdout to our pipe + oldStdout := os.Stdout + pr, pw, _ := os.Pipe() + os.Stdout = pw + // also mirror stderr + oldStderr := os.Stderr + pr2, pw2, _ := os.Pipe() + os.Stderr = pw2 + + // reader goroutines + done := make(chan struct{}) + go func() { + sc := bufio.NewScanner(pr) + for sc.Scan() { + s.hub.send(sc.Text()) + } + done <- struct{}{} + }() + go func() { + sc := bufio.NewScanner(pr2) + for sc.Scan() { + s.hub.send(sc.Text()) + } + done <- struct{}{} + }() + + // run hunter + hunter.Start(pkg.RunOptions{Name: name}) + + // close writers and restore + _ = pw.Close() + _ = pw2.Close() + <-done + <-done + os.Stdout = oldStdout + os.Stderr = oldStderr + s.hub.send("[+] Hunt complete") +} + +func (s *server) handleWS(w http.ResponseWriter, r *http.Request) { + up := websocket.Upgrader{CheckOrigin: func(r *http.Request) bool { return true }} + c, err := up.Upgrade(w, r, nil) + if err != nil { + return + } + s.hub.add(c) + defer func() { s.hub.rm(c); _ = c.Close() }() + for { // keep alive until client closes + if _, _, err := c.ReadMessage(); err != nil { + return + } + } +} + +func (s *server) handleQuit(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + http.Error(w, "use POST", 405) + return + } + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write([]byte(`{"ok":true}`)) + go func() { time.Sleep(200 * time.Millisecond); s.quitCh <- struct{}{} }() } diff --git a/main.go b/main.go index ec9ba86..e2d7719 100644 --- a/main.go +++ b/main.go @@ -1,9 +1,23 @@ package main import ( + "fmt" + "os" "rmm-hunter/cmd" + "rmm-hunter/internal/web" + + scurvy "github.com/Kraken-OffSec/Scurvy" ) func main() { + if len(os.Args) == 1 { + escErr := scurvy.CheckAndEscalateBinary() + if escErr != nil { + fmt.Printf("Failed to elevate: %v\n", escErr) + os.Exit(1) + } + web.StartWebServer() + return + } cmd.Execute() } From 15fb9eb510f1c39046075d50fe14527888258044 Mon Sep 17 00:00:00 2001 From: Evan Hosinski Date: Sun, 12 Oct 2025 18:53:07 -0400 Subject: [PATCH 2/7] Add web-based user interface with hunting, reporting, and elimination workflow for RMM-Hunter --- internal/web/templates/index.html | 231 ++++++++++++++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 internal/web/templates/index.html diff --git a/internal/web/templates/index.html b/internal/web/templates/index.html new file mode 100644 index 0000000..a32fee7 --- /dev/null +++ b/internal/web/templates/index.html @@ -0,0 +1,231 @@ + + + + + + RMM Hunter Web UI + + + +
+ +
+ +
+
+

Hunt

+

Click Start Hunt to scan for Remote Monitoring & Management (RMM) software. Progress logs will appear below in real-time.

+
+ + +
+
+
+ +
+

Use Previous Hunt

+
+
+ + + + +
+ +
+ KrakenTech-LLC • RMM Hunter Web Interface +
+ + + + + From adcad167dfdb8cee0f7f3c833a2359acfbb17b6f Mon Sep 17 00:00:00 2001 From: Evan Hosinski Date: Sun, 12 Oct 2025 20:02:49 -0400 Subject: [PATCH 3/7] Add support for dynamic hosts file management, browser opening, and new favicon handling in web server. Add elimination workflow UI enhancements with better state management and design. TODO: Test elimination per finding type in web view Figure out where RustDesk registry persistence is located. The installer is aware of it somehow --- internal/pkg/hunt/detect/services/services.go | 6 +- internal/web/browser.go | 45 ++ internal/web/hosts.go | 129 +++++ .../web/templates/android-chrome-192x192.png | Bin 0 -> 17756 bytes .../web/templates/android-chrome-512x512.png | Bin 0 -> 89666 bytes internal/web/templates/apple-touch-icon.png | Bin 0 -> 15980 bytes internal/web/templates/favicon-16x16.png | Bin 0 -> 469 bytes internal/web/templates/favicon-32x32.png | Bin 0 -> 1163 bytes internal/web/templates/favicon.ico | Bin 0 -> 15406 bytes internal/web/templates/index.html | 490 ++++++++++++++++-- internal/web/templates/site.webmanifest | 1 + internal/web/webserver.go | 80 ++- 12 files changed, 712 insertions(+), 39 deletions(-) create mode 100644 internal/web/browser.go create mode 100644 internal/web/hosts.go create mode 100644 internal/web/templates/android-chrome-192x192.png create mode 100644 internal/web/templates/android-chrome-512x512.png create mode 100644 internal/web/templates/apple-touch-icon.png create mode 100644 internal/web/templates/favicon-16x16.png create mode 100644 internal/web/templates/favicon-32x32.png create mode 100644 internal/web/templates/favicon.ico create mode 100644 internal/web/templates/site.webmanifest diff --git a/internal/pkg/hunt/detect/services/services.go b/internal/pkg/hunt/detect/services/services.go index 13e0b7a..cba30b8 100644 --- a/internal/pkg/hunt/detect/services/services.go +++ b/internal/pkg/hunt/detect/services/services.go @@ -7,7 +7,6 @@ import ( "strings" "github.com/Kraken-OffSec/Scurvy/core/service" - "golang.org/x/sys/windows" ) // Whitelist for our own tool and legitimate system components @@ -35,7 +34,8 @@ func Detect() []*Service { fmt.Printf("[-] Error getting Service Manager: %s\n", err.Error()) return []*Service{} } - defer windows.Close(scm.Handle) + // Note: The service manager handle is managed by the Scurvy library + // and should not be manually closed here to avoid invalid handle errors services, err := scm.ListServices() if err != nil { @@ -57,6 +57,8 @@ func compareServices(serviceStrings []string, scm *service.Mgr) []*Service { fmt.Printf(" [>-] Error opening service %s: %s\n", serviceString, err.Error()) continue } + // Note: Individual service handles are also managed by Scurvy library + config, err := svc.Config() if err != nil { fmt.Printf(" [>-] Error getting service config %s: %s\n", serviceString, err.Error()) diff --git a/internal/web/browser.go b/internal/web/browser.go new file mode 100644 index 0000000..670a9d7 --- /dev/null +++ b/internal/web/browser.go @@ -0,0 +1,45 @@ +package web + +import ( + "fmt" + "syscall" + "unsafe" +) + +var ( + shell32 = syscall.NewLazyDLL("shell32.dll") + shellExecuteW = shell32.NewProc("ShellExecuteW") +) + +// OpenBrowser opens the default browser to the specified URL using Windows ShellExecute API +func OpenBrowser(url string) error { + // Convert strings to UTF16 pointers + operation, err := syscall.UTF16PtrFromString("open") + if err != nil { + return fmt.Errorf("failed to convert operation string: %w", err) + } + + urlPtr, err := syscall.UTF16PtrFromString(url) + if err != nil { + return fmt.Errorf("failed to convert URL string: %w", err) + } + + // ShellExecuteW(hwnd, operation, file, parameters, directory, showCmd) + // SW_SHOWNORMAL = 1, SW_SHOW = 5 + ret, _, callErr := shellExecuteW.Call( + 0, // hwnd (NULL) + uintptr(unsafe.Pointer(operation)), // operation ("open") + uintptr(unsafe.Pointer(urlPtr)), // file (URL) + 0, // parameters (NULL) + 0, // directory (NULL) + 5, // showCmd (SW_SHOW) + ) + + // ShellExecute returns a value > 32 on success + if ret <= 32 { + return fmt.Errorf("ShellExecute failed with code: %d (error: %v)", ret, callErr) + } + + fmt.Printf("[web] Browser opened successfully (return code: %d)\n", ret) + return nil +} diff --git a/internal/web/hosts.go b/internal/web/hosts.go new file mode 100644 index 0000000..5c2688d --- /dev/null +++ b/internal/web/hosts.go @@ -0,0 +1,129 @@ +package web + +import ( + "bufio" + "fmt" + "os" + "path/filepath" + "strings" +) + +const ( + hostsEntry = "127.0.0.1 rmm-hunter" + marker = "# RMM-Hunter entry" +) + +// AddHostsEntry adds the rmm-hunter DNS entry to the Windows hosts file +// Requires administrator privileges +func AddHostsEntry() error { + hostsPath := getHostsPath() + + // Check if entry already exists + exists, err := hostsEntryExists(hostsPath) + if err != nil { + return fmt.Errorf("failed to check hosts file: %w", err) + } + + if exists { + fmt.Println("[+] rmm-hunter hosts entry already exists") + return nil + } + + // Read existing hosts file + content, err := os.ReadFile(hostsPath) + if err != nil { + return fmt.Errorf("failed to read hosts file: %w", err) + } + + // Append our entry + newContent := string(content) + if !strings.HasSuffix(newContent, "\n") { + newContent += "\n" + } + newContent += fmt.Sprintf("\n%s\n%s\n", marker, hostsEntry) + + // Write back to hosts file + err = os.WriteFile(hostsPath, []byte(newContent), 0644) + if err != nil { + return fmt.Errorf("failed to write hosts file: %w", err) + } + + fmt.Println("[+] Added rmm-hunter to hosts file") + fmt.Println("[+] You can now access the web UI at: http://rmm-hunter:8080") + return nil +} + +// RemoveHostsEntry removes the rmm-hunter DNS entry from the Windows hosts file +func RemoveHostsEntry() error { + hostsPath := getHostsPath() + + // Read existing hosts file + file, err := os.Open(hostsPath) + if err != nil { + return fmt.Errorf("failed to open hosts file: %w", err) + } + defer file.Close() + + var newLines []string + scanner := bufio.NewScanner(file) + skipNext := false + + for scanner.Scan() { + line := scanner.Text() + + // Skip the marker line and the next line (our entry) + if strings.Contains(line, marker) { + skipNext = true + continue + } + + if skipNext && strings.Contains(line, "rmm-hunter") { + skipNext = false + continue + } + + newLines = append(newLines, line) + } + + if err := scanner.Err(); err != nil { + return fmt.Errorf("failed to read hosts file: %w", err) + } + + // Write back to hosts file + newContent := strings.Join(newLines, "\n") + err = os.WriteFile(hostsPath, []byte(newContent), 0644) + if err != nil { + return fmt.Errorf("failed to write hosts file: %w", err) + } + + fmt.Println("[+] Removed rmm-hunter from hosts file") + return nil +} + +// hostsEntryExists checks if the rmm-hunter entry already exists in the hosts file +func hostsEntryExists(hostsPath string) (bool, error) { + file, err := os.Open(hostsPath) + if err != nil { + return false, err + } + defer file.Close() + + scanner := bufio.NewScanner(file) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if strings.Contains(line, "rmm-hunter") && strings.Contains(line, "127.0.0.1") { + return true, nil + } + } + + return false, scanner.Err() +} + +// getHostsPath returns the path to the Windows hosts file +func getHostsPath() string { + systemRoot := os.Getenv("SystemRoot") + if systemRoot == "" { + systemRoot = "C:\\Windows" + } + return filepath.Join(systemRoot, "System32", "drivers", "etc", "hosts") +} diff --git a/internal/web/templates/android-chrome-192x192.png b/internal/web/templates/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..9f9fff0a951a012e9baf3961c1cf5f12a5676557 GIT binary patch literal 17756 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 RWh;Op44$rjF6*2UngC*(+Oz-w literal 0 HcmV?d00001 diff --git a/internal/web/templates/android-chrome-512x512.png b/internal/web/templates/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..e5605af826a972a077275949220299e869ea4f7e GIT binary patch literal 89666 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໕GPP)|y zN$WF6t*NY*PDh7bH9zUCOm>cyqYIYix?_awhyEKD9JnnKhxhEI=x)lOFnJ_6lqj|4 zTJ7Scter^O+IVKEUjMpUqW@ZnfhdD`;&6akH+*eL?XNWooeFCVDx$IULsO8OG1oS} zzWB!8QCog$Res*?J**@Mj6n7Fqk7fd(2Ki~P8oyP&2=3heQG)#4WMxN&PZwwJpADi za8uEv@OB7nPG#-YQfBFl`4>KO>jP<~DTgo&G2_0+pr}l%{UtO_94*DTs-L^-Z%7WVQW_SmgH9R&)6vmk+bG2L0!$BE$LZ4 zTbNwKA8tAR+~U+zZZ^zxW%Oi7$yyoe*ZXSq*5N_~$g3hRu8S0!A@sgIwn9q9?+lg@ z!(mU%Kt=>w1wgr^Xm~WW0C5ywkIGGM6f3HG!dFs*Z01*{mg@6H{TN#BMzX2+3kyfZ~e_ZU<^L@Rq|3 zCyRv1c_OY{IK31j41xO|#q0A>*>h`Augp3(H)kobr7ELJw(RP0j=FjIW~ybbd?{Ue z&Ac$S3#>H&SN{Et5wLI(Srb@M47WF;I;kBd8$y(Y(5W$22kEF`bT)E`IS->(<}S=+ zaz-A02`Ci-%Aa}qb;M(aK@F>?q3#3N9wOj}iCZqIN77jU01yC4L_t(@wvNY-xWC59 zDq~#B8{$&s9EwAddTt@gpF0SZ9Y#St^Ey%nKy0xB*<%VsX?CL^bfkwM{M z9TU{CG_15025w*Blt27~oie{dSebN3CAEd2^chuvfN!UBYb7nA|82&_d)Ls6LA zj*_Gxb4c?!tT;M4?26~Nd06`W%gzkklGN2^QpCoPe%zdab_$=JJK2NoLd{^=Hx@Ef z4(J!=xh~l!oq=)%ptA?p|4p<(nGo6EJVb*bKp?C~!dr|)Qc7!182i{~xgnLeVQr-% zSJ4@w_Nqp7@3W97MAJ2Y2IJHS9()#QM#JF(XpUQe{I(;HT%N((DyIk~WFBP|%R5gc z3Z}OY=<7mu<{~;fRhWIZL1|b6kjsF(0|c2B*X*>tGrJ~%^trDOp&yWpY=>pP`BE7T zGnXL4m3LT(iD?G)#Tdb~*Y6CUdZQ%01)#rz%9Jr9(kP?M{@Vi)ps&6gAwvlI&ZnUl z^&lPH48)0(7SgX#{>X

hDf2dq?&{44xG%nv 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 literal 0 HcmV?d00001 diff --git a/internal/web/templates/apple-touch-icon.png b/internal/web/templates/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4039879979383238bc18296c73528b67550f7db6 GIT binary patch literal 15980 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 PC;&-OIgu(MgTVg-h;gFI literal 0 HcmV?d00001 diff --git a/internal/web/templates/favicon-16x16.png b/internal/web/templates/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..cfffb9f7658274e0bc73f1c1f24bc4f5517d3189 GIT binary patch literal 469 zcmV;`0V@89P)IYE4oE5^W7F4RH{(78poP(SHmCsc34n zDXXQ`q0zu7DD~;POB)^!J$OTOaNPHf`+hhM!ym`L0Z8yL(HV$eusS~r0dJ>{xQFfF zpYZE@Ll6QO<7S-A>IJE;)*};3pP{EmF~IT(#&{37Ts7eBS2*V*9Qd=|G6W%z&nND% zRldhnYzY(lGN{>@X31R}dU_NBa1hTi{2GGl3L9ve!jzgb2;IEvEkh6k#R~-l82-Iq)Jg-DtloCY?3E|b4hm2z!=l?>ij)CXP1+=?7Hn&9>=2dj z5e=%pjYY9V4s#4~1e}@!2)YO+jlCT$czSej z$}{P-d7J|u3uD8{x$z;VDbW3tIy|3RiFD7TVm#Bde({jJ&8Hi#)Qsbi=UTQ*0ZJ(Y zgg8Z%UHW`l;q!jiVlGZop!9;-{s#a6|NmwH+(rNZ00v1!K~w_(=BtDugWZZ600000 LNkvXXu0mjf<)O$; literal 0 HcmV?d00001 diff --git a/internal/web/templates/favicon-32x32.png b/internal/web/templates/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..bb3d71ea75e922da7425e628194525b05f16daad GIT binary patch literal 1163 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 tr9b%p4X$+e<4S53q1eQ=(q4&gelBl;yan RMM Hunter Web UI + + + + + + +

+ +
RMM HUNTER
+
POWERED BY KRAKENTECH
+
+
+
@@ -72,27 +146,63 @@
- @@ -206,6 +259,7 @@ const logEl = document.getElementById('log'); const huntsEl = document.getElementById('hunts'); const huntTag = document.getElementById('huntTag'); + const viewReportBtn = document.getElementById('viewReportBtn'); const reportSection = document.getElementById('reportSection'); const reportHeader = document.getElementById('reportHeader'); const reportBody = document.getElementById('reportBody'); @@ -350,27 +404,93 @@ } // Hunt flow + let lastReportData = null; + let currentReportName = null; + document.getElementById('startHunt').addEventListener('click', async ()=>{ - logEl.textContent=''; huntTag.classList.add('hidden'); + logEl.textContent=''; + huntTag.classList.add('hidden'); + viewReportBtn.classList.add('hidden'); + currentReportName = null; + let ws; - try{ ws = new WebSocket((location.protocol==='https:'?'wss':'ws')+'://'+location.host+'/ws/hunt'); - ws.onmessage = ev => { logEl.textContent += ev.data + '\n'; logEl.scrollTop = logEl.scrollHeight; }; + let wsReady = false; + let huntComplete = false; + + try{ + ws = new WebSocket((location.protocol==='https:'?'wss':'ws')+'://'+location.host+'/ws/hunt'); + ws.onopen = () => { wsReady = true; }; + ws.onmessage = ev => { + logEl.textContent += ev.data + '\n'; + logEl.scrollTop = logEl.scrollHeight; + + // Check if hunt is complete + if (ev.data.includes('[+] Hunt complete')) { + huntComplete = true; + } + }; }catch(e){ console.error(e); } + + // Wait for WebSocket to be ready before starting hunt + while(!wsReady && ws && ws.readyState !== WebSocket.OPEN) { + await new Promise(resolve => setTimeout(resolve, 50)); + } + + // Give it a tiny bit more time to ensure connection is stable + await new Promise(resolve => setTimeout(resolve, 100)); + const r = await fetch('/api/hunt/start',{method:'POST'}); const data = await r.json(); + if(data && data.reportName){ + currentReportName = data.reportName; + + // Wait for hunt to actually complete + while(!huntComplete) { + await new Promise(resolve => setTimeout(resolve, 100)); + } + huntTag.classList.remove('hidden'); await typeText(huntTag, 'Report: '+data.reportName+'.json', 30); + // Load report const rep = await (await fetch('/api/report?file='+encodeURIComponent(data.reportName+'.json'))).json(); - renderReport(rep); location.hash = '#report'; + lastReportData = rep; + renderReport(rep); + + // Show View Report button AFTER everything is loaded + viewReportBtn.classList.remove('hidden'); } if(ws) ws.close(); listHunts(); }); + // View Report button handler + viewReportBtn.addEventListener('click', () => { + if (lastReportData) { + location.hash = '#report'; + } + }); + document.getElementById('quitBtn').addEventListener('click', async ()=>{ - await fetch('/api/quit',{method:'POST'}); + // Show shutdown screen + const shutdownScreen = document.getElementById('shutdownScreen'); + const spinner = shutdownScreen.querySelector('.spinner'); + const shutdownSuccess = shutdownScreen.querySelector('.shutdown-success'); + shutdownScreen.classList.add('active'); + + // Send quit request + try { + await fetch('/api/quit',{method:'POST'}); + } catch(e) { + // Server is shutting down, connection will be lost + } + + // After 2 seconds, hide spinner and show success message + setTimeout(() => { + spinner.classList.add('hide'); + shutdownSuccess.classList.add('show'); + }, 2000); }); listHunts(); @@ -631,11 +751,123 @@ }).join(''); } - window.eliminateItem = function(type, idx) { + // Modal functions + const modal = document.getElementById('modal'); + const modalIcon = document.getElementById('modalIcon'); + const modalTitle = document.getElementById('modalTitle'); + const modalMessage = document.getElementById('modalMessage'); + const modalBtn = document.getElementById('modalBtn'); + + function showModal(type, title, message) { + modal.classList.add('active'); + modalIcon.className = `modal-icon ${type}`; + modalTitle.className = `modal-title ${type}`; + modalTitle.textContent = title; + modalMessage.textContent = message; + modalBtn.className = `modal-btn ${type}`; + modalBtn.textContent = 'OK'; + + if (type === 'success') { + modalIcon.textContent = '✓'; + } else { + modalIcon.textContent = '✕'; + } + + modalBtn.onclick = () => { + modal.classList.remove('active'); + }; + } + + window.eliminateItem = async function(type, idx) { if (!confirm(`Are you sure you want to eliminate this ${type.slice(0, -1)}?\n\nThis action cannot be undone.`)) return; - alert('Elimination functionality not yet implemented in web UI.\n\nPlease use the CLI: rmm-hunter eliminate --cli'); - // TODO: Implement API call to backend elimination endpoint + if (!currentReport) { + showModal('error', 'Error', 'No report loaded'); + return; + } + + // Get the report filename from the current report + const reportFile = currentReport.reportName || currentReport.name || 'rmm-hunter-report.json'; + + // Find the tree child element for this item + const treeChildren = document.querySelectorAll('.tree-child'); + let targetElement = null; + + // Find the element by matching the index and type + treeChildren.forEach((child, childIdx) => { + const parentNode = child.previousElementSibling; + if (parentNode && parentNode.classList.contains('tree-node')) { + // Check if this is the right category + const categoryText = parentNode.textContent.toLowerCase(); + if ((type === 'connections' && categoryText.includes('outbound')) || + (type === 'processes' && categoryText.includes('processes')) || + (type === 'services' && categoryText.includes('services')) || + (type === 'tasks' && categoryText.includes('scheduled')) || + (type === 'autoruns' && categoryText.includes('autorun')) || + (type === 'binaries' && categoryText.includes('binaries')) || + (type === 'directories' && categoryText.includes('directories'))) { + // This is the right category, now check index + const siblings = Array.from(child.parentElement.children).filter(c => c.classList.contains('tree-child')); + const itemIdx = siblings.indexOf(child); + if (itemIdx === idx) { + targetElement = child; + } + } + } + }); + + try { + const response = await fetch('/api/eliminate', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + reportFile: reportFile, + type: type, + index: idx + }) + }); + + const result = await response.json(); + + if (!response.ok) { + showModal('error', 'Elimination Failed', result.error || 'Unknown error occurred'); + return; + } + + // Success! Trigger slide-out animation + if (targetElement) { + targetElement.classList.add('eliminating'); + + // Wait for animation to complete before updating tree + setTimeout(async () => { + // Show success modal + showModal('success', 'Successfully Eliminated', `The ${type.slice(0, -1)} has been removed from your system.`); + + // Reload the report to get updated data + const updatedReport = await (await fetch('/api/report?file=' + encodeURIComponent(reportFile))).json(); + currentReport = updatedReport; + + // Reload elimination tree with updated data + loadEliminationData(updatedReport); + + // Clear the center and wiki panels + elimCenter.innerHTML = '
Select an item from the tree
'; + elimWiki.innerHTML = '
Item details will appear here
'; + }, 600); // Match animation duration + } else { + // Fallback if element not found + showModal('success', 'Successfully Eliminated', `The ${type.slice(0, -1)} has been removed from your system.`); + + const updatedReport = await (await fetch('/api/report?file=' + encodeURIComponent(reportFile))).json(); + currentReport = updatedReport; + loadEliminationData(updatedReport); + elimCenter.innerHTML = '
Select an item from the tree
'; + elimWiki.innerHTML = '
Item details will appear here
'; + } + + } catch (error) { + showModal('error', 'Error', `Failed to eliminate: ${error.message}`); + } }; // Update renderReport to also load elimination data diff --git a/internal/web/webserver.go b/internal/web/webserver.go index f38916b..15ad33a 100644 --- a/internal/web/webserver.go +++ b/internal/web/webserver.go @@ -10,11 +10,13 @@ import ( "net/http" "os" "path/filepath" + "rmm-hunter/internal/suspicious" "strings" "sync" "time" "rmm-hunter/internal/pkg" + "rmm-hunter/internal/pkg/hunt/eliminate" "rmm-hunter/internal/pkg/hunter" "github.com/gorilla/websocket" @@ -76,6 +78,7 @@ func StartWebServer() { mux.HandleFunc("/api/hunts", s.handleListHunts) mux.HandleFunc("/api/hunt/start", s.handleStartHunt) mux.HandleFunc("/api/report", s.handleGetReport) + mux.HandleFunc("/api/eliminate", s.handleEliminate) mux.HandleFunc("/api/quit", s.handleQuit) mux.HandleFunc("/ws/hunt", s.handleWS) @@ -103,7 +106,8 @@ func StartWebServer() { <-serverReady time.Sleep(500 * time.Millisecond) // Give server a moment to fully initialize log.Printf("[web] Opening browser to %s...\n", browserURL) - if err := OpenBrowser(browserURL); err != nil { + _, err := OpenBrowser(browserURL) + if err != nil { log.Printf("[web] Warning: Failed to open browser: %v\n", err) if !hostAdded { log.Printf("[web] Please open your browser and navigate to http://127.0.0.1\n") @@ -290,6 +294,61 @@ func (s *server) handleWS(w http.ResponseWriter, r *http.Request) { } } +func (s *server) handleEliminate(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + http.Error(w, "method not allowed", http.StatusMethodNotAllowed) + return + } + + var req struct { + ReportFile string `json:"reportFile"` + Type string `json:"type"` + Index int `json:"index"` + } + + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + http.Error(w, "invalid request", http.StatusBadRequest) + return + } + + // Load the report file + reportPath := filepath.Join(".", req.ReportFile) + data, err := os.ReadFile(reportPath) + if err != nil { + http.Error(w, fmt.Sprintf("failed to read report: %v", err), http.StatusInternalServerError) + return + } + + var report suspicious.Suspicious + if err := json.Unmarshal(data, &report); err != nil { + http.Error(w, fmt.Sprintf("failed to parse report: %v", err), http.StatusInternalServerError) + return + } + + // Perform elimination based on type + if err := performElimination(&report, req.Type, req.Index); err != nil { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusBadRequest) + json.NewEncoder(w).Encode(map[string]string{"error": err.Error()}) + return + } + + // Save updated report + updatedData, err := json.MarshalIndent(report, "", " ") + if err != nil { + http.Error(w, fmt.Sprintf("failed to marshal report: %v", err), http.StatusInternalServerError) + return + } + + if err := os.WriteFile(reportPath, updatedData, 0644); err != nil { + http.Error(w, fmt.Sprintf("failed to save report: %v", err), http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(map[string]string{"status": "success"}) +} + func (s *server) handleQuit(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { http.Error(w, "use POST", 405) @@ -299,3 +358,187 @@ func (s *server) handleQuit(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte(`{"ok":true}`)) go func() { time.Sleep(200 * time.Millisecond); s.quitCh <- struct{}{} }() } + +// performElimination executes the elimination logic for a specific finding type and index +func performElimination(report *suspicious.Suspicious, typeKey string, idx int) error { + switch typeKey { + case "connections": + if idx >= len(report.OutboundConnections) { + return fmt.Errorf("invalid index") + } + conn := report.OutboundConnections[idx] + if err := eliminate.EliminateConnection(conn.RemoteHost); err != nil { + return err + } + report.OutboundConnections[idx].Eliminated = true + + case "processes": + if idx >= len(report.Processes) { + return fmt.Errorf("invalid index") + } + proc := report.Processes[idx] + if err := eliminate.EliminateProcess(proc); err != nil { + return err + } + report.Processes[idx].Eliminated = true + + case "services": + if idx >= len(report.Services) { + return fmt.Errorf("invalid index") + } + svc := report.Services[idx] + if svc == nil { + return fmt.Errorf("service is nil") + } + if err := eliminate.EliminateService(*svc); err != nil { + return err + } + report.Services[idx].Eliminated = true + + case "tasks": + if idx >= len(report.ScheduledTasks) { + return fmt.Errorf("invalid index") + } + task := report.ScheduledTasks[idx] + if task == nil { + return fmt.Errorf("task is nil") + } + if err := eliminate.EliminateScheduledTask(*task); err != nil { + return err + } + report.ScheduledTasks[idx].Eliminated = true + + case "autoruns": + if idx >= len(report.AutoRuns) { + return fmt.Errorf("invalid index") + } + ar := report.AutoRuns[idx] + if err := eliminate.EliminateAutoRun(ar); err != nil { + return err + } + report.AutoRuns[idx].Eliminated = true + + case "binaries": + if idx >= len(report.Binaries) { + return fmt.Errorf("invalid index") + } + bin := report.Binaries[idx] + // Check if binary is blocked by active processes/services + if err := checkBinaryBlocked(bin.Path, *report); err != nil { + return err + } + if err := eliminate.EliminateBinary(bin.Path); err != nil { + return err + } + report.Binaries[idx].Eliminated = true + + case "directories": + if idx >= len(report.Directories) { + return fmt.Errorf("invalid index") + } + dir := report.Directories[idx] + // Check if directory is blocked by active processes/services + if err := checkDirectoryBlocked(dir.Path, *report); err != nil { + return err + } + if err := eliminate.EliminateDirectory(dir.Path); err != nil { + return err + } + report.Directories[idx].Eliminated = true + + default: + return fmt.Errorf("unknown type: %s", typeKey) + } + + return nil +} + +// checkBinaryBlocked checks if a binary is in use by active processes or services +func checkBinaryBlocked(path string, data suspicious.Suspicious) error { + normPath := func(p string) string { + return strings.ToLower(filepath.Clean(p)) + } + + np := normPath(path) + + // Check active processes + for _, p := range data.Processes { + if p.Eliminated { + continue + } + if normPath(p.Path) == np { + return fmt.Errorf("binary in use by running process %s (PID %d). Eliminate the process first", p.Name, p.PID) + } + } + + // Check enabled services + for _, s := range data.Services { + if s == nil || s.Eliminated { + continue + } + sp := normPath(s.BinaryPathName) + if sp == np && !strings.EqualFold(strings.TrimSpace(s.StartType), "disabled") { + // Check if service has a running process + for _, p := range data.Processes { + if p.Eliminated { + continue + } + if normPath(p.Path) == sp { + return fmt.Errorf("binary used by active and enabled service %s. Stop/delete the service first", s.Name) + } + } + } + } + + return nil +} + +// checkDirectoryBlocked checks if a directory contains binaries used by active processes or services +func checkDirectoryBlocked(dir string, data suspicious.Suspicious) error { + normPath := func(p string) string { + return strings.ToLower(filepath.Clean(p)) + } + + dn := normPath(dir) + if !strings.HasSuffix(dn, string(filepath.Separator)) { + dn += string(filepath.Separator) + } + + inDir := func(p string) bool { + pp := normPath(p) + if pp == "" { + return false + } + return strings.HasPrefix(pp, dn) + } + + // Check processes + for _, p := range data.Processes { + if p.Eliminated { + continue + } + if inDir(p.Path) { + return fmt.Errorf("directory contains active process %s (PID %d). Eliminate the process first", p.Name, p.PID) + } + } + + // Check services + for _, s := range data.Services { + if s == nil || s.Eliminated { + continue + } + if inDir(s.BinaryPathName) && !strings.EqualFold(strings.TrimSpace(s.StartType), "disabled") { + // Check if service has a running process + for _, p := range data.Processes { + if p.Eliminated { + continue + } + if normPath(p.Path) == normPath(s.BinaryPathName) { + return fmt.Errorf("directory contains active and enabled service binary for %s. Stop/delete the service first", s.Name) + } + } + } + } + + return nil +} From 3f50f208928fc066b23ab9a4cdc932732fbbcd27 Mon Sep 17 00:00:00 2001 From: Evan Hosinski Date: Sun, 12 Oct 2025 21:58:11 -0400 Subject: [PATCH 6/7] Enhance API error responses with JSON format, improve suspicious directory detection with worker pool implementation, and refine elimination logic with better index validation and data flow updates. Update UI for active report indicators, item expansion, and eliminated state tracking. --- .../pkg/hunt/detect/directory/directories.go | 107 +++-- internal/pkg/hunt/eliminate/autorun.go | 28 +- internal/web/templates/index.html | 450 +++++++++++++++--- internal/web/webserver.go | 88 ++-- 4 files changed, 536 insertions(+), 137 deletions(-) diff --git a/internal/pkg/hunt/detect/directory/directories.go b/internal/pkg/hunt/detect/directory/directories.go index a0ed870..16afaeb 100644 --- a/internal/pkg/hunt/detect/directory/directories.go +++ b/internal/pkg/hunt/detect/directory/directories.go @@ -7,55 +7,102 @@ import ( "rmm-hunter/internal/pkg/hunt/detect/common" . "rmm-hunter/internal/suspicious" "strings" + "sync" ) var appData = os.Getenv("APPDATA") var userProfile = os.Getenv("USERPROFILE") -func Detect() []Directory { - var suspiciousDirectories []Directory - seen := make(map[string]bool) // Prevent duplicates +const numWorkers = 5 +type searchJob struct { + basePath string + rmmDir string +} + +func Detect() []Directory { fmt.Printf("[*] Enumerating Suspicious Directories \n") - // For each known RMM directory, check in all base paths + // Create channels + jobs := make(chan searchJob, 100) + results := make(chan Directory, 100) + + // WaitGroup to track workers + var wg sync.WaitGroup + + // Start worker pool + for i := 0; i < numWorkers; i++ { + wg.Add(1) + go worker(jobs, results, &wg) + } + + // Start result collector goroutine + var suspiciousDirectories []Directory + seen := make(map[string]bool) + var resultWg sync.WaitGroup + resultWg.Add(1) + + go func() { + defer resultWg.Done() + for dir := range results { + if !seen[dir.Path] { + fmt.Printf(" [?] Found %s\n", dir.Path) + suspiciousDirectories = append(suspiciousDirectories, dir) + seen[dir.Path] = true + } + } + }() + + // Send jobs to workers for _, rmmDir := range common.KnownRMMDirectories { for _, basePath := range common.SearchBasePaths { - // Replace environment variables - basePath = replaceEnvVars(basePath) - - // Construct full path - fullPath := filepath.Join(basePath, rmmDir) - - // Check if this is a prefix pattern (ends with incomplete path like "ScreenConnect Client (") - if isPrefix(rmmDir) { - // Find all directories matching this prefix - matches := findPrefixMatches(fullPath) - for _, match := range matches { - if !seen[match] { - fmt.Printf(" [?] Found %s\n", match) - suspiciousDirectories = append(suspiciousDirectories, Directory{Path: match}) - seen[match] = true - } - } - } else { - // Exact match - if _, err := os.Stat(fullPath); err == nil { - if !seen[fullPath] { - fmt.Printf(" [?] Found %s\n", fullPath) - suspiciousDirectories = append(suspiciousDirectories, Directory{Path: fullPath}) - seen[fullPath] = true - } - } + jobs <- searchJob{ + basePath: basePath, + rmmDir: rmmDir, } } } + // Close jobs channel and wait for workers to finish + close(jobs) + wg.Wait() + + // Close results channel and wait for collector to finish + close(results) + resultWg.Wait() + fmt.Printf("[+] Found %d Suspicious Directories\n", len(suspiciousDirectories)) return suspiciousDirectories } +// worker processes search jobs from the jobs channel +func worker(jobs <-chan searchJob, results chan<- Directory, wg *sync.WaitGroup) { + defer wg.Done() + + for job := range jobs { + // Replace environment variables + basePath := replaceEnvVars(job.basePath) + + // Construct full path + fullPath := filepath.Join(basePath, job.rmmDir) + + // Check if this is a prefix pattern (ends with incomplete path like "ScreenConnect Client (") + if isPrefix(job.rmmDir) { + // Find all directories matching this prefix + matches := findPrefixMatches(fullPath) + for _, match := range matches { + results <- Directory{Path: match} + } + } else { + // Exact match + if _, err := os.Stat(fullPath); err == nil { + results <- Directory{Path: fullPath} + } + } + } +} + // replaceEnvVars replaces environment variable placeholders with actual paths func replaceEnvVars(path string) string { path = strings.ReplaceAll(path, "{{APPDATA}}", appData) diff --git a/internal/pkg/hunt/eliminate/autorun.go b/internal/pkg/hunt/eliminate/autorun.go index e151d83..1a09858 100644 --- a/internal/pkg/hunt/eliminate/autorun.go +++ b/internal/pkg/hunt/eliminate/autorun.go @@ -10,11 +10,33 @@ import ( // EliminateAutoRun removes an autorun entry from the system func EliminateAutoRun(ar AutoRun) error { all := scurvy.ListAutoruns() + + // Try to find by MD5 first for _, a := range all { - if a.MD5 == ar.MD5 { - // Found it, delete it + if a.MD5 == ar.MD5 && a.MD5 != "" { return scurvy.DeleteAutorun(a) } } - return fmt.Errorf("%s | %s not found", ar.Location, ar.Entry) + + // If not found by MD5, try to find by location (for registry entries) + for _, a := range all { + if a.Location == ar.Location && ar.Location != "" { + return scurvy.DeleteAutorun(a) + } + } + + // Build a descriptive error message + location := ar.Location + if location == "" { + location = "unknown location" + } + entry := ar.Entry + if entry == "" { + entry = ar.ImageName + } + if entry == "" { + entry = "unknown entry" + } + + return fmt.Errorf("autorun entry not found at %s (%s) - it may have already been removed", location, entry) } diff --git a/internal/web/templates/index.html b/internal/web/templates/index.html index a4eee25..79b2133 100644 --- a/internal/web/templates/index.html +++ b/internal/web/templates/index.html @@ -30,6 +30,10 @@ .nav{max-width:1400px;margin:0 auto;display:flex;align-items:center;gap:8px;padding:12px 24px} .brand{display:flex;align-items:center;gap:12px;font-weight:700;letter-spacing:.5px;font-size:16px;color:var(--text)} .brand img{width:40px;height:40px;object-fit:contain;filter:drop-shadow(0 0 8px rgba(23,228,110,.3))} + .active-report-indicator{display:flex;align-items:center;gap:8px;background:rgba(23,228,110,.08);border:1px solid rgba(23,228,110,.2);border-radius:8px;padding:8px 14px;margin-left:16px;transition:all 0.3s ease} + .active-report-indicator .report-icon{font-size:16px} + .active-report-indicator .report-name{font-size:13px;color:var(--accent);font-weight:500;max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} + .active-report-indicator:hover{background:rgba(23,228,110,.12);border-color:rgba(23,228,110,.3)} .spacer{flex:1} .nav a.btn{display:inline-flex;align-items:center;padding:10px 18px;border:none;border-radius:6px;color:var(--text);text-decoration:none;transition:all .2s;font-weight:500;font-size:14px;position:relative;overflow:hidden} .nav a.btn::before{content:'';position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(135deg,rgba(23,228,110,.1),rgba(23,228,110,.05));opacity:0;transition:opacity .2s} @@ -42,6 +46,9 @@ main{max-width:1100px;margin:20px auto;padding:0 16px;flex:1;width:100%} main.full-width{max-width:none;padding:0 20px} .card{background:var(--panel);border:1px solid #133422;border-radius:12px;padding:16px;margin-bottom:16px;box-shadow:0 8px 24px rgba(0,0,0,.25);overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;overflow:hidden} + .expandable-item{transition:all 0.2s ease;position:relative;padding-right:40px} + .expandable-item:hover{border-color:var(--accent);background:#0e1a13} + .expandable-item::after{content:'▼';position:absolute;right:20px;top:20px;color:var(--muted);font-size:12px;transition:transform 0.2s} h1,h2{margin:10px 0} .muted{color:var(--muted)} .grid{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));min-height:400px} @@ -74,6 +81,9 @@ .tree-child:hover::before,.tree-child.selected::before{opacity:1} .tree-child.eliminating{animation:slideOutRight 0.6s ease-in-out forwards} .tree-child.eliminating::after{content:'';position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(90deg,transparent,rgba(23,228,110,.3),transparent);animation:shimmer 0.6s ease-in-out} + .tree-child.eliminated{display:none;opacity:0.4;filter:grayscale(1);text-decoration:line-through;pointer-events:none} + .tree-child.eliminated::before{content:'✓ ';color:#17e46e;opacity:1} + .show-eliminated .tree-child.eliminated{display:flex} @keyframes slideOutRight{0%{transform:translateX(0);opacity:1}50%{opacity:0.5}100%{transform:translateX(100%);opacity:0;height:0;margin:0;padding:0}} @keyframes shimmer{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}} .detail-field{margin:12px 0;padding:10px;background:#050805;border:1px solid #0c2819;border-radius:8px} @@ -123,19 +133,23 @@ .modal{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.8);z-index:10001;display:none;align-items:center;justify-content:center} .modal.active{display:flex} .modal-content{background:var(--panel);border:1px solid #133422;border-radius:12px;padding:30px;max-width:500px;width:90%;box-shadow:0 20px 60px rgba(0,0,0,.5)} - .modal-icon{font-size:60px;text-align:center;margin-bottom:20px} + .modal-icon{font-size:48px;text-align:left;margin-bottom:16px;display:block} .modal-icon.success{color:var(--accent);animation:checkPop 0.5s ease-out} .modal-icon.error{color:#ff5c7a} @keyframes checkPop{0%{transform:scale(0)}50%{transform:scale(1.2)}100%{transform:scale(1)}} - .modal-title{font-size:24px;font-weight:700;text-align:center;margin-bottom:12px} + .modal-title{font-size:24px;font-weight:700;margin-bottom:16px;text-align:left} .modal-title.success{color:var(--accent)} .modal-title.error{color:#ff5c7a} - .modal-message{text-align:center;color:var(--muted);margin-bottom:24px;line-height:1.6} - .modal-btn{width:100%;padding:14px;border:none;border-radius:8px;font-weight:600;font-size:15px;cursor:pointer;transition:all 0.2s} - .modal-btn.success{background:var(--accent);color:#000} - .modal-btn.success:hover{filter:brightness(1.2)} - .modal-btn.error{background:rgba(255,92,122,.2);color:#ff5c7a;border:1px solid #ff5c7a} - .modal-btn.error:hover{background:rgba(255,92,122,.3)} + .modal-title.confirm{color:#ffd166} + .modal-message{color:var(--text);margin-bottom:24px;line-height:1.6;white-space:pre-wrap;font-size:15px;text-align:left} + .modal-buttons{display:flex;gap:12px;margin-top:24px} + .modal-btn{flex:1;padding:12px 24px;border:1px solid #1d4a2f;background:var(--panel);color:var(--text);font-weight:500;font-size:14px;cursor:pointer;transition:all 0.2s;border-radius:0} + .modal-btn:hover{background:#0e1a13;border-color:var(--accent)} + .modal-btn.primary{background:var(--accent);color:#000;border-color:var(--accent)} + .modal-btn.primary:hover{filter:brightness(1.2)} + .modal-btn.danger{background:rgba(255,92,122,.15);color:#ff5c7a;border-color:#ff5c7a} + .modal-btn.danger:hover{background:rgba(255,92,122,.25)} + .modal-icon.confirm{color:#ffd166;text-align:left} @@ -161,7 +175,7 @@ - + @@ -169,9 +183,14 @@ @@ -204,7 +223,12 @@