NOTA: No es necesario entrenar un diccionario propio por regla general ya que se incluyen 3 o 4 entrenamientos ya realizados y totalmente válidos. Si queremos ampliarlos, podriamos hacerlo siguiendo este artículo. Dicho esto, continuamos...
PassGAN es un enfoque novedoso y eficiente para el entrenamiento de diccionarios de contraseñas utilizando técnicas de aprendizaje profundo y generación de adversarios. Este método combina las ventajas de las redes generativas adversarias (GANs) y los algoritmos de aprendizaje automático para crear diccionarios de contraseñas más sofisticados y difíciles de predecir.
En este artículo veremos como entrenar nuestro propio diccionario o dataset
usage: train.py [-h] [--training-data TRAINING_DATA] --output-dir OUTPUT_DIR
[--save-every SAVE_EVERY] [--iters ITERS] [--batch-size BATCH_SIZE]
[--seq-length SEQ_LENGTH] [--layer-dim LAYER_DIM]
[--critic-iters CRITIC_ITERS] [--lambda LAMB]
El principal escollo con el que nos podemos encontrar, a nivel práctico, entrenando datasets o diccionarios con PassGAN es la memoria RAM… El proceso consume una gran cantidad de memoria RAM ya que:
1. Carga la lista o diccionario que le indicamos en –training-data y la filtra por longitud, según la longitud que le indiquemos en –seq-length , que por defecto es de 10 caracteres.
2. Desordena la lista de palabras para el entrenamiento de la red y realiza un padding de los caracteres que le indiquemos hasta completar dicha longitud. P.ej. Para la password 123456,. hace padding como 123456```` para 10 caracteres de longitud, eso a efectos practicos y como preproceso de la lista. Eso ocupa más memoria.
3. Luego hace un conteo de caracteres por frecuencia de uso y a nivel estadístico para generar dos pequeños diccionarios.
4. Genera la propia red GAN, generador y discriminador en 2 clases, cargando las listas por segunda vez en estas clases. Ahí es donde se producirá el entrenamiento como tal de la red GAN. Y eso ocupa aún más RAM.
5. Comienza el entrenamiento como tal de la red GAN y ahí ya se mantiene la memoria estable, al entrenar con la GPU. Esto quiere decir que si no sube demasiado la memoria RAM llegados a este punto y después de una media hora, tenemos cierta garantía de que nuestro sistema no mate el proceso por exceso de memoria consumida. El proceso con una GPU de tipo medio, lleva unas 9 horas de proceso para un diccionario de algunos miles de millones de passwords, en mi caso, 4k millones. Yo utilicé Google Colab, por razones obvias: equipamiento y precio de la energía, básicamente. Tuve que usar la opcion GPU Premium y memoria RAM extra para conseguir 80 Gb de RAM y una GPU decente. Viene a costar unos 200 o 300 creditos el entrenamiento en si.
Más opciones que nos dejamos en el tintero son las siguientes:
--output-dir [directorio donde guardar checkpoints & info]
Este directorio se debe crear dentro del directorio PassGAN con mkdir. Ejemplos ya creados serían pretrained, commonu11, csho10. Con un simple
mkdir midiccionario
valdría para inicializar el directorio antes del entrenamiento.
--save-every [numero de iteraciones]
que por defecto es 5000, dice cuando salva un nuevo checkpoint el programa, con su información asociada.
--iters [numero de iteraciones]
indica el numero de iteraciones que se realizarán antes de parar el programa. Por defecto son 200000. Esto salvaría como última iteración la 195000, así que un buen número de iteración de parada sería el 200100, para que se salve la iteración 200000 .
--batch_size: Tamaño del lote para el entrenamiento. Cuanto mayor sea el tamaño del lote, más ejemplos se procesarán al mismo tiempo durante el entrenamiento. Un tamaño de lote más grande puede acelerar el entrenamiento pero también requerir más memoria. El valor predeterminado es 64
Estos que siguen son hiperparámetros de ajuste de la GAN, para un entrenamiento mas ajustado. Es seguro dejar los valores por defecto y un buen ajuste puede mejorar el entrenamiento, un mal ajuste, arruinarlo.
--layer-dim [numero de capas]
Por defecto son 128, lo cual está bien para un entrenamiento estandar. Indica el número de capas ocultas en nuestra GAN.
Un valor más alto puede mejorar el rendimiento del modelo, pero también puede aumentar el tiempo de entrenamiento y el riesgo de overfitting. Un valor mas bajo, ahorra memoria y acelera el proceso perdiendo en precisión de nuestro modelo.
--critic_iters: Número de iteraciones del discriminador (también llamado crítico en el contexto de WGAN) por cada iteración del generador. En GANs tradicionales, el generador y el discriminador suelen actualizarse de manera equilibrada. Sin embargo, en la arquitectura Wasserstein GAN (WGAN), a veces es útil actualizar el discriminador varias veces por cada actualización del generador para garantizar una mejor convergencia. El valor predeterminado es 10.
--lambda: Coeficiente de regularización de la penalización del gradiente (GP). Esta opción es relevante en el contexto de las WGAN-GP (Wasserstein GAN con penalización de gradiente). La penalización de gradiente es una técnica de regularización utilizada para mejorar la estabilidad del entrenamiento de las GANs al penalizar a los discriminadores con gradientes de alta norma. El valor de --lambda controla el peso de esta penalización en la función de pérdida del discriminador. Un valor más alto de lambda penalizará más fuertemente a los discriminadores con gradientes grandes, lo que puede mejorar la estabilidad del entrenamiento pero también hacer que la convergencia sea más lenta. El valor predeterminado es 10.
El programa :
https://github.com/beta6/PassGAN
https://github.com/danielmiessler/SecLists <- de aqui obtenemos commonu.txt uniendo darkc0de+openwall+xato-net-10M
chso10.txt lo obtenemos de el diccionario crackstation-human-only.txt
podemos obtener en la red este diccionario de aqui: https://download.g0tmi1k.com/wordlists/large/crackstation-human-only.txt.gz
Entrenamientos ya realizados con éxito:
python train.py -o commonu11 --training-data data/commonu.txt --seq-length 11
python train.py -o csho10 --training-data data/csho10.txt --seq-length 10
Es seguro parar el programa con ctrl+c siempre y cuando no esté salvando una iteración.
El promedio de iteraciones de un entrenamiento normal son 200000, esto no quita que se hagan mas o menos si fuera necesario, ganando o perdiendo en precisión.
Dicho sea de paso que la instalación con virtualenv es como sigue:
apt install python3-virtualenv
virtualenv passganenv
cd passganenv
source bin/activate
git clone https://github.com/beta6/PassGAN
pip install --upgrade pip
pip install -r PassGAN/requirements.txt
cd PassGAN
aquí ya operariamos de forma normal con los programas revisados train.py y sample.py
Hasta aquí el artículo sobre el entrenamiento de PassGAN.
Si no habeis entendido algo, no pasa nada, es normal si no tocasteis nada de machine learning o deep learning. Esto no quita que podais realizar un entrenamiento con PassGAN o bien una generación de contraseñas sin mucho problema.
Espero que os haya gustado el artículo y podeis utilizar los comentarios para dudas o preguntas.
Saludos y feliz training…
blog comments powered by