IP sobre códigos QR

Ya hemos visto algunas y variopintas formas de transmitir información por canales poco habituales y hoy vamos a ver otra muy curiosa de la mano de Eric Seifert, que es capaz de enviar datos usando tan sólo un monitor y una cámara web mediante ¡códigos QR!

La idea es sencilla: usar un interfaz tun para enviar datos bidireccionalmente usando códigos qr que son mostrados en los monitores y leídos mediante webcams. Aunque para implementarlo Eric tuvo que resolver algunos problemas.

Primero, idear alguna manera de confirmar que el otro extremo recibe y lee el mensaje, para lo cuál agregó un simple encabezado SEQ/ACK que incrementa la secuencia con cada nuevo qrcode e incrementa el acknowledge cuando lee con éxito el del otro lado.
En segundo lugar, necesitaba una forma de codificar los datos. Los Códigos QR soportan un modo binario, pero este es el menos eficiente por lo que decidió usar en su lugar alfanuméricos y base32 para codificar los datos de los paquetes (base64 no funcionaría porque el código QR en este modo sólo admite letras mayúsculas).
También tuvo un problema con la biblioteca que utilizaba para codificar los datos, qrtools, que generaba un código qr pero los datos no eran los mismos al decodificar y lo arregló mediante la detección de éste y luego añadiendo un padding a los datos y volviéndolo a intentar hasta que funcione, para luego acabar quitando el padding de nuevo en el otro extremo.

De momento el *problema* es la transmisión de los datos. Empezó con tan sólo 100 bytes por segundo y consiguió multiplicar por 10 la velocidad hasta 1-2kBps quitando el header syn/ack. Eso sí, la latencia sigue siendo un gran handicap. De todas formas, no deja de ser interesante como técnica (quizás algo exótica) y posible método de exfiltración de datos, así que os animo a echar un ojo a los vídeos y al código Python en Github:

Videos Poc:
Github:
Fuentes:

Comentarios