
Una colección de técnicas, ejemplos y un poco de teoría para ofuscar manualmente scripts de PowerShell para lograr la evasión de AV, compilada con fines educativos. El contenido de este repositorio es el resultado de una investigación personal, incluida la lectura de materiales en línea y la realización de intentos de prueba y error en laboratorios y pruebas de penetración.
Una colección de técnicas, ejemplos y un poco de teoría para ofuscar manualmente scripts de PowerShell y evadir la detección basada en firmas, recopilada con fines educativos. El contenido de este repositorio es el resultado de una investigación personal, que incluye lectura de materiales en línea y la realización de intentos de prueba y error en laboratorios y pruebas de penetración. No deberías dar nada por sentado.
Presentación en vídeo de YouTube: youtube.com/watch?v=tGFdmAh_lXE
⚠️ Aviso legal: El uso de las técnicas y conceptos descritos en este repositorio para obtener acceso no autorizado a sistemas que no tienes permiso de probar es ilegal. Eres responsable de tus acciones. No seas malvado.
El término científico entropy, que generalmente se define como la medida de aleatoriedad o desorden de un sistema, es importante en la evasión de antivirus. Esto se debe a que el malware a menudo contiene código altamente aleatorizado, cifrado y/o codificado (ofuscado) para dificultar su análisis y, por tanto, su detección. Como uno de los diversos métodos, los productos antivirus utilizan el análisis de entropía para identificar archivos y payloads potencialmente maliciosos.
Es importante entender este concepto porque, al ofuscar código, debes tener en cuenta la variación de entropía que generan los cambios que decidas hacer. Romper firmas es fácil, pero si no prestas atención al nivel de entropía, los AV/EDR sofisticados lo verán.
Un principio a tener en cuenta: Cuanto mayor sea la entropía, más probable es que los datos estén ofuscados o cifrados, y más probable es que el archivo/payload sea malicioso. Afortunadamente, hay formas de reducirla.
Claude E. Shannon introdujo una fórmula en su artículo de 1948 A Mathematical Theory of Communication que puede utilizarse para medir la entropía de un conjunto de datos. Aquí tienes una implementación sencilla en Python de la Shannon Entropy que puedes usar para medir la entropía de los payloads que desarrolles:
#!/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))
También puedes usar esta calculadora de entropía de Shannon en línea o el Sigcheck.exe de Microsoft con la opción -a.
Lo maduro y elegante antes de lanzarse a pruebas de ofuscación por ensayo y error para conseguir una variación de payload que no sea marcada, es identificar la(s) parte(s) de un script que desencadenan la detección de malware. Especialmente en scripts cortos como los comandos C2, puede que consigas hacer cambios insignificantes y pasar desapercibido al instante.
Una gran herramienta para identificar estos desencadenantes es AMSITrigger. Aquí tienes un ejemplo de uso con un archivo que contiene un script malicioso. La zona roja señala la parte sobre la que debería aplicarse la ofuscación:

También puedes identificar los desencadenantes manualmente ejecutando un script trozo a trozo.
Al ofuscar scripts, debería ser una prioridad sustituir los nombres de variables/clases/funciones por otros aleatorios. De ese modo, en combinación con otras técnicas, podrás evadir la detección fácilmente. Pero debes tener en cuenta la entropía de los payloads que desarrolles. Ten en cuenta el siguiente script estándar de reverse shell que generalmente detectan la mayoría, por no decir todos, los AV:

Ahora considera la siguiente versión ofuscada:

En esta versión, todos los nombres de variables se han sustituido por nombres aleatorios de 32 caracteres. También he reemplazado (pwd).Path por $(gl). El payload tiene una Shannon entropy de 4.96. Al momento de escribir esto, no es detectado por MS Defender y un montón de otros productos:
