XUT_ / COURSES / CYBER SECURITY 101

III.I. Command Injection

Inyección de Comandos

La inyección de comandos ocurre cuando código del lado del servidor, como PHP, en una aplicación web, hace una llamada a una función que interactúa con la consola directamente. Una de estas vulnerabilidades permite al atacante ejecutar comandos en el sistema host.

Una vez que esto pasa, ya puede empezar con la fase de enumeración y pivotar entre sistemas.


Ejemplo de Código

Consideremos el siguiente escenario: MooCorp ha empezado a desarrollar una aplicación basada en web para arte ASCII de vacas con texto personalizable. Buscando maneras de implementar su app, han encontrado el comando cowsay de Linux, que hace justo eso. Así que en vez de programar una aplicación web entera, usan código simple para decirle a cowsay lo que tiene que hacer. Veamos el código que han desarrollado:

php
<?php
    if (isset($_GET["mooing"])) {
        $mooing = $_GET["mooing"];
        $cow = 'default';

        if(isset($_GET["cow"]))
            $cow = $_GET["cow"];
        
        passthru("perl /usr/bin/cowsay -f $cow $mooing");
    }
?>

En términos simples, este código hace lo siguiente:

  1. Comprueba si el parámetro "mooing" está definido. Si lo está, la variable $mooing recibe el valor pasado por el parámetro.

  2. Comprueba si el parámetro "cow" está definido. Si lo está, la variable $cow toma lo que le haya sido pasado.

  3. El programa ejecuta la función passthru("perl /usr/bin/cowsay -f $cow $mooing);. La función passthru, ejecuta un comando en la consola del sistema operativo. Podemos ver que el comando está concatenando las variables. Ya que podemos manipular esas variables, podemos inyectar comandos usando trucos.

    III.I. Command Injection


Explotar Inyección de Comandos

Ahora que sabemos cómo funciona la aplicación por dentro, nos aprovecharemos de una capacidad de bash llamada "inline commands".

Para ejecutar comandos inline, sólo necesitamos en el siguiente formato $(nuestro_comando). Si bash detecta un comando inline, lo ejecutará primero y usará el resultado con el comando principal, por ejemplo:

III.I. Command Injection

Así que, volviendo a la app de cowsay, esto es lo que pasaría si inyectásemos comandos:

III.I. Command Injection

Ya que la aplicación acepta cualquier input por nuestra parte, podemos inyectar comandos inline, que serán ejecutados y usados como parámetro para cowsay. Algunos comandos que puedes probar:

  • whoami
  • id
  • ifconfig / ip addr / ip a
  • uname -a
  • ps -ef

Challenge

  1. III.I. Command Injection
  2. III.I. Command Injection
  3. III.I. Command Injection
  4. III.I. Command Injection
  5. III.I. Command Injection