Command Injection (o inyección de comandos) es una vulnerabilidad que permite a un atacante inyectar y ejecutar comandos directamente en el sistema operativo en el que se ejecuta tu aplicación.
Al explotarla, los atacantes pueden generar distintos riesgos para una empresa, entre ellos:
- Robar credenciales de los usuarios o del sistema donde corre la aplicación.
- Dejar temporalmente inaccesibles las conexiones de los desarrolladores al servidor (SSH, Escritorio Remoto).
- Colocar aplicaciones maliciosas en tu servidor.
- Modificar la aplicación (cambiar imágenes, textos, o incluso borrarla completamente).
Desafortunadamente, en algunos casos, incluso logran ejecutar comandos en tu servidor para convertirse en usuario administrador y obtener el control total.
Diferencias entre Command Injection y Code Injection
Code Injection también es una vulnerabilidad y permite inyectar y ejecutar código en tu aplicación.
Por ejemplo, si existe la función eval() en tu código de NodeJS, y utilizas la entrada del usuario para evaluarla (esperando que él coloque una operación o filtro para interactuar), le estarías dando la posibilidad a un atacante de que inserte código malicioso en él. En ese caso, los atacantes podrían convertirla entonces en un Command Injection usando, por ejemplo, la instrucción exec(comando).
Es decir, muchas veces, los Code Injection se terminan transformando en un Command Injection.
Ejemplos de la vulnerabilidad Command Injection
Veamos tres ejemplos de cómo los atacantes usan esta vulnerabilidad para atacar una aplicación web.
1. Ejecución arbitraria de comandos
Supongamos que desarrollaste una aplicación en NodeJS que tiene una función que permite ver el contenido de un archivo:
El usuario coloca el nombre del archivo y la aplicación hace uso de la función exec() para ejecutar este comando:
cat "nombre_del_archivo"
El problema viene cuando un usuario decide colocar código malicioso, en este caso, utiliza caracteres especiales para encadenar comandos (&).
Este carácter permite la ejecución del segundo y tercer comando, debido a una concatenación en un parámetro controlado por el usuario, que en este caso se encuentra dentro de la función exec().
Entonces, el comando inyectado sería:
archivo" && whoami && cat "archivo2
Y el comando a ejecutar:
cat "arhivo1" && whoami && cat "archivo2"
Solución
Esto se podría evitar controlando y filtrando la entrada del usuario, algunos de los caracteres que se pueden usar para concatenar comandos en sistemas basados en unix, y sistemas windows son los siguientes:
- &
- &&
- |
- ||
2. Carga de archivos arbitrarios
Supongamos que tienes una página web que permite subir y visualizar una foto de perfil. La página web no verifica que tu foto sea una imagen, por lo que un atacante puede subir cualquier tipo de archivo (lo que se denomina vulnerabilidad Arbitrary File Upload).
Este es el ejemplo de cómo se vería la vulnerabilidad en el código:
Dado esto, un atacante sube un archivo PHP con el siguiente código:
<?php echo exec(´whoami´); ?>
Cuando el usuario quiera ver la imagen, el servidor ejecutará el código PHP y, al mismo tiempo, el comando whoami directamente en el sistema operativo. Como verás, este es un claro ejemplo de cómo un Code Injection se transforma en Command Injection.
Solución
Implementa filtros que solo permitan, en este caso, subir imágenes.
3. Inyección de plantilla de servidor (SSTI)
Supongamos que desarrollaste una aplicación web en Python que saluda al usuario al momento de ingresar y la URL es la siguiente:
http://www.example.com?nombre=kevin
Y, lamentablemente, utiliza una plantilla de código vulnerable que incorpora la entrada del usuario para después renderizar la plantilla.
Internamente tu aplicación recoge el parámetro nombre de la URL y te da la bienvenida “Hola Kevin”. Sin embargo, la aplicación solo recoge lo que pone el usuario en la URL sin hacerle ningún tipo de tratamiento.
En este caso, un atacante podría aprovechar la vulnerabilidad para colocar su código de Python:
{% import os %}{ os.popen {"whoami"} .read () }}
Así podría importar la librería del sistema (import os) y ejecutar el comando whoami directamente en el sistema operativo (otro caso en el que un Code Injection se transforma en un Command Injection).
Hackmetrix Insight: si descubriste que tienes una vulnerabilidad y quieres ver si alguien podría utilizarla para ejecutar comandos en tu servidor, coloca “to RCE” (Remote Command Execution) al final de una búsqueda. Por ejemplo “XSS to RCE”.
Tips para prevenir esta vulnerabilidad
- Evita a toda costa las llamadas al sistema, la mayoría de las veces es posible no utilizarlas.
- Implementa filtros. Si es imprescindible llevar a cabo llamadas al sistema, utiliza filtros y elimina caracteres que no son necesarios. Por ejemplo, si un usuario tiene que colocar su número de teléfono, solo habilita los caracteres numéricos.
- No ejecutes tu aplicación como administrador. Los comandos siempre se ejecutan con los permisos del usuario que inició la aplicación. Así, si un atacante logra ejecutar comandos, lo hará como un usuario de menores privilegios y podrás reducir considerablemente sus ataques.
- Coloca un firewall. Esto impedirá que externos inserten código malicioso.
Un pentest nunca está de más
La vulnerabilidad de inyección de código o comandos, no es la única que amenaza tu plataforma, por lo tanto, es recomendable hacer un ejercicio de ethical hacking (del tipo penetration testing, pruebas de intrusión o pentest) periódicamente para detectar estas vulnerabilidades y otras fallas de seguridad que pudieran estar presentes tanto en la aplicación como en las redes de tu empresa.
En Hackmetrix contamos con pentesters calificados que simulan ataques reales, reportan las vulnerabilidades encontradas y te brindan soporte durante todo el proceso de mitigación.
Conclusión
Command Injection es una de las vulnerabilidades más peligrosas: le brinda a un atacante accesos para hacer, prácticamente, lo que él quiera. Si alguna vez viste un sitio que decía “Hackeado por…”, es porque usaron esta vulnerabilidad.
Prevenir este tipo de vulnerabilidad puede ser algo complicado ya que puede generarse de muchas formas. Por lo cual, te recomendamos que una persona calificada analice tu aplicación y realice pruebas de intrusión periódicas.
Recuerda seguir los consejos que te dimos arriba para comenzar a prevenirla y escribir código mucho más seguro.
Si tienes alguna duda o quieres profundizar en cómo podemos ayudarte, contáctanos y resolveremos tus dudas.