En ocasiones viene bien contar con diccionarios robustos para lanzar herramientas como THC Hydra o similares, no obstante últimamente muchas personas tienden a utilizar contraseñas un poco más seguras que como mínimo, ya no siguen los patrones más habituales o que no se encuentran en el listado de las contraseñas más usadas (aunque de todo se puede llegar a ver). Es posible que las herramientas de fuerza bruta den mejores resultados si se utiliza un diccionario enfocado al objetivo y para ello es necesario recolectar información sobre el  “target” utilizando técnicas OSINT, por ejemplo. Esta información recolectada puede ser útil en herramientas como PyDictor a la hora de generar diccionarios con posibles contraseñas utilizando como entrada esta información.
PyDictor es un script desarrollado en Python que cuenta con abundantes opciones para personalizar la generación de diccionarios, entre las que se incluyen la aplicación de expresiones regulares, uso de complementos, codificar cada palabra del diccionario con un algoritmo como SHA, MD5, DES, entre otras cosas.

La instalación no es para nada compleja, de hecho, es probable que ya se cuente con todas las librerías y no sea obligatorio instalar nada, solamente clonar/descargar el repositorio de GitHub y ejecutar el script “pydictor.py”.
A continuación se enseñan algunos comandos sobre el uso básico de la herramienta para entender cómo funciona y lo fácil que resulta usarla.

python3 pydictor.py -base d -o /tmp/test1.txt -> Genera un fichero en donde cada línea contendrá una palabra del diccionario en base numérica, con exactamente una longitud de 4 (valor por defecto si no se especifica la opción –len). 0000, 0001, …., 9999

python3 pydictor.py –len 6 6 -base d -o /tmp/test2.txt -> Genera un fichero en donde cada línea contendrá una palabra del diccionario en base numérica, con exactamente una longitud de 6. 000000, 000001, …., 999999

python3 pydictor.py –len 5 5 -base L -o /tmp/test3.txt -> Genera un fichero en donde cada línea contendrá una palabra del diccionario utilizando los caracteres del alfabeto en minúsculas, con exactamente una longitud de 5. aaaaa, aaaab, aaaac, …., zzzzz

python3 pydictor.py –len 5 5 -base dc -o /tmp/test4.txt -> Genera un fichero en donde cada línea contendrá una palabra del diccionario utilizando los caracteres del alfabeto en mayúsculas y los dígitos del 0 al 9, con exactamente una longitud de 5. 00000, 00001, …, 0000A, …., ZZZZZ

De momento, estas pruebas iniciales demuestran que la herramienta puede hacer combinaciones y permutaciones. Nada que no hagan ya otras herramientas o incluso un script con pocas líneas de código, sin embargo esto para empezar y hacerse una idea de su uso está bien.

python3 pydictor.py –len 5 5 -base d –head adas –tail tra -o /tmp/test5.txt -> Genera un fichero en donde cada línea contendrá una palabra del diccionario en base numérica y empezará con “adas” y terminará con “tra”. Cada palabra tendrá exactamente una longitud de 5. adas00000tra, adas00001tra, …., adas99999tra

python3 pydictor.py –len 5 5 -base d –head adas –tail tra –encode sha256 -o /tmp/test6.txt -> Exactamente igual que el comando anterior, pero cada palabra del diccionario será codificada con SHA256

python3 pydictor.py –len 5 5 -char adastra -o /tmp/test7.txt -> Se genera un fichero en donde cada línea tendrá una de las posibles combinaciones de los caracteres indicados en “chars”. Cada palabra tendrá exactamente una longitud de 5.

Con estos ejemplos queda claro que el script es capaz de realizar permutaciones de una forma bastante flexible y aunque no aparece en la imagen anterior, existe otro tipo de permutación que también hace PyDictor y es basada en grupos de caracteres. Es decir, con “-chars” se indican los caracteres que se utilizarán para la permutación, mientras que con “-chunk” se especifican grupos de caracteres separados por un espacio y la herramienta permuta dichos grupos, sin modificar el contenido de cada grupo.

Ahora es el momento de utilizar una de las características más interesantes de la herramienta y es precisamente, la posibilidad de crear diccionarios personalizados utilizando la información que se tiene de un objetivo. Para ello, se debe cargar el módulo de ingeniería social disponible. Se debe ejecutar el script de la siguiente manera: “python3 pydictor –sedb” y a continuación aparecerá el siguiente asistente.

En este asistente lo que primero que hay que ver y establecer son las opciones, las cuales se pueden ver en el menú principal o con el comando “show options”. A partir de este punto hay que introducir los datos del objetivo en cuestión, teniendo en cuenta que cuanta más información se tenga, más combinaciones generará la herramienta y por supuesto, el tamaño del diccionario también será mayor.

Por otro lado, existen opciones muy interesantes que permiten que el diccionario sea más potente y robusto. Algunas de estas opciones se enseñan a continuación.

 

python pydictor.py -plug birthday 01011970 01012021 –dmy –len 8 8 -o /tmp/plugbir.txt -> Simplemente genera un fichero en el que cada palabra será una fecha entre el 01/01/1970 y 01/01/2021. Se puede combinar con otras opciones como “-chunk” para realizar permutaciones interesantes.

python pydictor.py -plug scratch http://thehackerway.com -o /tmp/scratch.txt -> Realiza un proceso de crawling básico contra el sitio indicado, extrayendo cada una de las palabras encontradas en el sitio web. El complemento scratch se puede combinar con otras opciones de la herramienta y también se puede hacer sobre múltiples sitios web, basta con dirigirse al fichero <PYDICTOR_DIR>/funcfg/scratch.sites y añadir cada sitio web manualmente (uno por línea). Funciona de un modo muy similar a CeWL.

python3 pydictor.py -extend adastra thehackerway.es –more –leet 0 1 2 11 21 –level 4 –len 1 12 –occur “<=10” “>0” “<=2” -o /tmp/wordlist.lst -> Genera un diccionario para ingeniería social utilizando los datos “adastra” y “thehackerway.es”. Con –more se le indica a la herramienta que genere un diccionario extendido utilizando algunos patrones de contraseñas comunes. Con –leet se realiza la sustitución de caracteres en función a las reglas definidas en el fichero <PYDICTOR_DIR>/funcfg/leet_mode.conf. Los números que acompañan a esta opción en este caso son “0, 1, 2, 11 y 21”, los cuales son códigos internos que indican cómo debe hacerse la sustitución y se encuentran debidamente explicados en la documentación oficial: https://github.com/LandGrey/pydictor#code. Con –level se intenta filtrar los resultados que serán incluidos en el diccionario. Con –occur suele venir acompañado de –leet como filtro para el número de  apariciones de letras, dígitos y caracteres especiales. Es decir, en este caso concreto se empezarán a sustituir letras por dígitos cuando la letra definida en las reglas “leet” aparezca 10 veces o más. Se sustituirán los dígitos cuando alguno de ellos aparezca 1 vez o más y finalmente, cualquier carácter especial se sustituirá cuando aparezca 2 veces o más.

Como se puede ver es una herramienta bastante completa y al mismo tiempo puede resultar compleja, no obstante la calidad de diccionarios que puede generar hace que merezca la pena su estudio. Por último, se aconseja ver los valores admitidos en la opción “-tool” ya que pueden ser útiles para la gestión de los diccionarios generados. Espero que te haya resultado interesante y si ese es el caso, puedes dejar un comentario en este post o simplemente compartirlo.

Un saludo y Happy Hack!
Adastra.