La inyección de comandos es un ciberataque que implica la ejecución de comandos arbitrarios en un sistema operativo (SO) anfitrión. Normalmente, el actor de la amenaza inyecta los comandos aprovechando una vulnerabilidad de la aplicación, como una validación de entrada insuficiente.
Requerimientos:
- Sistemas – Diferentes tipos de sistemas
- Programación – Conocimientos altos de programación
Resposabilidad:
En este tutorías utilizaremos técnicas de hacking, con el único fin de aprendizaje. No promovemos su utilización ni con fines lucrativos o incorrectos. No nos hacemos responsables de cualquier daño o menoscabo que pueda generar en los sistemas utilizados. La responsabilidad es absoluta del usuario de este tutorial.
Conocimientos:
- Linux – Alto
- Programación – Alto
- Kali Linux – Alto
- Windows – No aplica
- Redes – Bajo
Nivel general del Tutorial: Alto
Ideal para: Desarrolladores de codigo, Ingenieros de seguridad, Pentesters
Por ejemplo, un actor de la amenaza puede utilizar transmisiones inseguras de datos del usuario, como cookies y formularios, para inyectar un comando en el shell del sistema en un servidor web. El atacante puede entonces aprovechar los privilegios de la aplicación vulnerable para comprometer el servidor.
La inyección de comandos adopta diversas formas, como la ejecución directa de comandos del shell, la inyección de archivos maliciosos en el entorno de ejecución de un servidor y la explotación de vulnerabilidades en archivos de configuración, como las entidades externas XML (XXE).
Code Injection vs. Command Injection
La inyección de código es un término genérico para cualquier tipo de ataque que implique una inyección de código interpretado/ejecutado por una aplicación. Este tipo de ataque se aprovecha del mal manejo de entradas de datos no confiables. Es posible gracias a la falta de validación adecuada de los datos de entrada/salida.
Una de las principales limitaciones de los ataques de inyección de código es que se limitan a la aplicación o al sistema al que van dirigidos. Si un atacante puede inyectar código PHP en una aplicación y ejecutarlo, el código malicioso estará limitado por la funcionalidad de PHP y los permisos concedidos a PHP en la máquina anfitriona.
La inyección de comandos suele implicar la ejecución de comandos en un shell del sistema o en otras partes del entorno. El atacante extiende la funcionalidad por defecto de una aplicación vulnerable, haciendo que pase comandos al shell del sistema, sin necesidad de inyectar código malicioso. En muchos casos, la inyección de comandos da al atacante un mayor control sobre el sistema objetivo.
Ejemplos de vulnerabilidad de inyección de comandos
Aquí hay tres ejemplos de cómo la vulnerabilidad de una aplicación puede conducir a ataques de inyección de comandos. Estos ejemplos se basan en el código proporcionado por OWASP.
Ejemplo 1: Nombre de archivo como argumento de comando
Este es un ejemplo de un programa que permite a los usuarios remotos ver el contenido de un archivo, sin poder modificarlo o borrarlo. El programa se ejecuta con privilegios de root:
int main(char* argc, char** argv) { char cmd[CMD_MAX] = "/usr/bin/cat "; strcat(cmd, argv[1]); system(cmd); }
Aunque el programa es supuestamente inocuo -sólo permite el acceso de lectura a los archivos- permite un ataque de inyección de comandos. Si el atacante pasa, en lugar de un nombre de archivo, una cadena como:
";rm -rf /"
La llamada a system() fallará al ejecutarse, y entonces el sistema operativo realizará un borrado recursivo de la partición del disco raíz.
Ejemplo 2: Manipulación de la variable de entorno APPHOME
El siguiente fragmento de código determina el directorio de instalación de una determinada aplicación utilizando la variable de entorno $APPHOME y ejecuta un script en ese directorio.
... char* home=getenv("APPHOME"); char* cmd=(char*)malloc(strlen(home)+strlen(INITCMD)); if (cmd) { strcpy(cmd,home); strcat(cmd,INITCMD); execl(cmd, NULL); } …
El problema es que el código no valida el contenido del script de inicialización. Si el atacante consigue modificar la variable $APPHOME a una ruta diferente, con una versión maliciosa del script, este código ejecutará el script malicioso. Esto constituye un ataque de inyección de comandos.
Ejemplo 3: Manipulación de la variable $PATH
El siguiente código puede ser utilizado en un programa que cambia las contraseñas en un servidor, y se ejecuta con permisos de root:
system("cd /var/yp && make &> /dev/null");
La parte problemática de este código es el uso de make. Mientras que el atacante no puede cambiar el código en sí, porque no acepta entradas del usuario, puede modificar la variable $PATH. Esto puede hacer que el comando se ejecute en una ruta diferente controlada por el atacante. En esa otra ruta de la carpeta, el atacante puede plantar una versión maliciosa del binario de make.
Como el programa padre tiene privilegios de root, la versión maliciosa de make se ejecutará ahora con privilegios de root.
La conclusión de los tres ejemplos es que cualquier comando que invoque funciones a nivel de sistema como system() y exec() puede prestar sus privilegios de root a otros programas o comandos que se ejecuten dentro de ellos.
Métodos de inyección de comandos
Estas son algunas de las vulnerabilidades que comúnmente conducen a un ataque de inyección de comandos.
Inyección de comandos arbitrarios
Algunas aplicaciones pueden permitir a los usuarios ejecutar comandos arbitrarios, y ejecutar estos comandos como si fueran al host subyacente.
Carga arbitraria de archivos
Si una aplicación permite a los usuarios subir archivos con extensiones de archivo arbitrarias, estos archivos podrían incluir comandos maliciosos. En la mayoría de los servidores web, la colocación de tales archivos en la raíz web dará lugar a la inyección de comandos.
Serialización insegura
El código del lado del servidor se utiliza normalmente para deserializar las entradas del usuario. Si la deserialización se realiza sin la verificación adecuada, puede resultar en la inyección de comandos.
Inyección de plantillas del lado del servidor (SSTI)
Muchas aplicaciones web utilizan plantillas del lado del servidor para generar respuestas HTML dinámicas. Esto hace posible que los atacantes inserten plantillas maliciosas del lado del servidor. La SSTI se produce cuando la entrada del usuario se incrusta en una plantilla de forma insegura, y el código se ejecuta de forma remota en el servidor.
Inyección de entidad externa XML (XXE)
XXE se produce en aplicaciones que utilizan un analizador XML mal configurado para analizar la entrada XML controlada por el usuario. Esta vulnerabilidad puede causar la exposición de datos sensibles, falsificación de solicitudes del lado del servidor (SSRF) o ataques de denegación de servicio.
Prevención de la inyección de comandos
A continuación se presentan varias prácticas que puede implementar para evitar las inyecciones de comandos:
- Evite las llamadas al sistema y la entrada del usuario: para evitar que los actores de la amenaza inserten caracteres en el comando del sistema operativo.
- Establezca la validación de entradas para evitar ataques como XSS y SQL Injection.
- Cree una lista blanca de posibles entradas, para asegurarse de que el sistema sólo acepta entradas previamente aprobadas.
- Utilice sólo APIs seguras-cuando ejecute comandos del sistema como execFile()
- Utilice execFile() de forma segura: evite que los usuarios obtengan el control del nombre del programa. También debe asignar la entrada del usuario a los argumentos de los comandos de manera que se garantice que la entrada del usuario no pase tal cual a la ejecución del programa.
Espero que les sirva de ayuda.