Password cracker

Iniciado por Luxus01, 18 Junio 2017, 15:44 PM

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

Luxus01

Hola, tengo una duda.

He hecho un programa muy basico que usa dos archivos, una con palabras clave y otro con numeros clave para generar combinaciones palabra-numero, aleatorias, con las que se espera que una de ellas sea la contraseña.

Lo he probado con dos cuentas de las cuales ya sabia la contraseña y en los dos casos las ha adivinado.

El problema es que el programa genera como 300 contraseñas distintas, y probarlas todas manualmente no es muy eficiente.
Mi pregunta es si se puede hacer un programa que introduzca el usuario y vaya probando todas las contraseñas. Todo esto en paginas web como gmail, outlook, instagram, etc.

Os adjunto el codigo del programa y si veis algo por pequeño que sea, por favor decidlo.
Para que el codigo funcione hay que descargarse la libreria acm de internet, os dejo el enlace por aqui:http://www.filedropper.com/acm_2



package password_cracker;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;

import acm.program.ConsoleProgram;
//La libreria acm ha sido desarrollada por la universidad de standford
//Se puede encontrar mas informacion en "https://cs.stanford.edu/people/eroberts/jtf/javadoc/student/"

public class consola extends ConsoleProgram {

private static long permutaciones;

public void run() {

try {

println("Este progrograma calcula 300 combinaciones posibles entre un numero y una palabra claves"
+ " dados a traves de dos archivos de texto");
println();
println("Las posibles contraseñas se escribiran en un nuevo archivo de texto."
+ "El usuario debera introducirlas en la cuenta manualmente");

// Declaramos un objeto random
Random rand = new Random(System.currentTimeMillis());

// Declaramos archivos, lectores, escritores y buffers
File palabras = new File(
readLine("Introduce el directorio de las palabras:"));
File numeros = new File(
readLine("Introduce el directorio de los numeros:"));
File newfile = new File(
readLine("Introduce el nombre y el directorio del nuevo archivo:"));

if (!newfile.exists())
newfile.createNewFile();

FileReader filereader = new FileReader(palabras);
BufferedReader lector_palabras = new BufferedReader(filereader);

FileReader filereader2 = new FileReader(numeros);
BufferedReader lector_numeros = new BufferedReader(filereader2);

FileReader filereader3 = new FileReader(newfile);
BufferedReader lector = new BufferedReader(filereader3);

FileWriter filewriter = new FileWriter(newfile);
BufferedWriter escritor = new BufferedWriter(filewriter);

// Calculamos el numero de elementos en las listas

// Ademas marcamos el principio de los archivos para poder releerlos
// despues

lector_palabras.mark(500);
lector_numeros.mark(500);

int elements_number = contarLineas(lector_numeros);
int elements_word = contarLineas(lector_palabras);

int contador = 0;

String elementosWord[] = new String[elements_word];
String elementosNumber[] = new String[elements_number];

// Volvemos los lectores al principio del fichero

lector_palabras.reset();
lector_numeros.reset();

// Metemos los elementos de los archivos en los arrays
// correspondientes

String lectura = lector_palabras.readLine();
while (lectura != null & contador < elements_word) {
elementosWord[contador] = lectura;
lectura = lector_palabras.readLine();
contador++;
}

contador = 0;
lectura = lector_numeros.readLine();
while (lectura != null & contador < elements_number) {
elementosNumber[contador] = lectura;
lectura = lector_numeros.readLine();
contador++;
}

/*
* Usamos los elemntos de los array para generar contraseñas,cuando
* el programa detecte 300 contraseñas en el archivo, dejara de
* producir combinacionesy finalizara el programa.
*/
int passwordNumber = 0;
while (passwordNumber < 300) {
String contraseña = entrecruzar(rand, elementosWord,
elementosNumber);
comprobador(lector, contraseña, escritor);
passwordNumber = contarLineas(lector);

}
println("El programa a finalizado, puedes cerrarlo");
} catch (Exception e) {
System.out.println(e);
}

}

// cuentaLineas cuenta las lineas que hay en el archivo pasado
static public int contarLineas(BufferedReader lector) throws IOException {

int number = 0;
String lectura = lector.readLine();
while (lectura != null) {
number += 1;
System.out.println(lectura);
lectura = lector.readLine();
}
System.out.println("El numero de lineas es: " + (number - 1));
return number - 1;
}

/*
* Este metodo genera una contraseña a partir de una palabra aleatoria y un
* numero
*/
static public String entrecruzar(Random rand, String[] palabras,
String[] numeros) throws IOException {

String last = "";
last = palabras[rand.nextInt(palabras.length)]
+ numeros[rand.nextInt(numeros.length)];
return last;
}

/*
* Esta funcion se encarga de comprbar si la String acomp esta ya en la
* lista de contraseñas, y si no lo esta la añade
*/
static public void comprobador(BufferedReader lector, String acomp,
BufferedWriter escritor) throws IOException {

boolean comp = false;
String lectura = lector.readLine();
while (lectura != null) {
if (acomp == lectura)
comp = true;
lectura = lector.readLine();
if (acomp == lectura)
comp = true;
}
if (comp != true) {
escritor.write(acomp);
escritor.newLine();
}

}
}


Gracias de antemano ;D

Serapis

No es buena idea que un sistema que deba hacer loogin, permita dejar el usuario escrito.
Un buen sistema cuando falle la contraseña, debería borrar el usuario y la contraseña (o no borrar el usuario), pero al menos SIEMPRE indicar que "el usuario, la contraseña o ambos no son correctos.". Por que indicar que el 'usaurio no existe' o 'contraseña incorrecta' es dar pistas... Ya se sabe que quienes diseñas estas cosas muchas veces tampoco tienen un mínimo de consideración con la seguridad, o bien son forzados por aquello de: "...hazlo para usuarios torpones."  :laugh: :laugh: :laugh:

Entonces lo que pides, podrá o no ser posible, en base a cómo se haya diseñado el sistema de login.

Piénsalo un poco, es como si le dijéramos a los fabricantes de cerraduras: "Oye cuando rompa el muelle que sujeta cierta pieza de la cerradura, por favor, no solteis la alarma hasta que no corte el cable, de la alarma que hay un poco más allá del muelle"... y naturalmente más 61L1P0LL45 aún, si los fabricantes hacen caso.

Luxus01

Claro pero si tu ya sabes cual es el usuario, como se haria para que el programa metiese las contraseñas. Quiero decir, hace falta alguna libreria especial o algo?

MONTU

Hola creo que lo que buscas se llama Sentry MBA es un programa exclusivamente para fuerza bruta de contraseñas aun que tambien desde kali linus hay scrips que usan ese tipo de requisitos. Espero que te haya ayudado salu2.