On vit une drôle d'époque. Sincèrement. Il suffit que tout récemment certains utilisateurs de Facebook se rendent compte (en allant déterrer leurs messages d'avant 2009) que leur vie privée n'était pas si privée que cela pour que des ministres demandent des comptes et lancent une enquête de la CNIL. Tout ça parce que des utilisateurs n'ont pas (encore) compris que mettre sur un serveur distant des données personnelles (et pour certaines confidentielles) les rendait hors de contrôle. La bonne blague. Comme si ce genre de problème ne se produisait que dans le monde virtuel, le monde numérique.
Confidentiel, vous avez dit ?
Je forme des gens à la sécurité informatique, et plus généralement à la sécurité de l'information. Et cela plusieurs semaines par an. Et ce soir, en rentrant du boulot (où je dispense une formation, comme c'est étrange), une femme vient s'asseoir sur le siège diagonalement opposé au mien, dans un train de banlieue comme il y en a tant. Un train bondé, rempli de gens éreintés. Mais contrairement aux autres personnes qui ont déjà dégainé leurs smartphones, elle sort un bloc-notes ainsi qu'un document de quelques pages sur lequel est inscrit la mention "CONFIDENTIEL" en rouge, et encadrée.
Elle fait cela sous le nez de trois personnes, et commence à annoter le document comme si de rien n'était. Confidentiel, c'est marqué. On est trois à lorgner sur le document, et elle continue d'annoter: "Expliquer le schéma, comme je l'ai indiqué", "Non.". Le nom de sa société est visible, le document concerne une proposition commerciale, et le nom du client traîne pas très loin. Du grand art, je vous dit. J'avais mon smartphone dans les mains, en deux mouvements de doigt je lance l'appareil photo, coupe le son, et prend une série de clichés (avec zoom) de ce document annoté. Comme si de rien n'était. Et personne n'a rien remarqué. Normal quoi. Un smartphone, un geek, et une position qui fait style "je ne veux pas que vous puissiez voir mon écran".
Espion en herbe
J'ai été assez étonné de ne pas voir cette personne s'offusquer, car bon trois personnes qui reluquent son document ne l'ont pas fait broncher, et encore plus de pouvoir prendre ces photos sans me faire repérer. Je connais certaines personnes qui ont eu des problèmes juste en laissant un document annoté "CONFIDENTIEL" sur leur bureau, sans que même d'autres personnes y ait eu accès. Mais non, "CONFIDENTIEL" devait être là juste pour faire joli. Et pourtant je suis sûr que cette personne fait tout de même attention à ses documents sur son ordinateur, et à ses dossiers. Qu'elle trie tout comme il faut, et fait attention aux documents qu'elle transmet et stocke dans ses emails. Enfin j'ose espérer.
Pourtant, avec un smartphone tout ce qu'il y a de plus abordable et commun, n'importe qui peut se transformer en espion et prendre des photos à l'insu de personnes, en toute discrétion. Imaginons deux minutes que je travaille chez un concurrent, et l'on pourrait envisager que je puisse me servir de cette information. D'ailleurs ce n'est pas sans vous rappeler certaines personnalités qui se sont fait avoir avec une photo de documents sous le bras ... Même Nokia peut vous faciliter la tâche, avec ses derniers modèles intégrant une stabilisation de l'image, tout en étant hype.
Dernier point, et non des moindres: il est possible de nos jours de prendre une photo d'une personne ou d'un document à l'aide d'un objet très répandu, sans que personne ne le remarque. Un peu comme les appareils photos miniatures utilisés par des supers-espions à l'époque de la guerre froide, mais en plus gros. Sans que cela n'attire l'attention. Sans un bruit. Car le célèbre "clic" peut être désactivé, autorisant les prises de vues furtives. Et ce n'est pas neuf, malheureusement.
L'accès à l'information
Vouloir protéger l'information est une noble cause, et cela passe par différents mécanismes mis en œuvres: des procédures internes, une classification des documents, ainsi qu'une politique de mots de passe solide et éprouvée. On arrête pas de le dire. Mais vous ne pourrez jamais être derrière tout le monde, et encore moins derrière les bourreaux de travail ("workaholics") qui continuent de bosser dans le train qui les mène chez eux. Parce que bon, les objectifs et la carrière sont importants. Quant à la confidentialité ...
D'ailleurs, si par le plus grand des hasards cette personne lit ceci et se reconnaît, qu'elle n'hésite pas à me contacter. Sait-on jamais.
J'ai rendu visite il y a quelques jours à de la famille en Corrèze, terre de prédiléction de notre cher Président, et j'ai pu voir le superbe ordinateur portable que le Conseil Général de Corrèze a prêté à mon petit cousin dans le cadre de l'opération «Ordicollège 19». J'avais entendu parler de cette opération dans les médias, et j'étais donc content de pouvoir toucher à un des ordinateurs portables prêté à un élève. Les nouveaux collégiens corrèziens se voient ainsi tous dotés d'un ordinateur portable, enfin maintenant d'une tablette numérique iPad (depuis 2010).
Tâtons la bête
J'ai ainsi pu manipuler l'engin: un portable de marque Asus (c'est du solide), qui tourne sur Ubuntu. Je n'ai pas forcément pris le temps de regarder la version, mais de mémoire il me semble que c'était à jour. J'ai dans un premier temps tapé quelques commandes, histoire de voir ce qu'il y avait dessus, mais rien de bizarre:
Puis je me suis intéressé à une fonctionnalité typique d'Ubuntu: le sudo su. Mon cousin m'ayant dit que la configuration de l'ordinateur portable ne devait pas être modifiée, règle stipulée dans l'accord de prêt par ailleurs, je m'attendais à ce que cette commande échoue. Eh bien non, je me suis retrouvé administrateur de la machine, avec un bon vieux shell root. Bien sûr, il m'a fallu saisir le mot de passe du compte utilisateur, qui n'est autre que ordico. Mon cousin m'a par ailleurs fait remarquer que les élèves étaient autorisés à changer leurs mots de passe, mais que le système réclamait un mot de passe complexe, et donc que personne ne le changeait.
Par curiosité, j'ai récupéré le contenu du fichier /etc/shadow, histoire de trouver le mot de passe du compte d'administration root. Il m'a fallu peu de temps et une wordlist sur mesure pour arriver à le casser, ceci dit je n'ai pas été déçu. Le mot de passe du compte d'administration n'est autre que ... «ordicollege». Tadaaaa ! Donc bon, au lieu de faire un sudo su on pourrait tout aussi bien faire un su. Ce qui est révélateur dans le cas présent, c'est la contradiction entre la volonté d'empêcher les élèves de modifier le système et l'idée naïve qui consiste à mettre un mot de passe bateau. Difficile dans ce cas de limiter les modifications des systèmes.
Au vu de la progression de popularité des distributions orientées grand public comme Ubuntu, il semble probable qu'une faible proportion des élèves soient un brin connaisseurs ou asseaz curieux pour aller bidouiller le contenu de cet ordinateur mis à disposition, pour y installer des jeux, wine ou autres. J'ai d'ailleurs pu voir DeSmuME (logiciel d'émulation de jeux Nintendo DS) installé sur cet ordinateur portable ... Car oui, les dépôts utilisés sont ceux officiels, là encore je m'attendais au moins à des dépôts maison et centralisés au niveau du Conseil Régional, mais non. Décidémment, la tâche des bidouilleurs en herbe est très facilitée.
Quelques remarques techniques liés à l'opération «Ordicollège»
Une fois rentré, j'en ai profité pour me renseigner sur cette opération, après avoir récupéré l'avis d'un élève. L'opération a été lancée en 2008, et chaque élève de 6ème a reçu entre 2008 et 2010 un ordinateur portable. Elle a été continuée en 2011 et 2012, mais cette fois-ci ce sont des iPads qui ont été mis à disposition (version 1 pour les élèves arrivés en 2011, version 2 pour ceux arrivés en 2012). Un site officiel a été déployé, ainsi qu'une plateforme web de suivi et de maintenance. Pour le coup les informations présentes sur le site officiel de l'opération contiennent du poney en barre. Quelques extraits choisis:
Les premiers et second points peuvent se comprendre, mais peuvent dans la plupart des cas exposer des élèves à des vulnérabilités critiques, et donc exposer de même leurs données personnelles. Toutefois, si les iPads sont administrés comme le sont les ordinateurs portables, je ne pense pas que cela pose de gros problèmes: beaucoup de parents qui possèdent un iPad et qui l'ont jailbreaké peuvent le faire, et ceux qui s'y connaissent en Linux peuvent aussi altérer le contenu de l'ordinateur. Pour le retour à la plateforme, les opérations sont réversibles donc difficile pour un technicien de déterminer ce qui a été fait sur le matériel mis à disposition. Normal, ce ne sont pas des experts en inforensique.
Le dernier point m'a beaucoup étonné, car il est révélateur d'une pratique de la plateforme de maintenance: l'interdiction de création ou de modification du mot de passe de la tablette pour cause de coût de maintenance. Le site mentionne d'ailleurs les raisons de cette interdiction:
<quote>Pourquoi cette interdiction ? Depuis l'arrivée de la tablette dans le dispositif Ordicollège, la première cause d'intervention et d'immobilisation de ces matériels reste la création d'un code de verrouillage et son "oubli" par l'utilisateur. A chaque intervention de ce type, le matériel est immobilisé, les contenus stockés détruits, et cela pénalise à la fois l'utilisateur et la mise en oeuvre de ces outils par les enseignants. Cela engendre les opérations suivantes : prise en charge du matériel, effacement de la configuration, rechargement du système des applications, paramétrage, chargement des applications (valeur 30 €).</quote>
Ce dernier point est cependant très discutable car cela signifie que tout élève qui se fait emprunter sa tablette (ou même qui la prête en cours à un autre élève) ou qui se la fait voler par un autre élève peut voir ses informations personnelles compromises. Et cela peut aller jusqu'à la publication sur Facebook de messages ou photos malvenus, tels que les jeunes le font déjà. Alors oui, alléger les coûts c'est bien (surtout pour une opération ayant un budget de 1,5 M€) mais penser à la sécurité et la protection des informations personnelles de nos chères têtes blondes accros à Facebook et à Internet, c'est quand même vital (rappelez vous Luc Chatel et sa volonté de faire fermer les comptes Facebook des élèves harceleurs).
Tout récemment, j'ai eu à auditer un jeu en ligne pour un client, et je m'attendai à un jeu super travaillé qui repose sur des standards connus (un jeu en HTML5/CSS3/JS comme l'excellent CutTheRope). Mais non, je me suis retrouvé face à un jeu basé sur Flash et la technologie Flex. Si vous êtes un lecteur régulier de ce blog, vous devez savoir que les applications Flash ne me rebuttent pas, bien au contraire !
La prise en main du jeu est simple, mais le dialogue avec le serveur de jeu reste très obscur (car il s'agit d'un MEUPORG, bien sûr). D'après les captures effectuées, les données respectent le format Action Message Format (AMF) défini par Adobe, j'y avais déjà touché à l'époque des débuts de Deezer mais je suis loin d'en être un grand fan. Après de plus amples recherches, j'ai découvert qu'il s'agissait d'une application Flex, dialoguant avec plusieurs serveurs de jeu via de l'AMFRPC, un protocole activement employé par Flex. J'ai donc du m'équiper.
1. Outillage
Pour analyser des applications Flash, rien de mieux qu'un décompilateur Flash de renom. Pour ma part, je n'utilise pas Flare car incompatible avec les dernières versions de Flash, mais son pendant payant et pour Windows SWFDecompiler de Sothink. Cet outil reste LA référence dans le domaine, et permet de désassembler (presque) toutes les applications Flash. A cela s'ajoute la suite SWFTOOLS, bien pratique pour extraire des informations d'applications Flash (des ressources notamment).
Pour le proxy web, j'ai opté pour Charles Web Proxy. Il s'agit encore une fois d'un outil pour Windows, mais vu que de toute façon j'utilise déjà SWFDecompiler ... Charles Web Proxy permet de faire ce que tout bon proxy web transparent doit normalement savoir faire: espionner les requêtes, autoriser des points d'arrêt et surtout être capable de décoder et d'encoder les données selon plusieurs formats, dont l'AMF. On pourrait aussi employer Burp, qui possède la même fonctionnalité.
Pour terminer, la bibliothèque Python PyAMF permet de coder rapidement des clients AMFRPC en Python, très pratique dans notre cas.
Muni de ces outils, il est alors aisé d'intercepter les appels AMFRPC, de les analyser et de comprendre le fonctionnement global du service distant.
2. Flex, services et méthodes
Les applications Flex reposent sur des endpoints dans lesquels des services sont exposés, qui implémentent des méthodes que l'application Flash peut appeler à distance. Il s'agit ici de ce qu'on appelle couramment un système d'appel de procédure distante, ou Remote Procedure Call (RPC). Ce système de service est très courant, et permet d'offrir plusieurs services sur un seul point de connexion (ou endpoint.
Du point de vue d'un pentester, un service Flex est une grosse boîte noire possédant des services qui implémentent des méthodes, qu'il va falloir découvrir. Pour cela, plusieurs solutions sont envisageables:
Le dernier point est un peu plus ardu, car nécessite le développement d'un client AMFRPC dédié. Les deux premières méthodes sont donc préférables. J'ai ainsi débuté mon analyse par une décompilation du fichier SWF contenant le coeur de l'application. Et les ennuis ont commencés: SWFDecompiler plante lâchement durant l'analyse, et impossible donc d'obtenir le code de l'application. J'ai fait de nombreuses tentatives, avec différents logiciels, sans succès. Il semblerait que SWFDecompiler ait montré ses limites. Cela signifie-t-il qu'il est impossible d'extraire quoique ce soit de ce fichier ? Que nenni (© Tixlegeek)
2.1. Flasm + strings + grep = FTW (plan B)
N'ayant pas la possibilité de désassembler l'application, le plan B consiste à extraire directement du fichier les chaînes de caractères et à essayer de déduire les services des informations s'y trouvant. Avant toute chose, on fait appel à la commande file pour identifier le type d'application:
$ file ZOMFG.swf ZOMFG.swf: Macromedia Flash data (compressed), version 10
Il s'agit d'une application Flash >=10 compressée. Autrement dit, rien ne sert de grepper directement le contenu du fichier, c'est compressé. Il nous faut donc décompresser ce fichier, grâce à flasm:
$ flasm -x ZOMFG.swf ZOMFG.swf successfully decompressed, 7958828 bytes $ file ZOMFG.swf ZOMFG.swf: Macromedia Flash data, version 10
Il est ensuite trivial d'extraire les chaînes de caractères avec strings, et de grepper le résultat à la recherche d'éléments intéressants:
$ strings ZOMFG.swf > ZOMFG.txt $ grep ZOMFG.txt -e "some keywords here"
Il est aussi possible d'utiliser vim et ses recherches par motif, ou autre.
2.2. Analyse de flux
L'analyse de flux est relativement simple à réaliser grâce à Charles Web Proxy: celui-ci parse vraiment bien les messages AMF mais n'affiche pas tout (comme par exemple certaines listes), cependant cela reste un compagnon de choix ! Cette analyse de flux permet de mettre à jour un certain nombres de services, ainsi que de méthodes.
Il suffit d'utiliser l'application, et de noter les différents services et les méthodes associées. De plus, il peut être intéressant de repérer les différents messages et les champs associés, afin d'envisager des attaques par rejeu par la suite.
Le champ destination contient la référence au service, ici appelé "SMC". Le champ operation décrit la méthode à appeler, en l'occurrence "ExecuteServerCall".
{2.3. Enumération des {services et des méthodes associées}}
Cette dernière possibilité repose sur les résultats produits par les deux étapes précédentes: à l'aide de la première analyse, on établit une liste potentielle de services et de noms de méthodes, puis à l'aide d'un client AMFRPC maison, on teste la validité des services puis on détermine les méthodes existantes à partir des services identifiés.
Cette technique permet de déterminer de manière plus efficace les services et les méthodes associées, et permet de trouver dans certains cas des éléments non-présents dans l'application. J'ai développé dans le cadre de ce test d'application un outil semblable à DeBlaze, mais permettant de tester un service Flex distant (et aussi beaucoup moins poussé). Cet outil repose sur la bibliothèque Python PyAMF, et tente de déterminer les services offerts par un endpoint donné. Cela suppose que l'on connaisse le nom de cet endpoint, qui peut être trouvé via les deux méthodes précédentes.
Je ne peux pas dévoiler le code source de cet outil dans ce post (ooooh!), car il est soumis à des règles relativement strictes de confidentialité, propres à Sysdream. Cependant, l'algorithme de base est le suivant (aaaah !):
Pour chaque nom de service probable:
resultat = tenter un appel à la méthode Trololololo
Si pas d'erreur d'invocation:
Affiche 'Service: ' + service
Pour chaque méthode probable:
resultat =appeler la méthode 'methode' du service
Si aucune erreur d'invocation ni message de méthode non trouvée:
Affiche '- Methode:' + methode
De cette manière, on teste l'ensemble des services possibles et des méthodes probables. On peut aussi envisager des combinaisons de nom, des changement de casse, etc ... A noter que la référence à l'endpoint est obligatoire dans les headers Flex.
3. Sessions Flex
Lors de mes tests, j'ai été rapidement rejeté par le service Flex à cause des sessions. En effet, les applications Flex font appel à une gestion de session en Java (donc un cookie JSESSIONID par défaut), et il faut gérer ce cookie dans le client AMF pour pouvoir maintenir une session correcte. De même, l'envoi des requêtes via des "messages" AMF est basé sur une numérotation qui est continuellement incrémentée. Celle-ci doit aussi être maintenue par notre client AMF.
Lors des tests, et tout particulièrement lors des tests fonctionnels, les sessions sont primordiales et bien souvent mises de côté par les outils qui ne font pour la plupart que des tests unitaires. Ce qui impose dans bien des cas l'implémentation d'un client Flex maison prenant en charge ces sessions, quand il n'y a pas d'autres éléments de cookie à prendre en compte, bien sûr.
4. Conclusion
Les tests d'applications Flex se rapprochent fortement des tests de services web, car au fond le système Flex n'est rien d'autre qu'un service web basé sur AMF (au lieu des services SOAP que l'on retrouve souvent). Sans les possibilités de découverte des services et méthodes offertes par WSDL. Je pense avoir fait le tour des principaux soucis rencontrés durant le test de ce type d'application, même si le cas évoqué ici était un brin récalcitrant. D'ailleurs à ce jour, je n'ai pas trouvé de logiciel de décompilation permettant de décompiler ce satané SWF. Si quelqu'un a une idée (ou une révélation divine), me contacter via twitter ou via gmail.