dimanche 4 septembre 2011

Les transformations “XSLT” fournissent toujours de précieux services!

Je me suis retrouvé, il y a quelques mois de cela, avec un fichier “xml” contenant toutes les informations dont j’avais besoin, ou presque, pour pouvoir initialiser ma base de données.

Il ne me restait plus qu’à programmer un petit “wrapper” de XML vers SQL. Et avant de me lancer dans des développements avec mon language préféré C#, je me suis souvenu qu’il existait un language de transformation de XML, appelé XSLT, qui permettait de transformer un fichier “xml” en de nombreuses autres choses dont html, doc, pdf, wml et bien d’autres choses encore.

Alors pourquoi ne pas utiliser XSLT pour transformer mon fichier XML en fichier SQL que je n’aurais alors plus qu’ à importer dans ma base de données préférée.

Pour information, il existe plusieurs languages de requêtage XML dont XQUERY et XPATH.

Pour faciliter nos manipulations de XML nous allons utiliser une version d’évaluation d’un excellent outil appelé Altova XMLSpy qui nous permet de créer et tester nos requêtes avant de les appliquer à notre fichier “xml” source et produire notre fichier “sql” destination.

xmlspyaltova


Description du contexte

En observant le fichier “xml” source on note qu’il contient 2 catégories d’objets qui nous intéressent plus particulièrement: l’objet “Computer” et l’objet “User”. On constate que le champ “computerid” nous manque dans le fichier “xml” source pour permettre la création de l’objet “Computer” dans la table '”Computer” de la base de données. De même un champ “guid” nous manque pour permettre de créer un objet “User” dans la table “User” de la base de données.

Dans le fichier “xml” source, le paramètre “UserID” de l’objet “Computer” correspond au paramètre “UserID” de l’objet “User” auquel il appartient.

Dans la base de données, la valeur du “guid” de l’objet “Computer” doit avoir la valeur du “guid” de l’objet “User” auquel l’objet “Computer” appartient.

Le paramètre “computerid” de la la table “Computer” est initialisé à une valeur unique incrémentée à partir de 200.

Le paramètre “guid” de la la table “User” est initialisé à une valeur unique incrémentée à partir de 100.

Création des fichiers "xsl"


La première étape consiste à créer le(les) fichiers “xsl” décrivant la(les) transformation(s) à effectuer.

Commençons par écrire le fichier “guid_generator.xsl” ci-dessous permettant de créer le champ “guid” pour l’objet “User”:

<xsl:stylesheet version="1.0" xmlns:xsl="
http://www.w3.org/1999/XSL/Transform">

<xsl:variable name="guid" select="100"/>
<xsl:template match="@*node()">
<xsl:copy>
<xsl:apply-templates select="@*node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="User">
<User>
<xsl:apply-templates select="@* *"/>
<guid>
<xsl:choose>
<xsl:when test="not(preceding-sibling::*)">
<xsl:value-of select="$guid"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$guid + count(preceding-sibling::*)"/>
</xsl:otherwise>
</xsl:choose>
</guid>
</User>
</xsl:template>

Le champ “guid” est initialisé à 100. Puis on copie simplement le contenu du fichier source; et si l’objet XML est “User” alors on ajoute aux champs existants, un champ “guid” auquel on donne une valeur initiale (i.e. 100) à laquelle on ajoute le nombre d’objets “User” que l’on vient de parcourir. Simple et efficace!

Il ne nous reste plus qu’à transformer le fichier généré précédemment en fichier “sql” en créant le fichier “insert_generator.xsl” ci-dessous. On profite cependant de cette transformation pour donner une valeur au champ “computerid” nécessaire à la création de la table “Computer” (cette valeur est initialisée à 200):

<xsl:stylesheet version="1.0" xmlns:xsl="
http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text"/>
<xsl:variable name="computerid" select="200"/>
<xsl:template match="/">
<xsl:apply-templates select="//ComputerList"/>
<xsl:apply-templates select="//UserList"/>
</xsl:template>
<xsl:template match="User">
<xsl:text>INSERT INTO USER"("GUID", …, "MODIFDATE")
VALUES(</xsl:text>
<xsl:value-of select="./guid"/>
<xsl:text>,'</xsl:text>
<!—…-->
<xsl:text>SYSDATE);&#xA;</xsl:text>
</xsl:template>
<xsl:template match="Computer">
<xsl:param name="temp"><xsl:value-of select="./UserID"/></xsl:param>
<xsl:text>INSERT INTO COMPUTER"("COMPUTERID","GUID",…, "MODIFDATE")
VALUES(</xsl:text>
<xsl:choose>
<xsl:when test="not(preceding-sibling::*)">
<xsl:value-of select="$computerid"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$computerid + count(preceding-sibling::*)"/>
</xsl:otherwise>
</xsl:choose>
<xsl:text>,</xsl:text>
<xsl:value-of select="//UserList/User[UserID=$temp]/guid"/>
<xsl:text>,'</xsl:text>
<!—…-->
<xsl:value-of select="./ExpirationDate"/>
<xsl:text>');&#xA;</xsl:text>
</xsl:template>
</xsl:stylesheet>

Comme dit précédemment, notons qu’un objet “Computer” est associé à un objet “User” dans le fichier source “xml” au travers du paramètre “UserID”. La valeur du paramètre “UserID” de l’objet “Computer” courant est sauvegardée dans un paramètre appelé “temp” afin de permettre la récupération du “guid” correspondant à l’objet “User” ayant un “UserID” correspondant à “temp”, car c’est ce “guid” là qui doit être associé à l’objet “Computer” courant. Est-ce clair! Oui, bon on continue…

Les fichiers “xsl” nécessaires à nos transformations sont enfin écrits. Il ne nous reste plus qu’à installer notre parseur XML préféré, j’ai nommé Xalan installé sous C:\.

La génération du fichier “sql” se passe en 2 étapes:

cd C:\xalan-j_2_7_1
java -classpath "C:\xalan-j_2_7_1\xalan.jar";"C:\xalan-j_2_7_1\xercesImpl.jar";"C:\xalan-j_2_7_1\serializer.jar";"D:\xalan-j_2_7_1\xml-apis.jar" org.apache.xalan.xslt.Process -IN input.xml -XSL guid_generator.xsl -OUT output.xml
pause
java -classpath "C:\xalan-j_2_7_1\xalan.jar";"C:\xalan-j_2_7_1\xercesImpl.jar";"C:\xalan-j_2_7_1\serializer.jar";"D:\xalan-j_2_7_1\xml-apis.jar" org.apache.xalan.xslt.Process -IN output.xml -XSL sql_insert_generator.xsl -OUT output.sql
pause

La première étape permet de prendre le fichier “xml” source appelé “input.xml” et le transformer en un autre fichier “xml” appelé “output.xml” contenant également un champ “guid” incrémenté. Ce champ est nécessaire pour insérer l’objet “User” dans la table “User”. C’est le fichier “guid_generator.xsl” qui permet cette transformation.

La deuxième étape prend en entrée le fichier “output.xml” et le transforme en “output.sql”. C’est le fichier “insert_generator.xsl” qui permet cette transformation. Il permet également de créer un champ “computerid” et de lui donner une valeur unique pour permettre la création de l’objet “Computer”' dans la table “Computer” de la base de données.

Le tour est joué!

Note
: pour des raisons de confidentialité vous ne trouverez pas les fichiers “input.xml”, “output.xml” et “output.sql”. Mais je suis à votre entière disposition pour répondre à toutes questions!

samedi 3 septembre 2011

Etre anonyme sur internet avec Tor!

J’ai longtemps utilisé Sockschain pour mon anonymat sur internet. Mais à cette époque là, mon problème principal était de trouver des proxy actifs et fiables. Tor fait tout ça à votre place.

Vous pouvez télécharger Tor à l’URL suivante: https://www.torproject.org/download/download.html.en#Windows. Personnellement j’utilise la version stable appelée “Stable Vidalia Bundle works with Windows 7, Vista, XP”.

Ce package contient:
  • L’application Tor
  • Vidalia, l’interface graphique pour Tor
  • Torbutton, le “add-on pour votre Firefox
  • Polipo, le proxy web utilisée par Tor

Une fois l’installation terminée (voir l’URL suivante pour une description détaillée de l’installation: https://www.torproject.org/docs/tor-doc-windows.html.en, vous pouvez ouvrir le panneau de contrôle de Vidalia.

2011-06-18_1851

Si vous passez par un service mandataire vous devez, bien entendu, préciser son adresse IP et son port.

2011-06-18_1853

Par défaut la configuration de Tor permet d’aider les personnes (ayant un FAI qui interdit l’utilisation de Tor) à transiter par votre passerelle dont l’adresse est publiée automatiquement. Ces utilisateurs peuvent être chinois par exemple… A vous de voir!

2011-06-18_1853_001

L’activation et la désactivation du Torbutton, le ”add-on” Tor pour Firefox, se font en cliquant sur l’icône représentant un oignon.

2011-06-18_1857

Par défaut le “add-on” Firefox est configuré comme indiqué ci-dessous. On accède à cette configuration par “Firefox / Modules complémentaires / Extensions / Torbutton 1.3.3-alpha / Options

2011-06-18_1856

Lorsque votre configuration est terminée et votre “add-on” actif, vous pouvez vérifier que tout fonctionne convenablement avec le lien: https://check.torproject.org/

Si vous obtenez la page ci-dessous, vous êtes prêts pour l’anonymat. L’adresse IP affichée ici est une adresse américaine (from San Francisco).

2011-06-18_1916

Bien sûr l’anonymat à un prix, la performance!

dimanche 7 août 2011

Quand le Social Engineering vient en aide au marketing…

Préparer une campagne de mails nécessite d’avoir une bonne base d’adresses email. Mais ces bases sont souvent très, voire trop chères.

Alors lorsque l’on ne dispose pas des budgets suffisants on peut utiliser le système “D”.

Dans ce qui suit nous allons présenter 2 approches (il en existe certainement beaucoup d’autres), l’utilisation d’un outil au nom évocateur (en version gratuite) appelé EmailExtractor et le bon vieux “whois”.

EmailExtractor peut être téléchargé à l’URL suivante: http://emailextractorpro.com/download.html. Vous pouvez entre autres choses pour récupérer les adresses email d’un site web particulier ou encore pour récupérer les adresses email liées à un ou plusieurs mot clefs.


Récupérer les adresses email sur un site web

Dans l’onglet “Web site” vous pouvez saisir le nom du site web pour lequel vous souhaitez rechercher les adresses email et vous cliquez sur “Start”. Nous obtenons:

ScreenShot168

Récupérer les adresses email associées à un mot clef

Faisons le test avec le mot iPhone pour créer une base d’adresse des possesseurs d’iPhone (ou tout du moins les personnes intéressées par l’iPhone)

Dans l’onglet “Search engine” vous pouvez saisir le mot clef pour lequel vous souhaitez rechercher les adresses email et vous cliquez sur “Start”. Et nous obtenons:

ScreenShot172

Selon Wikipedia, “Whois” est un service de recherche fourni par les registres Internet, par exemple les Registres Internet régionaux (RIR) ou bien les registres de noms de domaine permettant d'obtenir des informations sur une adresse IP ou un nom de domaine.

Il existe de nombreuses manières d’utiliser la fonctionnalité “Whois”. J’ai personnellement un faible pour le site Geektools à l’URL: http://www.geektools.com/whois.php

Faisons un test sur le site “ergologic.fr” (par ailleurs excellent spécialiste de l’utilisation des outils informatiques et bureautiques)

ScreenShot171

Nous obtenons le résultat ci-dessous contenant:

  • l’adresse de l’organisation
  • l’adresse email de l’administrateur
  • le numéros de téléphone

Les informations que nous obtenons par ce biais sont parfois très surprenantes, et permettent de créer une base d’adresses avec de vrais personnes et non pas des adresses génériques augmentant ainsi le succès de notre campagne marketing.

ScreenShot169

Nous avons un très bonne exemple de ce qu’il aurait fallu faire lors de l’enregistrement DNS pour éviter la récupération de ce type d’informations avec le domaine “agarri.fr” (excellent spécialiste de la sécurité offensive).

On note en particulier le “WARNING” indiquant que le propriétaire du site a choisi l’anonymat. On remarque également le nom du contact: “Ano Nymous”.

ScreenShot170

Bonne campagne !

samedi 6 août 2011

Générer des mots de passe intelligents avec Cupp!

En jouant avec ma “Backtrack 5” j’ai découvert le générateur de mots de passe dont je rêvais.

Pourquoi générer des mots de passe, me direz-vous ? Eh bien pour faire une attaque “brute force” bien sûr. Mais vous allez alors me dire qu’il existe “pléthore” de générateurs de ce type. Oui! Mais Cupp est différent.

Cupp intervient dans le cadre d’une attaque de type SE (Social Engineering”). Imaginons que vous faites l’audit de la sécurité d’une entreprise et que vous souhaitez vérifier la politique de gestion des mots de passe. Vous pouvez alors commencer par récupérer toutes les informations laissées par les employés de l’entreprise sur leurs réseaux sociaux préférés, puis identifier vos cibles (les plus bavards et les moins prudents). Vous allez ensuite donner ces informations à Cupp qui en retour vous génèrera la liste des mots de passe les plus probables pour vos cibles. Et vous êtes alors sur la voie de la réussite de votre démonstration!

Regardons de plus prêt ce fameux Cupp!

Cupp requière les informations suivantes sur votre cible, sa femme, leur enfant et leur animal domestique préféré:

  • nom
  • prénom
  • surnom
  • date de naissance
  • des mots clefs

Sur cette base, Cupp génère des mots de passe, en concaténant ces informations, en ajoutant des nombres, des caractères spéciaux et en inversant les lettres.

Mais la fonctionnalité dont je rêvais est la suivante, le remplacement de certains caractères par des chiffres comme par exemple la lettre “o” par le chiffre “0”.

Pour être plus précis j’aurais souhaité pouvoir remplacer certaines lettres par des caractères spéciaux comme par exemple la lettre “a'” par “@”. Avec un peu de configuration, Cupp le permet également.

Dans ce qui suit nous allons décrire les quelques opérations qui permettent la génération de ce type de mots de passe.

Il est simplement nécessaire de modifier le fichier de configuration “cupp.cfg”. Dans la section “Leet”, on remplace les voyelles par les caractères de notre choix:

[leet]
a=@
i=!
e=e
t=t
o=0
s=s
g=g
z=z

Et on modifie la longueur maximale du mot de passe:

wcto=15

Puis lançons la commande (on remarque au passage que Cupp est écrit en Python):

>./cupp.py –i

Et nous saisissons nos données comme dans l’exemple ci-dessous:

2011-06-18_2022

Note: il est nécessaire de répondre “Yes” à la question concernant le mode “Leet” (c’est ce mode qui permet le remplacement de certaines lettres en fonction de notre configuration). Et nous obtenons la liste de mots de passe souhaités:

2011-06-18_2104

Merci Cupp!

Partager avec...