Nessus - un scanner de vulnérabilité

Nessus - scan

Historique de Nessus

Renaud Deraison a fait naître le "projet Nessus" en 1998 pour fournir à la communauté internet un scanner de vulnérabilité gratuit.En octobre 2005, l'entreprise de Renaud Deraison, Tenable Network Security, change la licence de Nessus 3 et devient propriétaire (100$ par mois).

Néanmoins, Tenable Network Security maintient le moteur d'analyse de la version 2 de Nessus (ainsi qu'une infime quantité de failles de sécurité) qui est utilisé par un fork open source de Nessus : OpenVAS.

Nessus 3 est disponible pour les plateformes Windows et Unix et permet de réaliser des audits de réseaux sans utiliser d'agent. Nessus 3 est 2 à 5 fois plus rapide que Nessus 2 (ou OpenVAS).

En avril 2009, Tenable Network Security sort la version 4 de Nessus.

Présentation de Nessus

Nessus est le scanner de vulnérabilité réseaux de Tenable Network Security. Par rapport aux autres scanners de vulnérabilité, Nessus a la particularité d'être basé sur une architecture client/serveur et d'être compatible avec Windows et Linux. En plus, Nessus stocke et gère toutes ses failles de sécurité grâce à un système de plugins.

Nessus est un logiciel qui effectue de réelles attaques et présente le résultat de ces attaques sous forme de rapport. Son utilisation peut donc être à double tranchant. D'un côté, une équipe sécurité peut l'utiliser pour scanner son réseau dans le but de prévenir les intrusions et les dénis de service. D'un autre côté, un hacker peut l'utiliser à des fins malhonnêtes et en profiter pour exploiter les vulnérabilités déclarées.

D'après l'étude comparative menée par le site Hamza, le moteur d'analyse de risques de Nessus se situe en tête de liste :

Indicateur MaxPatrol Internet Scanner Retina Nessus Shadow Security Scanner Net Clarity
Auditor
Identification des services et des applications, des dizaines 108 66 80 98 79 54
nombre trouvé de vulnérabilités 163 51 38 81 69 57
faux positifs 8 3 4 7 36 14
Vulnérabilité trouvée correctement
(sur 225 possibles)
155 48 34 74 33 43
Nombre de sauts
(faux négatifs)
70 177 191 151 192 182
en raison de l’absence d’une base de données 63 170 165 59 150 179
De ceux causés par la nécessité d’authentifier 0 6 16 36 0 0
Pour d’autres raisons 7 1 10 56 42 3

Pour la suite de la présentation, on considérera que le serveur et le client Nessus sont installés sur une machine Linux sans interface graphique. Le fait d'utiliser la ligne de commande pour utiliser Nessus permet sous Windows comme sous Linux, de planifier des scans par le planificateur de tâches ou cron (ou un quelconque ordonnanceur) et ainsi de conserver l'historique des rapports. Libre à la personne responsable de la sécurité d'utiliser ces rapports comme log ou encore de les expoités pour créer un logiciel dédié à la sécurité de son réseau.

Configuration

La gestion de la configuration du service Nessus s'est adaptée à cette architecture client/serveur.

L'utilisateur (côté client) possède un fichier de configuration par défaut ~/.nessusrc. Ce fichier de configuration va permettre de paramétrer les différentes options pour effectuer le scan.

Côté serveur, il existe également un fichier de configuration /etc/nessus/nessusd.conf. Ce fichier de configuration est plus complet que celui de la version client. Toutes les options de configuration spécifiées dans ce fichier vont écraser les options définies par l'utilisateur.

Serveur

Le serveur Nessus est un daemon. On peut l'installer à l'aide de la commande apt-get install nessusd. L'installation du serveur inclut des exécutables spécifiques à Nessus tels que :

.

C'est le serveur Nessus qui centralise tous les plugins et qui effectue les attaques contre les machines cibles. Au lancement, tous les plugins sont chargés en mémoire.

Le serveur possède un fichier de configuration "/etc/nessus/nessusd.conf" pour le paramétrer. Les valeurs inscrites dans ce ficher viendront écraser les éventuelles configurations clientes. Grâce à cette gestion de fichiers de configurations, l'administrateur de Nessus peut centraliser le paramétrage de Nessus. De la même façon, le serveur possède un fichier pour centraliser les règles de scan "/etc/nessus/nessusd.rules".

Client

Le client Nessus peut s'installer en exécutant la commande apt-get install nessus. Concrètement, le client Nessus sert à se connecter au serveur Nessus et à lui transmettre une liste de machines à scanner. Il possède également quelques exécutables pour la génération de rapports sous différents formats et pour leurs conversions dans d'autres formats.

Séquence des opérations

  1. D'abord, Nessus va détecter si la machine visée est vivante ou non. Grâce au plugin ping_host.nasl, il va effectuer des pings graduels. D'abord, il va tenter de joindre la cible par des requêtes ARP. Puis, il va essayer avec des requêtes TCP (avec des échanges SYN<=>ACK ou SYN<=>RST) sur des ports aléatoires allant de 1024 à 65535. Il va ensuite tenter en effectuant un ping (ICMP). Et enfin, il va effectuer un ping UDP applicatif (de type requête DNS, RPC, ...).
  2. Nessus va scanner les ports des machines vivantes avec un des quatre scanners de port interne, ou externe comme nmap. En sachant que Nessus est optimisé s'il utilise ses scanners de port maison. Il est donc déconseillé d'utiliser nmap pour des raisons de performances.
  3. Selon la configuration de l'utilisateur, Nessus effectue un scan local ou distant.
  4. Nessus envoie ses attaques de manière progressive. Il va utiliser sa base de connaissance pour appliquer les bonnes failles de sécurité aux bons services et aux bonnes versions. Grâce à ses plugins, le serveur Nessus va générer des attaques de plus en plus agressives contre les machines visées. Cela peut aller du simple test de version de logiciel jusqu’à des attaques de type DDoS comme par exemple « SYN flooding »

Scan distant

Avantages

Le scan distant est un scanner de port à la nmap. Il permet de déterminer les ports ouverts et le type de service réseaux de machines distantes. Nessus reconnaît la version des services en parsant les bannières de bienvenue ou les en-têtes dans les trames de réponses (par reconnaissance de l'empreinte numérique fingerprints). Il effectue donc une analyse TCP/IP complète et reconnaît les algorithmes de logiciels selon le type de trames de réponse.

Ainsi, à la différence de nmap, ce scan distant va détecter le type de service qu'il soit sur des ports standards ou non (nmap associe un numéro de port à un service grâce au fichier /etc/services).

Pour gagner du temps, Nessus peut avoir plusieurs instances du client et/ou du serveur et il peut également lancer plusieurs attaques simultanément sur une même machine. Cette option est configurable sur le serveur dans le fichier /etc/nessus/nessusd.conf ou sur le client dans le fichier ~/.nessusrc à la section SERVER_PREFS :

# Number of plugins that will run against each host,
# i.e. simultaneous tests
# Total number of processes will be max_checks x max_hosts
max_checks = 15

De la même manière, il peut lancer ses attaques sur plusieurs hôtes cibles (255 par défaut) simultanément :

# Maximum number of hosts
max_hosts = 255

La problématique est de trouver le bon compromis entre le nombre d'hôtes que l'on souhaite scanner et la bande passante du serveur Nessus.

Le serveur Nessus lance donc "max_hosts * max_checks" en parallèle! En attribuant des valeurs trop élevées, le serveur pourrait effectuer des attaques DoS sur les hôtes cibles, sur les réseaux cibles ou encore sur lui-même au niveau système ou réseau.

Inconvénients

Le scan distant a pour inconvénient de générer des faux positifs. C'est-à-dire que Nessus peut détecter une faille de sécurité par exemple, sur un service obsolète, alors qu'un patch de sécurité est appliqué sur la machine locale pour corriger les bugs de cette version. C'est le scan local qui vient corriger ce problème de faux positif.

Il y a un deuxième inconvénient sur ce genre de scan : la surcharge du réseau. Par exemple, dans le cas où l'on scanne un réseau entier et que le serveur Nessus ne se trouve pas dans ce réseau, les requêtes envoyées par Nessus peuvent saturer la table de translation de firewall intermédiaire.

En plus, toutes les adresses IP du réseau ne sont pas forcément utilisées. Nessus peut donc envoyer des requêtes à travers le réseau qui n'aboutiront jamais. La détection des machines vivantes est donc nécessaire mais ne rend pas le scan optimal dans ce cas là.

Scan local

Avantages

Pour corriger le problème de faux positif dû au scan distant, Nessus peut effectuer un scan local. Pour réaliser un scan local, Nessus se connecte en local sur la machine et envoie ses attaques. De préférence, Nessus doit utiliser un compte utilisateur local avec les droits les plus importants de la machine pour qu'un maximum de tests puissent être valides (comme l'accès à la base de registre sous Windows ou encore l'accès au ficher /etc/shadow sous Linux).

Ce type de scan permet de tester tout ce qui n'est pas testable par le scan distant sans avoir à se soucier des faux positif. Parmi ces tests, on retrouve :

Un utilisateur Nessus qui souhaite uniquement déterminer si ses machines sont à jour, exécutera un scan local. Ce scan local est extrêmement rapide, (environ 6 secondes pour déterminer les mises à jour en local contre une minute environ avec le scan distant).

Inconvénients

Pour le moment, Nessus ne permet pas de vérifier les stratégies de sécurité locales des systèmes distants. Tenable Network Security prévoit néanmoins d'implémenter cette fonctionnalité dans un script NASL

Pour effectuer ses tests, Nessus lance de réelles attaques contre les machines cibles. En d'autres termes, avec ses scans locaux, Nessus peut facilement effectuer un déni de service. Il est donc prudent de prévenir cette attaque soit, en effectuant le scan sur une plage horaire où la machine cible ne craint pas de perte de données soit, en spécifiant dans les fichiers de configuration que l'on souhaite effectuer, un scan safecheck.

De plus, certains IDS (comme snort) peuvent détecter les scans de Nessus comme étant une attaque de hacker. Il faut donc également penser à configurer correctement son IDS.

Gestion des rapports

A la fin du scan, Nessus génère un rapport. Ce rapport permet d'établir la liste des machines scannées, leurs services et leurs vulnérabilités. Nessus associe également une criticité, une description et une solution à ces vulnérabilités. C’est grâce à cette description que l’on peut connaître le risque d’une faille de sécurité, les éventuels effets sur le système si quelqu’un venait à l’exploiter et les patches de sécurité à appliquer pour supprimer le risque.

Par exemple, la description du plugin php_split_mime.nasl permet au responsable sécurité, de déterminer la procédure pour corriger la vulnérabilité :

desc["english"] = "
Synopsis :

Arbitrary code may be run on the remote server.

Description :

The remote host is running a version of PHP earlier than 4.1.2.

There are several flaws in how PHP handles multipart/form-data POST 
requests, any one of which can allow an attacker to gain remote access
to the system.

Solution : 

Upgrade to PHP 4.1.2

Risk factor :

High / CVSS Base Score : 7.5
(CVSS2#AV:N/AC:L/Au:N/C:P/I:P/A:P)";

Nessus peut générer des rapports sous différents formats :

Par défaut, Nessus génère un rapport au format NBE(Nessus Back End report). Les fichiers NBE sont des fichiers dont les informations sont séparées par des '|'.

Voici un exemple de fichier NBE :

timestamps|||scan_start|Wed Oct 21 18:05:26 2009|
timestamps||192.168.0.2|host_start|Wed Oct 21 18:05:31 2009|
results|192.168.0|192.168.0.2|general/tcp|10180|Security Note|The remote host is up\n
results|192.168.0|192.168.0.2|general/icmp|10114|Security Warning|\nThe remote host answers to an ICMP timestamp request. This allows an attacker \nto know the date which is set on your machine. \n\nThis may help him to defeat all your time based authentication protocols.\n\nSolution : filter out the ICMP timestamp requests (13), and the outgoing ICMP \ntimestamp replies (14).\n\nRisk factor : Low\nCVE : CAN-1999-0524\n
results|192.168.0|192.168.0.2|general/udp|10287|Security Note|For your information, here is the traceroute to 192.168.0.2 : \n192.168.0.11\n192.168.0.2\n\n
results|192.168.0|192.168.0.2|general/tcp|19506|Security Note|Information about this scan : \n\nNessus version : 2.2.10\nPlugin feed version : 200704181215\nType of plugin feed : GPL only\nScanner IP : 192.168.0.11\nPort scanner(s) : synscan nessus_tcp_scanner \nPort range : 1-15000\nThorough tests : no\nExperimental tests : no\nParanoia level : 1\nReport Verbosity : 1\nSafe checks : yes\nMax hosts : 20\nMax checks : 4\nScan duration : unknown (ping_host.nasl not launched?)\n\n
results|192.168.0|192.168.0.2|general/tcp|9999|Security Hole|\nYou are running a version of Nessus which is not configured to receive\na full plugin feed. As a result, the security audit of the remote host produced\nincomplete results.\n\nTo obtain a complete plugin feed, you need to register your Nessus scanner\nat http://www.nessus.org/register/ then run nessus-update-plugins to get\nthe full list of Nessus plugins.\n\n
timestamps||192.168.0.2|host_end|Wed Oct 21 18:07:53 2009|
timestamps|||scan_end|Wed Oct 21 18:07:53 2009|

La première information représente un flag :

La sécurité dans Nessus

Sécurité du serveur

Puisque l'utilisation de Nessus peut être à double tranchant; il paraît évident de placer la machine physique dans un endroit sécurisé (salle serveurs sécurisée).

Au niveau logique, la sécurité du serveur Nessus est plus complexe. Pour une sécurité maximale, il faudrait placer le serveur dans un réseau local inaccessible de l'extérieur. D'une manière globale, le serveur Nessus doit définir une politique de sécurité pour contrôler son accès.

Restriction des droits du serveur

On peut spécifier, au serveur Nessus, une liste d'adresse IP pour que les clients Nessus ne scannent pas les adresses ou les plugins contenus dans cette liste. Ce filtre est accessible dans le fichier /etc/nessus/nessusd.rules :

#
# Nessus rules
#

# Syntax : accept|reject address/netmask

reject 192.168.0.1
reject 192.168.0.2

# On peut aussi autoriser / refuser certains ports : 
# Refus de la connexion au port 80 pour la machine 10.0.0.1
reject 10.0.0.1:80
# Refus de la connexion aux ports entre 8000 et 10000 pour toutes les machines dans le réseau 192.168.0.254/24 : 
reject 192.168.0.0/24:8000-10000

# On peut également autoriser / refuser l'utilisation de certains plugins(ID) : 
plugin-reject 10335
plugin-accept 10000-40000
	 
# Accept to test anything :
default accept
				

Pour éviter que les scans locaux ne viennent effectuer des attaques DoS sur les machines cibles, Tenable Network Security a mis en place une configuration Safe checks(valeur booléenne) disponible à /etc/nessusd/nessusd.conf sur le serveur. Cette option va forcer le serveur Nessus à reconnaître les services uniquement sur les bannières de bienvenue signalées par les hôtes cibles au lieu d'essayer de reconnaître l'empreinte du service. De plus, cette option va désactiver tous les plugins qui peuvent effectuer des buffers overflow sur les hôtes cibles.

Configuration du serveur pour effectuer des scans locaux

Pour que le serveur puisse effectuer des tests locaux sur les machines cibles, il faut qu'il puisse s'y connecter localement. Dans Nessus, plusieurs types de connexion sont proposées (configurable dans la section PLUGINS_PREFS du fichier ~/.nessusrc sur le client) :

SNMP settings[entry]:SNMPv3 user name : = 
SNMP settings[password]:SNMPv3 authentication password : = 
SNMP settings[password]:SNMPv3 privacy password : = 
# Pour telnet, rsh, rexec : 
Cleartext protocols settings[entry]:User name : = 
Cleartext protocols settings[password]:Password (unsafe!) : = 
SSH settings[entry]:SSH user name : = root
SSH settings[radio]:Elevate privileges with : = Nothing;sudo;su
SSH settings[entry]:Preferred SSH port : = 22
SSH settings[password]:SSH password (unsafe!) : = 
SSH settings[file]:SSH public key to use : = 
SSH settings[file]:SSH private key to use : = 
SSH settings[password]:Passphrase for SSH key : = 
SSH settings[password]:su/sudo password : = 
SSH settings[file]:SSH known_hosts file : = 
SSH settings[entry]:Client version : = OpenSSH_5.0
Kerberos configuration[entry]:Kerberos Key Distribution Center (KDC) : = 
Kerberos configuration[entry]:Kerberos Realm (SSH only) : = 
Services[file]:SSL certificate : = 
Services[file]:SSL private key : = 
Services[password]:PEM password : = 
Services[file]:CA file : = 
Database settings[entry]:Login : = 
Database settings[password]:Password : = 
Database settings[entry]:Database SID : = 
Database settings[entry]:Database port to use : = 
Login configurations[entry]:HTTP account : = 
Login configurations[password]:HTTP password (sent in clear) : = 
Login configurations[entry]:NNTP account : = 
Login configurations[password]:NNTP password (sent in clear) : = 
Login configurations[entry]:POP2 account : = 
Login configurations[password]:POP2 password (sent in clear) : = 
Login configurations[entry]:POP3 account : = 
Login configurations[password]:POP3 password (sent in clear) : = 
Login configurations[entry]:IMAP account : = 
Login configurations[password]:IMAP password (sent in clear) : = 
Login configurations[entry]:SMB account : = admin
Login configurations[password]:SMB password : = password
Login configurations[entry]:SMB domain (optional) : = 
Login configurations[entry]:SNMP community (sent in clear) : = 
SLAD Init[file]:slad SSH public key: = 
SLAD Init[file]:slad SSH private key: = 
SLAD Init[password]:slad SSH key passphrase: = 
Global variable settings[checkbox]:Do not log in with user accounts not specified in the policy = no
Global variable settings[file]:SSL certificate to use : = 
Global variable settings[file]:SSL CA to trust : = 
Global variable settings[file]:SSL key to use : = 
Global variable settings[password]:SSL password for SSL key : = 

Certaines connexions comme l'accès aux bases de données ou encore aux serveurs web sont configurées pour tenter des attaques par injections de code. D'autres connexions sont établies (avec une authentification en claire : login + mot de passe) dans le but de rechercher les fautes de configuration (comme samba, snmp, nntp, pop2, pop3, imap). Enfin, pour se connecter aux systèmes d'exploitation, plusieurs méthodes d'authentification sont proposées par Nessus :

Pour sécuriser la connexion entre client/serveur, le serveur doit générer un certificat à l'aide de nessus-mkcert. Grâce à SSL la communication entre client/serveur est sécurisée (permet d'éviter une attaque de type Man In the Middle).

# End of /etc/nessus/nessusd.conf file.
#
# Added by nessus-mkcert
#
# If you decide to protect your private key with a password, 
# uncomment and change next line
 pem_password=password
# If you want to force the use of a client certificate, uncomment next line
 force_pubkey_auth = yes
#
# Added by nessus-mkcert
#
cert_file=/var/lib/nessus/CA/servercert.pem
key_file=/var/lib/nessus/private/CA/serverkey.pem
ca_file=/var/lib/nessus/CA/cacert.pem

Haut de page