Get Adobe Flash playerPlugin by wpburn.com wordpress themes

Archive for the “Développement” Category

Dans le précédent article nous avions présenté le scripting de plugins NSE pour Nmap à l’aide d’un exemple simple autour de requètes HTTP.

Afin de simplifier la présentation nous nous étions appuyé sur une lib fournie avec Nmap, la lib http qui nous a permis de passer nos requètes get très simplement avec


data = http.get( host, port, '/index.php' )

Mais on triche un peu, c’est trop facile. Dans cet article nous allons approfondir un peu en voyant ce qui vous sera essentiel pour écrire n’importe quel plugin : une façon plus brute et générale d’établir une connexion avec un service et de lui envoyer des requètes.

Read the rest of this entry »

Comments No Comments »

Nmap offre la possibilité à l’utilisateur de créer ses propres plugins avec le moteur de scripts NSE.

Ces scripts sont écrits en LUA, un language interpreté relativement simple à aborder en tout cas pour les besoins de la création d’un plugin NSE.

C’est ce que nous allons faire aujourd’hui en voyant de quelle façon est structuré un plugin NSE et comment il interragit avec Nmap.

On va s’appuyer pour cela sur un cas concret, la création d’un plugin dont le but est de rechercher une faille LFI (local file include) sur un site Web.

Read the rest of this entry »

Comments 5 Comments »

boost::variant<Boire, Conduire>

boost::variant<Boire, Conduire>

N’avez-vous jamais rêvé d’avoir un type qui permettrait de représenter l’alternative entre deux types A et B (formellement : le type somme de A et B), dans le genre AouB, mais sans devoir tout coder vous-même ? L’utilité ? Si le ministère de la santé devait vous donner un type C++ lorsque vous allez à une soirée qui s’annonce arrosée, ils vous donneraient le type BoireouConduire ! Bon, les programmeurs chevronnés venant du C vont prétendre que les unions remplissent ce rôle ; ce n’est pas faux, sauf que ces dernières ne sont pas très sûres et l’on peut très vite être amené à des comportements anormaux. Vous rêviez d’avoir de vrais types somme en C++, avec une vraie sûreté d’utilisation et bien ancré dans le système de type ? Comme d’habitude, Boost l’a fait.

Read the rest of this entry »

Comments 1 Comment »

multithreadingIl n’est plus rare à notre époque de voir des particuliers lambdas posséder des machines quadri-cores. Cependant, l’exploitation de ces ressources est un domaine à part entière : La programmation concurrente.

En vérité, l’objectif de la programmation concurrente est double :

1) Utiliser les nouvelles ressources de nos ordinateurs actuels et futurs, qui s’orientent vers la démultiplication des unités de calcul
2) Diviser la logique de son programme. Pour étayer ce point nous pouvons prendre l’exemple d’un lecteur vidéo dans lequel une tâche serait chargée de lire la vidéo alors qu’une autre aurait pour rôle « d’écouter » les évènements de l’interface graphique.

Cet article a pour but de vous présenter les problématiques de base de la programmation concurrente ainsi que l’un des outils disponibles en C++ : Boost.thread. Voyez le comme un matériau élémentaire pour aborder le sujet en douceur.

Read the rest of this entry »

Comments 6 Comments »


Pour mon premier post ici, je vais présenter les classes de traits, technique de base liée aux templates du langage C++. En utilisant une classe de traits dans du code template, on délègue une partie du travail à cette dernière.

Read the rest of this entry »

Comments No Comments »

      Après une standardisation du web avec XML, ce dernier révolutionne les protocoles RPC. La grande mode des Web Services : du RPC à base de XML avec le protocole de référence SOAP. Comme d’habitude, les avantages de XML sont vantés : simplicité, extensibilité, et indépendance par rapport aux technologies sous-jacentes. Toutefois, la vitesse peut également être un facteur déterminant dans le choix d’un protocole, et c’est là que commencent les ennuis pour XML …

      Il est donc question dans ce post de comparer deux protocoles de sérialisation binaire et/ou texte : protobuf, développé par Google et utilisé dans la majorité de ses protocoles RPC, et Boost, bibliothèque logicielle de référence en C++ étant donné qu’une partie de celle-ci composera la STL de la prochaine norme C++, j’ai nommé C++1x. Read the rest of this entry »

Comments No Comments »

      Firefox stocke depuis quelques versions les mots de passe enregistrés dans une base de données SQLite dont le nom est signons.sqlite, plutôt que dans un fichier au format texte, comme précédemment (signons2.txt, signons3.txt). En ce qui concerne le chiffrement, il s’agit de 3DES en mode EDE, et la clé se trouve dans le fichier key3.db.

      Bref, pour déchiffrement et obtenir tout ça, il nous faut utiliser l’API PKCS#11 ainsi que NSS (Network Security Services), une bibliothèque cryptographique développée par Mozilla et bien évidemment utilisée par Firefox. Rapidement, en commençant le développement de ce petit bout de code qui me semblait trivial au départ, j’ai remarqué que la difficulté … ne venait étrangement pas du code en lui même, mais de l’API NSS de Mozilla qui est très peu documenté (second lien avec comme mot clé “nss api” sur Google : “NSS API is lack of doc | Linux Developer Network” …). Au final j’ai donc préféré sortir Ollydbg et faire un peu de reverse engineering sur un outil closed source qui récupérait ces identifiants à des fins malicieuses. En dehors de ces bibliothèques pour le côté crypto, il nous faudra utiliser SQLite afin de lire le fichier signons.sqlite.

Voici le schéma de la table moz_logins qui nous intéresse :

  1.  
  2. CREATE TABLE moz_logins (id INTEGER PRIMARY KEY,
  3.                          hostname TEXT NOT NULL,
  4.                          httpRealm TEXT,
  5.                          formSubmitURL TEXT,
  6.                          usernameField TEXT NOT NULL,
  7.                          passwordField  TEXT NOT NULL,
  8.                          encryptedUsername TEXT NOT NULL,
  9.                          encryptedPassword TEXT NOT NULL,
  10.                          guid TEXT,
  11.                          encType INTEGER);
  12.  

Et voici le code C (avec une légère utilisation de l’API Win32) permettant de récupérer tous ces jolis identifiants :
Read the rest of this entry »

Comments 2 Comments »

      Voici la version finale du gestionnaire de mot de passe basé sur AES-256 dont j’ai commencé le développement avant cet été. Adieu la GUI avec l’API Win32, j’ai décidé qu’il valait mieux utiliser un widget toolkit pour des raisons esthétiques et pratiques (autant au niveau du développement que de l’utilisation). J’ai donc choisi Qt, principalement à cause de mon expérience avec cette bibliothèque.

      En ce qui concerne les nouvelles fonctionnalités, se trouvent toutes celles qui étaient cruciales et non-implémentées dans la dernière version par manque de temps : suppression et édition d’entrées, modification de la clé privée, etc. De plus, j’ai conçu l’interface graphique afin de pouvoir l’utiliser rapidement. Un timeout de 10secondes est aussi fixé lorsque l’on copie le mot de passe dans le presse-papiers, pour des raisons de sécurité. Bref, n’hésitez pas à me rapporter les bogues existants, ainsi que vos critiques / remarques.

      Je tiens aussi à remercier 0vercl0k pour ses propositions de fonctionnalités supplémentaires et ses tests. Au passage, un challenge plutôt atypique mais très enrichissant est actuellement disponible sur son blog : l’exploitation d’un stack-based buffer overflow … au sein de son système d’exploitation ! A exploiter, ou au moins tenter ;)

Read the rest of this entry »

Comments 5 Comments »

      TinyPasswordManager est un gestionnaire de mot de passe Open Source et (bientôt) multiplate-forme. Basé sur le chiffrement AES avec clé de 256bits, je l’avais initialement développé pour un usage personnel. L’objectif initial est d’obtenir un gestionnaire simple, c’est-à-dire n’utilisant pas de bibliothèques, et sécurisé. Pour l’instant, seule la version pour Windows est dévelopée entièrement, avec GUI. En ce qui concerne la version pour les systèmes dérivés d’UNIX, je prévois de poster d’ici peu de temps la version ligne de commande, puis, par la suite, envisager le développement d’une GUI avec QT ou GTK.

      Pour les spécifications “techniques”, la passphrase choisie par l’utilisateur est hashée avec SHA256. Le hash obtenu est utilisé comme clé AES. En ce qui concerne la méthode de padding, j’ai opté pour la technique décrite dans la norme ISO 10126, à savoir le remplissage avec des octets aléatoires, en spécifiant la taille du bourrage dans le dernier.

      Enfin, le mode d’opération d’AES utilisé est CBC. Pour rappel, avec un chiffrement en mode ECB, tous les blocs sont indépendants : chaque bloc est simplement chiffré avec la clé. Cela pose quelques soucis en matière de confidentialité car deux mêmes blocs auront un résultat chiffré identique, ce qui n’est pas le cas avec CBC, mode utilisé en général dans lequel chaque bloc est XORé avec le bloc chiffré précédent, puis chiffré.

Je mets à disposition le binaire ainsi que les sources :

Read the rest of this entry »

Comments 5 Comments »

      Comment mettre des données dans le presse-papiers à partir d’un programme en console sous GNU/Linux ? Voici le problème que j’ai rencontré il y a peu de temps alors que je développais une application sans interface graphique en C. M’attendant à une solution triviale étant donné la simplicité du besoin, j’ai été surpris de ne pas trouver de réponse sur Google, malgré des recherches plutôt poussées.

      En effet, sous Windows par exemple, le snippet suivant suffit à placer une chaîne de caractères dans le presse-papiers :

  1.  
  2. char str[] = "chaine à copier";
  3.  
  4. HGLOBAL hText = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, sizeof(str));
  5. char *pText = (char *)GlobalLock(hText);
  6. strcpy(pText, str);
  7. GlobalUnlock(hText);
  8.  
  9. OpenClipboard(NULL);
  10. EmptyClipboard();
  11. SetClipboardData(CF_TEXT, hText);
  12. CloseClipboard();
  13.  
  14. GlobalFree(hText);
  15.  

Sous GNU/Linux, c’est assez différent et malheureusement plus complexe à mettre en oeuvre. Tout d’abord, il est nécessaire de connaître les points suivants :

  • En plus du presse-papiers, est accessible sous GNU/Linux un tampon de sélection primaire (accessible avec le bouton du milieu de la souris), ainsi qu’un tampon de sélection secondaire (généralement non-modifiable directement par l’utilisateur).
  • C’est le serveur X qui gère les mécanismes liés à ces tampons.
  • Le serveur X n’alloue pas un tampon mémoire général accessible à toutes les applications graphiques, mais le contenu des sélections et du presse-papiers sont communiqués entre clients (communication peer-to-peer).

Read the rest of this entry »

Comments 3 Comments »