Intentando crear programa romper claves wifi (WEP) S.O Windows en C++

Iniciado por WiseHidden, 18 Marzo 2011, 11:13 AM

0 Miembros y 1 Visitante están viendo este tema.

lluk

yo también quiero ayudar, aunque más que nada para aprender porque justo ayer me puse con el wifiway y porque creo que no se lo suficiente de c/c++ pero si necesitan algo pueden pedírmelo y lo intento

mirando el primer codigo he visto una cosa que podrias hacer para hacerlo mas corto y legible:

donde pones

std::cout << "" << std::endl;
std::cout << "" << std::endl;
std::cout << "" << std::endl;


porqué no pones

std::cout <<"\n\n\n";

? bueno no es gran cosa ni mucho menos xdd pero algo es algo jaja

lluk

perdon por el doble post pero esque me he interesado mucho por este tema ^^

dejo mi aportacion:

#include <iostream>
#include <conio.h>
#include <string.h>

using namespace std;

int main()
{
   
   
   
   char letra2[2];
   
   for(int contador=48; contador<52; contador++)
   {
                    for(int contador2=48; contador2<52;contador2++)
                    {
                                      letra2[0]=contador;
                                      letra2[1]=contador2;
                                      cout<<letra2[0]<<letra2[1]<<endl;
                    }
   }                                      
   getch();
}


este codigo coje los caracteres ascii del 48 al 51 y imprime en pantalla todas las posibles combinaciones

y así hacemos que se guarde en un archivo.txt

#include <iostream>
#include <conio.h>
#include <string.h>
#include <fstream.h>

char nombre[50];

using namespace std;

int main()
{
   system("time /t");
   ofstream archivo;
       
   char letra2[2];
   
   cout<<"Introduce el nombre del archivo: ";
   gets(nombre);
   archivo.open(nombre);
   for(int contador=48; contador<52; contador++)
   {
                    for(int contador2=48; contador2<52;contador2++)
                    {
                                      letra2[0]=contador;
                                      letra2[1]=contador2;
                                      cout<<letra2[0]<<letra2[1]<<endl;
                                      archivo<<letra2[0]<<letra2[1]<<endl;
                    }
   }            
   archivo.close();                        
   getch();
}


esto ara que se guarden todas las combinaciones (como en el programa anterior) pero esta vez en un archivo.txt
mi padre dice que es casi infinito y que se me va a colapsar el ordenador, creeis que esta en lo cierto? dice que es mejor que envez de guardarlo en el archivo.txt todos que mire cada vez si es el correcto (yo eso ya no lo se hacer) y que solo guarde el correcto es decir donde pone:

archivo<<letra2[0]<<letra2[1]<<endl;


que ponga (lo voy a decir asi mal explicado sin comprobar lo de los drivers)

si(letra2[0] hasta la 13 = contraseña del wifi)
{
        guardar la cadena letra2 en el archivo.txt
}


EDITO:

imposible entrar en una red wifi por fuerza bruta si hay 13 caracteres usando el alfabeto alfanumérico (35 caracteres) hay 1'71*10 a la 20 combinaciones distintas, eso en un archivo.txt ocupa más de 1 millón de GB no creo que tu ordenador lo tenga.
Pense en hacerlo en vez de escribirlo en un archivo.txt comprobar cada vez si la combinación esa es correcta pero así nos podríamos pasar años intentándolo.

Si alguien le interesa el código al que llegé:

#include <iostream>
#include <conio.h>
#include <string.h>
#include <fstream.h>

char nombre[50];
char letra2[13];

using namespace std;
void escribir(int c,int c2,int c3,int c4,int c5,int c6,int c7,int c8,int c9,int c10,int c11,int c12,int c13)
{
     letra2[0]=c;
     letra2[1]=c2;
     letra2[2]=c3;
     letra2[3]=c4;
     letra2[4]=c5;
     letra2[5]=c6;
     letra2[6]=c7;
     letra2[7]=c8;
     letra2[8]=c9;
     letra2[9]=c10;
     letra2[10]=c11;
     letra2[11]=c12;
     letra2[12]=c13;
     cout<<letra2[0]<<letra2[1]<<letra2[2]<<letra2[3]<<letra2[4]<<letra2[5]<<letra2[6]<<letra2[7]<<letra2[8]<<letra2[9]<<letra2[10]<<letra2[11]<<letra2[12]<<endl;
}

int main()
{
    system("time /t");
    ofstream archivo;
    int c,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13;
   
   
    cout<<"Introduce el nombre del archivo: ";
    gets(nombre);
    archivo.open(nombre);
    for(c=48;c<90;c++)
    {
                      for(c;c>=58&&c<=64;c++)
                      {}                     
    for(c2=48;c2<90;c2++)
    {
                      for(c2;c2>=58&&c2<=64;c2++)
                      {}
    for(c3=48;c3<90;c3++)
    {
                         for(c3;c3>=58&&c3<=64;c3++)
                         {}
    for(c4=48;c4<90;c4++)
    {
                         for(c4;c4>=58&&c4<=64;c4++)
                         {}
    for(c5=48;c5<90;c5++)
    {
                         for(c5;c5>=58&&c5<=64;c5++)
                         {}
    for(c6=48;c6<90;c6++)
    {
                         for(c6;c6>=58&&c6<=64;c6++)
                         {}
    for(c7=48;c7<90;c7++)
    {
                         for(c7;c7>=58&&c7<=64;c7++)
                         {}
    for(c8=48;c8<90;c8++)
    {
                         for(c8;c8>=58&&c8<=64;c8++)
                         {}
    for(c9=48;c9<90;c9++)
    {
                         for(c9;c9>=58&&c9<=64;c9++)
                         {}
    for(c10=48;c10<90;c10++)
    {
                         for(c10;c10>=58&&c10<=64;c10++)
                         {}
    for(c11=48;c11<90;c11++)
    {
                         for(c11;c11>=58&&c11<=64;c11++)
                         {}
    for(c12=48;c12<90;c12++)
    {
                         for(c12;c12>=58&&c12<=64;c12++)
                         {}
    for(c13=48;c13<90;c13++)
    {
                         for(c13;c13>=58&&c13<=64;c13++)
                         {}
            escribir(c,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13);
            archivo<<letra2[0]<<letra2[1]<<letra2[2]<<letra2[3]<<letra2[4]<<letra2[5]<<letra2[6]<<letra2[7]<<letra2[8]<<letra2[9]<<letra2[10]<<letra2[11]<<letra2[12]<<endl;
    }
    }                               
    }
    }
    }
    } 
    }
    }                               
    }
    }
    }
    }
    }           
    archivo.close();                         
    getch();
}


espero que haya servido mi código y mis consejos ;)

El_Java

lluk tu padre tiene razón, son una burrada de combinaciones y lo mejor sería mientras que las hacemos,comprobarlas, por lo que podriamos perfectamente prescindir del texto con las contraseñas preestablecidas.
Y respecto a tu código, es algo lioso, creo que sería mucho más facil crear las combinaciones con el codigo de backtracking que he puesto antes. Y siempre que puedas, prescinde de system() porque lo unico que hace es quitarle portabilidad a tu código.

Se me ha ocurrido otra forma de comprobar las contraseñas que creo que sería más eficiente que las dadas hasta ahora. Os explico:

* Pongamos que la contraseña es "Perico198", no?
* Pues consistiría en algo parecido a lo de las peliculas americanas de robo de bancos.
* Hariamos una función para ver si un caracter coincide con el de la lista ASCII (sencillo)
* Al encontrarlo, guardar el caracter y buscar el siguiente caracter (tambien sencillo)
* El funcionamiento sería:
Contraseña:
Perico198   //comienza el programa...
Perico198   //encuentra el primer caracter "P" y lo fija
Perico   //encuentra el segundo caracter "e" y lo fija
Perico198   // etc etc etc etc
Perico198   //Voilá! Contraseña encontrada y lista para guardar :D

¿Qué me decis? Parece mejor que buscar una por una, opinad y hacemos asi.
En cuanto pueda hago el código, en dos días o así, ahora mismo estoy con un programa que me tiene bastante absorbido...  ;)

lluk

eso me parece muy buena idea
pensando en el codigo alfanumerico (35 caracteres)
solo tiene que comprobar la posicion 1 de la clave 35 veces (o tantas asta que coincidan)
y asi asta 13
ok me parece buena idea ^^

<<<-Basura->>>

pues es mala idea, puesto que no funciona xq??

pues cuando tu programa comiensa a buscar una letra. digamos "Perico198" y el programa inserta la letra "p" y q devuelve, simplemente un error*.

no te va a decir .... bien la primer letra es "p" fijala y sige intentando...
<<<--Basura-->>>

El_Java

Underwar lleva razón... no habia pensado en eso, gracias por la correccion xD
Pues nada, toca hacerlo con el metodo largo

Crash_RPM

hola buenas, yo he estudiado el modulo de administracion de sistemas informaticos, y de C.

Me esta interesando el tema asique me teneis para lo que pueda ayudar y si no puedo ayudar por lo menos ir aprendiendo. Asique si estais contactando por correo, mp.. o lo que sea avisadme please.

WiseHidden

Muy buenas Camaradas.

Ante todo dar la bienvenida a todos los que se estan interesando por dicho proyecto.

Rasielunderwar, lluk, El-Java, DanyHack, Xafi y Crash_RPM. Veo que ninguno somos expertos en el lenguaje C/C++ Pero veo que todos estamos aportando todo cuanto sabemos y mas, y esta es la mejor manera de aprender, unirse y hacer un programa tan interesante.

Todos estan aportando sus ideas, sus conocimientos y esfuerzo a hacer posible este proyecto.

Analizemos pues todo cuanto tenemos para ir englobando el codigo y asi ir haciendo mejores y aportes.

El-Java a creado un codigo que compara un texto que "Introducimos" y lo compara con un archivo de texto.

Citar
//Código by: El_Java
#include <iostream>
#include <fstream>
#include <string.h>

//using namespace std; para programas largos es mejor no ponerlo


int main(){
    std::ifstream txtIn;
    char texto[14], clave[14];

    std::cout << "Escribe la contrasenha a comparar: " << std::endl;
    std::cin.getline(clave, 14);

    txtIn.open("pass.txt");

    if (!txtIn.is_open()){
        std::cout << "Error abriendo archivo, comprueba que existe el archivo" << std::endl;
    }

    if (!txtIn.good()){
        std::cout << "Error, no es posible leer el archivo" << std::endl;
    }

    while((txtIn.eof()) == 0){ //mientras el archivo no haya llegado al final
        txtIn.getline(texto, 14, '\n');
        if ((strcmp(texto, clave)) == 0) break; //Si alguna contrasenha concuerda, parar el bucle while
        if ((strcmp(texto, "NINGUNA")) == 0) break;
    }

    if((strcmp(texto, "NINGUNA")) == 0){
        std::cout << "Ninguna contrasenha valida" << std::endl;
    }

    else{
        std::cout << "Encontrada la contrasenha:\n";
        std::cout << "texto: " << texto << std::endl;
        std::cout << "clave: " << clave << std::endl;
    }

    return 0;
}




Y para que funcione el texto tiene que tener estas caracteristicas:

    Llamarse pass.txt
    Por cada linea tener una contraseña
    Al final del texto terminarlo con la palabra NINGUNA

tal que quedaría asi:

pass.txt                                       pass.txt
1234567899874                         contraseña1
9876543210123                         contraseña2
7412589634157                         contraseña3
asdfghjkkasfg                               contrseña4
NINGUNA                                     final del texto

Es una buena base de partida pero existen varios interrogantes.
1º Partiendo de este punto se podria crear un Generador que cree ala inversa de un archivo de texto a una impresion ala pantalla. Por ejemplo.

La contraseña que buscamos es Perico123 y en nuestro archivo de texto (Que lo llamaremos Diccionario) tenemos las siguientes contraseñas

Perico000
Perico001
Perico.........  Perico999

Si la contraseña es perico123 en la "Comparativa 123 encontraremos la clave" Es decir un ataque por diccionario.

2º Otro problema y este creo es el que mas me esta dando quebraderos de cabeza es..... Nosotros estamos creando un programa para sacar un clave x pero esa clave x la estamos introduciendo nosotros, el problema esta en "Como hacemos para realizar la comparativa con una clave de un router cualquiera" Segun mi logica eso debe de tener un algoritmo segun el tipo de cifrado que lleve, la cuestion es realizar comparativas con diccionarios compatibles para cada tipo de cifrado.

Luego en el siguiente aporte hablas sobre la recursividad, la verdad que creo que adopta mejor las funciones que andamos buscando, aunque que buscar la forma en que haga la comparativa y nos de el true y el false.

Lluk tb ha hecho su aporte, pero como bien dice su padre las combinaciones son infinitas y aparte de "Petar el disco duro" el proceso de la cpu seria muy alto y trabajoso, aunque ese codigo se podria aprovechar ciertos comandos tb para crear algunos diccionarios aunque seria recomendable buscar otro metodo para generarlos.

El-java aportó de nuevo una idea muy buena, auqnue como dice raiserlaunderwar no es recomendable pues no te va ir dando positivos en cada LETRA que encuentre, aunque me a inspirado para otro futuro proyecto relacionado con ataques por fuerza bruta aunque a menos escala.

Y Crash-RPM agradecer su oferta de colaborar con nosotros pues siempre se es bienvenido.

Bueno englobando todo lo dicho aqui tenemos mas o menos una ideal general de lo que estamos buscando.
Veo importante de que todos hagamos aportes, pero seria mas eficaz seleccionar el programa por partes.

Partes esenciales del programa.

- Diseño de menu. (El esqueleto principal del programa) Donde el usuario podra seleccionar distintas opciones de menu, como generar un diccionario, realizar un ataque, e incluso una opcion de ayuda para entender el programa.

- Generador de Diccionario (Una pieza fundamental para la realizacion del programa)

- Diccionarios (Debes tener varios diccionarios para realizar el ataque) Podriamos hacerlo en un archivo de texto *.txt

- Y por ultimo englobar y "encajar" todos los codigos para que no de ningun error.

PD: Bueno disculparme por la hora de charla que aqui me e pegado, pero es importante ir canalizando y generalizando todos los aportes pues si no nunca se podra hacer nada.

PD: El tema de los puntos vitales del programa (Diseño,Generador de diccionario, ect....) Puede ser repartido por todos, para que cada uno se valla centrando en varios aspectos del programa.

Tal como yo lo veo, y que conste que esto es un decir, pues cada uno puede y hara porsupuesto lo que vea mas conveniente a sus conociemientos y esfuerzo, al fin y al cabo todos podemos ir aportando, colaborando, quitando y poniendo en todos y cada uno de los puntos principales del programa.

Yo lo estableceria del siguiente modo, segun e ido viendo de cada uno de vosotros.

WiseHidden y Danyhack: Diseño
Lluk y Xafi: Diccionarios
Rasielunderwar y El-Java: De los generadores de diccionario

y Crash_RPM: Ya ira aportando segun el vea donde puede ayudar

Como lo veis?? Lo dicho aunque yo sea el promotor del proyecto, no tengo ni mas derechos, ni mas votos que cualquiera de ustedes, pueden sugerir, contrariar y aprobar todo o parte de lo que e dicho, siempre y cuando sea con educacion jajajajaja

Bueno un enorme saludo a todos

Atentamente
Vuestro fiel camarada

WiseHidden

Si tu tienes una manzana y yo otra y decidimos intercambiarlas, seguiremos teniendo una manzana cada uno, pero si tu tienes una idea y yo otra y la intercambiamos, ambos tendremos dos ideas. (Origen Anónimo)

lluk

ook todo bien
aunque piensa que los diccionarios no se como los vamos ha hacer porque normalmente las claves wifi tienen 13 dígitos así que en los diccionarios tendrá que haber combinaciones de 13 dígitos alfanuméricos.

Alguna idea para empezar a eliminar combinaciones?

me he fijado y mi clave del wifi los 2 primeros números son aleatorios pero los demás son la mac del router, haber si esto sirve :S

El_Java

Despues de leer la Biblia... xD (aunque ha sido interesante)
Creo que tienes razón, en varios puntos:
1. Aquí todos pintamos lo mismo.
2. Debemos organizarnos entre todos lo mejor posible.
3. Hay varias formas de hacer lo mismo, como los dos códigos para crear contraseñas (backtracking y el codigo de lluk), y aunque me cuesta ceder, creo que deberiamos ponernos todos de acuerdo mediante votaciones o siguiendo algunos parametros para elegir el mejor.

Y por mi parte he de decir que debemos de salirnos de aqui xD Más que nada, porque esto es un foro para dudas y cosas así y creo que nos estamos excedediendo. Yo hace unos días que me he registrado en google code para subir proyectos, y si quereis creo yo el proyecto (decidme nombre) y os agrego a todos a él. Además, deberiamos agregarnos mediante un canal de mensajeria instantanea (msn, IRC, googletalk...) y así comunicarnos mejor. ¿Qué me decis?

En cuanto al proyecto, creo que podemos rebajar la busqueda de la contraseña si sabemos sacarle provecho al numero MAC de cada dispositivo, también decir que lo ideal sería que las primeras contraseñas que buscase fueran las predeterminadas (admin, 1234, admin1234, y por el estilo).

Decidme si estais de acuerdo y me pongo manos a la obra en lo de crear el proyecto ;)