13 agosto 2009

YACCT: Yet Another Certificate Cracker Tool

A la herramienta Brute12, publicada por Yago el año pasado para hacer cracking certificados digitales PKCS12, y bien conocida además por los participantes del Wargame de Campus Party 2009 le ha salido una herramienta hermana: Brute12Unx.

Brute12 es una fantástica herramienta hecha en C, bajo entornos Win32 que se basa en las librerías CAPICOM para probar a cargar un certificado digital PKCS12, probando una a una, las palabras de un diccionario a fin de encontrar la contraseña.

Brute12Unx tiene básicamente la misma funcionalidad, sólo que lo hace bajo entornos UNIX.
Asimismo permite, como opción, enviar un correo con el resultado, con la password correcta o con un mensaje de "Password no encontrada". De esta manera no es necesario estar monitorizando el proceso de cracking, y simplemente recibir un correo en cuanto se encuentre la solución.

Como dependencia requiere el módulo Crypt::OpenSSL::PKCS12 de forma obligatoria y Mail::Sender si se utiliza la función del envío de correo al terminar.

Se ha probado con buenos resultados en GNU/Linux CentOS4, así como en Mac OS X.

El modo de funcionamiento es muy sencillo. Funciona vía línea de comandos de la siguiente manera:

[root@Carmen brute12unx]# brute12unx.pl
Certificate Cracker PKCS12 for UNIX 03/08/2009 (http://www.lorenzomartinez.es/projs/brute12unx)
By Lorenzo Martinez (lorenzo@lorenzomartinez.es)

Based on idea: brute12 (http://www.security-projects.com/?Brute12)

Usage /usr/local/bin/brute12unx.pl -p cert.p12 -d dict.txt [-f emailfrom -t emailto -s smtp_server -v1]

Como parámetros obligatorios, hay que pasarle obviamente el certificado PKCS12 a crackear y el diccionario a utilizar con -p y -d respectivamente. Como opción podemos pasarle el email desde el que nos llega el correo, el email que lo recibe y la IP del servidor SMTP que utilizaremos para el envío. Asimismo con -v1 podremos ir viendo las diferentes palabras que se van probando para crackear el certificado digital.

Al estar basado en un lenguaje interpretado como Perl, en vez de uno compilado como C (como Brute12 para Windows), supongo que el rendimiento de una y de otra herramienta no serán iguales. No he podido hacer pruebas con el mismo hardware, y aunque se hace un uso intensivo de CPU como con cualquiera de este tipo de programa, el ratio de palabras probadas en un Pentium 4 a 2,8 Ghz ha sido de unas 25000 palabras/minuto.
225319 Checking "finalizado"... ... FOUND!!! Password is: finalizado Start time: 2009-08-12 22:54:15 End time: 2009-08-12 23:03:24
Es decir, 225319 palabras en unos 9 minutos y 9 segundos.

Abierto quedo a vuestras sugerencias para mejorar la herramienta (amén del rendimiento, que es ya conocido que no será comparable entre la versión C y la versión Perl)

La herramienta, la podéis descargar desde aquí

15 comments :

Anónimo dijo...

Buenos días,

sería interesante incorporar un directorio "demo" al fichero zip, con un certificado "vulnerable" a un diccionaro "dict.txt" que también fuese incluído.

De esa forma su evaluación podría ser bastante más rápida.

Un saludo.

primolarry dijo...

Yo iba a sugerir lo mismo, el único certificado que tengo es el mío de la FNMT y prefiero no jugar con él.

Un saludo

Lorenzo Martínez dijo...

@Anónimo y @PrimoLarry -> A petición vuestra he puesto un directorio demo con dos ficheros: ficticio.p12 (el certificado digital que pusimos en el wargame de la Campus Party) y dict.txt (un diccionario en el que aparece la contraseña para dicho certificado). En unos 9 segundos cae :D

Muchas gracias por vuestras sugerencias. Saludos,

Anónimo dijo...

Felicidades por esta nueva herramienta! Me dispongo a descargarla!

Mode Critica constructiva ON
No se si para perl existen bindings para CUDA pero seguro que usando las GPU de una Nvidia se puede acelerar notablemente el proceso.
Mode Critica constructiva OFF

Lorenzo Martínez dijo...

@Anónimo2, gracias por tu crítica constructiva. He estado mirando si existen módulos perl para eso y no he encontrado nada. Una pena porque seguramente sería una buena mejora para lo que flaquea en comparación con la versión hecha en C, el rendimiento...

primolarry dijo...

Gracias por la demo Lorenzo.

Respecto al rendimiento que comentas, en mi PC (dual core quad q6600, 2'4 Ghz x 4) ha tardado un segundo en recorrer las 747 palabras que había hasta "finalizado".

Luego he movido "finalizado" a la última posición del diccionario y ha tardado 20 segundos en recorrer las 11262 palabras, unas 33800 palabras por minuto. Sin embargo mi sistema operativo es ubuntu 32 bit y mientras está corriendo el programa sólo se usa un núcleo al 100% y los otros 3 al 10%.

Probablemente este programa compilado en C y corriendo en un PC con un SO más optimizado (64 bits o incluso gentoo) diera un rendimiento bastante mejor, siendo el actual más que aceptable.

Dejando de lado el rendimiento, a mí la verdad es que el programa me encanta. Cuanto más sencillo mejor :)

Un saludo

Anónimo dijo...

¿Siempre publicáis un artículo al día? ¿Desde siempre? Simplemente es curiosidad, os veo muy implicados en esta web.

Disculpad por el off-topic ;-) y saludos a la gente de este blog, tenéis unos artículos muy interesantes.

Lorenzo Martínez dijo...

@PrimoLarry -> muchas gracias por las pruebas y el análisis. Como bien indicas, el poder aprovechar al máximo las capacidades del procesador debido a un compilador y a un sistema operativo más potente, será uno de los puntos en los que habrá que centrarse. Alex me comentó que estaría bien usar threads (desconozco si los hilos de perl forzaría a cada core del procesador a procesar cada hilo o no...) o incluso con Yago estamos barajando otras posibilidades para darle más velocidad al asunto. Os mantendremos informados :D

@Anónimo -> En general intentamos publicar un artículo al día entre los 5 editores que somos. Sin embargo, hay días en los que por motivos de urgencia nos vemos obligados a publicar más de uno. Muchas gracias por tu interés. Saludos

vierito5 dijo...

Sobre perl y los threads no sé como se comportaría. Lorenzo, ¿morir a C y openssl con soporte para pkcs12?

$ openssl list-standard-commands | grep pkcs

crl2pkcs7
pkcs12
pkcs7
pkcs8

Lorenzo Martínez dijo...

@Vierito5 -> por ahí van los tiros de lo que estamos preparando :D

Anónimo dijo...

"@Anónimo -> En general intentamos publicar un artículo al día entre los 5 editores que somos. Sin embargo, hay días en los que por motivos de urgencia nos vemos obligados a publicar más de uno. Muchas gracias por tu interés. Saludos"

Gracias por la respuesta, seguid así :-)

Lorenzo Martínez dijo...

@PrimoLarry -> muchas gracias por las pruebas y el análisis. Como bien indicas, el poder aprovechar al máximo las capacidades del procesador debido a un compilador y a un sistema operativo más potente, será uno de los puntos en los que habrá que centrarse. Alex me comentó que estaría bien usar threads (desconozco si los hilos de perl forzaría a cada core del procesador a procesar cada hilo o no...) o incluso con Yago estamos barajando otras posibilidades para darle más velocidad al asunto. Os mantendremos informados :D

@Anónimo -> En general intentamos publicar un artículo al día entre los 5 editores que somos. Sin embargo, hay días en los que por motivos de urgencia nos vemos obligados a publicar más de uno. Muchas gracias por tu interés. Saludos

vierito5 dijo...

Sobre perl y los threads no sé como se comportaría. Lorenzo, ¿morir a C y openssl con soporte para pkcs12?

$ openssl list-standard-commands | grep pkcs

crl2pkcs7
pkcs12
pkcs7
pkcs8

Lorenzo Martínez dijo...

@Anónimo2, gracias por tu crítica constructiva. He estado mirando si existen módulos perl para eso y no he encontrado nada. Una pena porque seguramente sería una buena mejora para lo que flaquea en comparación con la versión hecha en C, el rendimiento...

Anónimo dijo...

Mucho más rápido porque está hecho en C llamando a openssl y porque soporta multihilo: crackpkcs12.

El proyecto está alojado en sourceforge, de donde lo podéis descargar.