
Eliminar duplicados de una lista de palabras MASIVA, sin ordenarla (para cracking de contraseñas basado en diccionarios)
Hoy en día, la creación de listas de palabras para contraseñas generalmente implica concatenar múltiples fuentes de datos.
Idealmente, las contraseñas más probables deberían estar al inicio de la lista, para que las más comunes se descifren al instante.
Con las herramientas de deduplicación existentes, te ves obligado a elegir si prefieres preservar el orden O manejar listas masivas.
Desafortunadamente, la creación de listas requiere ambas
Así que escribí duplicut en C altamente optimizado para abordar esta necesidad tan específica 🤓 💻
git clone https://github.com/nil0x42/duplicut # download ...
cd duplicut/ && make # compile ...
./duplicut wordlist.txt -o clean-wordlist.txt # dedupe !!!
-o, --outfile <FILE> Write result to <FILE>
-t, --threads <NUM> Max threads to use (default max)
-m, --memlimit <VALUE> Limit max used memory (default max)
-l, --line-max-size <NUM> Max line size (default 1024, max 4095)
-p, --printable Filter ascii printable lines
-c, --lowercase Convert wordlist to lowercase
-C, --uppercase Convert wordlist to uppercase
-D, --dupfile <FILE> Write dupes to <FILE> (slows down duplicut)
-h, --help Display this help and exit
-v, --version Output version information and exit
Características:
--line-max-size opción)--printable opción)--dupfile opción)--lowercase o --uppercaseImplementación:
Limitaciones:
--line-max-size no puede exceder 4095Un uint64 es suficiente para indexar líneas en el hashmap, empaquetando la información de tamaño dentro de los bits extra del puntero:

Si el archivo completo no cabe en memoria, se divide en fragmentos virtuales, de manera que cada fragmento utilice la mayor cantidad de RAM posible.
Cada fragmento se carga en el hashmap, se deduplica y se prueba contra los fragmentos posteriores.
De esta manera, el tiempo de ejecución se reduce al número triangular ésimo como máximo:

Si encuentras un error o algo no funciona como se espera, compila duplicut en modo depuración y publica un issue con la salida adjunta:
# debug level can be from 1 to 4
make debug level=1
./duplicut [OPTIONS] 2>&1 | tee /tmp/duplicut-debug.log