Saltar al contenido
Portada » Blog – Laprovittera Carlos » TryHackMe Command Injection

TryHackMe Command Injection

Hola hacketones! Bienvenidos a un nuevo CTF de la ruta completa de Web Fundamentals, en este capítulo veremos:  TryHackMe Command Injection

Introducción (¿Qué es la inyección de comandos?)

En esta sala, abordaremos la vulnerabilidad web de inyección de comandos . Una vez que comprendamos qué es esta vulnerabilidad, mostraremos su impacto y el riesgo que representa para una aplicación.

Luego, podrás poner en práctica estos conocimientos, a saber:

  • Cómo descubrir la vulnerabilidad de inyección de comandos
  • Cómo probar y explotar esta vulnerabilidad utilizando cargas útiles diseñadas para diferentes sistemas operativos
  • Cómo prevenir esta vulnerabilidad en una aplicación
  • Por último, podrás aplicar la teoría en la práctica aprendiendo en una clase práctica al final del aula.

Para empezar, entendamos qué es la inyección de comandos . La inyección de comandos consiste en abusar del comportamiento de una aplicación para ejecutar comandos en el sistema operativo, utilizando los mismos privilegios que la aplicación en un dispositivo. Por ejemplo, al ejecutar una inyección de comandos en un servidor web con el usuario «name», joese ejecutarán los comandos bajo este joeusuario y, por lo tanto, se obtendrán los permisos correspondientes joe.

La inyección de comandos también se conoce como «Ejecución Remota de Código» (RCE) debido a la capacidad de ejecutar código de forma remota dentro de una aplicación. Estas vulnerabilidades suelen ser las más lucrativas para un atacante, ya que permiten interactuar directamente con el sistema vulnerable. Por ejemplo, un atacante puede leer archivos, datos y elementos similares del sistema o del usuario.

Por ejemplo, poder abusar de una aplicación para ejecutar el comando whoamipara enumerar qué cuenta de usuario está ejecutando la aplicación será un ejemplo de inyección de comando .

La inyección de comandos fue una de las diez principales vulnerabilidades reportadas en el informe de inteligencia AppSec de Contrast Security de 2019 ( Contrast Security AppSec., 2019 ). Además, el marco OWASP propone constantemente vulnerabilidades de esta naturaleza como una de las diez principales vulnerabilidades de una aplicación web ( marco OWASP ).

Descubriendo la inyección de comandos

Esta vulnerabilidad existe porque las aplicaciones suelen usar funciones en lenguajes de programación como PHP , Python y NodeJS para transferir datos y realizar llamadas al sistema operativo de la máquina. Por ejemplo, tomar la entrada de un campo y buscar una entrada en un archivo. Tomemos como ejemplo el siguiente fragmento de código:

En este fragmento de código, la aplicación toma los datos que un usuario ingresa en un campo de entrada llamado$title Para buscar el título de una canción en un directorio. Veamos algunos pasos sencillos.

1. La aplicación almacena archivos MP3 en un directorio contenido en el sistema operativo.

2. El usuario introduce el título de la canción que desea buscar. La aplicación almacena esta información en la $titlevariable.

3. Los datos dentro de esta $titlevariable se pasan al comando greppara buscar en un archivo de texto llamado songtitle.txt la entrada de lo que el usuario desee buscar.

4. El resultado de esta búsqueda de songtitle.txt determinará si la aplicación informa al usuario de que la canción existe o no .

Ahora bien, este tipo de información normalmente se almacenaría en una base de datos; sin embargo, este es sólo un ejemplo de dónde una aplicación toma la información de un usuario para interactuar con el sistema operativo de la aplicación.

Un atacante podría abusar de esta aplicación inyectando sus propios comandos para que la aplicación los ejecute. En lugar de usar [nombre de la aplicación] greppara buscar una entrada en [nombre de songtitle.txtla aplicación], podría pedirle que lea datos de un archivo más confidencial.

Abusar de las aplicaciones de esta manera es posible independientemente del lenguaje de programación que utilicen. Mientras la aplicación lo procese y lo ejecute, puede provocar una inyección de comandos. Por ejemplo, el siguiente fragmento de código corresponde a una aplicación escrita en Python.

Tenga en cuenta que no se espera que comprenda la sintaxis de estas aplicaciones. Sin embargo, por razones prácticas, también he descrito los pasos de funcionamiento de esta aplicación de Python.

  1. El paquete «flask» se utiliza para configurar un servidor web
  2. Una función que utiliza el paquete «subproceso» para ejecutar un comando en el dispositivo
  3. Usamos una ruta en el servidor web que ejecutará lo que se proporcione. Por ejemplo, para ejecutar [nombre del archivo] , necesitaríamos whoamivisitar http ://flaskapp.thm/whoami

Responda las preguntas a continuación

¿Qué variable almacena la entrada del usuario en el fragmento de código PHP en esta tarea?

$title

¿Qué método HTTP se utiliza para recuperar datos enviados por un usuario en el fragmento de código PHP?

GET

Si quisiera ejecutar el idcomando en el fragmento de código Python, ¿qué ruta debería visitar?

/id

Explotación de la inyección de comandos

A menudo se puede determinar si se puede producir o no una inyección de comandos mediante el comportamiento de una aplicación, como se verá en la sesión práctica de esta sala.

Las aplicaciones que utilizan la entrada del usuario para completar comandos del sistema con datos a menudo pueden combinarse de forma imprevista. Por ejemplo, los operadores de shell ;y combinarán dos (o más) comandos del sistema y los ejecutarán&&& . Si no está familiarizado con este concepto, le recomendamos consultar el módulo «Fundamentos de Linux» para obtener más información.

La inyección de comandos se puede detectar principalmente de una de dos maneras:

  1. Inyección de comando a ciegas
  2. Inyección de comandos verbosos

He definido estos dos métodos en la tabla a continuación, donde las dos secciones siguientes los explicarán con mayor detalle.

MétodoDescripción
CiegoEste tipo de inyección se produce cuando no se obtiene una salida directa de la aplicación al probar las cargas útiles. Deberá investigar el comportamiento de la aplicación para determinar si la carga útil se ejecutó correctamente.
VerbosoEste tipo de inyección se produce cuando la aplicación recibe retroalimentación directa una vez que se ha probado una carga útil. Por ejemplo, al ejecutar el whoamicomando para ver con qué usuario se está ejecutando la aplicación, la aplicación web mostrará el nombre de usuario directamente en la página.

Detección de inyección de comandos a ciegas

La inyección de comandos a ciegas se produce cuando se produce una inyección de comandos ; sin embargo, no hay salida visible, por lo que no es inmediatamente perceptible. Por ejemplo, se ejecuta un comando, pero la aplicación web no muestra ningún mensaje.

Para este tipo de inyección de comandos , necesitaremos usar cargas útiles que causen un retraso. Por ejemplo, los comandos « ping` y « sleepson cargas útiles importantes para las pruebas. pingPor ejemplo, la aplicación se bloqueará durante segundos según el número de pings especificados.

Otro método para detectar la inyección ciega de comandos es forzar la salida. Esto se puede lograr mediante operadores de redirección como >. Si no está familiarizado con esto, le recomiendo consultar el módulo de fundamentos de Linux . Por ejemplo, podemos indicar a la aplicación web que ejecute comandos como whoamiy redirigirlos a un archivo. Luego, podemos usar un comando como catpara leer el contenido de este archivo recién creado.

Probar la inyección de comandos de esta manera suele ser complicado y requiere bastante experimentación, especialmente porque la sintaxis de los comandos varía entre Linux y Windows.

El curl comando es una excelente manera de probar la inyección de comandos . Esto se debe a que permite curl enviar datos desde y hacia una aplicación en su carga útil. Como ejemplo, se muestra el siguiente fragmento de código: una simple carga útil curl en una aplicación permite la inyección de comandos.

curl http://vulnerable.app/process.php%3Fsearch%3DThe%20Beatles%3B%20whoami

Detección de inyección de comandos verbosos

Detectar la inyección de comandos de esta manera es posiblemente el método más sencillo de los dos. La inyección de comandos verbosa ocurre cuando la aplicación proporciona información sobre lo que está sucediendo o ejecutándose.

Por ejemplo, la salida de comandos como pingo whoamise muestra directamente en la aplicación web.

Cargas útiles

He compilado algunas cargas útiles valiosas tanto para Linux como para Windows en las tablas a continuación.

Linux

Carga útilDescripción
¿Quién soy?Vea bajo qué usuario se ejecuta la aplicación.
esEnumere el contenido del directorio actual. Es posible que encuentre archivos como archivos de configuración, archivos de entorno (tokens y claves de aplicación) y mucho más.
silbidoEste comando invocará el bloqueo de la aplicación. Esto será útil para probar una aplicación para la inyección de comandos a ciegas.
dormirEsta es otra carga útil para probar una aplicación para la inyección de comandos a ciegas, donde la máquina no la tiene pinginstalada.
NetcatNetcat puede usarse para generar un shell inverso en la aplicación vulnerable. Puede usar este punto de apoyo para navegar por la máquina objetivo en busca de otros servicios, archivos o posibles formas de escalar privilegios.

Windows

Carga útilDescripción
¿Quién soy?Vea bajo qué usuario se ejecuta la aplicación.
directorEnumere el contenido del directorio actual. Es posible que encuentre archivos como archivos de configuración, archivos de entorno (tokens y claves de aplicación) y mucho más.
silbidoEste comando invocará el bloqueo de la aplicación. Esto será útil para probar una aplicación para la inyección ciega de comandos .
se acabó el tiempoEste comando también invocará el bloqueo de la aplicación. También es útil para probar una aplicación en busca de inyección de comandos a ciegas si el pingcomando no está instalado.

Responda las preguntas a continuación

¿Qué carga útil utilizaría si quisiera determinar bajo qué usuario se ejecuta la aplicación?

whoami

¿Qué herramienta de red popular podría usar para probar la inyección de comandos ciegos en una máquina Linux ?

ping

¿Qué carga útil debería utilizar para probar una máquina Windows en busca de una inyección de comandos a ciegas?

Timeout

Remediación de la inyección de comandos

La inyección de comandos se puede prevenir de diversas maneras. Desde el uso mínimo de funciones o bibliotecas potencialmente peligrosas en un lenguaje de programación hasta el filtrado de la entrada sin depender de la entrada del usuario. A continuación, se detallan estas estrategias. Los ejemplos a continuación corresponden al lenguaje de programación PHP ; sin embargo, los mismos principios se pueden aplicar a muchos otros lenguajes.

Funciones vulnerables

En PHP , muchas funciones interactúan con el sistema operativo para ejecutar comandos a través del shell; estas incluyen:

  • Ejecutivo
  • Paso a través
  • Sistema

Tome como ejemplo el siguiente fragmento. En este caso, la aplicación solo aceptará y procesará los números ingresados ​​en el formulario. Esto significa que whoamino se procesarán comandos como [nombre del formulario].

  1. La aplicación solo aceptará un patrón específico de caracteres (los dígitos del 0 al 9)
  2. La aplicación procederá entonces únicamente a ejecutar estos datos que son todos numéricos.

Estas funciones aceptan entradas como cadenas o datos de usuario y ejecutan lo que se proporciona en el sistema. Cualquier aplicación que utilice estas funciones sin las comprobaciones adecuadas será vulnerable a la inyección de comandos.

Saneamiento de entrada

Sanear cualquier entrada de usuario que utilice una aplicación es una excelente manera de evitar la inyección de comandos. Este proceso consiste en especificar los formatos o tipos de datos que un usuario puede enviar. Por ejemplo, un campo de entrada que solo acepta datos numéricos o elimina caracteres especiales como >,  &y /.

En el siguiente fragmento, la función filter_input PHP se utiliza para comprobar si los datos enviados mediante un formulario de entrada son números. Si no son números, se considera una entrada no válida.

Evitar filtros

Las aplicaciones emplean numerosas técnicas para filtrar y depurar los datos de la entrada del usuario. Estos filtros limitan el uso de cargas útiles específicas; sin embargo, podemos abusar de la lógica de una aplicación para eludirlos. Por ejemplo, una aplicación puede eliminar las comillas; en su lugar, podemos usar su valor hexadecimal para obtener el mismo resultado.

Al ejecutarlo, aunque los datos proporcionados estarán en un formato diferente al esperado, aún se pueden interpretar y tendrán el mismo resultado.

Responda las preguntas a continuación

¿Cuál es el término para el proceso de «limpieza» de la entrada del usuario que se proporciona a una aplicación?

Sanitisation

Práctica: Inyección de comandos (Implementación)

Implemente la máquina adjunta a esta tarea; será visible en la vista de pantalla dividida una vez que esté lista.

Pruebe algunas cargas útiles en la aplicación alojada en el sitio web visible en pantalla dividida para comprobar la inyección de comandos. Consulte esta hoja de referencia si tiene dificultades o desea explorar cargas útiles más complejas.

Encuentra el contenido de la bandera en /home/tryhackme/flag.txt . Puedes usar diversas cargas útiles para lograrlo; te recomiendo probar varias.

Responda las preguntas a continuación

¿Bajo qué usuario se ejecuta esta aplicación?

www-data

¿Cuáles son los contenidos de la bandera ubicada en  /home/tryhackme/flag.txt ?

THM{COMMAND_INJECTION_COMPLETE}

Conclusión

¡Enhorabuena por llegar al final de esta sala! En resumen, hemos aprendido sobre los siguientes elementos de la inyección de comandos :

  • Cómo descubrir la vulnerabilidad de inyección de comandos
  • Cómo probar y explotar esta vulnerabilidad utilizando cargas útiles diseñadas para diferentes sistemas operativos
  • Cómo prevenir esta vulnerabilidad en una aplicación
  • Aplicar su aprendizaje realizando la inyección de comandos en una aplicación práctica

Como probablemente habrás descubierto, existen múltiples cargas útiles que pueden usarse para lograr el mismo objetivo. Te recomiendo encarecidamente que retomes el aspecto práctico de esta tarea y pruebes métodos alternativos para recuperar la bandera.

Sigan entrenando, Hacketones, Nos vemos en el próximo laboratorio!!!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *