
Un workshop sullo sviluppo di malware.
Nell'era degli EDR, gli operatori red team non possono più cavarsela utilizzando payload pre-compilati. Di conseguenza, lo sviluppo di malware sta diventando una competenza fondamentale per qualsiasi operatore. Iniziare con lo sviluppo di malware (maldev) può sembrare scoraggiante, ma in realtà è molto semplice. Questo workshop ti mostrerà tutto ciò che ti serve per iniziare!
Questo repository contiene le slide e gli esercizi di accompagnamento per il workshop 'MalDev for Dummies' che è stato/sarà tenuto a Hack in Paris 2022 e X33fcon 2023. Sebbene le slide siano state progettate per essere presentate 'di persona', i materiali e gli esercizi rimarranno disponibili qui per essere completati al proprio ritmo - il processo di apprendimento non dovrebbe mai essere affrettato! Issue e pull request a questo repository con domande e/o suggerimenti sono benvenuti.
⚠ Dichiarazione di non responsabilità: Lo sviluppo di malware è una competenza che può -e dovrebbe- essere usata per il bene, per far progredire il campo della sicurezza (offensiva) e mantenere affilate le nostre difese. Se mai utilizzerai queste capacità per svolgere attività per le quali non hai autorizzazione, sei un principiante più grande di quanto questo workshop sia pensato e dovresti andartene via.
Con gli strumenti antivirus (AV) e Enterprise Detection and Response (EDR) che diventano sempre più maturi di minuto in minuto, il red team è costretto a stare al passo con i tempi. Sono finiti i tempi di execute-assembly e di lasciare payload non modificati su disco - se vuoi che i tuoi impegni durino più di una settimana, dovrai migliorare il tuo gioco nella creazione di payload e nello sviluppo di malware. Iniziare in questo campo può essere scoraggiante, tuttavia, e trovare le risorse giuste non è sempre facile.
Questo workshop è rivolto ai principianti del settore e ti guiderà attraverso i tuoi primi passi come sviluppatore di malware. È rivolto principalmente ai professionisti offensivi, ma anche i professionisti difensivi sono i benvenuti per partecipare e ampliare le loro competenze.
Durante il workshop esamineremo un po' di teoria, dopodiché ti allestiremo un ambiente di laboratorio. Ci saranno vari esercizi che potrai completare a seconda delle tue competenze attuali e del tuo livello di familiarità con l'argomento. Tuttavia, l'obiettivo del workshop è imparare, e esplicitamente non completare tutti gli esercizi. Sei libero di scegliere il tuo linguaggio di programmazione preferito per lo sviluppo di malware, ma il supporto durante il workshop è fornito principalmente per i linguaggi C# e Nim.
Durante il workshop, discuteremo gli argomenti chiave necessari per iniziare a creare il proprio malware. Questo include (ma non si limita a):
Per iniziare con lo sviluppo di malware, avrai bisogno di una macchina di sviluppo in modo da non essere disturbato da eventuali strumenti difensivi che potrebbero essere in esecuzione sulla tua macchina host. Preferisco Windows per lo sviluppo, ma Linux o MacOS vanno bene lo stesso. Installa il tuo editor/IDE preferito (io uso VS Code per quasi tutto tranne C#, per cui uso Visual Studio, e poi installa le toolchain necessarie per il tuo linguaggio MalDev preferito:
Non dimenticare di disabilitare Windows Defender o aggiungere le opportune esclusioni, così il tuo duro lavoro non verrà messo in quarantena! Successivamente, possiamo testare su una macchina separata con controlli difensivi come l'AV abilitato.
ℹ Nota: Spesso, i gestori di pacchetti come apt o strumenti di gestione software come Chocolatey o Winget (ora integrato!) possono essere utilizzati per automatizzare l'installazione e la gestione delle dipendenze in modo comodo e ripetibile. Tuttavia, sii consapevole che le versioni nei gestori di pacchetti potrebbero essere indietro di qualche versione rispetto alla realtà! Di seguito è riportato un comando di esempio per installare tutti gli strumenti menzionati in una volta sola.
choco install -y nim choosenim go rust vscode visualstudio2019community dotnetfx
I linguaggi che discuteremo durante questo workshop sono linguaggi compilati, il che significa che un compilatore viene utilizzato per tradurre il codice sorgente in eseguibili binari del formato scelto. Il processo di compilazione varia per ogni linguaggio.
Il codice C# (file .cs) può essere compilato direttamente (con l'utilità csc) o tramite Visual Studio stesso. La maggior parte del codice sorgente in questo repository (tranne la soluzione dell'esercizio bonus 3) può essere compilato come segue.
ℹ Nota: Assicurati di eseguire il comando seguente in un "Prompt dei comandi per sviluppatori di Visual Studio" in modo che sappia dove trovare
csc, si consiglia di utilizzare il "Prompt dei comandi degli strumenti nativi x64" per la tua versione di Visual Studio. Il flag/unsafesarà richiesto per la maggior parte degli script in cui accediamo direttamente a funzionalità di basso livello.
csc filename.exe
Puoi abilitare le ottimizzazioni in fase di compilazione con il flag /optimize. Puoi anche nascondere la finestra della console aggiungendo /target:winexe, o compilare come DLL con /target:library (ma assicurati che la struttura del codice sia adatta a questo).
Il codice Nim (file .nim) viene compilato con il comando nim c. Il codice sorgente in questo repository può essere compilato come segue.
nim c filename.nim
Se vuoi ottimizzare la build per la dimensione e rimuovere le informazioni di debug (molto meglio per l'opsec!), puoi aggiungere i seguenti flag.
nim c -d:release -d:strip --opt:size filename.nim
Opzionalmente puoi anche nascondere la finestra della console aggiungendo --app:gui.
Il codice Golang (file .go) viene compilato con il comando go build. Il codice sorgente in questo repository può essere compilato come segue.
GOOS=windows go build
Se vuoi ottimizzare la build per la dimensione e rimuovere le informazioni di debug (molto meglio per l'opsec!), puoi aggiungere i seguenti flag.
GOOS=windows go build -ldflags "-s -w"
Il codice Rust (file .rs) viene compilato tramite il comando cargo. Cargo può essere utilizzato per gestire le dipendenze e compilare il progetto. Il codice sorgente in questo repository può essere compilato navigando nella cartella del progetto ed eseguendo il seguente comando.
cargo build
Se vuoi ottimizzare la build per la dimensione e rimuovere le informazioni di debug, puoi aggiungere i seguenti flag. Fai riferimento anche alla sezione [profile.release] in ogni file Cargo.toml per alcune opzioni di opsec in fase di compilazione.
cargo build --release
La maggior parte delle soluzioni può essere compilata senza dipendenze. Nel caso siano necessarie dipendenze, viene fornito un progetto Visual Studio che collega ai pacchetti NuGet appropriati.
La maggior parte dei programmi Nim dipende da una libreria chiamata "Winim" per interfacciarsi con l'API di Windows. Puoi installare la libreria con il gestore pacchetti Nimble come segue (dopo aver installato Nim):
nimble install winim
Nel codice sorgente di questo repository vengono utilizzate alcune dipendenze. Puoi installarle come segue (dopo aver installato Go):
go mod tidy
Alcuni esempi dipendono dal crate windows-sys per chiamare l'API di Windows. Poiché utilizziamo Cargo, i pacchetti verranno gestiti automaticamente quando compili una build di test o release.
Le slide del workshop fanno riferimento ad alcune risorse che puoi utilizzare per iniziare. Risorse aggiuntive, come blog pertinenti o frammenti di codice, sono elencate nei file README.md per ogni esercizio!