q3rv0

Follow the white rabbit….

Remote Code Execution

La ejecucion remota de comandos, como su nombre lo dice, es una vulnerabilidad que nos permite inyectar ordenes remotamente en el sistema, basicamente se debe a un mal filtrado de variables que utilizan funciones como:

system()

passthru()

shell_exec()

exec()

ssh2_exec()

Y demas funciones php que permiten la ejecucion de comandos en el OS.

Hay ciertas webs, que utilizan scripts que se encargan de interactuar con los datos que el usuario provee en la aplicacion, muchos de ustedes seguramente habran echo uso de servicios de fingerprinting online, los cuales nos permiten utilizar comandos como whois, ping, dig, nslookup, etc

justamente de este tipo de webs hablo, si no se aplica una correcta seguridad en la aplicacion podria ser brutal para la misma, ya que cualquier usuario con conocimientos se podria aprovechar del mal filtro y lanzar comandos arbitrariamente en el sistema oporativo.

En si la explotacion de este tipo de vulnerabilidad no conlleva una complicaion en cuanto al uso de vectores largos, salvo que en el servidor victima este corriendo mod_security o algun otro tipo de waf con sus respectivos filtros. La idea no es explicar a evadir los mismos, si no mostrar que tan sencillo es explotar esta tecnica.

Vamos a ver un posible codigo vulnerable.

1
2
3
4
5
6
7
8
<?php
if (isset($_POST['boton-ping'])) {
    $objetivo=$_POST['target'];
    echo "<pre class=”report-header”>";
    echo shell_exec(" nslookup " .$objetivo);
    echo "</pre>";
}
?>

Vemos como toma los valores del usuario a travez de POST, y luego ejecuta la entrada con nslookup, a todo esto, no hay una sola verificacion de variables, desp voy a explicar como se puede corregir el script.

Como se puede aprovechar de la ineficiencia de un programador?

Sencillamente, usando una | (tuberia pipe) o ; (actua como separador de comandos)

Supongamos que quisieramos averiguar la version del kernel.

1
2
 
10.x.x.x|uname -a

o

1
10.x.x.x ; uname -a

El codigo se ejecutaria de la siguiente manera en el script.

1
nslookup 10.x.x.x|uname -a

Lo cual terminaria imprimiendo la version del kernel.

Sencillo no??.

Como se puede corregir esta vulnerabilidad?

– Validando la entrada de datos con funciones como escapeshellarg(), escapeshellcmd()

1
2
3
4
5
6
7
8
<?php
if (isset($_POST['boton-ping'])) {
    $objetivo=escapeshellcmd($_POST['target']);
    echo "<pre class=”report-header”>";
    echo shell_exec(" nslookup " .$objetivo);
    echo "</pre>";
}
?>

De esta manera el script quedaria sano y salvo a la entrada de comandos por parte de un atacante.