diff --git a/content/Etudiants/zz2-f5-websec.md b/content/Etudiants/zz2-f5-websec.md index 97899453287133eb880d96624f6e0e594ee37ca8..db1252f68788d5fb23d97931d97683824c76401d 100644 --- a/content/Etudiants/zz2-f5-websec.md +++ b/content/Etudiants/zz2-f5-websec.md @@ -124,13 +124,13 @@ Tags: cours <li> <a href="slides/1337/bruteforce.html" class="customizable"> - Brute force <i class="fas fa-hammer"></i> + Brute force </a> </li> <li> <a href="slides/1337/session.html" class="customizable"> - Session <i class="fas fa-hammer"></i> + Session </a> </li> </ul> diff --git a/content/slides/1337/images/session/cookie.png b/content/slides/1337/images/session/cookie.png new file mode 100644 index 0000000000000000000000000000000000000000..e2925cf1755285fc7b050a69e9ed3f77bc1bd405 Binary files /dev/null and b/content/slides/1337/images/session/cookie.png differ diff --git a/content/slides/1337/images/session/free.png b/content/slides/1337/images/session/free.png new file mode 100644 index 0000000000000000000000000000000000000000..3d453254d0bdd5867a029a44afea2ec0e66ae6c8 Binary files /dev/null and b/content/slides/1337/images/session/free.png differ diff --git a/content/slides/1337/images/session/sequencer.png b/content/slides/1337/images/session/sequencer.png new file mode 100644 index 0000000000000000000000000000000000000000..04718a13b7cad11435a10132c527c75168aef43a Binary files /dev/null and b/content/slides/1337/images/session/sequencer.png differ diff --git a/content/slides/1337/images/session/sequencer2.png b/content/slides/1337/images/session/sequencer2.png new file mode 100644 index 0000000000000000000000000000000000000000..4a651e821abaa535b39bacc89cb5837877d16955 Binary files /dev/null and b/content/slides/1337/images/session/sequencer2.png differ diff --git a/content/slides/1337/md/authentication.md b/content/slides/1337/md/authentication.md index 4a630e68914bc7815863f7b45e39050e3f9508d6..fa132500feb9894080b7cbf554d6d92fbe1e2733 100644 --- a/content/slides/1337/md/authentication.md +++ b/content/slides/1337/md/authentication.md @@ -1,18 +1,18 @@ -## authentification +# authentification "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 ." <i class="fa-brands fa-wikipedia-w"></i>ikipédia -## 3 concepts +### 3 concepts * identification * **authentification** * ACL -## preuves +### preuves * **ce que je sais**: mot de passe, numéro d'identification personnel * **ce que je possède**: carte d'identité, carte à puce, certificat électronique, Token, Token OTP, périphérique @@ -20,24 +20,12 @@ * **ce que je sais faire**: geste, signature -## 2AF - - - -https://www.google.com/landing/2step/ - - -## Yubikey - -[](https://www.yubico.com/) - - # quelques techniques ## du world wide web ### A base de login / mot de passe -## apache & .htaccess +### apache & .htaccess * [EnablingUseOfApacheHtaccessFiles](https://help.ubuntu.com/community/EnablingUseOfApacheHtaccessFiles) * surcharge du vhost courant (déconseillé) @@ -63,7 +51,7 @@ Note: - à creuser -## auth basic .htaccess +### auth basic / .htaccess ``` $ vi /var/www/http-basic/.htaccess @@ -82,7 +70,7 @@ $ htpasswd /var/www/http-basic/.htpasswd otheruser ``` -## auth basic +### auth basic / requête le client demande un contenu (protégé) @@ -97,7 +85,7 @@ Connection: keep-alive ``` -## auth basic +### auth basic / réponse le serveur répond que le contenu est protégé @@ -118,12 +106,12 @@ Content-Type: text/html; charset=iso-8859-1 ``` -## auth basic +### auth basic  -## auth basic +### auth basic ```http GET /http-basic/ HTTP/1.1 @@ -141,7 +129,7 @@ Authorization: Basic b3dhc3A6cGFzc3dvcmQ= [base64](https://fr.wikipedia.org/wiki/Base64)(username:password) -## auth digest +### 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) @@ -153,12 +141,12 @@ $ sudo service apache2 reload ``` -## auth digest +### auth digest <!-- .element style="background-color: white" --> -## auth digest .htaccess +### auth digest / .htaccess ``` $ vi /var/www/http-digest/.htaccess @@ -179,7 +167,7 @@ htdigest /var/www/http-basic/.htdigest "authdigest" otheruser ``` -## auth digest +### auth digest * le client demande un contenu (protégé) * le serveur répond que le contenu est protégé @@ -195,12 +183,12 @@ WWW-Authenticate: Digest realm="OwaspSample", ``` -## auth digest +### auth digest  -## auth digest +### auth digest ```http GET /example/owasp/test.asmx HTTP/1.1 @@ -231,34 +219,48 @@ Note: - pas de blocage testable à l'infini -## authentification par formulaire - -le plus courant +### authentification par formulaire -``` +```html <form method="POST" action="login"> <input type="text" name="username"> <input type="password" name="password"> </form> ``` +```php +$connect = mysqli_connect("host","user","pwd", "db"); +$result = $connect->query( + "SELECT password FROM user WHERE Username = '$_POST['username'];" +); +if(mysqli_num_rows($result) > 0 ){ + $row = mysqli_fetch_assoc($result); + if($row["password"] == md5($_POST['password'])) + { + echo "auth success"; + } +} +echo "auth failed"; + +``` + -## authentification par formulaire +### 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 mots de passe en clair sur le serveur est une mauvaise idée * [Rockyou.com en 2010](http://commedansdubeurre.ch/?story=162-piratage-de-32-millions-de-comptes-utilisateurs-chez-rockyou-recours-collectif-depose) * stocker les hashés est une bonne pratique * saler les hashés est encore mieux -## oAuth +### oAuth  -## oAuth +### oAuth | Version | SSL | Token | Technique | | ------- | ----------- | --------------- | ------------------------ | @@ -277,180 +279,40 @@ Note: - confiance dans consumer (l'app qui demande l'autorisation) -## SSO +### SSO * [CAS](http://www.apereo.org/cas) ##### "Identity providers (IdPs) supply user information, while service providers (SPs) consume this information and give access to secure content" -* [SAML](https://fr.wikipedia.org/wiki/SAML) [Shibboleth](images/authentication/Shibboleth.png) +* [keycloak](https://www.keycloak.org/) * [OpenID](https://openid.net/) +* [SAML](https://fr.wikipedia.org/wiki/SAML) [Shibboleth](images/authentication/Shibboleth.png) * [lemonldap-ng](https://lemonldap-ng.org/welcome/) -## JWT +### JWT [<!-- .element style="width: 80%" -->](https://blog.ippon.fr/2017/10/12/preuve-dauthentification-avec-jwt/) -## force brute - -* par dictionnaires - * liste d'utilisateurs + liste de mots 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 ... - - -## force brute - -* par recherche - * combinatoire -* hybride - * 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 - - -## Brute force [low/medium] - -```shell -export security=low -export PHPSESSID=esiff3kfto23f7uit3vr90jks4 -``` - -```shell -hydra -l admin \ - -P /usr/share/wordlists/rockyou.txt \ - vm-etu-vimazeno.local.isima.fr \ - http-form-get "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:H=Cookie\: PHPSESSID=${PHPSESSID}; security=${security};:Username and/or password incorrect." -``` - -* [THC Hydra](https://github.com/vanhauser-thc/thc-hydra) - * medium: sleep(2). Un peu plus long. - - -## Brute force [medium] - -```shell -export security=medium -export PHPSESSID=esiff3kfto23f7uit3vr90jks4 -``` - -```shell -patator http_fuzz method=GET follow=0 accept_cookie=0 --threads=1 --rate-limit=2 timeout=10 \ - url="http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/brute/?username=admin&password=FILE0&Login=Login" \ - 0=/usr/share/wordlists/rockyou.txt \ - header="Cookie: security=${security}; PHPSESSID=${PHPSESSID}" \ - resolve="vm-etu-vimazeno.local.isima.fr:10.16.41.197" \ - -x ignore:fgrep='Username and/or password incorrect.' -``` +### 2FA -* [patator](https://github.com/lanjelot/patator) - * resolv= -> [buggy version](https://bytemeta.vip/repo/lanjelot/patator/issues/174) - - -## Brute force [hard] -capturer la soumission du formulaire -<!-- .element style="width: 90%" --> - - -## Brute force [hard] -envoyer la requête dans *Intruder* -<!-- .element style="width: 90%" --> - - -## Brute force [hard] -* onglet *Intruder* - * *attack type* -> *pitchfork* - * ne laisser que password et user_token en paramètres -<!-- .element style="width: 90%" --> - - -## Brute force [hard] - -* onglet *Payloads* - * *Payload set*: 1 (mot de passe) -> *Simple list* - * *Payload settings [Simple list]* -> *load* -> */usr/share/wordslists/fasttrack.txt* -<!-- .element style="width: 90%" --> - - -## Brute force [hard] - * *Payload set*: 2 (token anti CSRF) -> *Recursive grep* -* onglet *Settings* - * *Grep - Extract* -> *add* -<!-- .element style="width: 90%" --> - - -## Brute force [hard] -* onglet *Resource pool* - * cocher *create new resource pool* -<!-- .element style="width: 90%" --> - - -## Brute force [hard] -<!-- .element style="width: 90%" --> - -## attaques offline - -* Dépend de la puissance de calcul -* Non furtive -* Reproductible - - -## attaques offline - -* [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> - * [Password Cracking: Lesson 2](http://www.computersecuritystudent.com/SECURITY_TOOLS/PASSWORD_CRACKING/lesson2/) - - -## attaques offline - -* [John the Ripper](http://www.openwall.com/john/) - * monde UNIX/BSD - * fichier /etc/passwd + /etc/shadow - * mangling rules: leet speak, custom ... - -```shell -unshadow /etc/passwd /etc/shadow > mypasswd -``` - -* [Checking Password Complexity with John the Ripper](http://www.admin-magazine.com/Articles/John-the-Ripper) + +https://www.google.com/landing/2step/ -## attaques par tables arc-en-ciel -* [CrackStation](https://crackstation.net/) - * avec la signature de smithy dans la table user +### 2FA / Yubikey -```shell -5f4dcc3b5aa765d61d8327deb882cf99 -``` +[](https://www.yubico.com/) -## <i class="fa fa-medkit"></i> Se protéger +### <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 - - -## <i class="fa fa-medkit"></i> Se protéger - -* instaurer des règles de durcissement au moment du choix du mot de passe - * pas contournable côté client ;) -* sensibilisez vos utilisateurs * mettre en place un deuxième facteur d'authentification * utiliser la crypto asymétrique diff --git a/content/slides/1337/md/bruteforce.md b/content/slides/1337/md/bruteforce.md index 5c515973ba22ff75383154dc8bda3ef8c3efca5c..51a4d103071e7f34fca43dc7d44acf64a19552a7 100644 --- a/content/slides/1337/md/bruteforce.md +++ b/content/slides/1337/md/bruteforce.md @@ -1 +1,166 @@ -# Brute Force \ No newline at end of file +# Brute Force + +## AKA burning cpu + + +### force brute + +* par dictionnaires + * liste d'utilisateurs + liste de mots 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 ... + + +## force brute + +* par recherche + * combinatoire +* hybride + * 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 + + +### <i class="fa-solid fa-bomb"></i> Brute force / low + +extract rockyou.txt + +```bash +cd /usr/share/wordlists +sudo gzip -d rockyou.txt.gz +``` + +```bash +export security=low +export PHPSESSID=esiff3kfto23f7uit3vr90jks4 +hydra -l admin \ + -P /usr/share/wordlists/rockyou.txt \ + vm-etu-vimazeno.local.isima.fr \ + http-form-get "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:H=Cookie\: PHPSESSID=${PHPSESSID}; security=${security};:Username and/or password incorrect." +``` + + +### <i class="fa-solid fa-bomb"></i> Brute force / medium + +* `sleep(2)` : Un peu plus long. + +```shell +export security=medium +export PHPSESSID=esiff3kfto23f7uit3vr90jks4 +``` + +```shell +patator http_fuzz method=GET follow=0 accept_cookie=0 --threads=1 --rate-limit=2 timeout=10 \ + url="http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/brute/?username=admin&password=FILE0&Login=Login" \ + 0=/usr/share/wordlists/rockyou.txt \ + header="Cookie: security=${security}; PHPSESSID=${PHPSESSID}" \ + resolve="vm-etu-vimazeno.local.isima.fr:10.16.41.197" \ + -x ignore:fgrep='Username and/or password incorrect.' +``` + +* [patator](https://github.com/lanjelot/patator) + * resolv= -> [buggy version](https://bytemeta.vip/repo/lanjelot/patator/issues/174) + + +### <i class="fa-solid fa-bomb"></i> Brute force / high + +capturer la soumission du formulaire +<!-- .element style="width: 90%" --> + + +### <i class="fa-solid fa-bomb"></i> Brute force / high + +envoyer la requête dans *Intruder* +<!-- .element style="width: 90%" --> + + +### <i class="fa-solid fa-bomb"></i> Brute force / high + +* onglet *Intruder* + * *attack type* -> *pitchfork* + * ne laisser que password et user_token en paramètres +<!-- .element style="width: 90%" --> + + +### <i class="fa-solid fa-bomb"></i> Brute force / high + +* onglet *Payloads* + * *Payload set*: 1 (mot de passe) -> *Simple list* + * *Payload settings [Simple list]* -> *load* -> */usr/share/wordslists/fasttrack.txt* +<!-- .element style="width: 90%" --> + + +### <i class="fa-solid fa-bomb"></i> Brute force / high + + * *Payload set*: 2 (token anti CSRF) -> *Recursive grep* +* onglet *Settings* + * *Grep - Extract* -> *add* +<!-- .element style="width: 90%" --> + + +### <i class="fa-solid fa-bomb"></i> Brute force / high + +* onglet *Resource pool* + * cocher *create new resource pool* +<!-- .element style="width: 90%" --> + + +### <i class="fa-solid fa-bomb"></i> Brute force / high + +<!-- .element style="width: 90%" --> + + +## attaques offline + +* Dépend de la puissance de calcul +* Non furtive +* Reproductible + + +## attaques offline + +* [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> + * [Password Cracking: Lesson 2](http://www.computersecuritystudent.com/SECURITY_TOOLS/PASSWORD_CRACKING/lesson2/) + + +## attaques offline + +* [John the Ripper](http://www.openwall.com/john/) + * monde UNIX/BSD + * fichier /etc/passwd + /etc/shadow + * mangling rules: leet speak, custom ... + +```shell +unshadow /etc/passwd /etc/shadow > mypasswd +``` + +* [Checking Password Complexity with John the Ripper](http://www.admin-magazine.com/Articles/John-the-Ripper) + + +## attaques par tables arc-en-ciel + +* [CrackStation](https://crackstation.net/) + * avec la signature de smithy dans la table user + +```shell +5f4dcc3b5aa765d61d8327deb882cf99 +``` + + +## <i class="fa fa-medkit"></i> Se protéger + +* instaurer des règles de durcissement au moment du choix du mot de passe + * pas contournable côté client ;) +* 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 +* sensibilisez vos utilisateurs diff --git a/content/slides/1337/md/detecting.md b/content/slides/1337/md/detecting.md index 25753c07a775a0f756f670aa7d6251990a45f738..02a712256ae1c2d3450fb46978857895e2038249 100644 --- a/content/slides/1337/md/detecting.md +++ b/content/slides/1337/md/detecting.md @@ -169,26 +169,6 @@ Note: * inclus les plugins vulnérables -## Gestion de sessions - -* [SID](http://php.net/manual/fr/session.idpassing.php) - * copier le SID ouvre une session - * /server-status [mod_status](https://httpd.apache.org/docs/2.4/mod/mod_status.html) -* cookie - * copier le cookie ouvre une session - * regarder s'il y d'autres paramètres -* SID prédictibles? - * patterns triviaux - * la recherche de non [entropie](https://fr.wikipedia.org/wiki/Entropie_de_Shannon) - * tomber sur une session en cours - -Note: -- paramètre dans cookie cf TP -- [Entropy analysis tools](http://sourceforge.net/p/entropyanalysis/code/ci/master/tree/) -- [Entropy analysis tools](https://github.com/ulikoehler/entropy-analysis-tools) - - toujours le même résultat : entropie nulle - - ## Spidering * Arborescence diff --git a/content/slides/1337/md/session.md b/content/slides/1337/md/session.md index 6f937a2ea6f7076343184ad31dbece177ff313a4..4498d881b3e172037ee3c6cd22d6090caf2bc60b 100644 --- a/content/slides/1337/md/session.md +++ b/content/slides/1337/md/session.md @@ -1 +1,42 @@ -# session \ No newline at end of file +# Weak Session IDs + +## aka lack of entropy + + +## Entropie + +* **Thermodynamique**:Grandeur thermodynamique exprimant le degré de désordre de la matière +* **Théorie de l'information**: Quantité moyenne d'information attribuable à un message constitué par un ensemble de signaux, représentant le degré d'incertitude où l'on est de l'apparition de chaque signal + + +### <i class="fa-solid fa-bomb"></i> Weak Session IDs / low + +<!-- .element style="width: 90%" --> + +simple incrémentation + + +### <i class="fa-solid fa-bomb"></i> Weak Session IDs / low + +<!-- .element style="width: 90%" --> + + +### <i class="fa-solid fa-bomb"></i> Weak Session IDs / low + +<!-- .element style="width: 90%" --> + + +### <i class="fa-solid fa-bomb"></i> Weak Session IDs / medium + +timestamp + + +### <i class="fa-solid fa-bomb"></i> Weak Session IDs / high + +* hash MD5 probable +* [CrackStation](https://crackstation.net/) + + +### <i class="fa-solid fa-bomb"></i> Weak Session IDs + +<!-- .element style="width: 90%" --> \ No newline at end of file diff --git a/content/slides/main.js b/content/slides/main.js index a05d2e3ed0289c3bc9a155b702f407f4b7414f2e..f551fe25a331552a2f34489cd7a404655e17cd0c 100644 --- a/content/slides/main.js +++ b/content/slides/main.js @@ -46,7 +46,7 @@ Reveal.addEventListener( "ready", (event) => { for (let code of document.getElementsByTagName("code")) { - code.innerHTML = code.innerHTML.replaceAll("http://vm-etu-vimazeno.local.isima.fr", "http://vm-" + user + ".local.isima.fr"); + code.innerHTML = code.innerHTML.replaceAll("vm-etu-vimazeno.local.isima.fr", "vm-etu-" + user + ".local.isima.fr"); }