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 dist-upgrade
Instalamos PHP php-fpm y las utilidades de userland para gestionar acls en el sistema de ficheros:
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:
Deshabilitamos algunos módulos para que no intercedan con php-fpm:
a2dismod mpm_worker
a2dismod mpm_prefork
Habilitamos los módulos necesarios para que php-fpm funcione:
a2enmod mpm_event
a2enmod proxy_fcgi
a2enmod rewrite
Reiniciamos el servicio para que aplique los cambios:
Comprobamos que la ejecución de php está funcionando correctamente a través de FPM:
Accedemos a la ip de la VM:
http://VM_IP/info.php
Eliminamos dicho fichero una vez se haya comprobado que funciona correctamente:
Instalamos algunas extensiones de PHP adicionales:
Instalamos DVWA:
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:
$_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:
DocumentRoot /var/www/html/DVWA-master
<Directory "/var/www/html/DVWA-master">
AllowOverride All
</Directory>
Reiniciamos Apache:
Instalamos un servidor MySQL:
Creamos la base de datos y le damos los permisos necesarios al usuario de acceso:
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:
allow_url_include = On
Reiniciamos php-fpm:
Aplicamos ACLs a algunos directorios para que todas las vulnerabilidades de DVWA puedan ser explotadas:
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> 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> 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:
[mysqld]
secure_file_priv=""
Si intentamos leer ahora el fichero:
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:
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/
También tendremos que deshabilitar el perfil de appArmor(solo Ubuntus o distros con appArmor por defecto):
apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld
Comprobamos que podamos escribir en dicho directorio:
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> GRANT SELECT ON mysql.* TO dvwa@'127.0.0.1';
mysql> FLUSH PRIVILEGES;
Comprobamos que podamos realizar la query sobre los usuarios MySQL:
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 |
+------------+------------------+