30 Juil

Déployer un scanner sur OpenStack (API OVH)

Déployer et lancer automatiquement le scanner MassVulScan depuis des instances OpenStack du Cloud Public d’OVH.

Introduction

Les entreprises, notamment, devraient s’assurer de ne pas exposer sur l’Internet des ports réseaux de manière indésirable.

Dans ce but, j’ai voulu aller plus loin avec le scanner MassVulScan en permettant d’effectuer un scan depuis n’importe où sur l’Internet sans devoir louer plusieurs serveurs chaque mois et tout réinstaller à chaque fois.

En effet, lorsque l’on utilise continuellement la ou les mêmes adresses IP source pour scanner son réseau on risque de masquer certaines failles de sécurité : certaines autorisations (théoriquement) accordées qu’à celles-ci, utilisation de mécanismes de sécurité comme fail2ban qui les bloqueraient..

Du coup, malgré des scans réguliers, certains ports peuvent rester ouverts longtemps à tout va sans que l’on s’en aperçoive.. je parle par expérience !

J’ai donc cherché et réfléchi à une solution qui répondrait à ce cahier des charges :

  • Facilité, simplicité et rapidité du déploiement
  • Lancement automatique d’un scan complet
  • Faible coût de fonctionnement et ne payer qu’à l’usage
  • Fournisseur Cloud disposant de plusieurs Data Center répartis sur la planète
  • Fournisseur Cloud tolérant cette pratique

Solution

Voici le script Bash que j’ai développé qui répond à mes besoins : osic4MVS

osic4MVS a.k.a. OpenStack Instance Creation For MassVulScan

J’ai retenu le fournisseur de Cloud OVH que j’utilise de longue date, meilleur rapport qualité/prix selon moi. La facturation du Cloud Public est claire (à la demande et sans coûts cachés), la tarification est attractive (0.03$ CAD pour mes scans sur BHS3), et leur interface Web est simple et efficace.

Le script Bash va donc s’appuyer sur l’API d’OVH pour déployer en quelques minutes un instance OpenStack sur laquelle sera installée MassVulScan.

Prérequis

Script

Le script Bash ne fonctionne que sur les OS de la famille Debian.

Le serveur à partir duquel sera lancé ce script devra avoir accès à l’Internet, plus précisément :

  • ICMP Echo Reply (ping)
  • SSH port TCP 22

Voici la liste des paquets à installer, suivant si vous utilisez Python 2.x ou Python 3.x :

apt update
apt install python-openstackclient s-nail screen dnsutils ipcalc netcat

Ou :

apt update
apt install python3-openstackclient s-nail screen dnsutils ipcalc netcat

Fournisseur OVH

Vous devez bien-sûr posséder un compte OVH et créer votre projet Cloud Public : OVHCloud

Ici mon projet s’appelle tout simplement « SCANS » :

Mon projet « SCANS »

Ensuite il faut créer un utilisateur OpenStack, rendez-vous dans : Public Cloud / Project Management / Users & Roles

Comptes utilisateurs et rôles

Ajoutez un nouvel utilisateur (avec une description) en lui affectant le rôle « Compute Operator » :

Ce rôle est suffisant pour le fonctionnement du script

On ne peut pas choisir le nom d’utilisateur qui est généré aléatoirement sous la forme « user-XXXXXXXXXXXX », tout comme le mot de passe. Voici notre nouvel utilisateur créé pour notre démonstration :

Nouvel utilisateur en cours de création – Notez bien le mot de passe

N’oubliez pas de noter le mot de passe ! En cas d’oubli, cliquez sur les trois petits points à droite du compte utilisateur pour accéder aux options et en regénérer un nouveau :

Les options du compte utilisateur

Profitez-en pour télécharger de suite le fichier OpenStack RC qui correspond en fait à vos variables d’environnement, il nous sera utile pour la suite. Lors du téléchargement on vous demandera sur quelle région ( = quel Data Center et pays) ce fichier s’appliquera, j’ai choisi ici l’Amérique du nord et leur centre Canadien BHS3 :

Sélectionner une région ou plutôt un centre de données attaché au fichier OpenStack

Rendez-vous sur l’interface Web Horizon pour gérer votre instance OpenStack : Public Cloud / Management Interfaces / Horizon

Choisissez bien votre région, ici BHS3 :

Choisir la région, ici BHS3, Canada

Ensuite, nous allons générer une paire de clés SSH : Project / Compute / Key Pairs

Créez votre paire de clés comme ici, elle se nommera « demo » :

Création d’une paire de clés SSH (privée/publique)

Une fois la création terminée, votre clé SSH privée sera automatiquement téléchargée, comme ici :

Ma clé privée pour la démonstration

C’est terminé, nous avons donc nos quatre éléments importants pour le script Bash :

  1. Un compte utilisateur OpenStack chez OVH Cloud Public
  2. Un fichier OpenStack RC contenant nos variables d’environnement
  3. Une paire de clé SSH
  4. Le nom de notre clé SSH publique

Installation et utilisation

Installation

L’installation du script Bash est très simple :

git clone https://github.com/choupit0/osic4MVS.git
cd osic4MVS
chmod +x osic4MVS.sh && chmod +x deploy.sh

Ensuite, afin d’automatiser l’utilisation nous allons indiquer le mot de passe directement dans le fichier OpenStack RC. Commentez les lignes 25 à 27 puis ajoutez-en une nouvelle contenant le mot de passe de l’utilisateur OpenStack, comme ceci :

On ajoute le mot de passe de l’utilisateur

Sans cela, il vous sera demandé de saisir le mot de passe plusieurs fois durant le déroulement du script Bash.

Après, déposez votre clé privé et votre fichier OpenStack RC dans un endroit sécurisé et protégez-les comme ici :

chmod 600 openrc.sh
chmod 600 demo.pem

Lecture/écriture pour le propriétaire uniquement, cela peut-être le compte « root », utilisez ensuite « sudo » pour appeler le script Bash par exemple.

Utilisation

On y arrive !!!

Un beau menu vous attend 🙂

Vous aurez besoin de préciser quatre arguments pour pouvoir lancer le script Bash :

  1. Le chemin vers le ou les fichiers contenant les noms d’hôtes et/ou adresses IPv4, format CIDR
    • Un fichier obligatoire : celui contenant les hosts à scanner
    • Un fichier optionnel : celui contenant les hosts à exclure
      • Pour exclure les passerelles de vos opérateurs par exemple
  2. Le chemin vers votre fichier OpenStack RC
  3. Le chemin vers votre clé SSH privée
  4. Le nom de votre clé publique SSH

Le script doit être lancé avec les droits « root » (avec « sudo » ou non), comme ceci :

./osic4MVS.sh -f scanme-nmap -r conf/openrc.sh -k keys/demo.pem -p demo

Et voilà le résultat, ici l’exécution complète du script, en 4 minutes et 20 secondes :

Script Bash exécuté en moins de 5 minutes !!!

Rapports

Voici les rapports générés suite au scan du site « scanme.nmap.org » utilisé dans la démonstration :

Suivre le déroulement

Après avoir vérifié les arguments passés, le script Bash effectuera les étapes suivantes :

  1. Vérifier l’accessibilité du Cloud Public d’OVH
  2. Vérifier les instances OpenStack existantes
  3. Analyse du ou des fichiers sources (pour ne garder que les entrées valides)
  4. Création de l’instance
  5. Attente de la disponibilité du serveur (ping + SSH)
  6. Déploiement du scanner MassVulScan
  7. Envoi du ou des fichiers hosts
  8. Lancement du scan MassVulScan : Masscan puis Nmap + vulners.nse
  9. Récupération des rapports en local via SCP (si il y a lieu)
  10. Suppression des sessions screen et OpenStack

Screen

Il vous sera possible de suivre l’installation et le scan en live si vous le souhaitez à travers une session screen. Comme ici avec le précédent scan de démonstration :

Session screen pour le suivi ou surveillance

En l’occurrence, vous aurez juste à taper dans un second terminal (droits « root ») :

screen -r scan_2021-07-30_121820

Et pour sortir sans fermer la session, faites au clavier :

CTRL + A et D

Courriels

Pour s’assurer du bon fonctionnement du script et/ou si vous prévoyez de lancer un gros scan de plusieurs heures, vous avez la possibilité de renseigner une ou plusieurs adresses courriels et un serveur SMTP(S).

Vous serez avertis à trois moments différents :

  1. Au démarrage effectif du scan
  2. A la fin du scan vous recevrez les rapports (si il y a lieu)
  3. Une fois la session screen et instance OpenStack supprimées

Il vous suffit pour cela de modifier les variables suivantes dans le script :

  • smtp_server = serveur SMTP(S) à utiliser
  • from_address = adresse email d’émission/retour
  • recipient = liste des destinataires (séparer par une virgule », »)
  • auth_user_pass = utilisateur et mot de passe encodés dans un URI (si besoin)

Un exemple ci-dessous pour l’encodage dans un URI :

root@HTB:~/osic4MVS# printf 'urlcodec encode demo@ovh.com' | s-nail -#
demo%40ovh.com
root@HTB:~/osic4MVS# printf 'urlcodec encode *ThisIsMyGreatPassW0rd!' | s-nail -#
%2AThisIsMyGreatPassW0rd%21

Il suffit d’assembler les deux informations en ajoutant deux point « : » entre les deux, comme ici :

auth_user_pass="demo%40ovh.com:%2AThisIsMyGreatPassW0rd%21"

Des exemples ci-dessous de courriels envoyés depuis les serveurs d’OVH :

Exemples de courriels envoyés durant la vie du script

Conclusion

J’utilise régulièrement cet outil (professionnellement) pour m’assurer de ne pas laisser de ports ouverts par inadvertance, surtout lorsque l’on travaille à plusieurs. Il suffit d’une erreur humaine ou d’appliquer une mise à jour pour se retrouver exposer sans le vouloir.

Vous pouvez programmer un lancement hebdomadaire via une tache cron, comme ici toutes les fins de semaine :

0 0 * * 0 bash /home/superuser/audit/ovh/osic4MVS.sh

Et avec les courriels on peut s’assurer du bon fonctionnement et on récupère les rapports facilement.

N’hésitez pas à laisser vos commentaires ! Merci d’avoir lu jusqu’au bout 😉