martes, 26 de enero de 2016

El encriptador PC-Secure de PCTools (1989-1990)

Cuando tuve mi primer pc, allá por 1991, tardé bastante en conseguir un programa de compresión de archivos, algo que en aquella época era mucho más necesario que actualmente. Tengamos en cuenta que mi primer disco duro tenía 20 megas de capacidad, que todavía se vendían los diskettes de 5¼ pulgadas y 540 Kb y que, si bien los disquettes de 3½ pulgadas de alta densidad podían contener 1,44 megas, a menudo había que conformarse con hacer un agujero en el lateral de los diskettes de «doble cara, doble densidad» de 720 Kb, más baratos, y rezar porque MS-DOS no encontrase muchos problemas a la hora de formatearlos con el doble de densidad de la garantizada por el fabricante.

Conseguí mis primeros compresores como parte de los programas que regalaban las revistas de informática. LhArc, el compresor japonés que producía archivos Lzh, se usaba (con otro nombre, claro está) en el disco de instalación de una demo de ContaPlus que regalaba una revista de software «serio», probablemente PC-Magazine. PkUnZip vino en un HobbyPC, como parte de la instalación de la demo de un juego, quizá "La bella y la bestia"; el problema es que sólo servía para descomprimir. La utilidad Arj, que se convirtió en mi favorita, me llegó también en un disco de instalación; no recuerdo en cuál. En cuanto a Tar, Gzip y demás utilidades tipo unix no las conocería hasta que hice mis pinitos con un compilador para PC llamado djgpp, que conocí poco antes de intentar usar linux... pero esto ya bien entrados los noventa, cuando ya tenía acceso a colecciones de shareware en cd-rom. Más o menos al mismo tiempo llegó Rar, también en un CD de shareware.

Por ello, durante un breve tiempo utilicé el backup de MS-DOS para hacer copias de seguridad (no ahorraba mucho espacio, sólo lo que la arquitectura del sistema de archivos FAT de Microsoft derrochaba habitualmente), el PCBackup de PC-Tools (tampoco comprimía los archivos, pero añadía un sector adicional, que suponía de un 5 a un 10% de espacio, a cada disquete) y, muy brevemente, el encriptador PC-Secure (no confundir con el antivirus homónimo) de la misma suite, que además de encriptar los archivos los comprimía con un ahorro del... ¡10%! Imagináos qué desesperado debía de estar para emplear ese programa.

* * *

Así que años después me he encontrado, tratando de organizar mis viejos programas basic, con tres archivos con extensión ".SEC", de dos de los cuales disponía también de la versión en texto plano. Las letras "PCT5" con que se iniciaban los ficheros me indicaron que las había creado algún programa de la suite PC-Tools. Entonces recordé lo que os he contado sobre ficheros comprimidos, encriptación, etcétera. Fui al trastero y busqué un de PC-Tools. A lo largo de mi vida he usado PC Tools 4, 5 y 6; sin embargo, ante la duda, saqué el primero que encontré. Probé con la clave que todavía creía recordar y encontré que el archivo no se descomprimía.

Después de leer un poco en la red, vi que el archivo usaba una codificación DES de un solo paso, y que, aunque era una codificación compleja, usaba solo una pequeña parte de la clave, así que era posible descrifrarlo por fuerza bruta. Mi primer intento se centró en averiguar cómo se usaba la línea de comandos de PC-Secure para poder hacer un ataque de fuerza bruta sin tener que enviar pulsaciones de teclado. Descubrí que, aparentemente, la sintaxis era:

  • PCSECURE /kclave /f fichero para encriptar (¿añadir /c para comprimir?)
  • PCSECURE /kclave /d fichero para desencriptar (¿añadir /c para comprimir?)
Después de un rato, me quedé insatisfecho con la idea de usar la fuerza bruta llamando una y otra vez al programa, lo que generaba cientos de ventanitas abriéndose y cerrándose sobre la pantalla de Windows. Así que usé la opción "encriptar" para crear unos cuantos archivos con las claves "1", "11", "12", "111", "123", "1111" y "1234", para averiguar si el programa guardaba la clave en algún lugar del archivo. Esto es lo que descubrí:
  • El archivo comenzaba con la firma "PCT6"
  • Los siguientes 4 bytes contenían la firma (hash) de la clave como DWord (entero de 64 bits) en el orden lsb...MSB estándar de Intel (es decir, el valor hex 12345678h se guarda como 78h 56h 34h 12h).
  • La firma estaba generada con el siguiente algoritmo:
    • Para cada byte en clave:
    • desplaza el hash a la izquierda 4 bits (es decir, hash=hash*16 o hash=hash<<4)
    • haz un o-exclusivo (XOR) entre hash y el byte de la clave.
  • Aparentemente, la firma o hash se usaba como clave XOR a lo largo del resto del archivo, con pequeñas modificaciones (rotaciones de bytes) cada cierto tiempo.

Decidí inicialmente pasar las claves de "fuerza bruta" a través del hash para comprobar si eran válidas antes de enviarlas al propio programa PC-Shell. Y como necesitaba un lenguaje de programación que poseyera un operador shift (hacer un shift en basic, que es lo que tenía instalado, es un dolor de cabeza en cuanto el último bit se activa y el número se convierte en negativo) empleé Processing para Android en modo Java. Era una buena idea, además, porque el procesador de mi móvil es mucho más rápido que el de mi ordenador. Sin embargo el programa volvía a empezar cada vez que perdía el foco. Ahí me empecé a dar cuenta, además, de que algo no cuadraba en el archivo que yo tenía.

Con todo esto, y tras deducir que el número de combinaciones para generar la clave eran finitas (de hecho, se podía deducir una clave "usable" tomando 8 bytes, uno por cada media palabra), probé otro ataque de fuerza bruta mucho más rápido porque se limitaba a probar combinaciones de 4 caracteres en lugar de todas las posibles entre 1 y 16 letras.

// Python

//Sustituir esto por los bytes 6-8 del
//archivo grabado por pcsecure.exe:
miclave=0x5d7ee440

//Archivo de salida
handle=open ("C:\salida.txt","a+")


bita=0
while (bita<=255):
    bitb=0
    while (bitb<=255):
        bitc=0
        while (bitc<=255):
            bitd=0
            print hex(bita)+" " + hex(bitb)+" "+hex(bitc)+" "+hex(bitd)
            while (bitd<=255):
                clave=bita
                clave=(clave<<4) ^bitb
                clave=(clave<<4) ^bitc
                clave=(clave<<4) ^bitd

  // Lo siguiente podría depender del archivo
  // PCSECURE.CFG con que se hayan encriptado
  // los archivos originalmente:

                clave=(clave ^0x8090000)
  // (Mi archivo pcsecure.cfg comienza 08 09 00 00 )

                if (clave==miclave):
                    print "solucion:"+ hex(bita)+" " + hex(bitb)+" "+hex(bitc)+" "+hex(bitd)
                    handle.write ("solucion:" + hex(bita)+" " + hex(bitb)+" "+hex(bitc)+" "+hex(bitd))
                    handle.flush()
                    handle.close ()
                    quit()
                if ((clave & 0xffff) == (miclave & 0xffff)):
                    print "parcial:"+ hex(bita)+" " + hex(bitb)+" "+hex(bitc)+" "+hex(bitd)
                    handle.write ("parcial:" + hex(bita)+" " + hex(bitb)+" "+hex(bitc)+" "+hex(bitd))
                bitd=bitd+1
            bitc=bitc+1
        bitb=bitb+1
    bita=bita+1

Mientras el programa de fuerza bruta iba funcionando, probé también el acercamiento de emplear una clave de 16 bits (si el hash era algo así como «5d7ee440», podría funcionar elegir el modo hex e introducir la clave «05 0d 07 0e 0e 04 04 00», y de hecho la clave hex máxima tenía precisamente 8 bytes, es decir, 16 cifras). Para mi desesperación, comprobé que PC-Secure graba la clave en un lugar totalmente diferente cuando se seleccionaba la opción "hex".

Además, había encontrado que mis archivos no acababan de cuadrar con el método de encriptación que había comprobado. Quizá fuera porque estaban comprimidos. Sin embargo, el resultado de la encriptación con compresión de pc-secure era un archivo más o menos del mismo tamaño que el original, con el final del archivo lleno de repeticiones de la clave (¡vaya seguridad!). Pero en los archivos que yo quería desencriptar, que sabía que estaban comprimidos, no tenían bytes repetidos al final.

Finalmente me decidí a rebuscar hasta encontrar el pc-Tools 5, y comprobé que su versión de PC-Secure usaba la misma línea de comandos que el incluido con PC-Tools 6, pero producía archivos completamente diferentes. Después de investigar (creando de nuevo los archivos con clave 1, 11, 12, 123...), decidí que, puesto que el sistema de encriptación era tan distinto (y de hecho, más seguro que PC-Tools 5, pues no incluía claves visibles al final de los archivos comprimidos), lo más sensato era probar mi vieja clave con *esa* versión de PC-Secure.

Funcionó a la primera

Ya sé que no se puede esperar mucho de un programa de hace 26 años, pero me maravillan dos hechos. Primero, ¿por qué PC-Secure 6 no avisa que no sabe descifrar un archivo creado con versiones anteriores? De hecho, los reconoce como archivos cifrados. Y, en segundo lugar, ¿por qué PCSecure 6 era menos seguro que PCSecure 5? ¿Se debe, quizá, a que, como se puede leer en el código de PCSecure 5, el primer programa fue desarrollado por terceros? No sería de extrañar: el mismo esquema el mismo esquema apareció con las utilidades de terceros incluidas en las últimas versiones de MS-DOS, luego discontinuadas. ¿O acaso los programadores de PC-Secure tuvieron miedo de haber vulnerado los tratados norteamericanos conta la exportación de tecnología de encriptación en la versión más antigua?

Se trata de un pequeño misterio que me habría gustado haber descubierto muchos años antes, cuando todavía hubiera existido la posibilidad de encontrar en la red a alguien que hubiera sido un usuario experto de aquellos programas. Aquí lo dejo como aviso a navegantes.