El ataque basado en reglas (Rule-based attack) consiste en la generación y filtración flexible de candidatos a contraseñas.
A pesar de todas sus capacidades, este ataque no es todopoderoso. Consideremos el siguiente ejemplo:
Tenemos la palabra:
seesaw
y necesitas reemplazar el carácter s
con el carácter $
. Por ejemplo, en John the Ripper podrías intentar usar la regla ss$
, pero esta solo devuelve $ee$aw
, cuando lo que necesitas es:
seesaw
$eesaw
see$aw
$ee$aw
También es necesario reemplazar otros símbolos de manera similar.
Esta tarea implica que al realizar los reemplazos, el programa debe tener en cuenta los reemplazos anteriores, lo que entra en conflicto con los métodos de procesamiento de diccionarios en el ataque basado en reglas, donde cada línea se procesa de forma independiente de las anteriores y siguientes. Por lo tanto, es poco probable que esta tarea se pueda resolver con el ataque basado en reglas.
Sin embargo, se puede asegurar que al generar diccionarios basados en una máscara obtenemos aproximadamente lo que necesitamos:
maskprocessor -1 s$ ?1ee?1aw
seesaw
see$aw
$eesaw
$ee$aw
Pero, ¿qué hacer si necesitas realizar la sustitución de una cantidad variable de caracteres, o reemplazar caracteres en diferentes posiciones, no solo en una palabra, sino en todo un diccionario?
Esta tarea es completamente resoluble mediante programación. Un ejemplo de algoritmo sería:
- Obtener el número de caracteres en la palabra para reemplazar.
- Si hay un solo carácter para reemplazar, genera dos palabras: una con la sustitución y otra sin ella.
- Si hay dos caracteres para reemplazar, genera cuatro palabras: sin sustitución, con el primer carácter reemplazado, con el segundo carácter reemplazado y con ambos caracteres reemplazados.
- Si hay tres caracteres para reemplazar, genera ocho combinaciones, y así sucesivamente.
Este algoritmo se puede convertir en una función, cuyos argumentos deben ser: 1) el carácter que necesitas reemplazar; 2) el carácter con el que reemplazar. Solo necesitas escribir el código de la función una vez y puedes usarlo tantas veces como necesites. Algo así se puede implementar incluso con PHP.
Pero no te desesperes: puedes hacerlo sin programación, usando herramientas como:
- Máscaras
- Archivos de máscara
El algoritmo es el siguiente:
- Convierte el diccionario en un conjunto de máscaras con los parámetros que necesitas.
- Genera un nuevo diccionario basado en el archivo de máscaras.
Por ejemplo, tienes una lista de palabras dic1.txt
con el siguiente contenido:
seesaw
samuelsonmarian
samuelspence
samuelspevak
samuelsrie
samuelss
samuelsstarr
SAMUELSTERNA
samuelstevens
samuelsux1
samuels-x
samuelt**
samuelta.
samueltad
samueltan
samueltanner
samueltapia2
samueltas21
samuel+teadoro
samuelteall
samuelteama
samuel te amo
samuel,te,amo
samuelteamo
SAMUELTEAMO
samuelteamo21
SAMUELTEAMOMUCHO
samueltequiero
samuelthane99
La tarea es reemplazar el carácter s
por el carácter $
en todas las combinaciones posibles, para que, por ejemplo, la palabra seesaw
se convierta en:
seesaw
$eesaw
see$aw
$ee$aw
Comienza generando el archivo de máscaras. En este comando, todos los caracteres s
en el archivo dic1.txt
se cambian por ?1
, y el resultado se guarda en el archivo masks.hcmask
:
cat d1.txt | sed 's/s/\?1/g' > masks.hcmask
Para reemplazar tanto s
minúsculas como S
mayúsculas:
cat d1.txt | sed 's/[sS]/\?1/g' > masks.hcmask
Como ya habrás notado, se obtiene un conjunto de máscaras. Por ejemplo, seesaw
se convierte en ?1ee?1aw
.
El formato de los archivos .hcmask
es el siguiente:
USUARIO_CONJUNTO1,USUARIO_CONJUNTO2,USUARIO_CONJUNTO3,USUARIO_CONJUNTO4,MASK
En mi ejemplo simple, usaré solo un conjunto de caracteres de usuario, por lo que el formato final del archivo masks.hcmask
será:
USUARIO_CONJUNTO1,MASK
Agregar un prefijo a cada línea del archivo se puede hacer con el siguiente comando:
sed -i -e 's/^/PREFIJO/' ARCHIVO
En mi caso, el conjunto de caracteres de usuario es s$
, es decir, donde ?1
se debe reemplazar por s
o $
. Así que el comando es:
sed -i -e 's/^/s$,/' masks.hcmask
El contenido del archivo masks.hcmask
ahora es:
s$,?1ee?1aw
s$,?1amuel?1onmarian
s$,?1amuel?1pence
s$,?1amuel?1pevak
s$,?1amuel?1rie
s$,?1amuel?1?1
s$,?1amuel?1?1tarr
s$,SAMUELSTERNA
s$,?1amuel?1teven?1
s$,?1amuel?1ux1
s$,?1amuel?1-x
s$,?1amuelt**
s$,?1amuelta.
s$,?1amueltad
s$,?1amueltan
s$,?1amueltanner
s$,?1amueltapia2
s$,?1amuelta?121
s$,?1amuel+teadoro
s$,?1amuelteall
s$,?1amuelteama
s$,?1amuel te amo
s$,?1amuel,te,amo
s$,?1amuelteamo
s$,SAMUELTEAMO
s$,?1amuelteamo21
s$,SAMUELTEAMOMUCHO
s$,?1amueltequiero
s$,?1amuelthane99
Ahora, en Hashcat, ejecuta la generación de diccionarios basada en el archivo de máscaras masks.hcmask
:
hashcat -a 3 --stdout masks.hcmask
Obtendrás el resultado deseado con todas las posibles variaciones de sustitución de caracteres en diferentes posiciones. El comienzo de los datos generados es:
seesaw
$eesaw
see$aw
$ee$aw
samuelsonmarian
$amuelsonmarian
samuel$onmarian
$amuel$onmarian
samuelspence
$amuelspence
samuel$pence
$amuel$pence
samuelspevak
$amuelspevak
samuel$pevak
$amuel$pevak
samuelsrie
$amuelsrie
samuel$rie
$amuel$rie
samuelss
$amuelss
samuel$$
$amuel$$
samuels$
$amuels$
samuel$s
$amuel$s
…
…
…
Puedes usar hasta cuatro conjuntos de caracteres de usuario a la vez, es decir, reemplazar hasta cuatro caracteres de esta manera. Si necesitas reemplazar más caracteres, puedes repetir estos pasos tantas veces como sea necesario.