miércoles, 29 de septiembre de 2010

CeWL: Custom Word List Generator

Hace algunas semanas tuve que hacer la auditoría WiFi de una empresa que tenía sus puntos de acceso con WPA-PSK, así que entre las pruebas que hicimos, nos encontramos con unos cuantos "handshake" de WPA (ya lo explicaremos en otra ocasión) sobre los que podríamos intentar un ataque de diccionario.

Sin embargo, los diccionarios "normales" no siempre funcionan, aunque el usuario haya cogido una palabra presente en diccionario, algunas de esas palabras pertenecen al "argot" propio del gremio, o a la cultura de la empresa. Esto es algo bastante común por parte de los usuarios a la hora de escoger claves.

Para ello, existen herramientas como CeWL, que realiza un crawling del sitio web que deseemos, y genera un diccionario a partir de las palabras encontradas en dicho sitio web, entre las cuales deberíamos encontrar estas palabras propias del "argot" de esta empresa.

Aunque podemos lanzarlo con los parámetros por defecto con buenos resultados, hay dos parámetros (entre otros) con los que podamos ajustar el funcionamiento de la herramienta. Veamos este ejemplo para crear un pequeño diccionario de la web de Movistar (publi corporativa):

# ./cewl.rb --depth 2 --min_word_length 5 --write wordlist.txt http://www.movistar.es

Mediante este comando, estamos realizando un crawling de la web de Movistar, con una profundidad 2, es decir, profundidad 1 serían todas las palabras de la web principal, profundidad 2 todas estas y todas las de las webs enlazadas desde esta, y así sucesivamente. De las palabras obtenidas, comprobamos si estas tienen una longitud mínima de 5, y sino las descartaremos. La longitud mínima es algo importante a considerar, ya que si ponemos un tamaño muy pequeño, preposiciones como "de", "a", "en" podrían ser reconocidas como palabras de nuestro wordlist, que se guardará en un dichero con nombre wordlist.txt.

Según el tamaño de la página, el crawling puede tardar más o menos, pero en páginas de tamaño considerable como la que hemos elegido para el ejemplo, puede tardar un buen rato.
Tras unos minutos, ya tenemos una primera lista, que como os podéis imaginar, ademas de las palabras que nos interesan, va a tener muchas palabras que realmente nos van a resultar de poca utilidad.

# wc -l wordlist.txt
3889 wordlist.txt

Sin embargo, aunque la mayoría de estas casi 4000 palabras no nos vayan a resultar de utilidad, sí que hay palabras que pueden darnos más de una alegría ¿Alguien sabe que es "Keteke"?

# more wordlist.txt | grep -i keteke
Keteke

Keteke es un proyecto de una red social que intentó sacar Telefónica hace algún tiempo, pero cuyo éxito ni se ha acercado al de otras redes sociales como FaceBook o Tuenti. Seguramente ninguno habíais oído hablar de él, igual que yo antes de empezar a trabajar en el grupo, y por supuesto es una palabra que probablemente no aparecerá en ningún diccionario del mundo, pero con una alta probabilidad, podría ser usada por el equipo técnico que participó en su desarrollo, y seguir siendo usada en alguna de las máquinas que albergaban este servicio pero que ahora se dedican a otros temas, etc.

Vale, tenemos un diccionario personalizado de 4000 palabras, de las cuales tengo un montón que son morralla, y algunas palabras que me pueden resultar muy útiles ¿Cómo hago para eliminar todo o gran parte de lo que no me va a resultar útil?

Observando las palabras de este diccionario en un vistazo diagonal (como se suele decir), vamos que hay muchas palabras numéricas que parecen no tener mucho significado, así como palabras "normales" que podrían estar presente en cualquier diccionario.
En primer lugar, vamos a quedarnos únicamente con las palabras que no contengan números, así que usaremos una expresión regular (ver nota al final para explicación):

# cat wordlist.txt | egrep "^[a-zA-Z]{5,12}$" > wordlist_movistar.txt

# wc -l wordlist_movistar.txt
3239 wordlist_movistar.txt

Bueno, hemos reducido un poco. Podríamos reducir un poco más haciendo "diff" con un diccionario y eliminando aquellas palabras comunes, pero aún así no conseguiríamos reducirlo mucho, así que vamos a dejarlo como está por el momento.

Claro... tenemos palabras como "Keteke", pero un usuario podría usar contraseñas como "keteke", "KETEKE", "Keteke06" o similares.
¿Cómo podemos obtener todas estas variaciones?

El próximo lunes destriparemos un par de herramientas para realizar estas "mutaciones" de palabras y enriquecer así nuestro diccionario para tener en cuenta todas estas combinaciones.

Nota: Explicación de la expresión regular (para los que no las dominen):
[a-zA-Z] = cualquier carácter mayúscula o minúscula
X{5,12} = que se produzca entre 5 y 12 veces
^X = que se encuentre al principio
X$ = que se encuentre al final
^[a-zA-Z]{5,12}$ = cualquier cadena de mayúsculas o minúsculas de longitud entre 5 y 12

5 comentarios :

Adrián dijo...

No conocía esta herramienta, pero me parece genial, yo había hecho un pequeño script en python que hacía "una versión cutre" de esto xD

Miguel dijo...

con la potencia de los equipos de hoy en día (dejando incluso a un lado CUDA), un diccionario de unos pocos miles de palabras es perfectamente manejable, ¿no crees? sería peor dejarse una posible clave atrás que incrementar el tiempo de proceso unos... ¿pocos segundos?.

gran entrada! espero impaciente la parte de mutaciones.

Jose Selvi dijo...

@Miguel: Unas cuentas miles de palabras está tirado para un crackeo off-line, pero si después quieres "mutar" esa palabra para obtener variaciones... la cosa se complica.

Como adelanto del siguiente post te diré que en las pruebas que hemos hecho pasamos de un diccionario de 4 palabras a 1300, así que imagina el tamaño de un diccionario de 3000 palabras después de ser mutado.

Gracias a los dos por los comentarios! :)

Anónimo dijo...

Muy interesante...
Probaste con tkiptun-nk para hacer el pentest???
Un saludo

Jose Selvi dijo...

@Anónimo: No, aircrack-ng de toda la vida. Según tengo entendido el tkiptun-nk implementa el ataque aquel contra redes QoS, y ni siquiera está completamente implementado. Me equivoco? No sigo al día este desarrollo, podría estar equivocado.

Tú lo has usado?

Saludos y gracias por el comentario!