
Una raccolta di tecniche, esempi e un po' di teoria per offuscare manualmente script PowerShell per ottenere l'elusione dell'antivirus, compilata a scopo didattico. I contenuti di questo repository sono il risultato di ricerca personale, inclusa la lettura di materiali online e tentativi ed errori in laboratori e penetration test.
Una raccolta di tecniche, esempi e un po' di teoria per offuscare manualmente script PowerShell al fine di bypassare il rilevamento basato su firme, compilata a scopo educativo. I contenuti di questo repository sono il risultato di ricerche personali, inclusa la lettura di materiale online e tentativi per prove ed errori in laboratorio e durante test di penetrazione. Non dovresti dare nulla per scontato.
Presentazione video YouTube: youtube.com/watch?v=tGFdmAh_lXE
⚠️ Disclaimer: L'utilizzo delle tecniche e dei concetti descritti in questo repository per ottenere accesso non autorizzato a sistemi su cui non hai il permesso di effettuare test è illegale. Sei responsabile delle tue azioni. Non essere malvagio.
Il termine scientifico entropy, che è generalmente definito come la misura della casualità o del disordine di un sistema, è importante nell'evasione degli AV. Questo perché il malware spesso contiene codice altamente randomizzato, cifrato e/o codificato (offuscato) per renderlo difficile da analizzare e quindi da rilevare. Come uno dei vari metodi, i prodotti antivirus utilizzano l'analisi dell'entropia per identificare file e payload potenzialmente dannosi.
È importante comprendere questo concetto perché, quando offuschi codice, dovresti tenere a mente la variazione di entropia creata dalle modifiche che scegli di apportare. Rompere le firme è facile, ma se non presti attenzione al livello di entropia, AV/EDR sofisticati lo vedranno.
Un principio da tenere a mente: Maggiore è l'entropia, più è probabile che i dati siano offuscati o cifrati, e più è probabile che il file/payload sia dannoso. Fortunatamente, ci sono modi per abbassarla.
Claude E. Shannon introdusse una formula nel suo articolo del 1948 A Mathematical Theory of Communication che può essere usata per misurare l'entropia di un insieme di dati. Ecco una semplice implementazione Python della Shannon Entropy che puoi usare per misurare l'entropia dei payload che sviluppi:
#!/bin/python3
# Usage: python3 entropy.py <file>
import math, sys
def entropy(string):
"Calculates the Shannon entropy of a UTF-8 encoded string"
# decode the string as UTF-8
unicode_string = string.decode('utf-8')
# get probability of chars in string
prob = [ float(unicode_string.count(c)) / len(unicode_string) for c in dict.fromkeys(list(unicode_string)) ]
# calculate the entropy
entropy = - sum([ p * math.log(p) / math.log(2.0) for p in prob ])
return entropy
f = open(sys.argv[1], 'rb')
content = f.read()
f.close()
print(entropy(content))
Puoi anche usare questo calcolatore di entropia di Shannon online o il Sigcheck.exe di Microsoft con l'opzione -a.
La cosa matura ed elegante da fare prima di lanciarsi in tentativi per prove ed errori di offuscamento per ottenere una variazione del payload che non venga segnalata, è identificare le parti di uno script che attivano il rilevamento del malware. Soprattutto in script brevi come i comandi C2, potresti essere in grado di apportare modifiche insignificanti e sparire subito dai radar.
Un ottimo strumento per identificare tali trigger è AMSITrigger. Ecco un esempio di utilizzo con un file contenente uno script dannoso. L'area rossa indica la parte a cui dovrebbe essere applicato l'offuscamento:

Potresti anche identificare i trigger manualmente eseguendo uno script pezzo per pezzo.
Quando offuschi script, dovrebbe essere una priorità sostituire i nomi di variabili/classi/funzioni con nomi casuali. In questo modo, in combinazione con altre tecniche, sarai in grado di bypassare il rilevamento facilmente. Ma dovresti tenere a mente l'entropia dei payload che sviluppi. Prendi in considerazione il seguente script reverse shell standard che viene generalmente rilevato dalla maggior parte, se non da tutti, gli AV:

Ora considera la seguente versione offuscata:

In questa versione, tutti i nomi delle variabili sono stati sostituiti con nomi casuali lunghi 32 caratteri. Ho anche sostituito (pwd).Path con $(gl). Il payload ha un'entropia di Shannon di 4.96. Al momento della stesura di questo documento, non viene rilevato da MS Defender e da un mucchio di altri prodotti:
