
🌸 Entorno interactivo de shellcoding para crear shellcodes fácilmente
Shellen es un entorno interactivo para escribir shellcodes. Si buscas una herramienta práctica para escribir shellcodes, shellen puede ser tu amiga. Shellen también puede usarse como herramienta de ensamblado o desensamblado.
Los motores keystone y capstone se utilizan para todas las operaciones de shellen.
Shellen solo funciona con python3. El soporte para python2 puede aparecer en el futuro.
Primero, debes instalar las dependencias de shellen:
$ sudo apt-get install cmake python3-dev python3-setuptools
Puedes instalar la versión estable de shellen usando pip3:
$ sudo pip3 install shellen
O si ya tienes todos los paquetes necesarios (consulta Requirements):
$ python3 setup.py install
Si tienes problemas al instalar keystone-engine, deberías compilar keystone-engine (consulta el archivo COMPILE.md en el repositorio keystone)
Después de instalar shellen y sus paquetes necesarios, puedes ejecutar shellen escribiendo lo siguiente en tu terminal:
$ shellen
Puedes ejecutar el comando help de shellen para obtener información sobre el uso de shellen.
Shellen ensambla y desensambla instrucciones, por lo que hay dos modos de uso: asm y dsm, respectivamente. Hay otras características que incluyen la búsqueda en tablas de syscalls y la búsqueda de shellcodes comunes.
Shellen tiene un prompt útil que muestra el modo actual, el SO (sistema operativo para syscalls) y la arquitectura elegida para el modo actual. El prompt de shellen se ve así:
L:asm:x86_32 >
Puedes editar tu entrada como si estuvieras escribiendo en una terminal. Además, shellen registra tu historial de comandos (solo presiona la flecha hacia arriba para ver tus comandos anteriores).
L es el nombre abreviado de Linux en el prompt. A continuación se listan todos los demás nombres de SO:
L es LinuxW es WindowsM es MacOSSi quieres cambiar de SO, escribe setos [linux/windows/macos] de la siguiente manera:
L:asm:x86_32 > setos windows
[+] OS changed to windows.
Para cambiar el modo actual, ingresa asm o dsm en el prompt.
L:dsm:arm32 > asm
[+] Changed to asm (assembly) mode
L:asm:x86_32 > dsm
[+] Changed to dsm (disassembly) mode
L:dsm:arm32 >
| Comando | Descripción |
|---|---|
clear | Limpia la pantalla de la terminal. Como es habitual, cls en Windows o clear en sistemas *nix. |
Para ensamblar instrucciones, escríbelas y sepáralas con punto y coma como se muestra aquí:
L:asm:x86_32 > mov edx, eax; xor eax, eax; inc edx; int 80;
[+] Bytes count: 7
Raw bytes: "\x89\xc2\x31\xc0\x42\xcd\x50"
Hex string: "89c231c042cd50"
Si los bytes ensamblados contienen un byte nulo, shellen te lo indicará.
El desensamblado es similar al ensamblado. En su lugar, escribe tus bytes en el prompt y ¡observa el resultado!
L:dsm:x86_32 > 89c231c042cd50
0x00080000: mov edx, eax
0x00080002: xor eax, eax
0x00080004: inc edx
0x00080005: int 0x50
También puedes ejecutar tu shellcode en un subproceso. ¡Ten en cuenta que esto puede dañar tu sistema!. Salta al último shellcode en un subproceso. ¿Qué podría salir mal? Ten en cuenta que no controlas la dirección base en la que se carga tu código, y esto asume que las instrucciones tendrán sentido para tu CPU. Consulta help dentro de shellen para ver cómo usarlo.
Estoy planeando ejecutar el subproceso en algún entorno virtual para que sea más seguro ejecutar shellcodes potencialmente peligrosos.
Los modos asm y dsm funcionan para diferentes arquitecturas. Para ver una lista de las arquitecturas disponibles para el modo actual de shellen, escribe esto:
L:dsm:x86_32 > archs
┌────────┬────────┬─────────┬─────────┬────────┐
│ │ │ │ │ │
│ arm32 │ mips32 │ sparc32 │ systemz │ x86_16 │
│ arm64 │ mips64 │ sparc64 │ │ x86_32 │
│ arm_tb │ │ │ │ x86_64 │
└────────┴────────┴─────────┴─────────┴────────┘
Si quieres cambiar la arquitectura actual, ingresa lo siguiente:
L:dsm:x86_32 > setarch arm32
[+] Architecture of dsm changed to arm32
Cuando creas un shellcode, necesitarás syscalls. Para buscar syscalls con shellen, escribe sys y el nombre de la syscall deseada. Shellen mostrará una lista de syscalls que puede contener la syscall que buscabas.
L:asm:x86_32 > sys open
┌────────┬───────┬──────────────────────┬──────────────────────┬──────────────┬──────────────┐
│ name │ eax │ ebx │ ecx │ edx │ esi │
├────────┼───────┼──────────────────────┼──────────────────────┼──────────────┼──────────────┤
│ open │ 0x05 │ const char *filename │ int flags │ umode_t mode │ - │
│ openat │ 0x127 │ int dfd │ const char *filename │ int flags │ umode_t mode │
└────────┴───────┴──────────────────────┴──────────────────────┴──────────────┴──────────────┘
sys muestra una lista de posibles variantes para la syscall proporcionada. La tabla de syscalls que shellen busca depende de la arquitectura y del sistema operativo (SO) elegidos. En este caso, la arquitectura es x86_32 y el SO es Linux.
Shellen puede mostrarte una lista de shellcodes comunes según tu palabra clave. La búsqueda por palabra clave de shellen utiliza la API de shell-storm.org (¡gracias al autor!) y se puede usar así:
L:asm:x86_32 > shell <keyword> <count>
Ten en cuenta que el parámetro count no es obligatorio. Hay una imagen de la salida de shell <keyword> <count> en la sección Pictures.
Actualmente, shellen solo es compatible con Linux. Si quieres añadir funcionalidad para Windows o MacOS, escribe un issue y añadiré el soporte.
Si encuentras un problema/error o algo similar, escribe un issue sobre ese problema. Además, si crees que una función sería una buena incorporación a shellen, haz lo mismo: escribe un issue e intentaré añadir la función solicitada.
asm y dsmSolo un pequeño grupo de imágenes. (Están desactualizadas debido a la incorporación de diferentes funciones)
help| Muestra el mensaje de ayuda. |
quit,q,exit | Finaliza la sesión actual y sale |