Un peu plus sur le Web
Introduction
Une partie consacrée aux bases du Web a déjà été abordée dans le chapitre Le réseau. Nous supposerons ici que cette partie est acquise afin d’approfondir un peu certains aspects du Web.
Beaucoup de logiciels spécialisés pour le Web en sécurité informatique utilisent le langage Python. Pour n’en citer que quelques-uns, nous avons sqlmap, W3af, wapiti...
Nous allons nous attarder ici sur les techniques de brute force et de parsing HTML. Nous allons voir comment créer différents outils utilisables pour des scénarios d’attaques web.
Reprenons les basiques
La très utile librairie urllib2 va nous être indispensable pour la suite. Résumons ce que nous avons vu dans le chapitre Réseau : la bibliothèque Scapy.
import urllib2
body=urllib2.open("http://www.eni.fr")
print body.read()
Nous venons d’effectuer une requête GET à un site web. Cela va nous retourner un objet fichier que nous pourrons lire.
Nous aimerions pouvoir définir des en-têtes spécifiques, créer des requêtes POST, utiliser les cookies...
Nous allons créer la même requête que précédemment mais en utilisant la classe request et en définissant un User-Agent HTTP customisé.
import urllib2
url = "http://www.eni.fr"
headers = {}
headers['User-Agent'] = 'Googlebot'
request = urllib2.Request(url,headers=headers)
response = urllib2.urlopen(request)
print response.read()
response.close()
Nous obtenons la réponse ci-dessous :
└─> python web_header_agent.py
<html>
<head>
<title>ENI Groupe, spécialiste de la formation à
l’informatique</title>
<meta name="description" content="ENI GROUPE, des professionnels de la
formation informatique, spécialiste en e-learning, éditeurs...
Mapping de site web
L’avènement des CMS (Content Management System) tels que Drupal, WordPress ou Joomla a fait que la création de sites web est devenue enfantine. Même les entreprises ont recours à ces CMS.
Quand les personnes qui ont installé ces CMS n’ont pas pris les précautions nécessaires afin de sécuriser leur site, il est devenu très facile pour un attaquant d’obtenir un accès non autorisé sur le serveur web.
Nous pouvons récupérer gratuitement les codes sources de ces différents CMS et les installer en local pour déterminer la structure des répertoires et le nom des fichiers installés. Nous sommes donc aptes à créer un scanner qui va parcourir tous ces fichiers et répertoires sur le site distant.
Nous allons donc essayer de créer ce scanner et nous utilisons pour cela l’objet Queue pour créer une application rapide et threadée.
#--*--coding:utf-8--*--
import Queue, threading, os, urllib2
threads=10
target = "http://www.eni.fr"
directory="/Users/franckebel/Download/joomla-3.1.1"
filters=[".jpg",".gif",".png",".css"]
os.chdir(directory)
web_paths=Queue.Queue()
for r,d,f in os.walk("."):
for files in f:
remote_path="%s/%s"...
Brute force de répertoires ou d’emplacement de fichiers
Dans la section précédente, nous devions avoir de précieux renseignements sur la cible comme le CMS utilisé, nous devions installer ce CMS sur notre machine afin de connaître les fichiers et répertoires…
Dans de nombreux cas, vous n’aurez pas toutes ces informations en possession. Nous devrons donc utiliser un outil de brute force afin d’essayer de glaner des informations importantes (ou non).
Nous allons fabriquer un outil simple qui va utiliser un dictionnaire et essayer de découvrir des répertoires et fichiers qui sont lisibles sur le site web cible.
Comme précédemment, nous utiliserons un pool de threads pour essayer de découvrir (agressivement) le contenu.
Nous pourrons récupérer un dictionnaire sur la distribution Kali ou chez SVNDigger par exemple. Nous utiliserons all.txt de SVNDigger.
Ouvrons notre éditeur favori (nano, vim, etc.) et écrivons le code suivant :
import urllib2, threading, Queue, urllib
threads = 50
target_url = http://www.eni.fr"
wordlist_file = /tmp/all.txt
resume = None
user_agent = "Mozilla/5.0 (X11 ; Linux x86_64 ; rv:19.0) Gecko/20100101
Firefox/19.0"
def build_worldlist(worldlist_file) :
fd = open(wordlist_file,"rb")
raw_words...
Brute force authentification HTML
De plus en plus de serveurs web ont une protection pour le brute force comme un captcha ou une équation mathématique simple à résoudre.
Joomla intégre une protection brute force assez classique et un token de connexion, mais pas de captcha fort comme protection.
Si nous voulons tester le site distant, il nous faut récupérer ce token du formulaire de login avant de soumettre le password et vérifier que l’on accepte le cookie dans urllib2.
Nous allons donc utiliser HTMLParser, déjà vu dans le chapitre Le réseau.
Comment est fait le formulaire de login de Joomla ?
<form action="/administrator/index.php" method="post" id="form-login"
class='form-inline">
<input name="username" tabindex="1" id="mod-login-username" type="texte"
class="input-medium" placeholder="User Name" size="15"/>
<input name="passwd" tabindex="2" id="mod-login-password" type="password"
class="input-medium" placeholder="Password" size="15"/>
<select id="lang" class="inputbox advancedSelect">
<option value="" selected="selected">Langage-Default</option>
<option value="en-GB">English (United Kingdom)</option>
<input type="hidden" name="option" value="com_login"/> ...
Selenium
1. Introduction
Selenium est un outil d’automatisation de navigateur web. Il permet donc d’écrire, de manière plus ou moins assistée, des scripts dont l’exécution réalisera automatiquement des actions dans un navigateur web : visiter une page, cliquer sur un lien, remplir un formulaire, etc. et de récupérer les résultats de ces actions.
WebDriver est inclus dans Selenium. Nous allons l’utiliser dans la suite.
WebDriver est basé sur un modèle client-serveur. Un client de test envoie des "commandes" via des requêtes HTTP à un serveur WebDriver après initialisation d’une session. Ce dernier distribue les commandes auprès des drivers des navigateurs concernés. Ces drivers exécutent les commandes sur les navigateurs en question via des mécanismes d’automatisation internes, de l’OS ou du JS. C’est en réalité plus compliqué que cela, car ces drivers peuvent eux-mêmes être des serveurs WebDriver (Internet Explorer), communiquer via des web sockets (Safari), etc. Le driver n’est pas nécessairement un binaire, les drivers de Firefox et de Safari sont des extensions du navigateur par exemple.
Par défaut, les navigateurs et leurs drivers doivent être disponibles sur la même machine que le serveur WebDriver (nous verrons plus tard qu’il...
Connexion sur un site web et navigation
Nous allons maintenant nous attarder sur un site où il est nécessaire de s’authentifier. Une fois authentifié, nous allons naviguer vers une page dans laquelle un emploi du temps est présent afin de le récupérer.
Comme exemple, nous nous connecterons sur l’ENT (environnement numérique de travail) de l’université de Valenciennes.
Si nous testons en saisissant un identifiant et un mot de passe et que nous observons le résultat avec un outil spécialisé, nous verrons le nom des champs qui sont username et password, et pour tenter la connexion, submit. Nous pouvons donc écrire la partie connexion assez simplement :
username = driver.find_element_by_id("username")
username.send_keys("votre_login_name")
password = driver.find_element_by_id("password")
password.send_keys("votre_password")
driver.find_element_by_name("submit").click()
Pour naviguer dans les pages, nous utiliserons :
move_mouse = driver.find_element_by_link_text("Mon bureau")
action = ActionChains(driver)
action.move_to_element(move_mouse)
action.perform()
Nous devrons ici "cliquer" sur "Mon bureau" puis "Mon emploi du temps".
Nous pourrions ensuite, dès arrivé sur la page d’emploi du temps, faire une copie d’écran. Mais ici, un bouton "Imprimer en PDF" existe, nous l’utiliserons donc.
Nous pourrons aussi naviguer dans les semaines avec les flèches gauche et droite.
Voici un exemple de programme complet pour cette application spécifique :
# Fonction qui renvoie le mois en lettres
def trad_mois(mois) :
mois_traduit = 0
if int(mois) == 1 :
mois_traduit = "Janvier" ...
Conclusion
Il existe beaucoup d’autres librairies utiles pour le Web. Un seul livre sur ce sujet ne suffirait pas. Nous avons essayé ici de vous donner les plus utiles pour le test de sites web et la sécurité. Nous n’avons pas montré l’écriture de plug-ins pour des logiciels spécialisés tels que Burp Suite ou Nessus ; de bons tutoriels sont disponibles pour cela sur Internet.