El libre pensamiento para un internet libre

No estas registrado.  

Anuncio

nord_600_250

#1 30-01-2015 20:35:36

kcdtv
Administrator

Registrado: 14-11-2014
Mensajes: 5,701

Calcular el checksum WPS (la ultima cifra del PIN)

Fuentes :


  Si no habéis leído el PDF de Stefan Viehböck mi consejo del día es : Leerlo. Uno se siente más inteligente después. smile
Es un texto "histórico" tongue porque desveló al gran publico la presencia de la brecha de seguridad equivocadamente llamada "WiFi Protect Setup" y como efectuar un ataque tipo "brute force" con PIN WPS  permitiendo averiguar en pocas horas las mas complejas y presuntamente seguras llaves WPA.


Recuerdo que el PIN WPS es una cadena de 8 cifras que podemos dividir en 3 partes : PIN.jpg


  1. Los 4 primeros números, es decir la primera mitad del PIN.
    Es la primera etapa del brute force : se ha de averiguar para obtener M5 y poder pasar al brute force sobre la segunda mitad del PIN.
    Tenemos por lo tanto que realizar un ataque sobre 10⁴ posibilidades (10 000 intentos máximo para obtener la primera mitad)

  2. Desde la quinta hasta la séptima cifra (incluidas) del PIN (o sea los dígitos cinco, seis y siete)
    Estos tres números son desconocidos (requieren un brute force). Son 1000 posibilidades (una décima parte del brute force sobre la primera mitad del PIN) 

  3. El ultimó dígito, llamado "Checksum WPS" (suma de comprobación) y que es el sujete de este tema.
    Se calcula utilizando los siete primeros dígitos: No es desconocido y hay un solo resultado posible, solo tenemos que aplicar la formula para calcularlo. Respecto a nuestro brute force significa que en lugar de tener dos secuencias de brute forces sobre 4 números (10000 + 10000 = 20000) tenemos una fase de brute force sobre 4 números (10 000) y otra sobre tres (1000). Mos hace un máximo de 11000 PIN por probar

Calcular el Checksum WPS paso a paso

  EL primer PIN que proba reaver es 12345670.
Esto se debe a que es el PIN que atribuye por defecto el propio WPS en caso de una configuración no completa del PIN en el firmware.
Vamos a ver como se hace para deducir que 0 es el ultimo dígito tomando 1234567 como siete primeras cifrás de un PIN WPS.
Así es fácil ya que el valor de cada dígito corresponde a su posicionamiento en el PIN. wink

Primer paso :
  Tenemos que multiplicar cada cifra sucesivamente por 3 o 1.
El primer dígito se multiplica por 3, el segundo por uno, el tercero por tres, el cuarto por uno etc...

        digito       operación     resultado

     --------------------------------------

       1            1   x   3   =     3

       2            2   x   1   =     2

       3            3   x   3   =     9

       4            4   x   1   =     4

       5            5   x   3   =    15

       6            6   x   1   =     6

       7            7   x   3   =    21


Segundo Paso  :

Sumamos los resultados obtenidos tràs multiplicar los digtós

3   +   2   +   9   +   4   +   15   +   6   +   21   =   60


Tercer paso   :

Guardamos las unidades de la suma calculada para obtener el dígito de control y en este caso es cero (60)


Cuarto paso  :

Restamos el dígito de control a 10 guardando solo la unidad del resultado (se usa una resta con reducción por modulo 10) 10 - 0 = 10

Hemos caluclado nuestro checksum WPS y es 0


Hagamos otro.... por ejemplo calculamos el checksum del PIN 9999999

primer paso: la multiplicación
(9x3)  +  (9x1)  +   (9x3)   +   (9x1)   +   (9x3)   +   (9x1)   +   (9x3)

segundo paso: la suma
27   +   9   +   27   +   9   +   27   +   9   +   27   =   135

tercer paso: dígito de control
guardamos la unidad de nuestra suma :  135

Cuarto paso : Checksum restando el dígito de control a diez
10 - 5 = 5

El PIN WPS valido es 99999995

Fácil ¿No?
Podemos comprobar si un PIN es valido en linea de comando con wpa_cli :   wpa_cli_checksum.jpg

 wps_check_pin <PIN> = verify PIN checksum
algoritmo; ejemplos de código

Vamos a mirar la función en bash que redactó para WPSPIN antares_145 que es el algoritmo del cheksum WPS  "paso a paso" de forma pedagogica, para dummies.

CHECKSUM(){                                                               # función de antares_145 de crack-wifi.com
PIN=`expr 10 '*' $STRING`                                                    # $STRING corresponde a los 7 primeros dígitos del PIN
ACCUM=0                                                                             #  $ACCUM corresponde a la suma de las multiplicaciones de cada digito 
                                                             
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10000000 ')' '%' 10 ')'`       # usamos la reducción por modulo diez para isolar cada digto
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 1000000 ')' '%' 10 ')'`         # el dígito uno por tres, el dígito 2 por 1 etc...
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`                                                   # calculamos el dígito de control (unidad de la suma obtenida anteriormente) 
CHECKSUM=`expr '(' 10 '-' $DIGIT ')' '%' 10`                             # calculamos el checksum ( 10 - digitode control ) 
}                                                                                             

Ahora en versión mas "elegante" en un búcle while de r00tnuLL

# Función que genera el checksum. Algoritmo de ZaoChunsheng.
FUNC_CHECKSUM(){
    ACCUM=0
    while [ $PIN -ne 0 ]; do
      ACCUM=$((ACCUM += 3 * (PIN % 10)))
      PIN=$((PIN /= 10))
      ACCUM=$((ACCUM += PIN % 10))
      PIN=$((PIN /= 10))
    done
    CHECKSUM=$(((10 - ACCUM % 10) % 10))     # Por último se halla el valor para añadirlo al pin.
}

Para concluir la classe de spawn en python

#!/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] # lista de enteros

    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
        
        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,"valido (:"
        else:
            print "Pin",self.pin,"invalido, el checksum debría ser",self.find_valid()

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

Guardamos el código en un fichero que llamamos  wpsum.py y le otorgamos derechos de ejecución con

chmod +x wpsum.py

Para ejecutar el scrpt hacemos (una vez situados en el directorio dónde el script esta guardado)

./wpsum.py <7_primeros_dígitos_del_PIN>

  Fin de la transmisión, nos vemos en otro tema. wink

Desconectado

Anuncio

nord_600_250

Temas similares

Tema Respuestas Vistas Ultimo mensaje
26 7781 15-03-2023 16:57:32 por kcdtv
Pegado:
34 3814 12-03-2023 18:24:22 por Guybrush92
Pegado:
Pegado:: Script multiuso wifi para Kali y otras distros por v1s1t0r  [ 1 2 3 18 ]
436 63614 07-03-2023 12:35:27 por kcdtv
0 423 23-02-2023 17:09:39 por kcdtv
Pegado:
114 258659 19-02-2023 17:36:14 por chuchof

Pie de página

Información del usuario

Ultimo usuario registrado: erpini
Usuarios registrados conectados: 0
Invitados conectados: 6

Estadisticas de los foros

Número total de usuarios registrados: 2,432
Número total de temas: 1,632
Número total de mensajes: 15,528

Máx. usuarios conectados: 373 el 30-09-2019 15:04:36