jueves, 15 de marzo de 2012

Manipulación de archivos PDF protegidos por contraseña en GNU/Linux

Un tema que está un poco confuso por la red es el de manejar ficheros PDF protegidos. Por ello me puse a investigar sobre cómo podríamos manipular estos ficheros en nuestro querido sistema GNU/Linux.

En mi caso he tenido que pelearme muchas veces con ficheros PDF protegidos por contraseña, e inevitablemente he tenido que buscarme la vida para pasar de ella o, en su defecto, recuperarla.

Es interesante distinguir entre los dos tipos de contraseña que puede tener un archivo PDF. El primer tipo, y el más común, es la contraseña de propietario. Esta es la contraseña que impide hacer modificaciones en el fichero, imprimirlo... Y ciertamente es la más molesta, al menos para mí.

El segundo tipo es la contraseña de usuario, que es la que se nos pide cuando intentamos leer el fichero.
Para empezar, conviene decir que en GNU/Linux lo tenemos "un poquito más fácil" que en Windows, puesto que los visores PDF que tenemos en GNU/Linux están hechos pensando en la libertad del usuario, por tanto, la mayoría de ellos no obedecen estas restricciones (hablando del password de propietario). El único que conozco que no incluye esta configuración por defecto es Okular, pero puede cambiarse este comportamiento a través del menú Preferencias -> Configurar Okular -> Obedecer las restricciones DRM

Al tema. Si tenemos delante un fichero PDF que nos impide su modificación o impresión en algún visor PDF, es tan sencillo como abrir dicho documento  con un visor de los "buenos", es decir, de los que tiene GNU/Linux, por ejemplo, Okular (habiendo desmarcado previamente la opción de obedecer las restricciones DRM). Así, este visor ya nos permitirá hacer cualquier cosa con este fichero. 

Pero... ¿Qué pasa si lo que quiero hacer es poder llevarme este fichero a cualquier visor de cualquier plataforma y que ya no tenga restricciones de ningún tipo? ¡Buena pregunta! Resulta que podemos imprimir "virtualmente" este fichero PDF y quitarle todas las restricciones, convirtiéndolo así en una copia del original pero sin restricciones. ¿Cómo? Sencillo. Deberíamos tener en nuestro sistema GNU/Linux una impresora virtual PDF que nos permita convertir un documento en PDF. El truco está en volver a convertir nuestro fichero PDF en otro fichero PDF idéntico al original, pero sin restricciones. Podemos comprobar que tenemos esta impresora virtual mirando en las preferencias del sistema, apartado impresoras.

Si no tenemos ninguna impresora virtual, la instalaremos así:

$ sudo aptitude install cups-pdf

De esta forma, se instalará en nuestro sistema la impresora virtual que nos permitirá convertir un documento en PDF, incluso si el documento original ya está en PDF. El documento convertido irá a parar a la ruta /home/usuario/PDF, y este documento ya no tendrá restricciones de ningún tipo.

Hasta aquí todo bien, ¿no?

Ahora vamos a ver cómo podemos recuperar una contraseña de un fichero PDF. El secreto está en usar la herramienta pdfcrack:

$ sudo aptitude install pdfcrack

Esta herramienta nos permite crackear un documento PDF utilizando la fuerza bruta. Lo que hará será ir probando miles de combinaciones por segundo hasta que dé con la buena, si es que le damos el tiempo suficiente para ello, claro está.

Pero antes debemos saber qué tipo de contraseña estamos intentando recuperar. Como ya he dicho anteriormente, si el fichero tiene restricciones de manipulación, estamos hablando de la contraseña de propietario, y si el fichero tiene contraseña de apertura, hablamos de la contraseña de usuario.

Bien, pues para recuperar la contraseña de propietario haremos lo siguiente:

$ pdfcrack -f archivo-protegido.pdf -o

Y el resultado:

PDF version 1.3
Security Handler: Standard
V: 2
R: 3
P: -3904
Length: 128
Encrypted Metadata: True
FileID: 9efe1c25e24c239a4ae85fca5e04979a
U: 877a6510a71e599e4a4309bd994252f400000000000000000000000000000000
O: dd027d75bab3642ffd6d1b4a2020e2df0022ff603ae18bfb6769f36dd5800bfa
Average Speed: 47266.8 w/s. Current Word: 'u46c'
Average Speed: 47480.2 w/s. Current Word: 'F65g'
Average Speed: 47068.2 w/s. Current Word: 'YZ2k'
Average Speed: 47445.9 w/s. Current Word: '7Q1o'
Average Speed: 47447.5 w/s. Current Word: 'LI0s'
Average Speed: 47456.4 w/s. Current Word: 'hDZw'
Average Speed: 47492.9 w/s. Current Word: 'zJYA'
Average Speed: 47496.4 w/s. Current Word: '0QXE'
Average Speed: 47498.7 w/s. Current Word: '9YWI'
Average Speed: 47498.6 w/s. Current Word: 'h7VM'
Average Speed: 47497.3 w/s. Current Word: '0eVQ'
Average Speed: 47498.3 w/s. Current Word: '3mUU'
Average Speed: 47470.2 w/s. Current Word: '1lTY'
Average Speed: 47500.8 w/s. Current Word: 'SuS2'
found owner-password: '1234'
found user-password: ''

Como puede verse, el programa ha ido probando combinaciones hasta dar con la buena, en este caso 1234.

En caso de que queramos recuperar la contraseña de usuario podemos probar el mismo comando anterior ya que, como puede verse en la salida del programa, busca ambas contraseñas. Pero si queremos ceñirnos únicamente a la contraseña de usuario, podemos lanzar el comando de la siguiente forma:

$ pdfcrack -f archivo-protegido.pdf

Y la salida será similar a la anterior solo que esta vez buscará únicamente la contraseña de usuario (la de apertura).

Bien, todo este jaleo de ataques de fuerza bruta tiene sentido si la contraseña utilizada es una combinación aleatoria de caracteres, pero lo cierto es que es habitual que la gente use contraseñas que se encuentran en diccionarios de palabras. Afortunadamente pdfcrack puede leer estos diccionarios y utilizarlos en el ataque:

$ pdfcrack archivo-protegido.pdf -w /usr/share/dict/spanish -o

Y el resultado:

PDF version 1.3
Security Handler: Standard
V: 2
R: 3
P: -3904
Length: 128
Encrypted Metadata: True
FileID: 469b24839bca0243e6f9127de61d4f35
U: 58958e6bf6ddfaf7a0a2c62ba212c94c00000000000000000000000000000000
O: 9dabdd4eb101d59e0014f330d3b6e7ecf1bd0595f81b6bd20c857e4b1107f170
found owner-password: 'zurrapiento'
found user-password: ''

Esta vez el tiempo empleado ha sido mucho menor que el anterior, puesto que solamente ha empleado el diccionario español para el ataque, y ha encontrado como contraseña la palabra zurrapiento, que se encuentra en las últimas posiciones del diccionario.

No es necesario decir que el diccionario español no es el único que podemos usar en el ataque, sin ir más lejos en la web y en las redes P2P (eMule y Torrent principalmente) se encuentran muchos diccionarios que podemos descargar y usar en el ataque, e incluso me atrevería a decir que serían mucho más eficientes que cualquiera de estos métodos, pues dichos diccionarios se han ido elaborando progresivamente con las combinaciones más "populares", por así decirlo.

Por último, vamos a ver cómo podemos establecer una contraseña para un fichero PDF.

Para ello, vamos a usar la herramienta pdftk, también alojada en los repositorios de nuestro sistema GNU/Linux:

$ sudo aptitude install pdftk

Para poner una contraseña de propietario, esto es, una contraseña que permita la lectura pero impida la manipulación del documento, haremos lo siguiente:

$ pdftk fichero-original.pdf output fichero-destino.pdf owner_pw contraseña

Donde fichero-original.pdf es el fichero al que queremos aplicarle la contraseña, fichero-destino.pdf es el fichero que se generará y que tendrá la contraseña de propietario, y contraseña es la contraseña que le aplicaremos al fichero.

Y para establecer una contraseña de usuario, es decir, la que impide su apertura, haremos algo parecido al comando anterior:

$ pdftk fichero-original.pdf output fichero-destino.pdf user_pw contraseña

Nótese que hemos cambiado el parámetro owner_pw por user_pw, que hace referencia al tipo de contraseña.

Y eso es todo amigos. En otro post publicaré la forma de combinar ficheros PDF, algo muy útil en el sector académico o reprográfico.  Se aceptan de buen grado sugerencias y críticas constructivas.

Un saludo, y espero que os sirva lo publicado.

2 comentarios:

  1. El nombre del fichero destino deberá ser distinto al original de lo contrario no se generará el pdf con la contraseña.
    Continuando con el tema se podría generar una contraseña solo para lectura y impresión?

    Gracias por el post está excelente!!!


    Saludes desde Toquicia... ..

    ResponderEliminar
  2. Puedes hacerlo con tan solo un navegador y una impresora PDF. Con el navegador abres el archivo PDF protegido contra impresión y te permite imprimirlo. Al imprimirlo lo que haces es que haciendo uso de la impresora PDF generas un nuevo archivo PDF desprotegido. Puedes ver con más detalle esta técnica aquí: http://cursohacker.es/desproteger-y-desbloquear-pdfs-guia-completa

    ResponderEliminar