Skip to content

Over the Wire – Natas 0-1 – Attention aux commentaires

Dans cet article nous débutons la résolution des challenges Natas de la plateforme Over The Wire. On commence doucement avec les niveaux 0 et 1

Je commence un nouvelle série d’articles sur la suite de challenges Natas du site Over The Wire. J’ai déjà traité du challenge Bandit qui s’oriente sur les commandes Linux. La suite de challenges Natas s’oriente elle vers l’exploitation de vulnérabilités web. Comme pour Bandit, les challenges vont du très basique aux cas plus complexes, il existe en date d’écriture de cet article 36 niveaux, et j’essaierai de tous les traiter (je ne promet rien :)).

Histoire de donner un peu plus de consistance à ces articles , je compte, pour chaque challenge, rédiger un script Python qui permettra d’automatiser la détection ou l’exploitation des vulnérabilités présentées. Cela me permettra de dépoussiérer mes connaissances en Python :p. Mon idée de départ était d’avoir un programme capable de résoudre automatiquement (avec plus ou moins d’intelligence) l’ensemble des challenges. Ne connaissant pas encore la composition de l’ensemble des challenges, j’ignore si cela est réalisable.

Également, nous étudierons les recommandations associées à chaque vulnérabilité exploitée (lorsque cela sera pertinent). L’objectif étant de voir comment exploiter une vulnérabilité pour mieux s’en protéger, cela en étudiant aussi bien l’attaque que la défense.

Nous traiterons dans cet article des niveaux 0 et 1 de Natas qui sont assez similaires,

Natas 0 – Exploitation

URL du challenge : http://overthewire.org/wargames/natas/

En arrivant sur la page d’accueil, on ne remarque rien d’anormal.Il faut s’intéresser ici à ce qui n’est pas directement visible pour l’utilisateur lamdba. On peut par exemple regarder le contenu technique de la requête et de la réponse du serveur en positionnant un proxy (sous notre contrôle) entre notre navigateur et le serveur. J’utiliserai ici BurpSuite (https://portswigger.net/burp/communitydownload)

Après avoir démarré le proxy BurpSuite et avoir paramétré mon navigateur pour passer par ce proxy, je constate que le contenu de la réponse du serveur contient un commentaire. Ce commentaire indique tout simplement le mot de passe du niveau suivant :

On constate très clairement qu’il y a un commentaire intéressant ici. L’information aurait également pu être obtenue plus simplement en utilisant le navigateur web. On peut en effet accéder au code source d’une page web en faisant un clic droit sur la page, puis en sélectionnant « Code source de la page » :

On retrouve ainsi le code source de la page HTML, l’ensemble des balises HTML, parfois du code Javascript, et les commentaires.

Natas 1 – Exploitation

URL du challenge : http://overthewire.org/wargames/natas/natas1.html

Le challenge suivant est exactement le même, mais le clic droit a été bloqué sur la page.

Cela empêche en principe les utilisateurs d’accéder à son code source. Cependant, d’autres méthodes existent pour accéder au code source de la page (CTRL+U notamment, qui est un simple raccourci clavier).

L’utilisation d’un proxy comme précédemment permettra également l’affichage du code source de la page, ainsi que la récupération du mot de passe.

Exploitation via un script Python

Un petit script Python peut ici être créé afin de repérer, par exemple, la présence de certains mots dans le code source. Il suffit de récupérer le code source de la page (ce qui correspond au simple fait de faire une requête au serveur web). En soit, c’est ce que notre navigateur fait constamment, contrairement à un bout de code Python, notre navigateur a la capacité de transformer ce code source en quelque chose de graphiquement plus agréable.

En Python3, j’utilise la bibliothèque requests pour télécharger le contenu d’une page web.

import requests

# Définition de l'URL ciblée par la requête 
url = "http://natas0.natas.labs.overthewire.org/"

# Envoi de la requête et stockage de la réponse serveur dans l'objet "res"
res = requests.get(url)

Chaque challenge Natas est protégé par une authentification HTTPBasic, il faut donc renseigner les identifiants lors de l’envoi de la requête, j’utilise pour cela les variables  user et password, ainsi que la variable url pour stocker l’URL du challenge. Ce bout de code sera ainsi réutilisable sur tous les niveaux :

import requests
from requests.auth import HTTPBasicAuth

print("Natas 0")

# Création des variables du script
user = "natas0"
password = "natas0"
url = "http://natas0.natas.labs.overthewire.org/"

# Envoi de la requête avec l'authentificaiton HTTPBasicAuth
res = requests.get(url, auth=HTTPBasicAuth(user, password))

# Affichage de la réponse
print(res.text)

Ici, le contenu du code source de la page est stocké dans l’objet res.text, qu’il me suffit de parcourir pour rechercher un mot précis par exemple.

# On vérifie si le mot "password" est présent dans une des lignes de la réponse
resTab = res.text.split('\n')
for line in resTab:
	if "password" in line :
		print(line)

Le script complet peut être trouvé ici : https://github.com/ogma-sec/natas_scripts/blob/master/natas-00-01.py

Pour faciliter l’écriture des scripts des prochains niveaux, j’ai également créé un fichier JSON amené à contenir toutes les informations (URL, login, mot de passe) des challenges. Il sera lu et mis à jour automatiquement par les scripts de chaque niveau. Également, j’ai créé un script ne contenant que des fonctions permettant de manier ce fichier, (le mettre à jour, récupérer un niveau, etc.) ainsi que d’autres fonctions pour trouver le flag dans challenge d’un texte par exemple (en fonction de sa taille). J’ai nommé ce fichier natas.py,. Je peux ensuite utiliser les fonctions qu’il contient grâce à l’importation de cette bibliothèqe au début de mes scripts :

# Import de ma bibliothèque perso nommée "natas"
import natas

Vous trouverez tout cela sur Github : https://github.com/ogma-sec/natas_scripts

Bonnes pratiques de sécurité

Bien, nous pouvons maintenant prendre un petit peu de recul par rapport à ces deux premiers niveaux et voir quelles sont les mauvaises pratiques qu’ils mettent en avant.

Le code source d’une page web contient généralement beaucoup d’informations, et cela est bien normal. Il s’agit principalement d’informations destinées à l’utilisateur (ou à son navigateur), textes, lien externes, scripts, images, etc.

Par définition, les commentaires HTML ne sont pas directement affichés à l’utilisateur, ils permettent aux développeurs d’ajouter des informations sur le code, délimiter des zones. Parfois, ces commentaires servent simplement de todolist. Lorsque utilisé ainsi, les commentaires peuvent contenir des informations techniques qui peuvent être utilisées par un attaquant. Le challenge du jour nous expose un mot de passe. Dans des conditions réelles, il peut s’agir d’informations sur les technologies utilisées, leurs versions, des noms ou adresses mail, des requêtes SQL ou du code PHP non utilisé, etc.

L’OWASP (Open Web Application Security Project) traite déjà de ce sujet dans son Testing-Guide : Review webpage comments and metadata for information leakage (OTG-INFO-005)

A noter que les métadonnées ne concernent pas uniquement les commentaires du code source d’une page HTML, ils peuvent également être présents dans les fichiers PDF, les images, etc.

Avant mise en production d’une application web, est il est donc conseillé de supprimer tous les commentaires (ou du moins une très grande majorité), car ceux-ci n’ont aucun intérêt technique pour l’utilisateur ou son navigateur, on parle ici des commentaires HTML, mais il en va de même le Javascript par exemple. Il peut, par exemple, être envisagé d’utiliser un script qui se charge de repérer tous les commentaires d’un code source. Le développeur sera alors en charge de juger si ceux-ci contiennent des informations sensibles, et de les supprimer. Différents outils, tels que BurpSuite, peuvent déjà réaliser cette tâche. Pour les autres objets (PDF, images), il est conseillé d’opérer de la même façon avec un script qui supprime toutes les métadonnées de ces fichiers sur les serveurs de production. Moins l’attaquant dispose d’information, moins ses attaques seront ciblées, il perdra donc plus de temps et augmentera les chances de se faire détecter.

J’espère que ce premier article sur la suite Natas vous a intéressé, d’autres viendrons 🙂

Partager :
Published inChallenges et CTFs

2 Comments

  1. Gudbes

    Super article très bien détaillé qui me permet pour cette fois de revoir mes acquis. Hâte de voir le prochain article !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *