03 junio 2008

Cracking de certificados Digitales

El objetivo de este artículo no es teorizar sobre técnicas para deducir claves RSA o encontrar colisiones en algoritmos de resumen como MD5 o SHA, el enfoque es mucho más pragmático y está orientado a, tal vez, el eslabón más débil de un entorno PKI: los contenedores criptográficos PKCS12. Las claves privadas de los certificados digitales pueden ir almacenadas en un tarjetas digitales “Smart Cards” y también estar almacenadas en ficheros (para su entrega, backup o similar), en este ultimo caso, el formato que, normalmente, se emplea se denomina PKCS12 y básicamente, grosso modo, se trata de un fichero donde va almacenado el certificado digital, su correspondiente clave privada y opcionalmente los certificados digitales de las CAs que forman parte de la PKI. Ese fichero en formato PKCS12 está a su vez cifrado con una clave que es la que permite acceder al contenedor donde se encuentra la clave privada, y como cualquier otra clave de acceso, se puede atacar por fuerza bruta. Obviamente el éxito / fracaso de ese tipo de ataque va en función de la calidad del diccionario empleado y la robustez de la clave empleada para proteger el contenedor criptográfico.
Para realizar el ataque por fuerza bruta, vamos a emplear la herramienta Brute12, se puede descargar en formato binario ya compilado y su código fuente aquí.
Para que funcione correctamente has de tener instalado en tu equipo CAPICOM, una interface a la CryptoAPI de windows vía objetos COM/OLE.
Para poder realizar las pruebas necesitas tener un diccionario lo más amplio posible. Uno con mucha solera y tradición lo puedes obtener en la Web Openwall, contiene múltiples palabras en numerosos idiomas.
Una vez tengamos CAPICOM instalado y el diccionario procedemos a usar Brute12, para ello abrimos un terminal cmd.exe y nos situamos donde hayamos descomprimido el .zip descargado ejecutándolo de la siguiente forma:

D:\brute12>brute12.exe certificado.p12 diccionario.txt
Brute12 31032008

http://www.security-projects.com/?Brute12
yjesus@security-projects.com


[*]Start
The current date/time is: Mon Mar 31 12:43:12 2008
Words tested: 1000
The current date/time is: Mon Mar 31 12:43:14 2008
Words tested: 2000
The current date/time is: Mon Mar 31 12:43:16 2008
Words tested: 3000
The current date/time is: Mon Mar 31 12:43:17 2008

El proceso continuara hasta que encontremos la contraseña del certificado y obtengamos el siguiente mensaje con la contraseña:

PKCS12 Deciphered !!
password:1234
The current date/time is: Mon Mar 31 12:44:59 2008

Pese a la criticidad de este tipo de ficheros (almacenan credenciales criptográficas para accesos seguros) es increíble la cantidad de entradas que devuelve google con una búsqueda como: filetype:p12 OR filetype:pfx
Desde mi punto de vista exponer este tipo de ficheros de forma publica es análogo a publicar un fichero passwd o SAM

-Referencias-

http://www.security-projects.com/?Brute12
http://www.rsa.com/rsalabs/node.asp?id=2124
http://www.openwall.com/
http://msdn2.microsoft.com/en-us/library/ms995332.aspx

2 comments :

Anónimo dijo...

Curioso :-)
Tengo hecha por ahí una funcioncilla en Java para hacer esto mismo; ¿sabes si se nota mucha diferencia de rendimiento con tu versión no-lastrada-por-la-jvm?

Yago Jesus dijo...

Hombre, yo entiendo que necesariamente debería ser mas rápido, no obstante, si te digo que, pensando en el rendimiento, hice una versión que tiraba directamente de CAPI sin usar objetos OLE y después de terminarla, el rendimiento era idéntico. Siempre puedes poner un contador como en el brute12 y ver lo que tarda en procesar 2000 o 3000 palabras.