
Genera millones de mutaciones de contraseñas basadas en palabras clave en segundos.
Agradecimientos especiales a DavidAngelos:
▶️ Se añadió una barra de progreso en cada paso para rastrear la ejecución.
▶️ Se añadieron opciones:
-i / --inorder): combinar palabras clave solo en el orden original (ej. foo,bar,baz → foo, bar, baz, foobar, foobaz, barbaz, foobarbaz).-c / --combinations): generar cada ordenación de cada subconjunto (ej. foo,bar,baz → foo, bar, baz, foobar, foobaz, barfoo, …, bazbarfoo).--sep <cadena>): al unir palabras, insertar esta cadena entre tokens (por defecto sin separador).--max-combine <N>): limitar cuántas palabras clave sin procesar se unen (por defecto: 2).--minlen/--maxlen <N>): filtrar la lista final solo con palabras de la longitud deseada.Psudohash es un generador de listas de contraseñas para orquestar ataques de fuerza bruta y descifrar hashes. Imita ciertos patrones de creación de contraseñas comúnmente utilizados por humanos, como sustituir letras de una palabra con símbolos o números (leet), usar variaciones de mayúsculas/minúsculas, agregar un relleno común antes o después de la frase de paso principal y más. Está basado en palabras clave y es altamente personalizable. 🎥 -> Video Presentación
Los administradores de sistemas y otros empleados a menudo usan una versión mutada del nombre de la empresa para establecer contraseñas (ej. Am@z0n_2022). Esto es común en dispositivos de red (puntos de acceso Wi-Fi, switches, routers, etc.), aplicaciones o incluso cuentas de dominio. Con las opciones más básicas, psudohash puede generar una lista de palabras con todas las mutaciones posibles de una o varias palabras clave, basándose en patrones comunes de sustitución de caracteres (personalizables), variaciones de mayúsculas/minúsculas, cadenas comúnmente usadas como relleno y más. Observe el siguiente ejemplo:

El script implementa el siguiente esquema de sustitución de caracteres. Puede agregar/modificar las asignaciones de sustitución editando la lista transformations en psudohash.py y siguiendo la estructura de datos que se muestra a continuación (por defecto):
transformations = [
{'a' : ['@', '4']},
{'b' : '8'},
{'e' : '3'},
{'g' : ['9', '6']},
{'i' : ['1', '!']},
{'o' : '0'},
{'s' : ['$', '5']},
{'t' : '7'}
]
Al establecer contraseñas, creo que es bastante estándar agregar una secuencia de caracteres antes y/o después de la frase de paso principal para hacerla "más segura". Por ejemplo, alguien puede establecer una contraseña "dragon" y agregar un valor como "!!!" o "!@#" al final, resultando en "dragon!!!", "dragon!@#", etc. Psudohash lee estos valores de common_padding_values.txt y los usa para mutar las palabras clave proporcionadas, añadiéndolos antes (-cpb) o después (-cpa) de cada variación de palabra clave generada. Puede modificarlo como prefiera.
Al agregar un valor de año a una palabra clave mutada, psudohash lo hará utilizando varios separadores. Por defecto, usará los siguientes separadores, que puede modificar editando la lista year_separators:
year_seperators = ['', '_', '-', '@']
Por ejemplo, si la palabra clave dada es "amazon" y se usó la opción -y 2023, la salida incluirá "amazon2023", "amazon_2023", "amazon-2023", "amazon@2023", "amazon23", "amazon_23", "amazon-23", "amazon@23".
Instale Python 3.x y tqdm primero:
pip3 install tqdm
Luego clone el repositorio y haga el script ejecutable:
git clone https://github.com/t3l3machus/psudohash.git
cd ./psudohash
chmod +x psudohash.py
./psudohash.py [-h] -w WORDS [-i] [-c] [--sep SEP] [--max-combine N] [-an LEVEL] [-nl LIMIT] [-y YEARS] [-ap VALUES] [-cpb] [-cpa] [-cpo] [-o FILENAME] [-q]
El diálogo de ayuda [ -h, --help ] incluye detalles de uso y ejemplos.
-w, --words <kw1,kw2,…>
Palabras clave separadas por comas (obligatorio).
-i, --inorder
Unir hasta --max-combine palabras clave en el orden dado (ej. foo,bar,baz → foo, bar, baz, foobar, foobaz, barbaz, foobarbaz).
-c, --combinations
Generar todas las permutaciones de cada subconjunto (hasta --max-combine) (ej. foo,bar,baz → foo, bar, baz, foobar, foobaz, barfoo, …).
--max-combine <N> (por defecto: 2)
Número máximo de palabras clave sin procesar para unir en una sola cadena base.
--sep <cadena>
Al unir palabras ( o ), colocar esta cadena entre tokens. Por defecto es una cadena vacía.
Sin palabras múltiples (solo singletons)
./psudohash.py -w foo,bar,baz -cpa
# → foo, bar, baz
Uniones en orden (-i, hasta 2 palabras por defecto)
./psudohash.py -w foo,bar,baz -i
# → foo, bar, baz, foobar, foobaz, barbaz
Combinaciones en todos los órdenes (-c, hasta 2 palabras por defecto)
./psudohash.py -w foo,bar,baz -c
# → foo, bar, baz, foobar, foobaz, barfoo, barbaz, bazfoo, bazbar
Cambiar separador entre palabras unidas
./psudohash.py -w foo,bar,baz -i --sep "_"
# → foo, bar, baz, foo_bar, foo_baz, bar_baz
Filtrado de longitud (--minlen/--maxlen)
./psudohash.py -w apple,banana -i --minlen 10
# Advertencia: no se puede determinar el tamaño exacto debido a los filtros de longitud.
# Ejemplos de salidas finales podrían incluir “applebanana” (11 caracteres), “bananaapple” (11 caracteres).
--years y --append-numbering con un --numbering-limit ≥ los últimos dos dígitos de cualquier año de entrada, probablemente producirá palabras duplicadas debido a los patrones de mutación implementados por la herramienta.--minlen o --maxlen, el script no puede precalcular el número exacto de palabras; verá una advertencia de "no se puede determinar el tamaño exacto" y se calculará el tamaño sin este filtro; el tamaño final será menor.En cuanto a las personas, creo que todos hemos (más o menos) establecido contraseñas usando una mutación de una o más palabras que significan algo para nosotros, por ejemplo, nuestro nombre o el de nuestra esposa/hijo/mascota/banda, agregando el año en que nacimos al final o quizás un relleno súper seguro como "!@#". Bueno, ¿adivina qué?

Estoy recopilando información sobre patrones comunes de creación de contraseñas para mejorar las capacidades de la herramienta.
-i-c--minlen <N>
Descartar cualquier contraseña final más corta de N caracteres.
--maxlen <N>
Descartar cualquier contraseña final más larga de N caracteres.
-an, --append-numbering <NIVEL>
Agregar sufijos numerados (con ceros a la izquierda hasta <NIVEL> dígitos) a cada mutación de palabra.
-nl, --numbering-limit <LÍMITE>
Número máximo hasta el cual contar al agregar números (por defecto: 50).
-y, --years <años>
Agregar uno o más años a cada mutación (ej. 1990-2000, o 2022,2023).
-ap, --append-padding <valores>
Agregar valores de relleno personalizados (separados por comas). Debe usarse con -cpb o -cpa.
-cpb, --common-paddings-before
Anteponer valores de common_padding_values.txt antes de cada mutación.
-cpa, --common-paddings-after
Añadir valores de common_padding_values.txt después de cada mutación.
-cpo, --custom-paddings-only
Usar solo rellenos proporcionados por el usuario (sin valores predeterminados). Debe usarse con -ap.
-o, --output <archivo>
Escribir los resultados en <archivo> (por defecto: output.txt).
-q, --quiet
Suprimir el banner de arte ASCII al inicio.
Combinar hasta 3 palabras (en lugar de las 2 por defecto)
(Nota: el ejemplo continúa pero el texto original se corta; asumimos que es intencional y no traducimos más allá de lo proporcionado)