Aller au contenu

Stage Pentests avec OWASP ZAP (DAST)

Nous avons vu précédemment des outils pour analyser ton code, tes dépendances et image docker, mais de façon statique appelé SAST.

Ici je te propose plonger dans le monde du DAST, AKA l'analyse cette fois-ci dîtes dynamique.

Avoir un système qui tourne chaque nuit, analyse ton application avec des tests d'intrusions qui analyses ton API et tes endpoints d'accès à tes autres micro-services, database, etc, et qui en modifie dynamiquement les paramètres, attribut et contenu, te permet d'avoir encore plus de retour sur la sécurité de ton système.

Cela va aller du simple bruteforce par des patterns communs, en allant avec tout type d'injections, etc.

Combiner un tel système avec des daily report et un système de monitoring & d'alerting avec Grafana, Datadog ou PagerDuty te permet d'avoir une vision intégrale à un instant T de l'ensemble des CVE que tu pourrais rencontrer.

OWASP - Zap Proxy

C'est un outils écrit en java open source très connu et très activement maintenu, qui te permet plusieurs choses :

  • Découverte de ton API/endpoint, de ton application web avec des systèmes de spyder et crawler. Ce sont des sortes de bot qui vont se promener tout seul sur ton site pour en découvrir toute les pages
  • Test d'intrusions statique
  • Test d'intrusions dynamique

En fin d'analyse, il te dévoile un rapport avec l'ensemble des vulnérabilités qu'il aura rencontre sur ton application. Il les classes selon la criticité de la faille détecté, et te donnes des conseils pour comment les fixer.

Extension par marketplace

Etant open source, il existe une multitude d'extensions intéréssante. Tu peux retrouver des rules supplémentaires d'attaques pour améliorer l'éfficacité du tool, avoir des outputs de resultats de tes tests sous divers formats, et bien d'autres.

Tips - Script

Zap Proxy te permet de coder sous divers language (Javascript avec Nashorn engine, Zest, Groovy, Kotlin, Python avec Jython engine, Ruby), des scripts variés te permettant de réaliser toute sorte de tâche pour des uses cases spécifique que tu aurais besoin et d'améliorer dynamiquement ses utilités :

  • Authentification : réaliser des authentication complexe
  • Http Sender : script appelé à chaque requête/réponse
  • Session mangement : gère comment les sessions sont maintenu dans ton app
  • Stand alone : appelé manuellement par ta main
  • Targeted : comme le Stand Alone, mais avec une target bien spécifique
  • Et bien d'autres 🔥

Tips - Authentification

Authentification simple

Afin que Zap proxy analyse et test ton site dans sa globalité, il est nécessaire si tu as une partie avec de l'authentification, par exemple un site web de vente en ligne, de lui fournir les instructions pour être loggé comme un vrai utilisateur.

Pour cela tu peux très bien lui indiqué une simple page de connexion, avec un username/password traditionnel à remplir avec un sytème de bouton basique. Tu devras lui fournir aussi un système lui permettant de se rendre compte si il a bien réussi son authentification (ex, accès à une page spécifique à un compte utilisateur).

Authentification complexe

Il fonctionne notemment avec les sites web moderne à base d'OIDC (OpenID Connect), OAuth ou encore Kong, qui se base sur une authentification avec un serveur spécifique, des redirections spécifiques, peut être même avec des sytemes de token, bearer token, JWT, etc. Pour réaliser ce genre d'authentification complexe, tu devras utiliser un script spécifique selon ton type d'authent recherché, vu dans la section plus haut.

Tip

J'ai déjà réalisé ce type d'authentification, explications et code disponible ici : Blog DeeplyLearning

Exemple

Fonctionnement basique

Si tu souhaites juste faire une première utilisation pour voir comment il fonctionne, tu peux te baser sur les scripts build-in :

  • zap-api-scan.py
  • zap-baseline-scan.py
  • zap-full-scan.py

Script built-in avec app en ligne

Je te montre ici comment industrialiser le process en CI/CD, si tu souhaites tester une application web qui tourne déjà sur ton serveur :

owasp_zap_scan:
  stage: security_scan
  image: zaproxy/zap-stable
  before_script:
    - mkdir -p /zap/wrk
  script:
    - /zap/zap-full-scan.py -t "http://example.com" -r htmlreport.html
  artifacts:
    when: always
    paths:
      - /zap/wrk/htmlreport.html

Script built-in avec app en local

Si tu souhaites à l'inverse tester une application en localhost avant de la pousser en ligne afin de t'assurer que l'application soit dépourvue de CVE, tu peux la lancer depuis ta pipeline avec les Gitlab Services.

owasp_zap_scan:
  stage: security_scan
  image: zaproxy/zap-stable
  before_script:
    - mkdir -p /zap/wrk
  services:
    - name: $mon_registry:$mon_tag
      alias: mon-app
  script:
    - /zap/zap-full-scan.py -t "http://mon-app:mon-port" -r htmlreport.html
  artifacts:
    when: always
    paths:
      - /zap/wrk/htmlreport.html

Dans le cas ou tu utilises un registry privé, tu dois gérer ton docker loginpour pouvoir pull ton image sans soucis.

Je te donne ici un exemple de configuration si tu gères tes propres Gitlab runners en self-hosted, te permette de gérer cet authentification.

Ici je te montre pour accéder au registry de Docker.io :

[[runners]]
  executor = "docker"
  environment = ["DOCKER_AUTH_CONFIG={\"auths\":{\"https://index.docker.io/v1/\":{\"auth\":\"base_64\"}}}"]
  [runners.docker]
      environment = ["DOCKER_AUTH_CONFIG={\"auths\":{\"https://index.docker.io/v1/\":{\"auth\":\"base_64"}}}"]

A toi de remplacer la partie base_64 par l'output de la commande suivante :

echo -n "username:password" | base64

Note

Dans le cas ou tu n'ais pas accès à la configuration de tes runners, tu peux utiliser les Gitlab Variables et y définir DOCKER_AUTH_CONFIG de la même façon dans un before_script par exemple.

Fonctionnement avec authentification complexe

Pour réaliser ton pentest, tu vas devoir comprendre comment le mettre en place.

Tu dois d'abord lancer le Daemon de ZAP. C'est un simple serveur qui va tourner et attendre des instructions. Pour cela, à partir de l'image officiel de zap, tu peux t'en sortir facilement avec ./zap-x.sh, disponible à la racine de l'image officiel.

La version ./zap.sh est la même mais avec l'UI. Donc en CI/CD, on l'évitera.

Une fois le daemon lancé, tu peux interagir avec ce serveur avec des scripts en Python en utilisant le SDK de ZAP via son package PyPi. Libre à toi de faire ton propre utilisation custom (Chose que j'avais réalisé chez Thales histoire d'avoir quelque chose qui fit 100% nos besoin en terme d'analyse). Par example :

  1. Attendre de façon scripté le lancement du daemon ZAP (et donc d'avoir un sleep en dur)
  2. Lancer le spyder simple
  3. Lancer le spyder ajax
  4. Lancer le scan passif
  5. Lancer le scan actif
  6. Générer le repport de résultat en HTML
  7. Shutdown le serveur