diff --git a/content/slides/1337/authentication.html b/content/slides/1337/authentication.html new file mode 100644 index 0000000000000000000000000000000000000000..96338c5a1be4bd703b9861a704d2de132bf874d3 --- /dev/null +++ b/content/slides/1337/authentication.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>authentification</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/authentication.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/heartbleed.html b/content/slides/1337/heartbleed.html new file mode 100644 index 0000000000000000000000000000000000000000..868f5aaeb49be6234c4d9fb9fc5c27892adc63cb --- /dev/null +++ b/content/slides/1337/heartbleed.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>heartbleed</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/heartbleed.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/authentication/http-basic-auth.png b/content/slides/1337/images/authentication/http-basic-auth.png new file mode 100644 index 0000000000000000000000000000000000000000..1bee09569c6ed446d436322668f6a6128522f0c3 Binary files /dev/null and b/content/slides/1337/images/authentication/http-basic-auth.png differ diff --git a/content/slides/1337/images/authentication/http-digest-auth.png b/content/slides/1337/images/authentication/http-digest-auth.png new file mode 100644 index 0000000000000000000000000000000000000000..07eb734ba9044851e14571905d18f8216589f3f0 Binary files /dev/null and b/content/slides/1337/images/authentication/http-digest-auth.png differ diff --git a/content/slides/1337/images/heartbleed/bruce-schneier-facts.jpg b/content/slides/1337/images/heartbleed/bruce-schneier-facts.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e5747c9bef49be9b3ef13fe3f2ce730f2f668b91 Binary files /dev/null and b/content/slides/1337/images/heartbleed/bruce-schneier-facts.jpg differ diff --git a/content/slides/1337/images/heartbleed/heartbleed.png b/content/slides/1337/images/heartbleed/heartbleed.png new file mode 100644 index 0000000000000000000000000000000000000000..5bac615b45f0801152ee024f54cfda7558e09161 Binary files /dev/null and b/content/slides/1337/images/heartbleed/heartbleed.png differ diff --git a/content/slides/1337/images/heartbleed/heartbleed_explanation_1.png b/content/slides/1337/images/heartbleed/heartbleed_explanation_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5ebc73f684af143a4715b2e4eb23f8184d34e7d7 Binary files /dev/null and b/content/slides/1337/images/heartbleed/heartbleed_explanation_1.png differ diff --git a/content/slides/1337/images/heartbleed/heartbleed_explanation_2.png b/content/slides/1337/images/heartbleed/heartbleed_explanation_2.png new file mode 100644 index 0000000000000000000000000000000000000000..786d9cb17afa89cd2595bb9d3a0558cb492f64f9 Binary files /dev/null and b/content/slides/1337/images/heartbleed/heartbleed_explanation_2.png differ diff --git a/content/slides/1337/images/heartbleed/impact_heartbleed.jpg b/content/slides/1337/images/heartbleed/impact_heartbleed.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0fd31b7bd7cb0f27d3acede1005f7cb1c049a9e2 Binary files /dev/null and b/content/slides/1337/images/heartbleed/impact_heartbleed.jpg differ diff --git a/content/slides/1337/images/heartbleed/router_heartbleed.jpg b/content/slides/1337/images/heartbleed/router_heartbleed.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e78cb25c86d5ec7bd043e2be32f16cf978efa7b2 Binary files /dev/null and b/content/slides/1337/images/heartbleed/router_heartbleed.jpg differ diff --git a/content/slides/1337/md/authentication.md b/content/slides/1337/md/authentication.md new file mode 100644 index 0000000000000000000000000000000000000000..670e4bb50c6db0eac40635a6f26c0a817dfb51c4 --- /dev/null +++ b/content/slides/1337/md/authentication.md @@ -0,0 +1,390 @@ +## authentification + +"<i class="fa fa-wikipedia-w" aria-hidden="true"></i> processus permettant à un système de s'assurer de la légitimité de la demande d'accès faite par une entité (être humain ou un autre système...) afin d'autoriser l'accès de cette entité à des ressources du système (systèmes, réseaux, applications…) conformément au paramétrage du contrôle d'accès ." + +* identification +* authentification +* ACL + + +## preuves + +* ce que je sais + * mot de passe, numéro d'identification personnel +* ce que je possède + * carte d'identité, carte à puce, droit de propriété, certificat électronique, diplôme, passeport, Token, Token OTP, préiphérique +* ce que je suis + * photo, caractéristique physique, voire biométrie +* ce que je sais faire + * geste, signature + + +## sur le web + +* authentification HTTP + * basic + * digest +* authentification par formulaire +* authentification déportée + * OAuth +* authentification d'API + + +## apache & .htaccess + +* [EnablingUseOfApacheHtaccessFiles](https://help.ubuntu.com/community/EnablingUseOfApacheHtaccessFiles) + * surcharge du vhost courant (déconseillé) + +``` +$ sudo vi /etc/apache2/apache2.conf + +<Directory /var/www/> + Options Indexes FollowSymLinks MultiViews + AllowOverride All # None par défaut + Order allow,deny + allow from all +</Directory> +``` + +Note: +- potentiellement danegreux + - php.ini surchargeable aussi + - tems d'exec max + - taille de fichier max + - reporting d'erreur + - configurable en cas de virtual hosting + - à creuser + + +## auth basic .htaccess + +``` +$ vi /var/www/http-basic/.htaccess + +AuthType Basic +AuthName "Big Basic Secret" +AuthUserFile /var/www/http-basic/.htpasswd +Require valid-user +``` + +[htpasswd](https://httpd.apache.org/docs/2.2/programs/htpasswd.html) outil de création des utilisateurs + +``` +$ htpasswd -c /var/www/http-basic/.htpasswd guest +$ htpasswd /var/www/http-basic/.htpasswd otheruser +``` + + +## auth basic + +le client demande un contenu (protégé) + +```http +GET /http-basic/ HTTP/1.1 +Host: go.od +User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0 Iceweasel/31.8.0 +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 +``` + + +## auth basic + +le serveur répond que le contenu est protégé + +```http +HTTP/1.1 401 Authorization Required +Date: Wed, 21 Oct 2015 13:26:29 GMT +Server: Apache/2.2.22 (Debian) +WWW-Authenticate: Basic realm="Big Basic Secret" +Content-Length: 472 +Content-Type: text/html; charset=iso-8859-1 + +<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> +<html><head> +<title>401 Authorization Required</title> +</head><body> +<h1>Authorization Required</h1> +</body> +``` + + +## auth basic + + + + +## auth basic + +```http +GET /http-basic/ HTTP/1.1 +Host: go.od +User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0 Iceweasel/31.8.0 +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 +Authorization: Basic b3dhc3A6cGFzc3dvcmQ= +``` + +[base64](https://fr.wikipedia.org/wiki/Base64)(username:password) + + +## auth digest + +* Même schéma que la version Basic excepeté + * algorithme de hashage [MD5](https://fr.wikipedia.org/wiki/MD5) plutôt qu'un simple encodage [base64](https://fr.wikipedia.org/wiki/Base64) + * ajout d'un [nonce](http://fr.wikipedia.org/wiki/Nonce_cryptographique), rattacher à la session de communication, pour éviter les [attaques "par rejeu"](https://fr.wikipedia.org/wiki/Attaque_par_rejeu) + +``` +$ sudo a2enmod auth_digest +$ sudo service apache2 reload +``` + + +## auth digest + + + + +## auth digest .htaccess + +``` +$ vi /var/www/http-digest/.htaccess + +AuthType Digest +AuthName "authdigest" +AuthDigestDomain "/" +AuthDigestProvider file +AuthUserFile "/var/www/http-digest/.htdigest" +Require valid-user +``` + +[htdigest](https://httpd.apache.org/docs/2.2/fr/programs/htdigest.html) outil de création des utilisateurs + +``` +htdigest -c /var/www/http-basic/.htdigest "authdigest" guest +htdigest /var/www/http-basic/.htdigest "authdigest" otheruser +``` + + +## auth digest + +le client demande un contenu (protégé) + +```http +HTTP/1.1 401 Unauthorized +WWW-Authenticate: Digest realm="OwaspSample", + nonce="Ny8yLzIwMDIgMzoyNjoyNCBQTQ", + opaque="0000000000000000", \ + stale=false, + algorithm=MD5, + qop="auth" +``` + + +## auth digest + +le serveur répond que le contenu est protégé + +```http +GET /example/owasp/test.asmx HTTP/1.1 +Accept: */* +Authorization: Digest username="owasp", + realm="OwaspSample", + qop="auth", + algorithm="MD5", + uri="/example/owasp/test.asmx", +nonce="Ny8yLzIwMDIgMzoyNjoyNCBQTQ", +nc=00000001, +cnonce="c51b5139556f939768f770dab8e5277a", +opaque="0000000000000000", +response="2275a9ca7b2dadf252afc79923cd3823" +``` + +Note: +- haché plus réversible même si MD5 ca craint un peu +- le nonce evite le rejeu + - le serveur connait les nonce qu'il a émis + - il sait qu'ils ne sont valables qu'une fois + - http://slideplayer.fr/slide/1622495/ -> slide 30 +- le cnonce agit comme un salt + - évite le cassage du mot de passe par dictionnaire +- toujours pas de lockout +- attaque man in the middle + - demande de nonce au serveur et l'envoie au client et renvoie le resultat du cacul au serveur +- pas de blocage testable à l'infini + + +## authentification par formulaire + +le plus courant + +``` +<form method="POST" action="login"> +<input type="text" name="username"> +<input type="password" name="password"> +</form> +``` + + +## authentification par formulaire + +* le mot de passe est transmis en clair au serveur + * https :) +* stocker les mots de passe en clair sur le serveur est un mauvaise idée + * stocker les hashés est un bonne pratique + * [Rockyou.com en 2010](http://commedansdubeurre.ch/?story=162-piratage-de-32-millions-de-comptes-utilisateurs-chez-rockyou-recours-collectif-depose) + +Note: +- peut être en GET + - plus facile pour le scripter en brute force + - et encore + - passe dans l'url? + - server-status intéressant +- http sniffbale https ok +- peut avoir du code coté client (calcul du md5 en js avant soumiision par exemple) +- 3 étapes + - formulaire + - traitement serveur + - la ressource (notamment accès direct) ou information 403 avec la suite +- dépend beaucoup des développeurs + - best practice + - esapi OWASP +- récupération du token de session suffit souvent (passé par GET par exemple SID ou par cookie) +- potentiellement + - lock out sur brute force + - paramètre assitionel - timestamp +- XSS redirect user vers une page d'auth fake +- SQL injection +- marche aussi avec un interpréteur de commande LDAP +- pour l'attaque des fois ca répond 200 alors que c'est non (ca devrait être 403) + - méfiance + + +## oAuth + +* tri-partie + +<div style="text-align: center"> +<!-- .element style="width: 50%" --> +</div> + +| Version | SSL | Token | Technique | +| --------- | ----------- | --------------- | ------------------------ | +| oAuth 1.0 | optionel | sans expiration | mise en place compliquée | +| oAuth 2.0 | obligatoire | révocable | simple et plus léger | + +* 1.0 incompatible avec 2.0 +* <i class="fa fa-newspaper-o"></i> [How to Secure Your REST API using Proven Best Practices](https://stormpath.com/blog/secure-your-rest-api-right-way) + +Note: +- authentification simple (instagram) +- souvent autorisations partielles attribuées à l'app +- le token évite de rejouer l'auth +- oAuth 1.0 en clair lire le token +- pas de consensus sur la version 1 ou 2 sur Internet +- confiance dans consumer (l'app qui demande l'autorisation) + + +## Les attaques brute force + +* Différents types + * Attaque par dictionnaires + * devine automatiquement les paramètres d'authentification à partir d'une liste d'utilisateur / mot de passe + * optimisable avec de la probabilité, [des dictionnaires au hasard](https://dazzlepod.com/site_media/txt/passwords.txt), de l'ingénieurie sociale, du flaire etc ... + * Attaque par recherche + * essayer toutes les combinisaons de caractères + * trouver un mot de passe de 8 caractères composé exclusivement de caractères alphabétiques: 26<sup>8</sup> possibilités + * Attaque par recherche basée sur des règles + * décliner via des règles les propositions d'un dictionnaire + * leetspeakation automatique + * [John the Ripper](http://www.openwall.com/john/) permet de générer des mots de passes dérivant de parties du username + + +## [THC Hydra](http://www.thc.org/thc-hydra/) + +* multi-protocole: IMAP, SMB, HTTP, VNC, MS-SQL MySQL, SMTP, SSH, VNC, Asterisk, ... +* [RTFM](https://github.com/vanhauser-thc/thc-hydra) +* [liste de usernames](https://raw.githubusercontent.com/maryrosecook/commonusernames/master/usernames.txt) +* [liste de mots de passe](https://wiki.skullsecurity.org/index.php?title=Passwords) + +<pre> +<code data-trim class="hljs bash" style="font-size: 22px"> +hydra 192.168.1.26 ssh2 -s 22 -P pass.txt -L users.txt -e nrs -t 10 +</code> +</pre> + +* attaque du protocole ssh sur le port 22 +* 10 threads à la fois +* essaie toutes les combinaisons possibles entre les username de users.txt et les mots de passe de pass.txt + * + mot de passe vide + * + mot de passe = username + * + mot de passe = username à l'envers +* [OWASP - Testing for Brute Force](https://www.owasp.org/index.php/Testing_for_Brute_Force_%28OWASP-AT-004%29) +* [Using Hydra to dictionary-attack web-based login forms](http://insidetrust.blogspot.fr/2011/08/using-hydra-to-dictionary-attack-web.html) +* voir aussi [medusa](http://foofus.net/goons/jmk/medusa/medusa.html) + +Note: +- Burp Suite +- Patator + + +## attaques offline + +* Dépend de la puissance de calcul +* Non furtive +* Reproductible +* [OPHCRACK (the time-memory-trade-off-cracker)](http://lasecwww.epfl.ch/~oechslin/projects/ophcrack/) + * monde windows + * fichiers SAM + * fonctionne avec des [dictionnaires](http://ophcrack.sourceforge.net/tables.php) + * <i class="fa fa-gift"></i> <a href="http://www.newbiecontest.org/index.php?page=epreuve&no=224">obtenir le pass d'un compte windows en moins de 10 minutes</a><!-- tips: le xp free suffit --> + * [Password Cracking: Lesson 2](http://www.computersecuritystudent.com/SECURITY_TOOLS/PASSWORD_CRACKING/lesson2/) +* [John the Ripper](http://www.openwall.com/john/) + * monde UNIX/BSD + * fichier /etc/passwd + /etc/shadow + * mangling rules: leet speak, custom ... + +<pre> +<code data-trim> +unshadow /etc/passwd /etc/shadow > mypasswd +</code> +</pre> + +* [Checking Password Complexity with John the Ripper](http://www.admin-magazine.com/Articles/John-the-Ripper) + + +## attaques par tables arc-en-ciel + +* [Project RainbowCrack](http://www.antsight.com/zsl/rainbowcrack/) +* [CrackStation](https://crackstation.net/) + * avec la signature de smithy dans la table user + +<pre> +<code data-trim> +5f4dcc3b5aa765d61d8327deb882cf99 +</code> +</pre> + + +## <i class="fa fa-medkit"></i> Se protéger + +* bien choisir son système d'authentification +* bien implémenter son système d'authentification + * [ESAPI (The OWASP Enterprise Security API)](https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API) + * libs & bundles éprouvés +* mettre un nombre d'essais maximum consécutifs + * plugin anti brute force + * wordpress + * drupal + * compléter par des restrictions par IP, voir par blocs d'IPs +* instaurer des règles de durcissement au moment du choix du mot de passe + * pas contournable côté client ;) +* sensibilisez vos utilisateurs + * [<i class="fa fa-desktop"></i> Se protéger avec de bons mots de passe](http://doc.m4z3.me/_/bpu/se_proteger_avec_de_bons_mots_de_passe.htm#/cover) + * [<i class="fa fa-video-camera"></i> Se protéger avec de bons mots de passe](http://webtv.u-clermont1.fr/media-MEDIA150410174414391) diff --git a/content/slides/1337/md/heartbleed.md b/content/slides/1337/md/heartbleed.md new file mode 100644 index 0000000000000000000000000000000000000000..26e25bd1bc2bbcab9408406709d99a408ae0f7ed --- /dev/null +++ b/content/slides/1337/md/heartbleed.md @@ -0,0 +1,194 @@ +## heartbleed + + + + +## un système vulnérable ... + +[Ubuntu server 12.04.4](http://ubuntu-release.locaweb.com.br/12.04/) + +```bash +sudo apt-get install nginx +``` + +### surtout pas d'upgrade pour garder des services vulnérables ;) + +[paramétrage réseau](/zz2-f5-securite-logicielle-22-securite-des-applications-web.html#recreer-lenvironnement-de-cours-dans-virtualbox) + + +## architecture typique + +* nginx route le traffic http (80/443) + * vers d'autres serveurs web + * dans notre cas une debian + * avec apache + +Note: +- appli node sur port exotique +- possibilité de filtrage de requête +- [load balancing](http://nginx.org/en/docs/http/load_balancing.html) pour pas cher +- accessoirement nickel pour les migrations + + +## nginx + +<pre> +<code data-trim class="hljs bash" style="font-size: 23px; min-height: 560px"> +upstream debian80 { + server 172.16.76.144:80; +} +server { + listen 80; + server_name heart.bleed; + # don't mess with security :p + rewrite ^ https://heart.bleed$request_uri? permanent; +} +server { + listen 443; + server_name heart.bleed; + ssl on; + ssl_certificate /etc/nginx/ssl/keys/heartbleed.crt; + ssl_certificate_key /etc/nginx/ssl/keys/heartbleed.key; + location / { + proxy_pass http://debian80/; + proxy_set_header Host $http_host; + } +} +</code> +</pre> + + +## heartbleed + +* découverte en mars 2014 + * par Google & Codenomicon + * présente depuis mars 2012 + * introduite à la suite d'un "bug fix" par un contributeur bénévole + * validée le 31 décembre 2011 + * faille d'implémentation dans openssl + + +<div style="text-align: center"> + <img src="images/heartbleed/heartbleed_explanation_1.png"/> +</div> + + +<div style="text-align: center"> + <img src="images/heartbleed/heartbleed_explanation_2.png"/> +</div> + + +## impact + +* [Bruce Schneier la positionne à 11 sur une échelle de 1 à 10](https://www.schneier.com/blog/archives/2014/04/heartbleed.html) +<!-- .element style="float: right; margin: 20px" width="25%" --> +* Qui savait? + * Qui a pu exploiter? + * [la NSA est soupçonnée par bloomberg d'avoir exploité la faille pendant 2 ans](https://www.bloomberg.com/news/articles/2014-04-11/nsa-said-to-have-used-heartbleed-bug-exposing-consumers) + + +## impact + +* touche tout ce qui utilise SSL/TLS + * https + * mail + * imaps + * pop3s + * smtps + * ftps + * vpn + * ... + + +## impact + +touche beaucoup d'équipements aussi + + + + +## mesure curative + +* mettre à jour ASAP +* révoquer et changer tous les certificats +* changer tous les mots de passe + * Touche beaucoup de services web + + + +Note: +- Windows avec openSSH ne sera pas épargné au prochain tour + + +## timeline + +* [Heartbleed - timeline](https://securityledger.com/2014/06/infographic-a-heartbleed-disclosure-timeline-secunia/heartbleed_infographic/) + +* [CVE-2014-0160](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0160) + * CVE-2014-0346 + +Note: +- vitesse de distribution des patchs + - temps de compilation et de distribution dans les paquets + + +## 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/) +* [Heartbleed Early Shodan Search - port: 443 openssl 1.0.1](https://www.shodan.io/search?query=port%3A443+openssl+1.0.1) +* [Heartbleed CVE Shodan Search - vuln:cve-2014-0160](https://www.shodan.io/search?query=vuln%3A%21cve-2014-0160) +* [Heartbleed Shodan Report](https://www.shodan.io/report/XTx7BmP5) +* [Heartbleed Bug Health Report](https://zmap.io/heartbleed/) + + +## détection + +```bash +$ nmap -p 443 --script=ssl-heartbleed heart.bleed +Starting Nmap (https://nmap.org) at 2015-10-20 12:10 EDT +Nmap scan report for heart.bleed (172.16.76.143) +Host is up (0.0014s latency). +rDNS record for 172.16.76.143: proxy +PORT STATE SERVICE +443/tcp open https +| ssl-heartbleed: +| VULNERABLE: +| The Heartbleed Bug is a serious vulnerability +| in the popular OpenSSL cryptographic software library. +``` + + +### exploit <i class="fa fa-spinner fa-spin"></i> + +* [<i class="fa fa-github"></i> akenn/hb-test.py](https://gist.github.com/akenn/10159084) +* [<i class="fa fa-newspaper-o"></i> Andrew Kennedy blog - Heartbleed](http://akenn.org/blog/Heartbleed/) +* [<i class="fa fa-gear"></i> https://heart.bleed ](https://heart.bleed ) + * nginx renvoie sur un formulaire d'authentification servi par apache en forçant https + * authentifions nous + + +### exploit <i class="fa fa-spinner fa-spin"></i> + +```bash +$ python hb-test.py heart.bleed > hb.dump \ + && cat hb.dump | tail -n +10 | head -n 40 +00e0: 63 65 70 74 2D 4C 61 6E 67 75 61 67 ..Accept-Languag +00f0: 6E 2D 55 53 2C 65 6E 3B 71 3D 30 2E e: en-US,en;q=0. +0100: 63 63 65 70 74 2D 45 6E 63 6F 64 69 5..Accept-Encodi +0110: 67 7A 69 70 2C 20 64 65 66 6C 61 74 ng: gzip, deflat +0120: 65 66 65 72 65 72 3A 20 68 74 74 70 e..Referer: http +0130: 68 65 61 72 74 2E 62 6C 65 65 64 2F s://heart.bleed/ +0140: 78 2E 68 74 6D 6C 0D 0A 43 6F 6F 6B index.html..Cook +0150: 68 65 61 72 74 62 6C 65 65 64 3D 27 ie: heartbleed= +0160: 72 69 65 6E 64 73 21 27 0D 0A 43 6F Hi friends!.use +01d0: 65 3D 6D 61 7A 65 6E 6F 76 69 26 70 rname=mazenovi&p +01e0: 6F 72 64 3D 6C 65 61 6B 65 64 70 61 assword=leakedpa +01f0: 48 95 77 37 7B E7 02 27 4D 8B 3C 2D ss't.H.w7{..'M.<- +``` + +aucun signe de l'attaque dans les logs + +Note: +- ca marche aussi avec les clés privées de serveurs + - et avec tous les secrets qui passe par la mémoire du serveur diff --git a/content/slides/privacy/md/tls.md b/content/slides/privacy/md/tls.md index 000998a24c0810ccf1fcd4bdf6c29c40bcf22ee4..31602782e028b2600db252a038f31b15225aef3b 100644 --- a/content/slides/privacy/md/tls.md +++ b/content/slides/privacy/md/tls.md @@ -637,6 +637,10 @@ Note: * [Comodo ssl analyzer](https://sslanalyzer.comodoca.com/) * [OpenSSL Decoder](https://raymii.org/s/software/OpenSSL_Decoder.html) * [Strong SSL Security On nginx](https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html) + * avec nmap + ``` + nmap -p 443 --script=ssl-enum-ciphers heart.bleed + ``` * [<i class="fa fa-gitlab"></i> Monter un serveur https avec apache](https://gitlab.isima.fr/mazenovi/tp-www-ssl)