Affichage des articles dont le libellé est hack. Afficher tous les articles
Affichage des articles dont le libellé est hack. Afficher tous les articles
12/12/2008

Création d’un keygen (générateur de clés) à partir d’un algorithme

Il y a quelques jours, j’ai travaillé sur la sécurité d’une application web. Cette dernière demandait à l’utilisateur de payer une licence afin de faire disparaitre le texte “version demo”. Je montrerai le travail de recherche et d’analyse du code PHP et Javascript la semaine prochaine, pour le moment intéressons nous à la création d’un keygen (générateur de clé) à partir d’un algorithme donné. Je précise une fois de plus que cet article a pour but de faire “découvrir” une petite partie de la “sécurité informatique” et non d’inciter au piratage.

 

Rappel sur les keygens :

Un générateur de clés, aussi appelé keygenerator ou tout simplement keygen, est un logiciel générant des numéros de série afin d'installer/déverrouiller/lancer une application.

Un générateur de clés a deux moyens pour trouver une clé-cd valide : la méthode brute force et la méthode qui consiste à reconstituer l'algorithme utilisé par la société éditrice du logiciel.

Source Wikipedia

J’en profite aussi pour préciser les expressions algorithmiques utilisées dans cet article :

  • POS(X) : retourne le caractère à la position X, en partant de 0, d’une string quelconque.
  • X MOD Y : retourne X modulo Y
  • LEN(STR) : retourne la longueur d’une string

Les postulats sur lesquels nous nous baserons :

  • On se basera sur la string DK suivante (si quelqu’un connait le nom technique je suis intéressé) : 123456789ABCDEFGHJKLMNPQRSTUVWXYZ
  • La clé (licence key) que doit entrer l’utilisateur est de 11 caractères ou plus.
  • Nous comptons, pour les positions de caractère par exemple, à partir de 0.

Une fois la clé de licence spécifiée, le programme va effectuer les traitements suivants afin de définir la validité d’une clé :

  • Création d’une seconde clé (clé temporaire/intermédiaire à partir de la clé de licence entrée par l’utilisateur) sous la forme : [11][0][8][12]
    • [11] est la caractère en 11ème position de la licence originale
    • Si la licence originale est ZK5JC9EO6IEGP alors la clé intermédiaire sera GZ6P
  • On vérifie à partir de cette clé intermédiaire que :
    • Le modulo de la position du second caractère sur DK est différent de 1. On trouvera alors [0] c’est à dire le caractère en 0ème position de notre clé de licence finale.
      • Par exemple pour 12 :
      • 12 MOD 5 = 2 //12 est valide (modulo différent de 1) on cherche donc le caractère correspondant
        POS(12) = C //C est donc un caractère possible en position 1 pour notre clé intermédiaire et en position 0 pour notre clé finale
        [0] = C
    • On prends aléatoirement les positions des 0ème et 2ème caractères sur DK
    • La position du 3ème caractère doit être égale à (j'ai décomposé le code pour une lecture plus aisée) :
      • X = POS([11]) + POS([8]) //on additionne les positions sur DK de 0ème et 3ème caractère
        X *= 9
        X = X Mod (Len(DK) - 1) //on repositionne X sur DK
        [12] = POS(X) //le 3ème caractère de notre clé intermédiaire est donc à la position X sur DK

L’idée est donc de générer aléatoirement des licences qui correspondent à cet algorithme. Voici un code VB6 permettant de résoudre cette problématique :

Randomize '(re)initialisation du moteur de nombre aléatoire
Dim dK as String
dK = "123456789ABCDEFGHJKLMNPQRSTUVWXYZ"
Dim sr(12) As String 'clé de licence finale que nous allons générer

'#########################################
' Traitement sur la clé intermédiaire
'#########################################

Dim tmp0, tmp1, tmp2, tmp3 As Integer

'Recherche du 2ème caractère
tmp = 1
Do While ((tmp Mod 5) = 1)
tmp = rand(1, Len(dK))
Loop
sr(1) = Mid(dK, tmp, 1)

'On créé le 0ème & 2ème caractère
tmp0 = rand(0, Len(dK) - 1)
tmp2 = rand(0, Len(dK) - 1)

sr(0) = Mid(dK, tmp0 + 1, 1)
sr(2) = Mid(dK, tmp2 + 1, 1)

'Le 3ème caractère doit être égal à
tmp3 = tmp0 + tmp2
tmp3 = tmp3 * 9
tmp3 = tmp3 Mod (Len(dK) - 1)
sr(3) = Mid(dK, tmp3 + 1, 1)

'#########################################
' On en déduit ensuite la clé finale
'#########################################

'Ordre : [11][0][8][12]
sr(11) = sr(0)
sr(0) = sr(1)
sr(8) = sr(2)
sr(12) = sr(3)

sr(1) = Mid(dK, rand(1, Len(dK)), 1)
sr(2) = Mid(dK, rand(1, Len(dK)), 1)
sr(3) = Mid(dK, rand(1, Len(dK)), 1)
sr(4) = Mid(dK, rand(1, Len(dK)), 1)
sr(5) = Mid(dK, rand(1, Len(dK)), 1)
sr(6) = Mid(dK, rand(1, Len(dK)), 1)
sr(7) = Mid(dK, rand(1, Len(dK)), 1)
sr(9) = Mid(dK, rand(1, Len(dK)), 1)
sr(10) = Mid(dK, rand(1, Len(dK)), 1)
'La clé finale = Join(sr, "")

J’utilise des variables intermédiaires et de nombreux appelles à la fonction rand. Ce code est très facilement optimisable mais j’ai préféré le décomposer afin de faire ressortir l’algorithme de base et pour que cet article soit accessible au plus grand nombre.

Si vous avez aimé cet article ou si vous avez des demandes particulières, n’hésitez pas à le faire savoir en commentaire. N’oubliez pas de vous inscrire au flux rss du blog :).

11/25/2008

Amusons-nous avec Sébastien Chabal (…ou comment “profiter” du buzz d’Orange)

Logo OrangeVous le savez peut-être, Orange vient de lancer une campagne marketing au doux nom de Chabal Le Duel. Visitez-donc le site si vous ne connaissez pas. L’idée est vraiment excellente : recevoir un appel personnalisé de Sébastien Chabal qui vous demande de l’aide pour marquer un but. En plus l’impression de réelle est augmentée par la synchronisation entre le mini-film que vous voyez à l’écran et ce qui se dit dans votre téléphone.

Avertissement : Je vois fleurir ce type de site (appel téléphonique + vidéo) depuis un bon moment. Cet article n’est que le résultat d’une (petite) réflexion que je me suis permis de me poser il y à maintenant 30 minutes. Mon but est de montrer comment il est possible de “dévier” (légèrement) l’utilisation d’une telle plateforme et en aucun cas de réaliser des actions malhonnêtes, je vous demanderai donc d’en faire autant.

 

Oui et alors ?

Alors je me suis intéressé un peu plus aux échanges client(flash)/serveur. Une fois le formulaire (où l’on doit remplir son nom, prénom, email et numéro de téléphone) envoyé ces échanges se forment et voici un résumé :

#request# GET http://as00.estara.com/OneCC/200106295512/checkPhone.php?phone1=336XXXXXXXX

(Hypothèse) : “vérification si le numéro de téléphone est correcte”, retourne le nombre d’appels envoyés vers ce téléphone par la plateforme.

 

#request# POST http://as00.estara.com/OneCC/200106295512/email.php (+ paramètres)

(Hypothèse) : page pour l’enregistrement de l'email, nom, prénom, numéro de téléphone et options diverses.

 

#request# POST http://as00.estara.com/OneCC/200106295512/mpc2.php

Paramètres :

phone1=336XXXXXXXX Numéro de téléphone au format international
&ord=0%2F5684821980666167
&name=FRANCOIS Prénom à utiliser

Ce script permet d'établir l'appel avec le numéro précisé et de spécifier le prénom que le Chabal virtuel devra employer.

Retourne :

STATUS_URL=http://paetec-2901.estara.com/vxml/contact/status.php?confid=e56978910e2936d11fae5ca9d5hh5bv6
DISCONNECT_URL=http://paetec-2901.estara.com/vxml/contact/disconnect.php?confid=e56978910e2936d11fae5ca9d5hh5bv6

 

Puis, pour garder la synchronisation entre le téléphone et la vidéo, il y a un appel récurrent de :

#request# POST http://paetec-2601.estara.com/vxml/contact/status.php

Paramètres :

nbrequest=1
&confid=e56978910e2936d11fae5ca9d5hh5bv6
&ord=0%2F5684821980666167

 

Constat après quelques tests

  • La variable ord peut être vide lors de l’appel de mpc2.php la communication avec le téléphone sera quand même effectuée
  • Si name n’est pas  dans la liste pré-enregistrée, ou s’il n’est pas défini, le Chabal virtuel dira “salut l’ami”
  • Si ord n’est pas défini, alors l’appel ne sera plus en mode inconnu mais par un numéro en 01…

Il est donc tout à fait possible d’effectuer directement une requête POST sur mpc2.php afin de lancer un appel vers un numéro de téléphone prédéfini.

 

Quels déviances sont possibles ?

Sachant ce que l’on sait maintenant il nous est possible de détourner ce système de son utilisation principale, on pourrait donc :

  • Flooder un ami…ou enemi
  • Créer un bash ou un programme qui appelle, via Curl ou autre, à intervalle régulier, via un cron par exemple, le script mpc2.php. Ce qui pourrait permettre en pratique de faire téléphoner Chabal à minuit tout les soirs à un “amis”.
  • …et sans doute d’autres détournements dont je n’ai pas l’idée à l’heure où j’écris ces lignes.

Beaucoup trop de site “full flash”, en plus du fait qu’ils ne sont vraiment pas agréable et lent (point de vue personnel) oublient l’aspect de sécurisation des données qui transitent, un simple chiffrage des valeurs serait déjà mieux.

11/21/2008

Activer les fonctionnalités cachées de Windows Seven build 6801

Continuons sur notre lancée à la découverte de Windows Seven. Aujourd’hui voyons comment débloquez en un clic les fonctions de multitouch, diaporama d’arrière plan (slideshow wallpapers) et bien plus. Cependant avant d’appliquer ce patch sauvegardez les fichiers suivant :

\Windows\Explorer.exe
\Windows\System32\wisptis.exe
\Windows\System32\ieframe.dll
\Windows\System32\shell32.dll
\Windows\System32\stobject.dll
\Windows\System32\TabletPC.cpl
\Windows\System32\themecpl.dll
\Windows\System32\themeui.dll
\Windows\System32\powercfg.cpl

Ensuite téléchargez le patch pour architecture x86. La version pour x64 serait disponible demain.

Patch blue badge Arrière plan aléatoire via flux rss (flickr ici) Option du multitouch

Pour plus de capture rendez-vous sur mon Flickr.

11/09/2008

Comment débloquer la nouvelle barre de tâche de Windows Seven

Présentée lors de la dernière PDC, la nouvelle barre de tâche de Windows Seven a de quoi intriguer. Seulement, Microsoft a annoncer qu’elle ne serait pas présente dans les différentes versions données aux développeurs lors de la conférence du fait de son instabilité.

Cependant Rafael de WithinWindows déjà connu pour ses patchs Uxtheme nous propose une manipulation pour activer cette fonctionnalité.

  1. Téléchargez d’abord le zip suivant votre plateforme x86 ou x64 que vous devrez extraire dans le dossier windows.
  2. Ouvrez ensuite une console en mode Administrateur et exécutez les commandes suivante :
    • takeown /f %windir%\explorer.exe
    • cacls %windir%\explorer.exe /E /G %username%:F (remplacez “username” par votre nom d’utilisateur)
    • taskkill /im explorer.exe /f
    • cd %windir%
    • start unlockProtectedFeatures.exe

Ayant moi même réalisé la manipulation, j’ai rencontré un problème au niveau des commandes takeown et cacls, si vous rencontrez les mêmes difficultés :

  • Clic droit sur “explorer.exe”
  • Onglet sécurité
  • Ajoutez-vous dans la liste des utilisateurs et vérifiez bien que vous avez coché toutes les propriétés

Via.

8/22/2007

Blogmusik devient Deezer, mais où est l'erreur ?

Deezer, radioblog et plein d'autre, le nom change mais le problème reste le même.
Ces sites promettent de rester dans la légalité, mais c'est impossible.
Même radioblog dans ces derniers versions est très très facilement piratable pour obtenir la musique que vous êtes en train d'écouter.

Pour Deezer c'est pareil :)

  1. Ouvrez Firefox avec l'add-on firebug
  2. Allez sur n'importe quelle page
  3. Ouvrez firebug, clic sur "clear"
  4. Cliquez ensuite sur la musique qui vous interresse pour l'écouter
  5. Cherchez "encapsulation.php", puis clic droit dessus et "Copy location"
  6. Ensuite, plusieurs moyens, soit vous passez par votre navigateur (coller dans l'url, puis "fichier" -> "enregistrer sous") soit par un programme spécialisé
Mais au final, le problème reste le même. Cette musique est téléchargeable.
L'internet est un espace de liberté, ces libertés peuvent être violée, beaucoup plus facilement que dans le réel, on peut plus facilement réaliser ces rêves. Comment empêcher le téléchargement illégale ? Stopper internet ? Non ? Donc on ne peut pas :).
»
 
 
Made with on a hot august night from an airplane the 19th of March 2017.