Análisis a fondo de malware: examinando un payload de PowerShell

Cada vez vemos más malware que usa la técnica de “Living off the Land,” es decir, usa las propias herramientas nativas del sistema en su contra. En otras palabras, usa las funciones y herramientas integradas en el sistema operativo, como Windows PowerShell, para realizar una actividad maliciosa y evitar la detección.

En esta publicación, examinaremos un payload malicioso que se ejecutó usando PowerShell. Lo encontramos en uno de los endpoints de nuestros partners, a partir de un valor de Run Key. Vamos a profundizar.

Snapshot of PowerShell Payload

Un valor HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run llamado ਀਀. Qué raro.

El comando (los datos del valor) también es extraño. PowerShell está leyendo otro valor del registro con el mismo nombre de valor bajo HKLM\Software.

También podemos ver que los datos que el comando de PowerShell lee del valor HKLM\Software\਀਀ son una cadena base64. Y no solo parece base64, sino que el comando de PowerShell lo confirma al usar FromBase64String().

Decodificando el payload

Así se ve la cadena base64:

JABzAD0ATgBlAHcALQBPAGIAagBlAGMAdAAgAEkATwAuAE0AZQBtAG8AcgB[SNIP]

Ahora usaremos Python para decodificar los datos en base64.

>>> data = "JABzAD0ATgBlAHcALQBPAGIAagBlAGMAdAAgAEkATwAuAE0A[SNIP]">>> import base64>>> base64.b64decode(data)b'$\x00s\x00=\x00N\x00e\x00w\x00-\x00O\x00b\x00j\x00e\x00c\x00t\x00 \x00I\x00O\x00.\x00M\x00e\x00m\x00o\x00r\x00y\x00S\x00t\x00r\x00e\x00a\x00m\x00(\x00,\x00[\x00C\x00o\x00n\x00v\x00e\x00r\x00t\x00]\x00:\x00:\x00F\x00r\x00o\x00m\x00B\x00a\x00s\x00e\x006\x004\x00S[SNIP]

Los datos decodificados arriba parecen una cadena UTF-16 (basta con ver todos los bytes \x00). Y justo debajo, Python pudo convertirlo en algo que podemos leer con facilidad.

>>> base64.b64decode(data).decode('utf-16')'$s=New-Object IO.MemoryStream(,[Convert]::FromBase64String("H4sIAAAAAAAAAL1Xe2/iuBb/u3yKa[SNIP]"));IEX (New-Object IO.StreamReader(New-Object IO.Compression.GzipStream($s,[IO.Compression.CompressionMode]::Decompress))).ReadToEnd();'

Ahora tenemos más código de PowerShell y otra cadena codificada en base64. Esta cadena también parece estar comprimida con Gzip, nota el [IO.Compression.CompressionMode]::Decompress. Podemos echar un vistazo decodificándola en base64 y usando Gzip para descomprimirla.

Aquí está el script completo que fue comprimido con Gzip y codificado en base64:

En el script decodificado anterior, podemos ver otra cadena codificada en base64 (línea 37) y dos llamadas a func_get_proc_address, una para VirtualAlloc() (línea 41) y otra para CreateThread() (línea 55). El malware suele usar estas funciones, primero asignando memoria para el shellcode y luego ejecutándolo con CreateThread().

Si decodificamos en base64 la nueva cadena, podemos ver que contiene lo que parece ser una cadena UserAgent. Es probable que este shellcode establezca una conexión HTTP.

>>> base64.b64decode("/OiJAAAAYInlMdJki1Iw...")b'\xfc\xe8\x89\x00\x00[SNIP]\x00\x00Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; ASU2JS)\x00XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\x00Y1\xffWWWWQh:Vy\xa7\xff\xd5[SNIP]'

Podemos usar shellen para desensamblar el shellcode, pero primero necesitamos convertir los bytes decodificados en base64 en una cadena hexadecimal.

>>> base64.b64decode("/OiJAAAAYInlMdJki1Iw...").hex()fce8890000006089e531d2648b52308b520c8b52148b72280fb74a2631ff[SNIP]'

Ahora que tenemos el shellcode como cadena hexadecimal, podemos pegarlo en el prompt de desensamblado de shellen para ver el código ensamblador.

shellen’s disassembly prompt

Aproximadamente a la mitad, hay varias instrucciones que destacan.

several instructions that stand out

Las últimas cinco instrucciones cargan WinInet, la API de Windows Internet para acceder a recursos de internet. Metasploit documentó muy bien un shellcode que usa las mismas instrucciones para cargar WinInet.

Ahora hemos encontrado nuestro descargador. 

found downloader

• • •

Nos metimos a fondo para entender cómo funcionaba este código malicioso y cómo operaba el payload. Podemos ver cómo los atacantes usan estas técnicas de “living off the land” para reducir sus probabilidades de ser detectados, y aprender de sus técnicas ofensivas es la mejor forma de fortalecer la defensa.

¿Te preguntas qué se esconde en tus redes?

Los hackers evolucionan constantemente, explotan nuevas vulnerabilidades y se instalan en entornos SMB, hasta que se topan con Huntress.

Ofrecemos una prueba gratuita de Huntress para un número ilimitado de endpoints. Simplemente implementa nuestro agente, configura una integración de reportes con tu sistema de tickets, y te entregaremos procedimientos de remediación paso a paso para cada endpoint comprometido que descubramos. Cuando termine la prueba, nuestro equipo puede desinstalar nuestros agentes de forma remota con un solo clic (sin necesidad de limpieza adicional).

También te podría interesar