8.2.11

como obtener las mejores wordlists (diccionarios)

es muy comun en las auditorias de seguridad (y x supuesto en el hacking) el uso de wordlists (o diccionarios) para buscar claves debiles en un sistema. el procedimiento de crackeo de la clave es simple, se utiliza alguna herramienta, segun el caso, q vaya probando passwords hasta dar con la correcta.

en el caso de claves online la historia es mas complicada ya que se utilizan sistemas para blockear al atacante cada X numero de intentos. en los servidores q administro x ej suelo instalar fail2ban q hace muy bien el trabajo, se puede configurar numero de intentos, tiempo del ban, envio de correo con el log y whois del ataque, etc.

la idea entonces es hacerse con la clave encriptada (hash) para despues crackearla tranquilo en la comodidad de nuestros hogares. la manera de obtener el hash tanto como el proceso de crackeo es algo a lo q no me voy a referir ya que esta entrada es sobre otro tema (y depende del caso especifico), pero se supone q si estan buscando wordlists ya saben para q las quieren y tendran su john the ripper (o el q sea) preparado.


tipos de crackeo

hay varios formas de intentar crackear 1 hash pero el tiempo depende de varios factores, la velocidad de procesamiento del sistema es muy importante pero tambien el tipo de encriptacion q tiene el hash, al aumentar la complejidad del algoritmo obviamente aumenta el tiempo del proceso.

se puede ver mucho x ahi gente pidiendo "wordlists para ataque de fuerza bruta", eso es en realidad un error de concepto, no xq no se pueda hacer sino porque son 2 cosas distintas. 1 ataque x fuerza bruta es el que va probando todas las combinaciones hasta dar con la correcta, dentro de esta posibilidad tenemos q fijarnos en los tipos de caracteres q puede incluir la password (mayusculas, minusculas, signos de puntuacion y numeros). supongamos q simplemente buscaramos letras minusculas el sistema iria probando todo el abecedario y luego:

aa
ab
ac... hasta az y despues:

ba
bb
bc...

y asi sucesivamente hasta completar los campos q le hayamos indicado, si fueran 8 llegaria hasta "zzzzzzzz".

esto obviamente lleva muchisimo tiempo, dependiendo de la extension de la password y la complejidad del algoritmo tal vez... para siempre... je

pero como somos seres humanos y a la mayoria le cuesta recordar secuencias de caracteres sin sentido, un gran porcentaje de los usuarios utiliza passwords que son simples palabras q se pueden encontrar en 1 diccionario. en este punto es donde entran en juego las wordlists. seguramente no van a crackear la pass del server de la nasa con 1 wordlist pero para cuentas de users normales suelen funcionar bastante bien si se usa la correcta.

con el diccionario solamente probamos las palabras q se encuentran en el, sin perder tiempo en secuencias sin sentido y ahorrando de esta forma muchisimo tiempo de proceso. el tema es q la palabra este en la lista, sino x supuesto q no vamos a obtener ningun resultado.


creando wordlists

la mejor opcion entonces es crear nuestra propia wordlist basados en las necesidades de cada caso. es importante la ingenieria social, investigar al objetivo para tener 1 idea de lo q puede poner como pass, usar nombres de productos si se trata de 1 empresa q fabrica algo, constelaciones si son astronomos, drogas si son quimicos, nombres de equipos y jugadores si esta relacionado con algun deporte, etc.

los otros dias necesitaba una lista especifica, nombres permitidos en argentina... en la red se pueden encontrar muchas wordlists especificas y generales en todos los idiomas (la mayoria en ingles), pero es imposible encontrar algo tan especifico como lo q buscaba asi q no me quedo otra q hacermela yo mismo.

la informacion se encuentra facilmente en google (en el reg civil x ej) pero no en forma de lista, y copiar y pegar es practicamente imposible. me disponia a usar metodos prehistoricos con wget y algun script para manipular los datos, cuando me encontre con 1 interesante utilidad q automatiza el trabajo.

voy a explicar los 2 metodos, xq aunque al final termine usando el viejo y fiel wget me gusto el programita. se llama:


CeWL (se pronuncia cool)

se puede descargar de aca:

http://www.digininja.org/files/cewl_3.0.tar.bz2

y la pagina con instrucciones (en ingles) aca:

http://www.digininja.org/projects/cewl.php

basicamente hay q tener instalado ruby y las siguientes gems:

hpricot
http_configuration
mime-types
mini_exiftool
rubyzip
spider

se instalan con:

gem install nombredelgem

y hay q setear la variable RUBYOPT con el valor rubygems:

export RUBYOPT=rubygems

no esta en las instrucciones pero tuve q intalar tambien la libreria "libimage-exiftool-perl", xq me daba un error. para otros errores fijense en la pagina. el help de cewl devuelve:

$ ./cewl.rb --help
cewl 3.0 Robin Wood (dninja@gmail.com) (www.digininja.org)

Usage: cewl [OPTION] ... URL
--help, -h: show help
--depth x, -d x: depth to spider to, default 2
--min_word_length, -m: minimum word length, default 3
--offsite, -o: let the spider visit other sites
--write, -w file: write the output to the file
--ua, -u user-agent: useragent to send
--no-words, -n: don't output the wordlist
--meta, -a file: include meta data, optional output file
--email, -e file: include email addresses, optional output file
--meta-temp-dir directory: the temporary directory used by exiftool when parsing files, default /tmp
-v: verbose

URL: The site to spider.

el uso es bastante simple supongamos q queremos descargar el contenido de "www.yahoo.com" en el archivo "lista", pondriamos:

./cewl.rb -w lista www.yahoo.com

con el resto de las opciones se pueden hacer cosas bastante interesantes como setear un minimo de caracteres, la cantidad de links, etc... cosa de experimentar 1 poco...


con el viejo wget ;)

con wget y 1 sencillo script a medida podemos obtener los mismos resultados, como el script depende de lo q quieran hacer solamente voy a nombrar los comandos de manipulacion para q cada uno los use como quiera.

para descargar la pagina con wget:

wget -r -l 1 -nd paginaadescargar

"-r" descarga recursivamente la pagina, "-l" especifica el nivel de profundidad y "-nd" q no se creen los directorios. con esto obtenemos los archivos q componen la pagina, seleccionamos lo q nos interesa y procedemos a extraer el contenido y ordenarlo 1 poco, para eso vamos a usar wyd q es 1 script en perl q se puede descargar desde aca:

http://www.remote-exploit.org/wp-content/uploads/2010/01/wyd-0.2.tar.gz

simplemente lo descomprimimos y lo ejecutamos. el help:

$ ./wyd.pl --help

*
* ./wyd.pl 0.2 by Max Moser and Martin J. Muench
*

Unknown option: help
Usage: ./wyd.pl [OPTIONS]

Options:

-o = Write wordlist to
-t = Separate wordlist files by type, e.g. '.doc'
-s = Use 'strings' for unsupported files
-b = Disable removal of non-alpha chars at beginning of word
-e = Disable removal of non-alpha chars at end of word
-f = Disable inclusion of filenames in wordlist
-v = Show debug / verbose output
-n = Continue even if programs / modules are missing

suponiendo q tenemos el contenido q descargamos en el directorio download/ tendriamos q ingresar:

./wyd.pl -n -o nombredelarchivoagenerar.txt download/

con esto ya tenemos una lista con todas las palabras q estaban en las paginas q descargamos, solo hay q limpiarla y ordenarla 1 poco, para esto nos sobra con los comandos de manejo de cadenas q trae bash. vamos a ver lo mas basico....


ordenando las listas

empecemos x ordenar alfabeticamente:

sort -d lista > listaordenada

borrar entradas repetidas:

uniq listaordenada > listaunica

ya tenemos una lista ordenada alfabeticamente y sin palabras repetidas ("listaunica"). muchas veces aparece el problema de palabras q quedan con algun caracter pegado al principio o al final o cadenas q queremos remover xq contienen algun caracter raro o lo q sea, para eso usamos sed (StreamEDitor)... el help de sed:

$sed --help
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

-n, --quiet, --silent
suppress automatic printing of pattern space
-e script, --expression=script
add the script to the commands to be executed
-f script-file, --file=script-file
add the contents of script-file to the commands to be executed
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if extension supplied)
-l N, --line-length=N
specify the desired line-wrap length for the `l' command
--posix
disable all GNU extensions.
-r, --regexp-extended
use extended regular expressions in the script.
-s, --separate
consider files as separate rather than as a single continuous
long stream.
-u, --unbuffered
load minimal amounts of data from the input files and flush
the output buffers more often
--help display this help and exit
--version output version information and exit

If no -e, --expression, -f, or --file option is given, then the first
non-option argument is taken as the sed script to interpret. All
remaining arguments are names of input files; if no input files are
specified, then the standard input is read.

E-mail bug reports to: bonzini@gnu.org .
Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.

esto es 1 poco mas dificil de manejar pero se deja... para remover un caracter al principio de la palabra:

sed 's/^[caracter]//' -i lista.txt

al final:

sed 's/[caracter]$//' -i lista.txt

para borrar lineas conteniendo X caracter:

sed '/caracter/d' -i lista.txt

y asi podemos hacer infinidad de cosas con nuestras cadenas, si x ejemplo queremos extraer las palabras q empiecen con la letra "m" y continuen con cualquier caracter entre la "d" y la "j" usamos grep con el modificador "-w":

grep -w 'm[d-j]*' .txt

todo esto lo podemos combinar en 1 sola linea:

./wyd.pl -n pages | grep -w 'm[d-j]*' | sort -d | uniq > lista.txt

o si son muchas algun script q simplifique para no tener q andar cambiando variables todo el tiempo en la consola.

solamente queda cargarlas en su programa de cracking favorito y probarlas...