Preliminares.
Cada práctica está desglosada en partes.
Una parte puede contener ejercicios opcionales que no están
pensados para ser realizados en las sesiones de prácticas
(aunque por supuesto pueden realizarse si sobra tiempo). El comienzo de
los ejercicios optativos se indica mediante una línea horizontal
gruesa como esta:
Las prácticas se realizarán bajo Linux salvo que se
indique lo contrario. Debes arrancar el Linux del PC y elegir la
opción Usuario autenticado en
Anubis. Con esta forma de trabajar estás corriendo los
procesos en el PC, pero tu directorio home
es el mismo que el de anubis,
de modo que todo lo que modificas se queda guardado allí.
Si lo deseas, puedes trabajar directamente sobre anubis, ejecutando desde un
terminal la orden ssh -X anubis
que abrirá un shell en anubis y permitirá ejecutar
aplicaciones X de anubis sobre el terminal gráfico de tu Linux.
Si no entiendes todo esto consúltalo con el profesor antes de
empezar.
Consejos:
- Para "cortar y pegar" en las X, selecciona el texto y sin tocar
nada más, con el botón central del ratón (o si no
lo hay, pulsando ambos botones a la vez), suéltalo donde
quieras. No hay que pulsar Ctrl-C ni elegir ninguna opción de
ningún menú, es el portapapeles interno de las X.
- Cuando se trabaja en Informática, la diferencia entre un
profesional y el usuario es que el profesional lee los mensajes de
error y los interpreta y el usuario dice "esto no va". Aplícate
esta regla y verás como todo es más fácil. Esto se
nota mucho al trabajar en Unix donde los mensajes de error son algo
más explicativos que "El programa falló y
terminará".
Métodos criptográficos elementales.
- Descarga el programa precompilado pc (con
el botón derecho del ratón puedes guardarlo),
cámbiale los permisos (chmod
a+x pc) y prueba que funciona, ejecutandolo y obteniendo el
resultado correcto, según (corta y pega la línea de
comando):
$ echo jajajaja | ./pc
10 1 0.11111
a 4 0.44444
j 4 0.44444
Total 9, Entropía 1.392147
El programa te muestra el caracter (o su código ascii), el
número de veces que aparece y la probabilidad. La
ejecución pc -o
muestra el resultado ordenado por frecuencia.
-
Descarga el programa (texto fuente) cesar.c,
compílalo (cc -s -o cesar
cesar.c) y comprueba
que funciona correctemente según:
$ echo comorrr! | ./cesar -e 3 | hexdump -c
Cifrando con clave 3
0000000 f r p r u u u $ \r
0000009
-
Descarga el archivo binario quijote.bin.
Es el resultado de un cifrado de cesar
con llave desconocida. ¿Qué crees que puede contener este
archivo?.
%%%
Parece lógico pensar que "El quijote".
%%%
- Teniendo en cuenta que la letra que más aparece en el
castellano es la "e", descifra el texto contenido en
quijote.bin y averigua la llave
empleada.
%%%
Estamos trabajando sobre el código ASCII, por lo que lo que más va a a aparecer
es el espacio en blanco, no la letra "e".
%%%
- Estudia el código fuente de cesar.c.
Observa que no abre
ficheros, sino que usa la entrada estándar, lo que es mucho
más comodo de programar y más facil de usar si se sabe un
poco de shell.
- Escribe un programa similar basándote en cesar.c,
pero que implemente el
método de Vigenère. Como se usan distintos alfabetos
desplazados, en lugar de pasarle como parámetro una
colección de números, le pasaremos una cadena de
caracteres y los desplazamientos serán los códigos ascii
de cada carácter de la cadena. Si llamas vig.c a tu programa, después
de compilarlo (cc -o vig -s vig.c),
puedes comprobar que funciona comparando con estos resultados:
echo comorrr! | ./vig -e jorl | hexdump
Cifrando con clave jorl
0000000 decd dbdf e1dc 8de4 0074
0000009
%%%
!!!vig.c!!!
%%%
- Descifra el archivo quijote.bin usando la clave que has
obtenido + 32 (ojo que sale binario). Razona el resultado. Lo mismo
con la clave - 32.
%%%
./cesar -d 66 <quijote.bin | less
Se lee más o menos el quijote (con los ojos).
Es debido a que pasa las minúsculas
a mayúsculas (distancia 32 en el código ascii).
Con clave 34-32=2 sólo se leen las mayúsculas, apareciendo como minúsculas.
%%%
- Intenta descifrar el quijote.bin, pero a base
de fuerza bruta.
%%%
for ((i=1; i<255; i++)); do
if ./cesar -d $i <quijote.bin 2>/dev/null | grep Quijote >/dev/null; then
echo La clave es $i
fi
done
%%%
- Diseña y escribe un programa (trans) que permita cifrar
y descifrar por transposición
en bloques de n caracteres. La secuencia de
transposición
podrá elegirse en tiempo de ejecución. La sintaxis de uso
puede ser algo como
trans -e 9=1-4-8,6-7
que realiza la transposición de modo que el 1 va al 4,
el
4 al 8, el 8 al 1, el 6 al 7 y el 7 al 6 en un bloque de 9 caracteres.
El parsing de esta línea de parámetros puede
resultar
complicado, pero puedes usar este
trozo de código
C para ayudarte.
Una ejecución del programa puede ser:
echo comorrr, cuidadito! | trans -e 9=1-4-8,6-7 | more
8-2-3-1-5-7-6-4-9-
,omcrrro tuicaiddoÿ
ÿ!ÿÿÿÿÿ
Los caracteres raros se deben a haber
empleado relleno para completar el bloque.
%%%
!!!trans.c!!!
%%%
- Escribe un programa que realice el
cifrado y descifrado por transposición por columnas.
%%%
Que rollo.
%%%
- Descifra el siguiente texto:
elsardinatoselelsardinauniconotamotoelnotasardinaasnojabonosoeldoncellaelpiojosaasnozocoyula.
El texto contiene una cierta información subliminal.
Averíguala. No comentes los resultados con tus
compañeros, porque sólo les fastidiará.
%%%
Veo que en la ristra hay palabras identificables, las escribo en vertical en un papel.
Leo en vertical la primera letra y obtengo:
Este es un mensaje de paz.
El texto contiene más información. Cada palabra permite averiguar como se codifica en morse la letra inicial,
si cada sílaba que contiene la letra o se traduce a raya y el resto de sílabas a punto.
La información añadida es tanto la información de cómo se codifica como el hecho mismo de dar la codificación.
No hay que ser adivino para esto: basta con buscar las palabras mas raras en google y se ve el misterio.
%%%
-
Razona e implementa si cabe estos dos métodos de cifrado (clave k):
- Cada carácter se cifra sumándole el carácter siguiente de la secuencia de entrada.
El último se cifra sumándole k.
- Cada carácter se cifra sumándole el último carácter cifrado
(es decir, el cifrado del carácter anterior en la secuencia de entrada).
El primero se cifra sumándole k. ¿Cómo llamarías a este método?.
%%%
- El primer método es absurdo pues no se podría descifrar con comodidad.
- El segundo es simple, se trata de un césar-CBC:
%%%
Criptografía de llave privada con Openssl.
El comando openssl te permite realizar múltiples
operaciones criptográficas.
Ejecuta openssl nosabo para obtener una lista de funciones.
Ejercicios:
-
Prueba el DES, por ejemplo (el comando no es correcto
por dos razones piénsalo bien
antes de ejecutarlo):
openssl des -k jelou -in /usr/local/bin/openssl
- Descarga el archivo casita.png.
- Este es el efecfo del DES sobre el
archivo cuando DES se aplica mal.
- Prova el efecto tu mismo, usando el comando:
convert -depth 8 casita.png rgb:- | openssl des ...... | head -c $[476*205*3] | display -depth 8 -size 476x205 rgb:-
No debes modificar la invocación de convert ni de display,
sólo debes pensar lo que debes pasar como argumentos a openssl des. Para ello, averigua
que parámetros admite el comando openssl des y usa los que
necesites. Cuando lo consigas, prueba distintas llaves y observa el
efecto de la llave sobre el resultado.
%%%
openssl des -k "me da igual" -des-ecb
%%%
- Prueba otros
cifradores, como CAST, Blowfish, IDEA, RC5, con sus
variantes.
- Repite varias veces la misma ejecución con la misma llave.
Intenta averiguar por qué salen los colores diferentes.
- Observa el efecto del des u
otro cifrador sobre ésta
imagen. Es similar el efecto
sobre ésta.
Razona el resultado. Intenta reproducirlo con un comando similar al
anterior.
%%%
Sólo se aprecian los trozos que tienen un color muy uniforme. El resto de la foto
al tener cada pixel muy diferente del siguiente, no se ve afectada por el síndrome.
Con el comando identify puedes averiguar
el tamaño de las imágenes y construir el comando equivalente al empleado con la casita.
%%%
- Escribe un programa usando la librería OpenSSL (libcrypto)
que genere una par de llaves RSA y muestre por pantalla los exponentes e
y d, el módulo n, y los primos p y q.
PKI con OpenSSL.
El comando openssl req realiza las operaciones:
- Tratamiento de objetos pkcs10, por ejemplo: req -text
-in fichero_con_objeto_pkcs10
- Generación de nuevos objetos pkcs10 (+ clave
privada): req -new
- Generación de certificados autofirmados (+ clave privada):
req -new -x509
El comando openssl x509 permite:
- Tratar certificados.
- Generar un objeto pkcs10 con los datos de un certificado x509
y con una clave.
- Tomar un objeto pkcs10 y una clave privada y generar un
certificado x509
autofirmado.
El comando openssl pkcs12 permite:
- Generar objetos pkcs12 con una clave privada, el certificado que
le corresponde
y todos los certificados que se quieran añadir:
pkcs12 -export -inkey fichero_con_la_clave_privada -in fichero_con_el_cert
Mostrar el contenido de objetos pkcs12. Te pedirá
una clave para proteger la clave privada (puedes usar -nodes para
evitarlo).
Se pide:
- Genera un certificado autofirmado (C1+K1) con una llave RSA de
2048 bits, válido para 360 días, y muéstralo en
modo texto (req).
Asegúrate de que generas un certificado mirando la cabecera PEM.
%%%
openssl req -newkey rsa:2048 -x509 -out C1 -keyout K1 -nodes
%%%
- Empaquétalo en un objeto pkcs12
(P1) y muéstralo
en modo texto (pkcs12).
%%%
openssl pkcs12 -export -out P1 -inkey K1 -in C1
openssl pkcs12 -nodes -in P1
%%%
- Genera un objeto pkcs10 (R2) + clave privada (K2) y muéstralo
en modo texto (req).
Anota los primeros bytes del módulo de la llave
(mira en K2 o en R2, obviamente es el mismo por ser los pkcs10
siempre autofirmados).
Asegúrate de que generas una petición certificado mirando
la cabecera PEM de R2.
%%%
openssl req -new -keyout K2 -out R2 -nodes
%%%
- Genera otra clave privada (K3) y anota su módulo (genrsa,rsa).
%%%
openssl genrsa -out K3
%%%
- Firma con K3 el objeto R2, generando un autofirmado C2 (para 360
días) y muéstralo como texto (x509).
Asegúrate de que has generado un cert y no un pkcs10.
%%%
openssl x509 -req -in R2 -signkey K3 -out C2
%%%
- Observa el módulo de C2 y compáralo con los que has
anotado.
Dado C2, ¿qué ha pasado con K2?. ¿Cual es la clave
pública que va con C2?. ¿Cómo ha llegado ahí?.
¿Para qué ha servido R2?.
%%%
K2 ha desaparecido. La asociada a K3, va con ella. R2 sólo datos personales.
%%%
- Firma con K3 el objeto R2, pero que no sea autofirmado (C3)
manteniendo
la clave pública de R2 (req).
¿Que papel estás haciendo?.
%%%
openssl req -x509 -key K3 -in R2 -out C3
Estoy haciendo un papel similar al de una CA.
%%%
- Con C2 y la clave
privada correspondiente, genera un objeto pkcs12
(P2) y analiza su contenido.
%%%
openssl pkcs12 -export -out P2 -inkey K3 -in C2
openssl pkcs12 -nodes -in P2
%%%
- Con C3 y la clave privada correspondiente, genera un objeto pkcs12
(P3) y analiza su contenido.
%%%
openssl pkcs12 -export -out P3 -inkey K2 -in C3
openssl pkcs12 -nodes -in P3
%%%
- Guarda P1 y P2 para los ejecricios optativos de la
práctica del correo.
- El comando openssl
ca permite administrar una autoridad certificadora.
Para usarlo es necesario cierto setup que puede conseguirse
usando el script CA.sh.
- Crea un directorio y entra en él.
- Lee atentamente el script CA.sh en lo referente a la
creación de la CA.
- Crea una CA como lo hace CA.sh, pero:
- Genera tu propio fichero de configuración que puedes
copiar del original.
- Al generar el certificado raíz, no protejas la clave
privada. Esto
es posiblemente una barbaridad, pero estamos en prácticas.
- Escribe un script que genere una colección de objetos pkcs12,
cada uno conteniendo un certificado, una clave privada y el certificado
de tu autoridad, para cada uno de los usuarios de /etc/password,
conteniendo su dirección de mail en spisa y su CN tomados de /etc/password.
Sugerencia unix:
while read -r lin
do
mail=$(echo $lin | cut -d: -f1)
CN=$(echo $lin | cut -d: -f5)
...........
done </etc/passwd
%%%
Ejemplo.
%%%
Varios.
- Estudia la seguridad
del calendario de
prácticas y comunica tus conclusiones por email al profesor
antes de la siguiente sesión de prácticas.
Por fines estadísticos, no realizes esto en colaboración con otros
compañeros/as.
%%%
- Bueno no es muy difícil darse cuenta de que hay un
botoncito en la parte de abajo a la derecha que al pulsarlo nos pide
una clave. Se trata de averiguarla.
Si no has llegado hasta aquí, no se que asuntos de seguridad has
podido ver en esta página ....
- Una solución para averiguar la clave es emplear la
fuerza bruta contra el servidor. Esta opción no parece realista,
pues el servidor puede rechazar demasiadas conexiones, o en cualquier
caso, irá demasiado lento como para intentar siquiera una psswd
de pocas letras.
- Descartada (al menos momentáneamente) esta vía,
debo ver el código fuente de la página. Observo que al
final hay un formulario, donde se envía la clave al servidor con
un churro extrañísimo.
- O no tanto, pues obviamente, es base64. Decodificándolo
se obtiene una cadena binaria.
- Después de mirarla y remirarla y no sabiendo por donde
tirar empizo a pensar que es algo cifrado. Pensar que estoy haciendo
una práctica de ciptografía me ayuda a concluir eso
(¿esto es lógica de la buena?).
- Llamo a directamente a la URL del prg inviocado por el
botón y veo que es un editor web que me genera páginas de
calendarios como la que estoy analizando.
- Me genero un calendario y miro la fuente y efectivamente es
como lo que quiero descifrar. Pero ahora puedo poner la password yo,
con lo que podré hacer un ataque con texto escogido.
- Pongo una X, por ejemplo y trato de descifrar el resultado. No
se con que cifrador está hecho.
- Observo que el servidor es un apache con php, opto por pensar
que esta cifrado con alguna libreria php y me hago un php que prueba a
descifrar con mi clave con todos los algoritmos y librerías.
- No obtengo nada, algunos cifradores me descifran (no dan
error), pero no saco nada en claro al descifrar.
- Pruebo a generar una página sin clave. El resultado es
un código similar, puede que esté cifrado con clave
vacía o que lo que está cifrado es a su vez binario.
- Vuelvo a los resultados de mi programa de "tanteo descifrador".
Descarto los cifradores que no se quejan nunca e intento identificar
las cadenas binarias de los cifradores que me han funcionado realmente,
concluyendo que se trata de un blowfish.
La cadena descifrada sigue sin ser inteligible.
- Sólo queda la posibilidad, no descartable por optimizar
el tamaño de la página, de que se trate de datos
comprimidos.
- Pruebo con todas las formas de descompresion de php, hasta que
consigo hacer un inflate y
observar que aparece una cierta cadena de texto que no me importa
demasiado, pero que trato de averiguar su patrón, cosa que
consigo simplemente creando otro calendario y viendo lo que no cambia.
- Construyo ahora un programa que coja la cadena original aplique
blowfish y descomprima y
compare con el patrón (una cadena fija corta).
- Dejo el programa actuando por fuerza bruta durante .... ¡
unos segundos ! y sale la clave.
- Como alternativa a todo ello puedo intentar el ataque por
fuerza bruta contra el servidor ...., es sencillo lanzar un ataque de
fuerza bruta empezando con claves de 1 caracter, luego de 2 , ... y que
¡haya suerte!
%%%