Esta pagina se ve mejor con JavaScript habilitado

DVWA

 ·  🎃 kr0m

Para poder practicar nuestro hack-fu es necesario tener un entorno de pruebas en condiciones, en este artículo aprenderemos a montar una aplicación web muy conocida DVWA, se trata de una aplicación con muchísimos fallos de seguridad pensada para el aprendizaje.

Instalamos Ubuntu server y creamos un usuario llamado kr0m.

Actualizamos el SO a la última versión:

apt update
apt dist-upgrade

Instalamos PHP php-fpm y las utilidades de userland para gestionar acls en el sistema de ficheros:

apt install php php-fpm acl -y

Configuramos el timezone de PHP:

cd /etc/
apt search php

PHPVERSION=“7.2”
echo ‘; set timezone to Europe/Madrid
; priority=30
date.timezone = Europe/Madrid’ > /etc/php/$PHPVERSION/mods-available/timezone.ini
phpenmod timezone

Instalamos Apache:

apt install apache2

Deshabilitamos algunos módulos para que no intercedan con php-fpm:

a2dismod php$PHPVERSION
a2dismod mpm_worker
a2dismod mpm_prefork

Habilitamos los módulos necesarios para que php-fpm funcione:

a2enconf php$PHPVERSION-fpm
a2enmod mpm_event
a2enmod proxy_fcgi
a2enmod rewrite

Reiniciamos el servicio para que aplique los cambios:

service apache2 restart

Comprobamos que la ejecución de php está funcionando correctamente a través de FPM:

echo “” > /var/www/html/info.php

Accedemos a la ip de la VM:
http://VM_IP/info.php

Eliminamos dicho fichero una vez se haya comprobado que funciona correctamente:

rm /var/www/html/info.php

Instalamos algunas extensiones de PHP adicionales:

apt install php-intl php-mysql php-sqlite3 php-xml php-gd php-mongodb git -y


Instalamos DVWA:

cd /var/www/html
wget https://github.com/ethicalhack3r/DVWA/archive/master.zip
apt install unzip
unzip master.zip
chown -R kr0m:kr0m DVWA-master/
mv DVWA-master/config/config.inc.php.dist DVWA-master/config/config.inc.php

Configuramos el usuario que accederá a la base de datos:

vi DVWA-master/config/config.inc.php

$_DVWA[ 'db_server' ] = '127.0.0.1';
$_DVWA[ 'db_database' ] = 'dvwa';
$_DVWA[ 'db_user' ] = 'dvwa';
$_DVWA[ 'db_password' ] = 'p@ssw0rd';

Configuramos el nivel de seguridad en el que correrá DVWA:

$_DVWA[ 'default_security_level' ] = 'low';

Configuramos un vhost de Apache:

vi /etc/apache2/sites-enabled/000-default.conf

DocumentRoot /var/www/html/DVWA-master
<Directory "/var/www/html/DVWA-master">
    AllowOverride All
</Directory>

Reiniciamos Apache:

/etc/init.d/apache2 restart

Instalamos un servidor MySQL:

apt install mysql-server

Creamos la base de datos y le damos los permisos necesarios al usuario de acceso:

mysql

mysql> CREATE DATABASE dvwa;
mysql> GRANT ALL PRIVILEGES ON dvwa.* TO dvwa@'127.0.0.1' IDENTIFIED BY 'p@ssw0rd';
mysql> FLUSH PRIVILEGES;

Configuramos la siguiente directiva de PHP para que todas las vulnerabilidades de DVWA puedan ser explotadas:

vi /etc/php/7.2/fpm/php.ini

allow_url_include = On

Reiniciamos php-fpm:

/etc/init.d/php7.2-fpm restart

Aplicamos ACLs a algunos directorios para que todas las vulnerabilidades de DVWA puedan ser explotadas:

setfacl -dR -m u:www-data:rwX -m u:kr0m:rwX /var/www/html/DVWA-master/hackable/uploads/
setfacl -R -m u:www-data:rwX -m u:kr0m:rwX /var/www/html/DVWA-master/hackable/uploads/
setfacl -dR -m u:www-data:rwX -m u:kr0m:rwX /var/www/html/DVWA-master/external/phpids/0.6/lib/IDS/tmp/phpids_log.txt
setfacl -R -m u:www-data:rwX -m u:kr0m:rwX /var/www/html/DVWA-master/external/phpids/0.6/lib/IDS/tmp/phpids_log.txt
setfacl -dR -m u:www-data:rwX -m u:kr0m:rwX /var/www/html/DVWA-master/config
setfacl -R -m u:www-data:rwX -m u:kr0m:rwX /var/www/html/DVWA-master/config

Accedemos a la interfaz web:
http://VM_IP/
admin
password

NOTA: Para poder probar todo el potencial de las inyecciones SQL necesitamos que el servicio MySQL esté configurado de una determinada manera, que el usuario de acceso tenga ciertos privilegios, que el docroot de apache tenga ciertos permisos y que el perfil de apparmor de MySQL esté deshabilitado.


DESSECURIZANDO:

Si queremos que MySQL pueda escribir con el usuario dvwa:

mysql

mysql> GRANT FILE ON *.* TO dvwa@'127.0.0.1';
mysql> FLUSH PRIVILEGES;

Si queremos que MySQL pueda leer/escribir fuera de /var/lib/mysql-files/ hay que deshabilitar la opción --secure-file-priv en caso contrario observaremos el siguiente error:

mysql dvwa -h127.0.0.1 -udvwa -p’p@ssw0rd'

mysql> SELECT first_name, last_name FROM users WHERE user_id='1' UNION ALL SELECT 1, LOAD_FILE('/etc/passwd') INTO OUTFILE '/tmp/blindOutputTest0.txt';
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-----------------------+
| Variable_name    | Value                 |
+------------------+-----------------------+
| secure_file_priv | /var/lib/mysql-files/ |
+------------------+-----------------------+

Para deshabilitarlo:

vi /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]
secure_file_priv=""
/etc/init.d/mysql restart

Si intentamos leer ahora el fichero:

mysql dvwa -h127.0.0.1 -udvwa -p’p@ssw0rd'

mysql> SELECT first_name, last_name FROM users WHERE user_id='1' UNION ALL SELECT 1, LOAD_FILE('/etc/passwd') INTO OUTFILE '/tmp/blindOutputTest0.txt';

Comprobamos el contenido del fichero:

head /tmp/blindOutputTest0.txt

admin admin
1 root:x:0:0:root:/root:/bin/bash\
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\
bin:x:2:2:bin:/bin:/usr/sbin/nologin\
sys:x:3:3:sys:/dev:/usr/sbin/nologin\

Si además queremos que pueda escribir en /var/www/html/DVWA-master/

chmod 757 /var/www/html/DVWA-master/

También tendremos que deshabilitar el perfil de appArmor(solo Ubuntus o distros con appArmor por defecto):

ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld

Comprobamos que podamos escribir en dicho directorio:

mysql dvwa -h127.0.0.1 -udvwa -p’p@ssw0rd'

mysql> SELECT first_name, last_name FROM users WHERE user_id='1' UNION ALL SELECT 1, LOAD_FILE('/etc/passwd') INTO OUTFILE '/var/www/html/DVWA-master/blindOutputTest0.txt';

Si queremos que el usuario dvwa pueda leer información sobre los usuarios de MySQL:

mysql

mysql> GRANT SELECT ON mysql.* TO dvwa@'127.0.0.1';
mysql> FLUSH PRIVILEGES;

Comprobamos que podamos realizar la query sobre los usuarios MySQL:

mysql dvwa -h127.0.0.1 -udvwa -p’p@ssw0rd'

mysql> SELECT first_name, last_name FROM users WHERE user_id='1' UNION ALL SELECT 1, user FROM mysql.user;
+------------+------------------+
| first_name | last_name        |
+------------+------------------+
| admin      | admin            |
| 1          | dvwa             |
| 1          | debian-sys-maint |
| 1          | mysql.session    |
| 1          | mysql.sys        |
| 1          | root             |
+------------+------------------+
Si te ha gustado el artículo puedes invitarme a un RedBull aquí