Ocultando información en sitios curiosos (I): boolean.io
Llevo tiempo queriendo coger la costumbre de escribir algo con regularidad. Contar mis locuras e investigaciones, que casi siempre salen de la falta de sueño :)
Así que… a empezar.
De qué va este post
En esta serie hablaré de lugares extraños y, sobre todo, curiosos donde esconder información.
Hoy: ocultando información en boolean.io
El otro día, gracias a mis compañeros de trabajo, descubrí este servicio:
¿De qué va esto?
Es un tanto peculiar, porque lo que ofrecen son “booleanos como servicio”. Curioso, ¿no?
¿Qué es eso de boolean as a service?
Lo que ellos llaman “boolean as a service” no es ni más ni menos que dejarte guardar un “true” o un “false” y darte una URL única asociada. Es decir:
Si quisiéramos guardar un “true”, nos darían una URL como esta:
http://boolean.io/heouwjfyosllndhw7gh628jdjf/
Cada vez que la consultemos nos devolverá un “true”, serializado en JSON.
Además, dan la posibilidad de cambiar el true a false, siempre y cuando sepamos el ID que el sitio nos ha dado.
Cabe destacar que el acceso no es autenticado.
Todo son ceros y unos
Como bien sabemos, todo software acaba convertido en un “0” (false) o un “1” (true), ¿cierto?
¿Y si cogiéramos un mensaje, lo descompusiéramos en cada uno de sus caracteres y cada carácter lo convirtiéramos en su valor binario? ¿Y si cogiésemos esa cadena binaria y la guardáramos, valor a valor, en boolean.io?
Pues lo que pasaría es que boolean.io nos daría un identificador por cada valor guardado. Solo tendríamos que apuntar ese ID y el orden en el que insertamos la información.
Para recuperarla habría que hacer el proceso contrario: coger cada ID, en orden, e ir recuperando valor a valor hasta formar el mensaje oculto inicial.
¿Un poco enrevesado? Puede, pero ya se sabe, cuando el diablo se aburre… :)
Let’s go!
Tras la teoría, veamos si de verdad se puede ocultar información como os he contado.
El día que mis compañeros me comentaron esto tardamos poco en comer, así que me puse 10 minutillos y me hice un pequeño script. Lo podéis encontrar –> aquí <–
Está hecho en Python y es muy fácil de usar.
Instalación
pip install -r requirements.txt
Generando la información a ocultar
Hay que tener en cuenta que la cantidad de información que podemos ocultar es bastante pequeña. Además, el servicio está limitado a 40 peticiones por minuto.
Así que vamos a hacer la prueba con “a\n”. Es decir: la letra “a” y un salto de línea.
Creamos el fichero con la información:
echo "a" > info_to_hide.txt
Uso: ocultando información
Ahora solo queda ejecutar el script de ocultación:
# python hide.py -f info_to_hide.txt -o hidden.db
[i] Storing char: 'a'
|- Storing bit '0'
|- Storing bit '1'
|- Storing bit '1'
|- Storing bit '0'
|- Storing bit '0'
|- Storing bit '0'
|- Storing bit '0'
|- Storing bit '1'
[i] Storing char: '
'
|- Storing bit '0'
|- Storing bit '0'
|- Storing bit '0'
|- Storing bit '0'
|- Storing bit '1'
|- Storing bit '0'
|- Storing bit '1'
|- Storing bit '0'
El fichero generado, hidden.db, es el que contiene las referencias y el orden que nos ha devuelto el servidor, tal y como comenté arriba, ¿recuerdas? Si lo abrís veréis que es un JSON muy sencillo.
Uso: recuperando información oculta
Con el fichero hidden.db podemos recuperar los datos ocultos (nosotros, o cualquiera que lo tenga):
# python unhide.py -f hidden.db
[i] Starting ...
|- Reading: 'dc342f87-39dd-4f97-8188-32ab312bc0a8'
|- Reading: '60375eb1-7f02-4398-a8b7-a2ea1eedccd8'
|- Reading: 'aa0aada9-5ae5-46a3-b2f9-de269ebc986b'
|- Reading: '4311b005-e958-422d-bb4c-f625d23924ca'
|- Reading: 'd254560a-5351-4a48-a2c0-008faa1b1a9a'
|- Reading: '6a31180e-1394-4b70-a305-599beb5114da'
|- Reading: '7523af15-e7c8-45a4-81e6-f989570dac0d'
|- Reading: 'b1fbdcfc-531c-47d5-9d9c-b97ab26927a5'
|- Reading: 'a3f8f3a9-cab5-4e84-b83a-b5c758085f49'
|- Reading: '13910781-907c-43c9-9fcd-66e255380628'
|- Reading: '4606d74c-4b46-42f5-8ebc-846e5680b816'
|- Reading: '80c13529-818e-4761-91c6-55dd0d427935'
|- Reading: '2a02bcd0-0458-4d4f-b50c-c5a5d6647965'
|- Reading: 'e81021ce-cd73-42dc-ae55-e520a5fd9fc7'
|- Reading: '1dd260fc-7ad6-4046-b5ab-4386cce9957f'
|- Reading: 'fc8d3490-a189-4ae9-9d29-dee8da2fe56d'
[i] Hidden message: 'a
'
Et voilà. Información recuperada.
Conclusión
Sí, ya sé que el ejemplo es muy tonto, pero no me negaréis que es curioso :)
Os veo en mi siguiente ocurrencia escrita.
¡Chau!