Page cover

💉Detección

Detección de Command Injection


El proceso de detección de vulnerabilidades básicas de inyección de comandos del sistema operativo es el mismo proceso para explotar dichas vulnerabilidades. Intentamos agregar nuestro comando a través de varios métodos de inyección. Si el resultado del comando cambia con respecto al resultado habitual previsto, hemos explotado la vulnerabilidad con éxito.

Esto puede no ser cierto para vulnerabilidades de inyección de comandos más avanzadas porque podemos utilizar varios métodos de fuzzing o revisiones de código para identificar posibles vulnerabilidades de inyección de comandos. Luego, podemos construir gradualmente nuestra carga útil hasta lograr la inyección de comandos.

Este módulo se centrará en las inyecciones de comandos básicas, donde controlamos la entrada del usuario que se usa directamente en una función de ejecución de comando del sistema sin ningún tipo de desinfección.

Para demostrarlo, utilizaremos el ejercicio que se encuentra al final de esta sección.


Detección de inyección de comandos

Cuando visitamos la aplicación web en el siguiente ejercicio, vemos una utilidad Host Checker que parece pedirnos una IP para comprobar si está viva o no:

Podemos intentar ingresar la IP del host local 127.0.0.1 para verificar la funcionalidad y, como se esperaba, devuelve la salida del comando ping que nos dice que el host local está efectivamente activo:

Aunque no tenemos acceso al código fuente de la aplicación web, podemos suponer con seguridad que la IP que ingresamos va a un comando ping ya que el resultado que recibimos así lo sugiere. Como el resultado muestra un solo paquete transmitido en el comando ping, el comando utilizado puede ser el siguiente:

ping -c 1 OUR_INPUT

Si no se desinfecta ni se escapa nuestra entrada antes de usarla con el comando ping, es posible que podamos inyectar otro comando arbitrario. Por lo tanto, intentemos ver si la aplicación web es vulnerable a la inyección de comandos del sistema operativo.


Métodos de inyección de comandos

Para inyectar un comando adicional al deseado, podemos utilizar cualquiera de los siguientes operadores:

Operador de inyección

Carácter de inyección

Carácter codificado en URL

Comando ejecutado

Punto y coma

;

%3b

Ambos

Nueva linea

%0a

Ambos

Background

&

%26

Ambos (la segunda salida generalmente se muestra primero)

Pipe

|

%7c

Ambos (solo se muestra la segunda salida)

AND

&&

%26%26

Ambos (solo si el primero tiene éxito)

OR

||

%7c%7c

Segundo (solo si falla el primero)

Sub-Shell

``

%60%60

Ambos (solo Linux)

Sub-Shell

$()

%24%28%29

Ambos (solo Linux)

Podemos usar cualquiera de estos operadores para inyectar otro comando para que se ejecuten ambos o cualquiera de los comandos. Escribiríamos nuestra entrada esperada (por ejemplo, una IP), luego usaríamos cualquiera de los operadores anteriores y luego escribiríamos nuestro nuevo comando.

En general, para la inyección de comandos básicos, todos estos operadores se pueden utilizar para inyecciones de comandos independientemente del lenguaje de la aplicación web, el marco o el servidor back-end. Entonces, si estamos inyectando una aplicación web PHP que se ejecuta en un servidor Linux, o una aplicación web .Net que se ejecuta en un servidor back-end de Windows, o una aplicación web NodeJS que se ejecuta en un servidor back-end de macOS, nuestras inyecciones deberían funcionar. a pesar de todo.

Nota: La única excepción puede ser el punto y coma ;, que no funcionará si el comando se ejecuta con Windows Command Line (CMD), pero sí funcionará si se ejecuta con Windows PowerShell.

En la siguiente sección, intentaremos utilizar uno de los operadores de inyección anteriores para explotar el ejercicio Host Checker.


Caso práctico

Objetivo: 83.136.254.158:34041

Intente agregar cualquiera de los operadores de inyección después de la dirección IP en el campo IP. ¿Qué decía el mensaje de error (en inglés)?

Última actualización

¿Te fue útil?