
Generador de conjeturas de contraseñas basado en Gramática Libre de Contexto Probabilística (PCFG)
PCFG = Probabilistic Context Free Grammar
PCFG = Pretty Cool Fuzzy Guesser
En resumen: Una colección de herramientas para investigar cómo los humanos generan contraseñas. Se pueden usar para descifrar hashes de contraseñas, pero también para crear contraseñas sintéticas (honeywords) o ayudar a desarrollar mejores algoritmos de fortaleza de contraseñas.
Trainer: 4.4
Guesser: 4.6
PRINCE_LING: 4.3
Password_Scorer: 4.4
Se utiliza Sphinx para crear dinámicamente una Guía para Desarrolladores basada en los docstrings del código. Para construir la Guía para Desarrolladores, consulte las instrucciones en /doc/INSTRUCTIONS.rst
También se puede encontrar una Guía para Desarrolladores preconstruida en PDF en /doc/build/latex/pcfgdevelopersguide.pdf. Nota: no voy a reconstruir esta guía entre versiones importantes para mantener el historial de git más limpio. Es decir, hacer commits de PDFs se vuelve muy desordenado muy rápido. Esto significa que la guía preconstruida puede estar ligeramente desactualizada, por lo que si la usas para ayudarte a escribir/modificar código, se recomienda construir la guía tú mismo en lugar de usar la preconstruida.
Este proyecto utiliza aprendizaje automático para identificar los hábitos de creación de contraseñas de los usuarios. Se genera un modelo PCFG entrenando con una lista de contraseñas de texto plano divulgadas/descifradas. En el contexto de este proyecto, el modelo se denomina conjunto de reglas y contiene muchas partes diferentes de las contraseñas identificadas durante el entrenamiento, junto con sus probabilidades asociadas. Esta derivación puede ser útil para otras herramientas de descifrado como PRINCE, y/o partes del conjunto de reglas pueden incorporarse directamente en ataques de diccionario más tradicionales. Este proyecto también incluye un generador de conjeturas PCFG que utiliza este conjunto de reglas para generar conjeturas de contraseñas en orden de probabilidad. Esto es mucho más potente que los ataques de diccionario estándar, y en las pruebas se ha demostrado que puede descifrar contraseñas en promedio con significativamente menos conjeturas que otros métodos disponibles públicamente. La desventaja es que generar conjeturas en orden de probabilidad es lento, lo que significa que crea en promedio entre 50 y 100 mil conjeturas por segundo, mientras que los algoritmos basados en GPU pueden crear millones y miles de millones (y más) de conjeturas por segundo contra algoritmos de hash rápidos. Por lo tanto, el adivinador PCFG es mejor usado contra grandes cantidades de hashes salados u otros algoritmos de hash lentos, donde el costo de rendimiento del algoritmo se compensa con la precisión de las conjeturas.
pip3 install chardetEl conjunto de reglas predeterminado incluido en este repositorio se creó entrenando con un subconjunto de 1 millón de contraseñas del conjunto de datos RockYou. Se puede lograr un mejor rendimiento entrenando con el conjunto completo de 32 millones de contraseñas de RockYou, pero se excluyó para mantener el tamaño de descarga pequeño. Puede usar el conjunto de reglas predeterminado para comenzar a generar contraseñas sin tener que entrenar con una nueva lista, pero se recomienda entrenar con un conjunto objetivo de contraseñas que pueda estar más cerca de lo que intenta atacar. Si crea su propio conjunto de reglas, aquí tiene una guía rápida:
python3 trainer.py -t INPUT_PASSWORD_LIST -r NEW_RULESETpython3 trainer.py -t INPUT_PASSWORD_LIST -r NEW_RULESET -c 0.6
b. --save_sensitive: Si se especifica, los datos sensibles como direcciones de correo electrónico y sitios web completos que se descubran durante el entrenamiento se guardarán en el conjunto de reglas. Aunque el generador de conjeturas PCFG actualmente no utiliza estos datos, son muy valiosos durante un ataque real de descifrado de contraseñas. Esta opción está desactivada por defecto para facilitar el uso de esta herramienta en un entorno académico. Tenga en cuenta que, incluso cuando está desactivada, casi con seguridad seguirá habiendo datos de PII guardados dentro de un conjunto de reglas, así que proteja adecuadamente los conjuntos de reglas generados. Ejemplo: python3 trainer.py -t INPUT_PASSWORD_LIST -r NEW_RULESET --save_sensitive
c. --comments: Agrega un comentario al archivo de configuración de su conjunto de reglas. Esto es útil para saber por qué y cómo generó su conjunto de reglas cuando lo revise más tarde. Incluya el comentario que desee agregar entre comillas.Esto genera conjeturas en stdout usando un conjunto de reglas PCFG previamente entrenado. Estas conjeturas se pueden redirigir a cualquier programa que desee utilizarlas. Si no se especifica ningún conjunto de reglas, se usará el conjunto de reglas predeterminado DEFAULT. Para los fines de esta guía, se asumirá que el conjunto de reglas utilizado es NEW_RULESET.
python3 pcfg_guesser.py -r NEW_RULESET -s SESSION_NAMEpython3 pcfg_guesser.py -r NEW_RULESET -s SESSION_NAME --loadHay muchos casos en los que desea estimar la probabilidad de que una contraseña sea generada por un conjunto de reglas previamente entrenado. Por ejemplo, esto podría ser parte de una métrica de fortaleza de contraseña, o usarse para fines de investigación. Se ha incluido un programa de ejemplo para realizar esto.
python3 password_scorer -r NEW_RULESET -i INPUT_LISTNombre: PRINCE Language Indexed N-Grams (Prince-Ling)
Resumen: Construye listas de palabras personalizadas basadas en un conjunto de reglas/gramática PCFG ya entrenado para usar en ataques combinatorios estilo PRINCE. La idea detrás de esto es que, dado que el entrenador PCFG ya descompone un conjunto de entrenamiento de contraseñas en análisis individuales, esa información podría aprovecharse para hacer listas de palabras dirigidas para otros ataques.
Mecánica básica: Internamente, la herramienta Prince-Ling es básicamente un generador de conjeturas PCFG en miniatura. Elimina la generación de conjeturas Markov y reemplaza las estructuras base utilizadas en los ataques PCFG normales con una estructura base significativamente reducida adaptada para generar listas de palabras PRINCE. Esto permite generar palabras de diccionario en orden de probabilidad teniendo en cuenta cuán útiles se espera que sean esas palabras en un ataque PRINCE.
Usando Prince-Ling
python3 prince-ling.py -r NOMBRE_DEL_CONJUNTO_DE_REGLAS -s TAMAÑO_DE_LA_LISTA_DE_PALABRAS_A_CREAR -o NOMBRE_ARCHIVO_SALIDApython3 pcfg_guesser -r NEW_RULESET -s NOMBRE_SESION | ./john --stdin --format=bcrypt CONTRASEÑAS_A_DESCIFRAR.txt
Si observa algún error, o si tiene una función que le gustaría que se agregue, por favor abra un issue en esta página de GitHub. También acepto pull requests, aunque idealmente enlace un pull request a un issue para que pueda revisarlo más fácilmente, hacer preguntas y comprender mejor los cambios que está realizando.
Hay muchas mejoras que se pueden hacer en el modelado de estrategias de creación de contraseñas usando PCFGs. Estoy muy abierto a nuevas ideas, cambios y sugerencias. Solo porque el código actualmente haga algo de cierta manera no significa que sea la mejor opción. Por ejemplo, la estructura base fundamental del enfoque actual, donde se generan máscaras para cadenas alfabéticas, dígitos, otros, etc., se eligió porque era la opción "más fácil" de implementar. Mi equipo tuvo mucho debate sobre que una mejor opción podría ser comenzar con una palabra base, y luego modelar reglas de manipulación más tradicionales aplicadas a ella como transiciones en el PCFG. ¡Así que siéntase libre de experimentar con este código!