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
+
+![HTTP basic auth](images/authentication/http-basic-auth.png "HTTP basic auth")
+
+
+## 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
+
+!["Basic Digest Auth"](images/authentication/http-digest-auth.png "Basic Digest Auth")
+
+
+## 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">
+![oAuth](images/oAuth.png "oAuth")<!-- .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
+
+![heartbleed](images/heartbleed/heartbleed.png "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)
+!["Bruce Schneier"](images/heartbleed/bruce-schneier-facts.jpg "Bruce Schneier")<!-- .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
+
+!["Heartbleed device"](images/heartbleed/router_heartbleed.jpg "Heartbleed device")
+
+
+## mesure curative
+
+* mettre à jour ASAP
+* révoquer et changer tous les certificats
+* changer tous les mots de passe
+  * Touche beaucoup de services web
+
+!["Heartbleed impact"](images/heartbleed/impact_heartbleed.jpg "Heartbleed impact")
+
+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)