Introduction
Nikto est un scanner de serveurs web open-source populaire qui effectue des tests complets sur les serveurs web pour plusieurs éléments, notamment plus de 6700 fichiers/programmes potentiellement dangereux, des vérifications de versions obsolètes pour plus de 1250 serveurs, et des problèmes spécifiques à la version sur plus de 270 serveurs.
Parfois, une application web nécessite la présence d'un en-tête HTTP spécifique dans les requêtes. Cela peut être pour l'authentification (comme une clé API ou un jeton de session), pour le routage vers une version spécifique d'une application, ou pour activer un mode de débogage. Les scans Nikto standards échoueraient ou seraient incomplets dans ces scénarios car ils manqueraient l'en-tête requis.
Dans ce laboratoire, vous apprendrez à utiliser l'option -addheaders de Nikto pour inclure des en-têtes personnalisés dans vos scans. Cela vous permet de tester des applications qui ont des exigences d'en-tête spécifiques, garantissant ainsi une évaluation de sécurité plus approfondie et plus précise.
Identifier un en-tête HTTP personnalisé requis par une application
Dans cette étape, vous allez interagir avec une application web simple pour comprendre pourquoi un en-tête personnalisé pourrait être nécessaire. Nous avons un serveur web fonctionnant sur le port 8000 qui requiert un en-tête spécifique, X-LabEx-Auth, pour l'accès.
Tout d'abord, essayons d'accéder à l'application web sans l'en-tête personnalisé en utilisant la commande curl.
curl http://127.0.0.1:8000
Vous recevrez un message "Access Denied" (Accès refusé), car l'en-tête requis est manquant.
Access Denied
Maintenant, envoyons à nouveau la requête, mais cette fois nous inclurons l'en-tête personnalisé requis en utilisant l'option -H dans curl. L'en-tête est X-LabEx-Auth avec la valeur SecretToken.
curl -H "X-LabEx-Auth: SecretToken" http://127.0.0.1:8000
Cette fois, le serveur accorde l'accès et renvoie un message de bienvenue. Cela confirme que l'application vérifie cet en-tête spécifique.
Welcome, authorized user! The server is Apache/2.4.1 (Unix).
Ce processus démontre comment identifier et confirmer la nécessité d'un en-tête personnalisé avant d'exécuter un scan de sécurité.
Utiliser l'option -addheaders pour spécifier l'en-tête et la valeur
Dans cette étape, vous découvrirez l'option Nikto utilisée pour ajouter des en-têtes personnalisés à ses scans.
Maintenant que nous savons qu'un en-tête personnalisé est requis, nous devons indiquer à Nikto de l'inclure dans toutes ses requêtes HTTP. Nikto fournit l'option -addheaders à cet effet.
La syntaxe est simple :
-addheaders "NomEnTete:ValeurEnTete"
Vous remplacez NomEnTete par le nom de l'en-tête (par exemple, X-LabEx-Auth) et ValeurEnTete par sa valeur correspondante (par exemple, SecretToken).
Si vous devez ajouter plusieurs en-têtes personnalisés, vous pouvez les séparer par un caractère de nouvelle ligne (\n). Par exemple :
-addheaders "EnTete1:Valeur1\nEnTete2:Valeur2"
Pour notre scénario actuel, la structure complète de la commande Nikto pour scanner l'application cible ressemblerait à ceci. Notez que nous n'exécutons pas la commande dans cette étape ; nous la construisons simplement pour comprendre la syntaxe.
nikto -h http://127.0.0.1:8000 -addheaders "X-LabEx-Auth: SecretToken"
Cette commande demande à Nikto de cibler l'hôte à l'adresse http://127.0.0.1:8000 et d'ajouter l'en-tête X-LabEx-Auth: SecretToken à chaque requête qu'il envoie pendant le scan.
Exécuter un scan avec l'en-tête personnalisé inclus
Dans cette étape, vous allez exécuter un scan Nikto en utilisant l'option -addheaders que vous venez d'apprendre.
Avec la commande correcte construite, il est temps de lancer le scan. Cela permettra à Nikto d'interagir avec l'application en tant qu'utilisateur autorisé, découvrant potentiellement des vulnérabilités qui ne sont pas visibles pour les utilisateurs non authentifiés.
Exécutez la commande suivante dans votre terminal :
nikto -h http://127.0.0.1:8000 -addheaders "X-LabEx-Auth: SecretToken"
Nikto va maintenant commencer le scan. Comme chaque requête inclut l'en-tête X-LabEx-Auth: SecretToken, l'application web les traitera avec succès. Observez la sortie de Nikto. Il identifiera le serveur et commencera à tester diverses vulnérabilités.
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: 127.0.0.1
+ Target Port: 8000
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: Werkzeug/2.0.1 Python/3.10.6
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
+ No CGI directories found (use '-C all' to force check all possible dirs)
+ "Allowed HTTP Methods: HEAD, OPTIONS, GET"
+ OSVDB-3233: /: Found a default page.
...
+ 15 requests: 0 error(s) and 5 item(s) reported on remote host
+ End Time: ...
---------------------------------------------------------------------------
+ 1 host(s) tested
Le point clé à retenir est que le scan s'exécute avec succès, alors qu'un scan sans l'en-tête serait bloqué par l'application.
Vérifier que l'en-tête est envoyé à l'aide d'un outil proxy
Dans cette étape, vous allez vérifier que Nikto envoie effectivement l'en-tête personnalisé avec ses requêtes. Bien que des outils professionnels comme Burp Suite ou OWASP ZAP soient généralement utilisés à cette fin, nous pouvons simuler un proxy avec un simple écouteur netcat (nc).
Tout d'abord, vous devez ouvrir un deuxième terminal. Vous pouvez le faire en cliquant sur l'icône "+" dans la barre d'onglets du panneau de terminal.
Dans le nouveau terminal, démarrez un écouteur netcat sur un port, par exemple, 8888. Cet écouteur affichera simplement toutes les données qu'il reçoit.
nc -l -p 8888
Maintenant, revenez à votre terminal d'origine. Exécutez à nouveau le scan Nikto, mais cette fois, pointez-le vers votre écouteur netcat au lieu du serveur web réel. Cela amènera Nikto à envoyer sa requête HTTP à netcat, nous permettant ainsi de l'inspecter.
nikto -h http://127.0.0.1:8888 -addheaders "X-LabEx-Auth: SecretToken"
Après avoir exécuté la commande, basculez rapidement vers le deuxième terminal où netcat est en cours d'exécution. Vous verrez la requête HTTP brute envoyée par Nikto. Recherchez l'en-tête X-LabEx-Auth: SecretToken dans la sortie.
GET / HTTP/1.1
Host: 127.0.0.1:8888
User-Agent: Mozilla/5.00 (Nikto/2.5.0) (Evasions:None) (Test:000001)
X-LabEx-Auth: SecretToken
Accept-Encoding: gzip,deflate
Connection: close
Comme vous pouvez le constater, l'en-tête personnalisé est inclus dans la requête. Cela confirme que l'option -addheaders fonctionne comme prévu.
Vous pouvez maintenant arrêter l'écouteur netcat en appuyant sur Ctrl+C dans le deuxième terminal, puis fermer cet onglet.
Tester les vulnérabilités nécessitant des en-têtes spécifiques
Dans cette étape, vous comprendrez l'implication pratique en matière de sécurité de l'utilisation d'en-têtes personnalisés en comparant les scans avec et sans l'en-tête.
De nombreuses vulnérabilités, telles que les références directes d'objets non sécurisées (IDOR) ou les failles d'escalade de privilèges, n'existent que dans les sections authentifiées d'une application. Un scan qui ne fournit pas l'en-tête d'authentification correct manquera complètement ces problèmes.
Pour illustrer cela, exécutez d'abord un scan Nikto contre le serveur web sans l'en-tête personnalisé. Cela simule un scan par un attaquant non authentifié.
nikto -h http://127.0.0.1:8000
Nikto s'exécutera, mais chaque requête qu'il enverra recevra une réponse "Access Denied" (Accès refusé). Le scanner ne peut pas analyser correctement l'application car il ne peut pas passer le contrôle d'autorisation initial. Les résultats d'un tel scan ont une valeur limitée.
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: 127.0.0.1
+ Target Port: 8000
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: Werkzeug/2.0.1 Python/3.10.6
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
+ "Allowed HTTP Methods: GET, HEAD, OPTIONS"
+ OSVDB-3233: /: The site returned a 403 Forbidden, this may indicate that it's a default file.
...
En comparant cela avec le scan réussi que vous avez effectué à l'étape 3 (qui utilisait l'en-tête), vous pouvez voir la différence. Le scan avec l'en-tête personnalisé a pu interagir avec la logique principale de l'application (comme indiqué par le message "Welcome" que nous avons vu avec curl) et effectuer des tests significatifs. Le scan sans l'en-tête a été arrêté à la porte d'entrée.
Cela souligne l'importance d'utiliser des en-têtes personnalisés pour garantir que vos scans de vulnérabilités soient aussi complets que possible.
Résumé
Dans ce laboratoire, vous avez appris une technique cruciale pour effectuer des évaluations efficaces de la sécurité des applications web avec Nikto.
Vous avez réussi à :
- Identifier l'exigence d'un en-tête HTTP personnalisé d'une application à l'aide de
curl. - Apprendre la syntaxe de l'option
-addheadersde Nikto. - Effectuer un scan Nikto incluant un en-tête personnalisé pour obtenir un accès autorisé.
- Vérifier que l'en-tête personnalisé était correctement envoyé à l'aide d'un écouteur
netcat. - Comprendre comment les scans avec des en-têtes personnalisés peuvent découvrir des vulnérabilités qui seraient autrement manquées.
Cette compétence est essentielle pour tout professionnel de la sécurité, car elle permet des tests plus approfondis des applications web modernes et complexes qui s'appuient sur des en-têtes pour l'authentification, la gestion d'état et d'autres fonctions.


