Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. Hacking et Forensic
  3. Un peu plus sur le Web
Extrait - Hacking et Forensic Développez vos propres outils en Python (2ième édition)
Extraits du livre
Hacking et Forensic Développez vos propres outils en Python (2ième édition)
3 avis
Revenir à la page d'achat du livre

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&eacute;cialiste de la formation &agrave;  
l&rsquo;informatique</title> 
<meta name="description" content="ENI GROUPE, des professionnels de la  
formation informatique, sp&eacute;cialiste en e-learning, &eacute;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.

images/HF01EP07.png

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.

images/HF02EP07.png

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.