
Un taller sobre desarrollo de malware
En la era de EDR, los operadores de red team ya no pueden salirse con la suya usando payloads precompilados. Por lo tanto, el desarrollo de malware se está convirtiendo en una habilidad vital para cualquier operador. Comenzar con maldev puede parecer desalentador, pero en realidad es muy fácil. ¡Este taller te mostrará todo lo que necesitas para empezar!
Este repositorio contiene las diapositivas y los ejercicios complementarios para el taller 'MalDev for Dummies' que se ha facilitado/se facilitará en Hack in Paris 2022 y X33fcon 2023. Aunque las diapositivas fueron diseñadas para presentarse 'en persona', los materiales y ejercicios permanecerán disponibles aquí para completarlos a tu propio ritmo: ¡el proceso de aprendizaje nunca debe apresurarse! Se agradecen las issues y pull requests a este repositorio con preguntas y/o sugerencias.
⚠ Aviso: El desarrollo de malware es una habilidad que puede -y debe- usarse para el bien, para avanzar en el campo de la seguridad (ofensiva) y mantener nuestras defensas afiladas. Si alguna vez usas este conjunto de habilidades para realizar actividades para las que no tienes autorización, eres un tonto más grande de lo que este taller pretende y deberías largarte de aquí.
Con las herramientas antivirus (AV) y de Enterprise Detection and Response (EDR) volviéndose más maduras a cada minuto, el red team se ve obligado a mantenerse a la vanguardia. Quedaron atrás los tiempos de execute-assembly y de dejar payloads sin modificar en el disco: si quieres que tus compromisos duren más de una semana, tendrás que mejorar tu juego de creación de payloads y desarrollo de malware. Sin embargo, comenzar en este campo puede ser desalentador, y encontrar los recursos adecuados no siempre es fácil.
Este taller está dirigido a principiantes en el ámbito y te guiará a través de tus primeros pasos como desarrollador de malware. Está dirigido principalmente a profesionales ofensivos, pero los profesionales defensivos también son muy bienvenidos a asistir y ampliar sus habilidades.
Durante el taller repasaremos algo de teoría, después te prepararemos con un entorno de laboratorio. Habrá varios ejercicios que puedes completar dependiendo de tu conjunto de habilidades actual y nivel de comodidad con el tema. Sin embargo, el objetivo del taller es aprender, y explícitamente no completar todos los ejercicios. Eres libre de elegir tu lenguaje de programación preferido para el desarrollo de malware, pero el soporte durante el taller se proporciona principalmente para los lenguajes de programación C# y Nim.
Durante el taller, discutiremos los temas clave necesarios para comenzar a construir tu propio malware. Esto incluye (pero no se limita a):
Para comenzar con el desarrollo de malware, necesitarás una máquina de desarrollo para que no te molesten las herramientas defensivas que puedan ejecutarse en tu máquina anfitriona. Prefiero Windows para el desarrollo, pero Linux o MacOS también funcionan bien. Instala tu editor/IDE preferido (uso VS Code para casi todo excepto C#, para lo cual uso Visual Studio, y luego instala las cadenas de herramientas necesarias para tu lenguaje de MalDev preferido:
No olvides deshabilitar Windows Defender o agregar las exclusiones apropiadas, ¡para que tu arduo trabajo no sea puesto en cuarentena! Más adelante, podemos probar en una máquina separada con controles defensivos como AV habilitado.
ℹ Nota: A menudo, los gestores de paquetes como apt o herramientas de gestión de software como Chocolatey o Winget (¡ahora integrado!) se pueden usar para automatizar la instalación y gestión de dependencias de manera conveniente y repetible. Sin embargo, ten en cuenta que las versiones en los gestores de paquetes pueden estar un par de versiones por detrás de la versión real. A continuación se muestra un comando de ejemplo para instalar todas las herramientas mencionadas de una vez.
choco install -y nim choosenim go rust vscode visualstudio2019community dotnetfx
Los lenguajes que discutiremos durante este taller son lenguajes compilados, lo que significa que se utiliza un compilador para traducir tu código fuente a ejecutables binarios del formato que elijas. El proceso de compilación difiere según el lenguaje.
El código C# (archivos .cs) se puede compilar directamente (con la utilidad csc) o a través del propio Visual Studio. La mayoría del código fuente en este repositorio (excepto la solución al ejercicio extra 3) se puede compilar de la siguiente manera.
ℹ Nota: Asegúrate de ejecutar el siguiente comando en un "Símbolo del sistema para desarrolladores de Visual Studio" para que sepa dónde encontrar
csc; se recomienda usar el "Símbolo del sistema de herramientas nativas x64" para tu versión de Visual Studio. El indicador/unsafeserá necesario para la mayoría de scripts donde accedemos directamente a funcionalidades de bajo nivel.
csc filename.exe
Puedes habilitar optimizaciones en tiempo de compilación con el indicador /optimize. También puedes ocultar la ventana de consola agregando /target:winexe, o compilar como DLL con /target:library (pero asegúrate de que la estructura de tu código sea adecuada para esto).
El código Nim (archivos .nim) se compila con el comando nim c. El código fuente de este repositorio se puede compilar de la siguiente manera.
nim c filename.nim
Si deseas optimizar tu compilación para el tamaño y eliminar información de depuración (¡mucho mejor para opsec!), puedes agregar los siguientes indicadores.
nim c -d:release -d:strip --opt:size filename.nim
Opcionalmente, también puedes ocultar la ventana de consola agregando --app:gui.
El código Golang (archivos .go) se compila con el comando go build. El código fuente de este repositorio se puede compilar de la siguiente manera.
GOOS=windows go build
Si deseas optimizar tu compilación para el tamaño y eliminar información de depuración (¡mucho mejor para opsec!), puedes agregar los siguientes indicadores.
GOOS=windows go build -ldflags "-s -w"
El código Rust (archivos .rs) se compila mediante el comando cargo. Cargo se puede usar para gestionar tus dependencias y compilar tu proyecto. El código fuente de este repositorio se puede compilar navegando a la carpeta del proyecto y ejecutando el siguiente comando.
cargo build
Si deseas optimizar tu compilación para el tamaño y eliminar información de depuración, puedes agregar los siguientes indicadores. Consulta también la sección [profile.release] en cada archivo Cargo.toml para algunas opciones de opsec en tiempo de compilación.
cargo build --release
La mayoría de las soluciones se pueden compilar sin dependencias. En caso de que se requieran dependencias, se proporciona un proyecto de Visual Studio que enlaza con los paquetes NuGet adecuados.
La mayoría de los programas Nim dependen de una biblioteca llamada "Winim" para interactuar con la API de Windows. Puedes instalar la biblioteca con el gestor de paquetes Nimble de la siguiente manera (después de instalar Nim):
nimble install winim
Se utilizan algunas dependencias en el código fuente de este repositorio. Puedes instalarlas de la siguiente manera (después de instalar Go):
go mod tidy
Algunos ejemplos dependen de la crate windows-sys para llamar a la API de Windows. Como estamos usando Cargo, los paquetes se gestionarán automáticamente cuando compiles una compilación de prueba o de lanzamiento.
Las diapositivas del taller hacen referencia a algunos recursos que puedes usar para comenzar. Recursos adicionales, como blogs relevantes o fragmentos de código, se enumeran en los archivos README.md de cada ejercicio.