Hoy hablaremos de las vulnerabilidades de inyección de comandos del sistema operativo. Qué grado de amenaza suponen? ¿Cómo se pueden prevenir estas vulnerabilidades? ¿Cómo ayuda NexDAST a remediarlas? Responderemos a todas estas preguntas en detalle a continuación.
¿Qué son las inyecciones de comandos del sistema operativo?
No confunda la inyección de comandos con la inyección de código. Un código malicioso que se inyecta en un lenguaje de programación es una vulnerabilidad de inyección de código. Las inyecciones de comandos en el sistema operativo son un tipo de carga útil que el hacker inyecta. La carga útil luego se ejecuta como un comando del sistema operativo.
Un hacker ejecuta un comando temporal del sistema operativo en el servidor de la aplicación, con el consiguiente riesgo de que la aplicación y los datos se vean comprometidos. Las vulnerabilidades de inyección de comandos del sistema operativo se utilizan a menudo como un trampolín para los hackers. Este es el peor escenario con las inyecciones de comandos del sistema operativo, ya que comienza con las inyecciones de comandos del sistema operativo y conduce a la explotación de otras partes de la infraestructura de alojamiento que resulta en toda una serie de otros sistemas que se exponen.
Python, Ruby, Perl, Java, C, PHP. Todos estos lenguajes de programación permiten a los usuarios llamar a un comando shell del sistema. Esto los hace vulnerables a las inyecciones de comandos del sistema operativo. Sin embargo, la ejecución del comando temporal inyectado depende de los privilegios del servidor web. Por ello, las vulnerabilidades de inyección de comandos no son tan peligrosas por sí mismas. Pero un hacker puede explotar la escalada de privilegios y acceder a más información. Con esa información, se pueden encontrar y explotar más vulnerabilidades.
Ejemplos de vulnerabilidades de inyección de comandos en el sistema operativo
Supongamos que quieres comprar un teclado en un sitio web. La aplicación tiene que permitirte primero ver si el teclado que quieres está en stock. Los usuarios obtienen esta información a través de URLs como esta:
https://Keyboard-website.com/StockStatus?ProductID=111&StoreID=22
La aplicación pide a los sistemas heredados que proporcionen al usuario información sobre las existencias. La llamada a un comando shell representa esta funcionalidad. Los ID de producto y de tienda son argumentos, por lo que el comando shell tiene un aspecto similar al siguiente:
Keyboards.py 111 22
Los usuarios ven ahora si su teclado preferido está en stock. Sin embargo, hay un problema aquí. La aplicación no está asegurada contra las inyecciones de comandos del sistema operativo. Los hackers pueden ahora enviar una entrada que ejecuta un comando temporal. Parece algo así como «& echo randomstring &» en el parámetro storeID. La aplicación entonces ejecuta este comando:
Keyboards.py & echo randomstring & 22
¿Qué hace este comando? Hace que la cadena suministrada haga eco en la salida. Una forma eficiente de comprobar los tipos de inyecciones de comandos del sistema operativo. El separador de comandos del shell ( & ) convierte un comando en tres. Los usuarios ven entonces tres resultados:
Error - productID was not provided
Randomstring
22: command not found
El comando original Keyboard.py se ejecutó, pero faltaban los argumentos esperados. Por eso recibimos un mensaje de error. La cadena suministrada (Randomstring) se hizo eco en la salida. Ese es el objetivo del comando echo inyectado. Pero aparece 22: command not found. ¿Por qué? Porque el argumento original 22 se ejecutó como un comando, causando un error.
Ahora, vamos a cubrir las vulnerabilidades de inyección de comandos del SO ciego. Esto ocurre cuando una aplicación no devuelve la salida de un comando en su respuesta. A pesar de esto, los hackers todavía tienen varias técnicas para explotar estas vulnerabilidades:
- retrasos de tiempo
- redirigir la salida
Usar un comando inyectado para desencadenar un retraso de tiempo permite a un hacker confirmar si el comando fue ejecutado. El tiempo que tarda una aplicación en responder es lo que indica si el comando se ejecutó o no. Uno de los comandos más efectivos para explotar esta vulnerabilidad ciega es un ping. Este comando te permite elegir un número exacto de paquetes ICMP para enviar. Ese número será el tiempo necesario para que este comando se ejecute.
Redirigir la salida es otro exploit de inyección de comandos del SO. Se redirige la salida del comando inyectado directamente a un archivo. Ese archivo se encuentra dentro del webroot que se recupera a través de su navegador.
Prevención de las inyecciones de comandos del sistema operativo
¿Cómo puede prevenir las inyecciones de comandos del sistema operativo? La forma más sencilla y efectiva es no utilizar nunca shell_exec o llamadas similares para los comandos del SO del host. En su lugar, aplique los mismos comandos en el lenguaje de programación que esté utilizando. El problema aparece si tu lenguaje de programación no tiene un comando correspondiente al que necesitas. En estos casos debes utilizar la sanitización de la entrada. Ayudará si haces esto antes de asignar el valor al comando del shell. El uso de la lista blanca es siempre la opción más segura cuando se trata de inyecciones.
Otras opciones de validación de entrada potentes incluyen:
- Validación de caracteres alfanuméricos (Confirmar la inclusión de sólo caracteres alfanuméricos sin espacios en blanco o sintaxis en la entrada)
- Validación de números (Confirmar que la entrada es un número)
- Lista blanca de valores permitidos (Confirmar contra las listas blancas de valores permitidos)
Nunca se debe evitar el metacarácter de la shell y tratar de sanear la entrada de esa manera. Ya que eso hace que la entrada sea vulnerable a los hackers inteligentes, que pueden eludirla fácilmente.
Cómo NexDAST puede ayudar a prevenir las Inyecciones de Comandos del Sistema Operativo
La forma más simple y efectiva de prevenir las Inyecciones de Comandos del Sistema Operativo es utilizar NexDAST. Nuestra solución de pruebas de seguridad de caja negra examina automáticamente su aplicación. Cuando se detecta una Inyección de Comandos en el SO, se envían directrices de remediación al desarrollador o al equipo de SecOps. Con NexDAST no es necesario realizar largas y lentas pruebas manuales.
Ejemplo de NexDAST identificando una Inyección de Comandos en el SO:
vulnerable.com/site/ping?ip=8.8.8.8%3B+%2Fbin%2Fcat+%2Fetc%2Fpasswd
La parte %3B+%2Fbin%2Fcat+%2Fetc%2Fpasswd
es la vulnerabilidad. NexDAST también proporciona directrices de remediación que le ayudan a remediar esta vulnerabilidad de la manera más eficiente posible.
¿Quieres saber más sobre NexDAST? Ya lo hemos tratado en profundidad en uno de nuestros blogs, y si tiene un problema en el que NexDAST puede ayudarle, solicite una demostración aquí.