SCRT Information Security Julia Benz Guide de l utilisateur WebSeekurity Version 1.0 Mars 2012
Table des matières Table des matières i 1 Introduction 1 1.1 Contributions.............................. 1 1.2 Fonctionnalités............................. 2 2 Installation 3 2.1 Packages requis............................. 3 3 Débuter avec WebSeekurity 5 3.1 CLI................................... 5 3.2 GUI................................... 6 4 Tutoriel et Exemples 12 4.1 AMF................................... 12 4.1.1 Serveur d exemple....................... 12 4.1.2 Mode Manual........................ 13 4.1.3 Mode Automatic....................... 15 4.1.4 Mode Fuzzing........................ 17 4.2 SOAP.................................. 18 4.2.1 Serveur d exemple....................... 18 4.2.2 Mode Manual........................ 19 5 Documentation 21 Bibliographie 22 i
Chapitre 1 Introduction WebSeekurity peut être utilisé pour évaluer la sécurité des applications Web qui utilisent AMF ou SOAP pour interagir avec un serveur. En particulier, les applications Internet riches développées grâce à la technologie Flex de Adobe [1] peuvent être auditées grâce à cet outil. Jusqu à maintenant, AMF et SOAP ont été intégrés à l outil. La gestion des protocoles est faite par plug-in. Cela signifie que d autres protocoles de communication pourront facilement être ajoutés par la suite. L outil remplace la partie cliente de l application et peut être utilisé pour communiquer avec le serveur. Il permet d envoyer des requêtes et de recevoir les réponses correspondantes. WebSeekurity tente de découvrir et d identifier des failles potentielles du côté du serveur : faiblesse des mécanismes d authentification et d autorisation, fuite d informations, vulnérabilités aux injections SQL, etc. Plusieurs modes sont proposés : Manual, Automatic et Fuzzing. Le mode Manual permet de créer des requêtes de toutes pièces. Le mode Automatic est utilisé pour découvrir les services et méthodes de l application de manière automatisée. Finalement, le dernier mode nous permet d effectuer du fuzzing. WebSeekurity est distribué sous license GNU GPLv2 [2]. 1.1 Contributions Les logiciels suivants ont contribué ou inspiré le développement de WebSeekurity. L outil Deblaze [3], distribué sous license GNU GPLv2, compatible avec la license sous laquelle WebSeekurity est distribué (GNU GPLv2). 1
2 CHAPITRE 1. INTRODUCTION Le script Python invregex.py du package pyparsing [4], distribué sous la license MIT compatible avec la license sous laquelle WebSeekurity est distribué (GNU GPLv2). Les exemples fournis par le projet PyAMF [5], distribués sous une license MIT. Les exemples fournis par le projet SOAPpy [6], distribués sous une license BSD. 1.2 Fonctionnalités L outil implémente les fonctionnalités suivantes. A. Génération de requêtes Création manuelle de requêtes Création automatique de requêtes (des dictionnaires sont fournis pour les noms de services et méthodes) Mode Fuzzing Visualisation des réponses Protocoles implémentés : AMF et SOAP B. Historique de session et reporting Création d un historique Génération de rapports HTML basée sur un historique C. Interfaces Interface en ligne de commande Interface graphique D. Compatibilité Linux Windows Mac OS
Chapitre 2 Installation WebSeekurity fonctionne avec Python 2.7 (non compatible avec Python 3.0 et les versions supérieures de Python). 2.1 Packages requis Les packages suivant doivent être installés pour que WebSeekurity fonctionne. A. PyAMF Le protocole AMF est supporté par cette librairie [5]. Plus d informations concernant ce package peuvent être trouvées ici : http ://www.pyamf.org/index.html B. SOAPpy Le protocole SOAP est supporté par cette librairie [6]. Plus d informations concernant ce package peuvent être trouvées ici : http ://pypi.python.org/pypi/soappy/. Afin que SOAPpy fonctionne, les packages suivants doivent être installés : fpconst 0.6.0 (ou version sépurieure) : http ://pypi.python.org/pypi/fpconst wstools : http ://pypi.python.org/pypi/wstools C. pyparsing Cette librairie Python est utile pour parser les expressions régulières [4]. Plus d informations concernant ce package peuvent être trouvées ici : http ://pyparsing.wikispaces.com/ 3
4 CHAPITRE 2. INSTALLATION D. Tcl/Tk Tcl/Tk est requis comme le module Python Tkinter est utilisé pour l interface graphique [7].
Chapitre 3 Débuter avec WebSeekurity 3.1 CLI Lorsque WebSeekurity est utilisé via la ligne de commande, le script cli.py doit être exécuté. Les arguments suivants peuvent être passés. [-d] Si spécifié, les informations de debugging sont affichées. [-v] Si spécifié, le détail des résultats est affiché. [-po] Protocole à utiliser. Choix = [AMF, SOAP]. [-u] URL via laquelle l application doit être atteinte. [-s] Service à tester. [-sd] Découverte automatique des services. Si aucun autre argument n est spécifié, le dictionnaire par défaut est utilisé. [-ds] Dictionnaire à utiliser pour la découverte automatique des services. [-rs] Expression régulière à utiliser pour la découverte automatique des services. [-m] Méthode à tester. [-pa] Paramètres à envoyer avec la requête. Exemple si deux paramètres doivent être envoyés : -pa toto -pa toto123. Si le paramètre est un objet, il doit être spécifié comme suit : [object name]:object class,object namespace, param1 : param1 param2 :number [param3]...object description...[param3][object name] [-md] Découverte automatique des méthodes. Si aucun autre argument n est spécifié, le dictionnaire par défaut est utilisé. [-dm] Dictionnaire à utiliser pour la découverte automatique des méthodes. [-rm] Expression régulière à utiliser pour la découverte automatique des méthodes. [-mf] Le mode Fuzzing est utilisé. Des paramètres ou une expression régulière sont requis pour ce mode. [-re] Expression régulière à utiliser pour le fuzzing. 5
6 CHAPITRE 3. DÉBUTER AVEC WEBSEEKURITY [-mp] Nombe maximum de paramètres qui peuvent être modifiés en même temps pendant le fuzzing. [-usr] Nom d utilisateur si requis. [-pwd] Mot de passe si requis. [-he] Header HTTP à ajouter. [-va] Valeur correspondant au header HTTP à ajouter. [-t] Nombre de threads à lancer. [-hi] Fichier dans lequel doit être sauvé l historique de la sesssion (path/history file) [-rp] Fichier dans lequel doit être sauvé le rapport HTML de la sesssion (path/report file.html). Les options -usr, -pwd, -he et -va ne fonctionnent pas encore pour le protocole SOAP. 3.2 GUI Lorsque WebSeekurity est utilisé via l interface graphique, le script gui.py doit être exécuté. Figure 3.1: WebSeekurity : partie Request Editor, modifié avec Gliffy [8]
3.2. GUI 7 L interface graphique de l outil a deux parties distinctes : la partie Request Editor (figure 3.1 ci-dessus) et la partie Reporting (figure 3.4 ci-dessous). 1. La partie Request Editor est la partie principale de l interface graphique. Les éléments suivants en font partie. 2. La partie Protocol and URL permet à l utilisateur de spécifier le protocole à utiliser pour communiquer avec l application et l URL à laquelle se connecter. 3. Dans la partie Credentials and HTTP Headers, l utilisateur peut spécifier si un nom d utilisateur et un mot de passe doivent être utilisés pour s authentifier et si des headers HTTP doivent être ajoutés à la requête HTTP qui est envoyée au serveur. Ces paramètres sont optionnels ; l utilisateur n a pas besoin d en donner si cela n est pas requis par l application testée. Lorsque l on clique sur le bouton Add HTTP Headers, une fenêtre popup apparait. Figure 3.2: WebSeekurity : popup pour ajouter les headers HTTP, modifié avec Gliffy [8] 4. Cette fenêtre popup permet à l utilisateur de spécifier les headers HTTP (et leurs valeurs) à ajouter à la requête HTTP, Plusieurs headers HTTP peuvent être ajoutés à la requête. 5. Grâce à la partie Discovery Modes, l utilisateur peut choisir quels modes utiliser pour les services et les méthodes. Les modes à disposition pour les services sont Automatic et Manual et pour les méthodes Automatic, Manual et Fuzzing. Lorsque l on clique sur le bouton Validate, une fenêtre popup apparait. 6. Suivant les modes choisis par l utilisateur, une fenêtre popup différente apparait. La fenêtre popup de la figure 3.3 apparait dans le cas où le mode de service est Manual et le mode de méthode est Fuzzing. C est la fenêtre popup la plus
8 CHAPITRE 3. DÉBUTER AVEC WEBSEEKURITY complète qui puisse apparaitre. Cette fenêtre popup permet à l utilisateur de spécifier les éléments suivants. Figure 3.3: WebSeekurity : popup pour le mode Fuzzing, modifié avec Gliffy [8] 7. Grâce aux parties Service Name et Method Name, l utilisateur peut spécifier le service à contacter et la méthode à appeler. 8. Dans la partie Parameters, l utilisateur peut choisir de générer les paramètres grâce à une expression régulière ou de spécifier les paramètres qui doivent être modifiés durant le fuzzing. 9. Si l utilisateur choisit de spécifier une expression régulière, il doit cocher la case correspondante et donner l expression régulière à utiliser. 10. Si l utilisateur choisit d insérer des caractères spéciaux dans les paramètres donnés, il doit cocher la case correspondante. Puis, il doit indiquer le nombre maximum de paramètres qui peuvent être modifiés en même temps. Il doit aussi spécifier les paramètres et la méthode à appeler. Ces paramètres sont ensuite affichés dans la partie List of Parameters. Comme nous pouvons le remarquer, les paramètres qui sont des objets sont affichés de manière spéciale afin que cela soit plus clair et plus lisible. Lorsque l on clique sur le bouton OK, la requête est construite selon les différents élements donnés.
3.2. GUI 9 11. La requête construite précédemment est résumée dans la partie Request. Le nombre de threads à lancer peut être spécifié dans cette partie. L utilisateur peut choisir de modifier la requête grâce au bouton Modify ou de l envoyer grâce au bouton Send. Lorsque l on clique sur le bouton Send, la requête est envoyée au serveur. 12. Lorsque la réponse est reçue, elle est affichée dans la partie History. Suivant le type de réponses, des couleurs différentes sont utilisées. Si un service ou une méthode a été découvert grâce au mode Automatic, la couleur bleue est utilisée pour afficher la réponse. Dans le cas où le mode pour la méthode est Fuzzing, la réponse à la requête initiale est affichée en orange, les réponses identiques à la réponse initiale sont affichées en vert et les réponses différentes sont affichées en rouge. 13. Une fois qu une requête a été envoyée et une réponse a été reçue, l utilisateur a la possibilité de renvoyer cette requête. Il peut soit faire un clic droit sur la requête qu il veut renvoyer ou sélectionner la requête et cliquer sur le bouton Resend. Cela ouvre une fenêtre popup pour permettre à l utilisateur de mofifier la requête avant de la renvoyer. 14. Dans la partie Request Editor, l utilisateur a aussi la possibilité de gérer un historique des requêtes et réponses. Les différentes options à disposition sont : Open History, Reset History et Save History. Les boutons correspondants se trouvent en bas de la fenêtre. Si l on ouvre un historique, celui-ci sera affiché dans la partie History. Si l on clique sur Reset, la partie History va être remise à zéro. Finalement, si l on sauve un historique, l on peut choisir un emplacement et un nom pour le fichier à sauver. 15. La partie Reporting de l outil permet à l utilisateur de générer un rapport HTML à partir d un historique (figure 3.4 ci-dessous).
10 CHAPITRE 3. DÉBUTER AVEC WEBSEEKURITY Figure 3.4: WebSeekurity Tool : partie Reporting, modifié avec Gliffy [8] 16. Grâce à la partie History, l utilisateur peut choisir un historique pour générer le rapport HTML. 17. Dans la partie Report, plusieurs options sont proposées pour permettre à l utilisateur de moduler ce qui doit être inclus dans le rapport. 18. Le bouton Save Report As permet à l utilisateur de choisir un emplacement et un nom pour le rapport HTML à générer. 19. Un rapport HTML a le format suivant (figure 3.5). 20. Dans la section Services and Methods Discovery, les services et méthodes découverts sont listés. Les services découverts sont présentés en premier lieu, suivis des méthodes découvertes par service. 21. Dans la section Complete History, un historique détaillé est présenté sous la forme d un tableau. Le même code de couleur que celui de la partie History de l interface graphique est utilisé. Du bleu est utilisé pour les services et méthodes découverts. Pour le mode Fuzzing, le jaune correspond à la requête initiale, le vert est utilisé pour les requêtes identiques et le rouge pour les requêtes différentes.
3.2. GUI 11 Figure 3.5: WebSeekurity : exemple de rapport HTML, modifié avec Gliffy [8]
Chapitre 4 Tutoriel et Exemples 4.1 AMF Afin de faire les premiers pas avec l outil WebSeekurity, un serveur d exemple a été fourni. 4.1.1 Serveur d exemple Le serveur d exemple utilisé pour illustrer le cas AMF est tiré du projet PyAMF [5]. Il est distribué sous une license MIT (compatible avec la license GNU GPLv2) et a été modifié (permis par la license MIT). Une base de données SQLite est utilisée. L URL de ce serveur est http://localhost:8000. Il fournit les services et méthodes suivants. Service et Méthodes Service user add user add user object delete user get user list users validate user Service echo echo Afin de poursuivre ce tutoriel, veuillez lancer le serveur d exemple AMF en exécutant le script amfserver.py. 12
4.1. AMF 13 4.1.2 Mode Manual Dans un premier temps, nous allons créer et envoyer une requête AMF simple. Le service à contacter est user et la méthode à appeler est add user qui prend trois paramètres (chaînes de caractères) : nom d utilisateur toto, mot de passe toto123, et email toto@example.ch. A. CLI Le script cli.py doit être lancé et la commande suivante exécutée. python cli.py -po AMF -u http://localhost:8000 -s user -m add user -pa toto -pa toto123 -pa toto@example.ch Une réponse de ce type doit être reçue. Figure 4.1: Réponse reçue par WebSeekurity Le nom d utilisateur, le mot de passe et l adresse email fournis sont de simples chaînes de caractères. Nous envoyons maintenant une requête qui a pour paramètre un objet. Nous appelons la méthode add user object du service user. Cette méthode prend un seul paramètre qui doit être un objet. Il est demandé de décrire un objet selon le format suivant. [object name]:object type,object namespace, attribute1 : attribute1 attribute2 :number [attribute3]...object description...[attribute3][object name] Voici la commande qui doit être exécutée en ligne de commande. python cli.py -po AMF -u http://localhost:8000 -s user -m add user object -pa [user]:user,example.namespace, username : toto password : toto123 email : toto@example.ch [user] Une réponse de ce type doit être reçue.
14 CHAPITRE 4. TUTORIEL ET EXEMPLES Figure 4.2: Réponse reçue par WebSeekurity B. GUI Nous utilisons maintenant l interface graphique pour envoyer la requête précédente. Voici comment les différents champs doivent être remplis (voir figures 4.3 et 4.4). La case AMF doit être cochée et l URL doit être spécifiée dans le champ approprié. Ensuite, les modes pour les services et méthodes doivent être mis sur Manual. Une fois que cela est fait, cliquez sur le bouton Validate et une fenêtre popup devrait apparaitre (voir figure 4.4). Figure 4.3: Interface graphique de WebSeekurity Dans la fenêtre popup, remplissez les champs nécessaires. Le paramètre objet doit être représenté suivant le même format que pour l interface en ligne de commande. Nous pouvons voir dans la figure ci-dessous que WebSeekurity permet une
4.1. AMF 15 représentation claire des objets. Finalement, cliquez sur le bouton OK. La requête doit être résumée dans la partie Request de la fenêtre principale. Pour envoyer la requête, cliquez sur le bouton Send. Figure 4.4: Interface graphique de WebSeekurity 4.1.3 Mode Automatic Le mode Automatic de WebSeekurity permet de découvrir de manière automatisée les services et les méthodes d une application Web. Nous essayons dans un premier temps de découvrir les services de notre serveur d exemple. Nous utilisons le dictionnaire par défaut pour effectuer la découverte. Le concept de threading a été implémenté. Des requêtes peuvent être envoyées en parallèle si plusieurs threads sont lancés. Le temps de traitement est ainsi réduit. Nous décidons de démarrer deux threads. La commande suivante doit être exécutée. python cli.py -po AMF -u http://localhost:8000 -sd -m test -t 2 Dans un premier temps, l outil indique le nombre de requêtes qui doivent être envoyées et demande si vous voulez continuer l opération. Puis les réponses aux
16 CHAPITRE 4. TUTORIEL ET EXEMPLES deux premières requêtes sont affichées. Les premiers noms de services testés sont des noms générés aléatoirement. Regardez les réponses reçues et decidez si vous voulez continuer la découverte. Vous devriez mettre fin à l opération si les réponses reçues indiquent qu une erreur de connexion s est produite par exemple. En effet, dans ce cas, l erreur se produira également pour toutes les requêtes suivantes. Il est donc mieux d arrêter à ce moment-là l opération. Figure 4.5: Réponse reçue par WebSeekurity Une fois que la découverte a été effectuée, une réponse de ce type est reçue. Figure 4.6: Réponse reçue par WebSeekurity Nous pouvons voir dans la figure ci-dessus que WebSeekurity a découvert les services echo et user. Vous pouvez aussi sélectionner un dictionnaire de votre choix en exécutant la commande suivante. python cli.py -po AMF -u http://localhost:8000 -sd -ds path/your own dictionary.txt -m test -t 2 Vous pouvez aussi spécifier une expression régulière pour générer les noms de service à tester. Avec la commande suivante, tous les noms de service composés du mot Service suivi d un chiffre sont testés. Ainsi, les noms de service Service0 à Service9
4.1. AMF 17 sont testés. python cli.py -po AMF -u http://localhost:8000 -sd -rs Service[0-9] -m test -t 2 Essayons maintenant de découvrir quelles méthodes sont mises à disposition par le service user qui a été découvert. Vous pouvez également utiliser votre propre dictionnaire ou une expression régulière pour identifier les méthodes disponibles. Ici, nous utilisons le dictionnaire par défaut. La commande suivante doit être exécutée. python cli.py -po AMF -u http://localhost:8000 -s user -md -t 2 La découverte des méthodes est faite de la même manière que la découverte des services. Une réponse de ce type doit être reçue. Figure 4.7: Réponse reçue par WebSeekurity Toutes les opérations effectuées via l interface en ligne de commande peuvent être effectuées grâce à l interface graphique. 4.1.4 Mode Fuzzing Le mode Fuzzing de WebSeekurity permet d insérer des caractères spéciaux à l intérieur des paramètres d une requête. Vous pouvez aussi spécifier une expression régulière pour générer le paramètre. Le mode Fuzzing est utilisé pour découvrir des vulnérabilités potentielles. La méthode get user de notre serveur d exemple est vulnérable aux injections SQL. Quand cette méthode est appelée, elle se connecte à la base de données SQLite et récupère l utilisateur qui a été passé en paramètre. Exécutons la commande suivante.
18 CHAPITRE 4. TUTORIEL ET EXEMPLES python cli.py -po AMF -u http://localhost:8000 -s user -mf get user -pa test Une réponse de ce type doit être reçue. Figure 4.8: Réponse reçue par WebSeekurity Le guillemet inséré dans le paramètre test a généré une réponse suspicieuse. Cela indique que l application est potentiellement vulnérable aux injections SQL. Pour tester cela, des injections SQL peuvent être effectuées manuellement. Le caractère null (\x00) a aussi généré une réponse inhabituelle. Si nous analysons l erreur reçue, nous pouvons voir que le caractère null indique probablement la fin d une chaîne de caractères dans SQLite. Par conséquent, l instruction SQL qui est exécutée finit avec le premier t de test et non pas avec un guillemet. Cela a causé une erreur. Le mode Fuzzing nous permet également d utiliser une expression régulière pour générer le paramètre. La commande suivante peut être exécutée pour tester si l application supporte les grands nombres comme paramètre. python cli.py -po AMF -u http://localhost:8000 -s user -mf get user -re [9]{5,20} 4.2 SOAP 4.2.1 Serveur d exemple Le serveur d exemple utilisé pour illustrer le cas SOAP est tiré du projet SOAPpy [6]. Il est distribué sous une license BSD (compatible avec la license GNU GPLv2) et a été modifié (permis par la license MIT). L URL de ce serveur est http://localhost:8080. Il fournit les méthodes suivantes (SOAP ne fonctionne pas avec des services comme AMF). Méthode echo
4.2. SOAP 19 Afin de poursuivre ce tutoriel, veuillez lancer le serveur d exemple SOAP en exécutant le script soapserver.py. WebSeekurity fonctionne de la même manière pour AMF et SOAP. Par conséquent, nous allons seulement montrer comment envoyer des requêtes SOAP simples avec le mode Manual et via l interface en ligne de commande. Il est important de remarquer qu aucun service n est requis pour SOAP. La découverte automatique de services n a donc plus d utilité. Comme WebSeekurity est un outil qui doit fonctionner pour différents types de protocoles, le champ pour les services doit être rempli même si l on n a besoin d aucun service pour SOAP. 4.2.2 Mode Manual Dans un premier temps, nous créons et envoyons une requête SOAP simple. La méthode à appeler est echo qui prend un paramètre en entrée et retourne ce paramètre. Le script cli.py doit être lancé et la commande suivante exécutée. python cli.py -po SOAP -u http://localhost:8080 -s -m echo -pa toto Une réponse de ce type doit être reçue. Figure 4.9: Réponse reçue par WebSeekurity Le paramètre toto spécifié est une simple chaîne de caractères. Nous envoyons maintenant une requête avec un objet XML comme paramètre. Nous appelons la même méthode echo. L objet XML peut être représenté suivant le format d objet que nous avons défini précédemment ou il peut être décrit à l aide du langage XML. Ces deux cas sont présentés ci-dessous. Description standard de l objet (les champs pour le type et le namespace restent vides) [user]:,, username : toto password : toto123 [user]
20 CHAPITRE 4. TUTORIEL ET EXEMPLES Par conséquent, la commande qui doit être exécutée est la suivante. python cli.py -po SOAP -u http://localhost:8080 -s -m echo -pa [user]:,, username : toto password : toto123 [user] Une réponse de ce type doit être reçue. Figure 4.10: Réponse reçue par WebSeekurity Format XML <user> <username>toto</username> <password>toto123</password> </user> Par conséquent, la commande qui doit être exécutée est la suivante. python cli.py -po SOAP -u http://localhost:8080 -s -m echo -pa <user><username>toto</username><password>toto123</password></user> Une réponse de ce type doit être reçue. Figure 4.11: Réponse reçue par WebSeekurity Nous pouvons remarquer que les réponses reçues sont identiques. Cela est normal vu que nous avons seulement changé la représentation de l objet XML. L objet lui est resté le même.
Chapitre 5 Documentation La documentation complète de WebSeekurity peut être trouvée dans le dossier doc du package de l outil. 21
Bibliographie [1] Adobe, Flex Product. http://www.adobe.com/products/flex.html. Consulté le 20.02.2012. [2] GNU General Public License. http://www.gnu.org/copyleft/gpl.html, June 2007. Consulté le 03.03.2012. [3] Deblaze : A Remote Enumeration Tool for Flex Servers. http://deblaze-tool.appspot.com, 2009. Consulté le 03.03.2012. [4] pyparsing Python module. http://pyparsing.wikispaces.com/, 2012. Consulté le 04.03.2012. [5] The PyAMF Project, PyAMF : AMF for Python. http://www.pyamf.org. Consulté le 03.03.2012. [6] SOAPpy : SOAP Services for Python. http://pypi.python.org/pypi/soappy/. Consulté le 04.03.2012. [7] Tkinter : Python interface to Tcl/Tk. http://docs.python.org/library/tkinter.html. Consulté le 08.03.2012. [8] Gliffy. http://www.gliffy.com/. Consulté le 04.03.2012. 22