Mostrando entradas con la etiqueta cifrado. Mostrar todas las entradas
Mostrando entradas con la etiqueta cifrado. Mostrar todas las entradas

martes, 26 de agosto de 2014

iceweasel, tor y dns leaks

Para los que no conozcáis iceweasel, he de decir que es un fork totalmente libre de firefox, y el navegador predeterminado de Debian. De cualquier forma, es mi navegador habitual.

Todo empezó el pasado domingo, cuando me decidía a bajarme el último capítulo de una de esas series extranjeras que sigo y que aquí ni se estrenaron, ni se estrenan, ni se las espera. La página no estaba disponible. Como no tenía la IP de la página, comprobé su estado a través del servicio: downforeveryoneorjustme.com.

Era solo yo. Entonces me di cuenta de que mi ISP había decidido volver a bloquear ciertas páginas de descargas. Páginas de esas que tan poco les gusta a unos y que tan útiles nos resultan a otros.

Esto me enfadó bastante. Por una parte, por qué están bloqueadas otra vez? Hay una sentencia judicial reciente que les obliga a levantar el bloqueo. Por otra parte, qué anduve haciendo con mis DNS y por qué me dejé puestas las que usa el ISP y no las OpenDNS? (Seguro que ya no eran horas...) En ese momento pensé que tal y como están las cosas (gracias a un buen puñado de ministros inútiles) sería mejor bajar el torrent a través de TOR (siempre cifrando el tráfico del cliente de descargas, claro). Pero... Tampoco resolvía!

WTF? AYFKM??? DNS LEAKS?!?!?!

Cambio las DNS y me dispongo a comprobar si hay fugas con wireshark. Efectivamente, unas fugas de DNS tan grandes que no sabía si tendría que pagarles el IBI. D'OH!!!.

Inmediatamente se me vino a la cabeza una mala configuración de firefox/bug que provocaba estas fugas (allá por el 2012...), y fui directo al about:config a comprobarlo, por si era heredada.

Después de cambiar la variable network.websocket.enabled y ponerla a false, me vuelvo a wireshark, a ver que tal están las cosas ahora y... Sigo con fugas! D'OH!!! (2).

Pero ya que estamos aquí, y por aquello de no dar dos viajes, vamos a rebuscar un poco en las opciones relacionadas con las DNS...

network.proxy.socks_remote_dns = false? Vamos a ponerla a true... A ver qué dice ahora wireshark...

Efectivamente, era eso. Y yo dejando mi rastro de miguitas de DNS por TOR :'(

Gran lección aprendida: Antes de salir de casa hay que hacer siempre los deberes.

Así que ya sabéis, cuidado con esas fugas!

*Nota: Algunas extensiones pueden revelar nuestra IP aún mientras estamos utilizando TOR o i2p. Haced los deberes!

*Nota 2: Los enlaces están apuntando a meneame.net y wikipedia intencionadamente. No pienso enlazar a ningún medio de AEDE.

Enjoy! ;)

martes, 29 de octubre de 2013

algunos códigos python útiles para CTFs

Cifrados por sustitución simple monoalfabético

El cifrado por sustitución es un método en el que unidades de texto plano son sustituidas con texto cifrado siguiendo un sistema regular. En el caso del sistema cifrado de sustitución simple, la unidad de texto plano es una letra. Es decir, un caracter del texto original es sustituido por otro del alfabeto de texto cifrado. Los ejemplos más caracteristicos de este sistema de cifrado son los cifrados César, ROT13 o Dvorak. El objetivo aquí es deducir de qué sistema se trata y la transposición de caráctes, es decir, qué caracteres se corresponden entre el texto plano y el alfabeto de cifrado. Una vez averiguado, podemos automatizar la traducción con la función maketrans del módulo string:


text = 'bpql bp rk bgbjmil ab zfcoxal zbpxo, rkl ab ilp jbqlalp jxp zlklzfalp ab zfcoxal mlo prpqfqrzflk pfjmib jlklxicxybqfzl'
trans = string.maketrans('xyzabcdefghijklmnopqrstuvw', 'abcdefghijklmnopqrstuvwxyz')
print text.translate(trans)


Cadenas escritas al revés

Si estamos vagos, o no queremos leer hacia el sentido contrario al habitual, podemos obtener el resultado utilizando el tercer argumento de las extended slices de python:

>>> 'sever la atircse anedac'[::-1]
'cadena escrita al reves'


Fuerza bruta

A veces nos es últil tener un array que se autorellene con combinaciones para solucionar alguna prueba que requiera de fuerza bruta (bruteforce o bruteforcing). Para ello dejo en mi github un código de demostración de cómo programar esto en python: bruteforceBytearray. Yo he programado un ejemplo con un bytearray, y he dejado una función para imprimir por pantalla cómo se va rellenando el array. Es un ejemplo y siempre se puede adaptar a las necesidades personales ;)

Enjoy!

Fuentes:

domingo, 15 de septiembre de 2013

ssh sin contraseña, utilizando claves rsa

Supongamos que tenemos dos equipos entre los que nos conectamos habitualmente utilizando ssh.El equipo1 (10.0.0.1) y el equipo2 (10.0.0.2).

Al conectarnos con mucha frecuencia, introducir la contraseña cada vez que nos conectamos se convierte en una labor repetitiva, cansina y en una pérdida de tiempo. Para poder conectarnos entre ellos de forma cómoda y segura, podemos hacerlo utilizando claves rsa, en vez de contraseña.


Esquema de los equipos y sentido de la conexión ssh
Esquema de los equipos y sentido de la conexión ssh

Para poder conectarnos mediante ssh utilizando las claves rsa, en lugar de tener que introducir la contraseña:

En el equipo1 creamos las claves rsa pública y privada:

rubenhortas@equipo1:~/.ssh$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/rubenhortas/.ssh/id_rsa): [ENTER]
Enter passphrase (empty for no passphrase): [ENTER*]
Enter same passphrase again: [ENTER*]
Your identification has been saved in /home/rubenhortas/.ssh/id_rsa.
Your public key has been saved in /home/rubenhortas/.ssh/id_rsa.pub.
The key fingerprint is:
**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**
The key's randomart image is:


< Que te lo voy a decir ;)>
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
*Dejad la passphrase en blanco, porque si no la va a pedir cada vez que nos conectemos al equipo2 por ssh

Copiamos la clave pública al equipo2:

rubenhortas@equipo1$ ssh-copy-id -i ~/.ssh/id_rsa.pub 10.0.0.2
The authenticity of host '10.0.0.2 (10.0.0.2)' can't be established.
RSA key fingerprint is **:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
rubenhortas@10.0.0.2's password: [CONTRASEÑA EQUIPO2]

Por último nos conectamos al equipo2 por ssh, y comprobamos que no nos pide la contraseña.

Enjoy!

domingo, 20 de mayo de 2012

usando la nube con sentido común y p7zip

Al hilo del anterior post ( usando la nube con sentido común y aespipe ), y después de investigar un poco, voy a explicar algo más la última nota del artículo, porque creo que quedó bastante escueta y aislada, y merece profundizar un poco más ;)

p7zip Es, hoy por hoy, mi utilidad favorita para comprimir. Es la versión, en línea de comandos, de 7zip para sistemas POSIX. Es open source, consigue muy buenos ratios de compresión, usa varios núcleos, soporta un montón de formatos y puede cifrar usando AES-256.

*Si lo que queremos es comprimir con contraseña, el script se puede adaptar cambiando la línea de aespipe por el comando que queramos ejecutar. Por ejemplo, para comprimir con contraseña usando p7zip y header encryption (mhe=on):
7z a -r -mhe=on -pCONTRASEÑA $i.7z $i

Esta nota, hace referencia a compimir con contraseña usando p7zip, lo que yo no sabía cuando lo escribí es que, de forma resumida, viene siendo un "comprimir y cifrar para vagos".

Cuando comprimimos con p7zip y usamos contraseña, p7zip aplica una función de derivación basada en SHA-256 a la contraseña, y usa el resultado como clave para cifrar con el algoritmo AES-256.

Resumiendo, sería parecido al método explicado usando aespipe, pero todo en uno ;)

domingo, 13 de mayo de 2012

usando la nube con sentido común y aespipe

Con el reciente auge de los servicios de almacenamiento "gratuítos" en la nube, dropbox, skydrive, google drive... Aparecen unas posibilidades de uso interesantes. Una de ellas es la de usarlos para guardar pequeños backups o utilidades a las que poder acceder desde cualquier sitio con conexión a internet.

Llegados a este punto, deberíamos reflexionar sobre qué información almacenar en este tipo de servicios. Si la información es de carácter crítico, almacenarla en un servicio de este tipo, no es buena idea. En este caso sería más conveniente utilizar un servicio de almacenamiento de pago, o contratar los servicios de una empresa de backuping, con unos términos de uso claros y definidos que garanticen que nuestra información no será accedida por ninguna persona, OCR, bot...

Una vez decidida la información que queremos almacenar en la nube, no todo lo que subamos va a tener el mismo nivel de relevancia o privacidad. Deberíamos clasificar la información, y definir unas políticas de seguridad claras en base a cada tipo. Es decir, no es lo mismo subir unos ebooks, subir unos ficheros de configuración, subir algún proyecto personal o subir una lista de passwords. Por eso habrá que separar la información, básicamente en dos grupos, la que nos da igual que se vea o sea indexada, y la que queremos que permanezca totalmente privada.

Para evitar miradas ajenas sobre la información que queremos que se mantenga privada, tenemos varias alternativas. Entre ellas:

  • Subir el contenido comprimido con contraseña (y confiar en que no se van a realizar ataques de fuerza bruta).
  • Cifrar, cifrar y cifrar

Como la segunda es más segura que la primera, para este punto, tendremos varias posibilidades:

  1. Truecrypt: Todo un clásico y un indispensable en nuestros ordenadores, está claro. La parte mala de usar truecrypt es que requiere crear volúmenes/contenedores de datos, y por pequeños que sean, suponen una gran descarga de datos adicional. Es decir, si el fichero que nos queremos bajar es de 500Kb, por pequeño que sea el contenedor de truecrypt (50Mb, 10Mb?),descargarse el contenedor entero, supone una descarga de datos inmensa en relación con el tamaño del fichero.
  2. GPG: Otro clásico. Una buena elección para cifrar fichero por fichero, siempre que seas ordenado, y guardes y exportes correctamente tus claves gpg. (No es mi caso ;))
  3. Aespipe: Aespipe es una utilidad para cifrar fichero a fichero. Crea ficheros .tar o .cpio cifrados. Lo mejor de usarlo, es que los ficheros mantienen su tamaño original. Aespipe puede trabajar usando claves gpg, aunque no voy a centrarme en este caso, por lo comentado en el punto anterior.

Si escogemos aespipe, éste trabaja, por defecto, en su modo recomendado multi-key-v3, que requiere una clave con una longitud mínima de 20 caractereres. Llegados a este punto, podemos optar por usar una clave del tipo "googlemecagontostusmuertosnomiresloqueguardo", o escoger una clave (segura) que usemos habitualmente, que no llegue a los 20 caracteres y cifrarla, por ejemplo con un SHA.

$ echo -n nuestrapass | sha512sum
c9087d475d0307f2e4130f0d919084366c4572eb2ef88df62d560ba01d40a3d8ddf1c9186662903d3d27e164b6cf4acf5e1400095d3814716ac5176a756f84fe -

Con esto conseguimos una clave que supera ampliamente los 20 caracteres, y que podremos generar en cualquier equipo que utilicemos, recordando, simplemente, nuestra clave y el algoritmo de cifrado.

Si vamos a cifrar un solo fichero, copiar y pegar la pass es suficiente. Pero si vamos a cifrar varios ficheros, podemos guardar la contraseña en un fichero que almacenaremos de forma temporal y que le pasárselo a aespipe como parámetro:

  1. Exportar la clave al fichero:
    $ echo -n nuestrapass | sha512sum | cut -d " " -f1 >> passParaLaNube.txt
  2. Pasarle el fichero con la clave a aespipe como parámetro:
    $ aespipe -e aes256 -P passParaLaNube.txt ficheroCifrado.tgz
  3. Descifrar el fichero:
    $ aespipe -e aes256 -d -P passParaLaNube.txt fichero

Si vamos a cifrar una cantidad considerable de ficheros, podemos automatizar la tarea con un pequeño script en bash:

#!/bin/bash
for i in *;
do 
   if [ $i != script -a $i != passParaLaNube.txt ];
   then
      aespipe -e aes256 -P passParaLaNube.txt <$i >$i.tgz
   fi;
done;

*script es el nombre del script

*passParaLaNube.txt es el nombre del fichero con la contraseña para aespipe

*Si lo que queremos es comprimir con contraseña, el script se puede adaptar cambiando la línea de aespipe por el comando que queramos ejecutar. Por ejemplo, para comprimir con contraseña usando p7zip y header encryption (mhe=on):
7z a -r -mhe=on -pCONTRASEÑA $i.7z $i
(También habría que quitar -a $i != passParaLaNube.txt de la condición de evaluación del if ;) )

(Segunda parte) usando la nube con sentido común y p7zip