- PySkyWiFi es un experimento que usa temporalmente los campos de perfil de una cuenta de millas aéreas accesibles incluso antes de pagar, para hacer viajar solicitudes y respuestas HTTP de ida y vuelta de forma extremadamente lenta durante vuelos largos
- El prototipo inicial actualizaba y consultaba el campo de nombre de la cuenta para crear un chat, y luego se amplió para que un demonio en tierra leyera solicitudes como
STOCKPRICE: APPLy devolviera el resultado - La arquitectura final se divide entre un sky proxy dentro del avión y un ground daemon conectado a internet, y usa el encabezado
X-PySkyWiFide solicitudes locales concurlpara indicar la URL de destino - La transmisión divide las solicitudes HTTP en pequeños chunks y mantiene el orden con segmentos
DATA,ACK,ENDy números de secuencia de 6 dígitos - Se evitó seguir enviando solicitudes automáticas a cuentas reales de aerolíneas, y la prueba final se quedó en usar GitHub Gist para llamar con
curlla página principal del blog y recibir la respuesta HTML unos minutos después
Un atajo descubierto en el portal Wi‑Fi antes de pagar
- La página de inicio de sesión del Wi‑Fi del avión exigía pago, pero incluso antes de pagar permitía gratis el inicio de sesión de la cuenta de millas aéreas
- Al ver el campo de nombre en la pantalla de edición del perfil, surgió la idea de usar ese valor como un pequeño canal de comunicación con el exterior
- Al principio se pensó en Go como lenguaje de implementación, pero se eligió Python para poder ponerle al proyecto el nombre PySkyWiFi
- El código fuente está publicado en PySkyWiFi
Prototipo 1: mensajería instantánea usando el campo de nombre
- Dos clientes inician sesión en la misma cuenta de millas aéreas y se envían mensajes alternando entre actualizar y leer el campo de nombre
- Si uno cambia el nombre a
Hello how are you, el otro lo lee - Luego lo cambia a
Im fine how are youy el primero ve la respuesta
- Si uno cambia el nombre a
- Como cambiar el nombre manualmente en la UI era incómodo, se automatizó con una herramienta de línea de comandos
- La herramienta inicia sesión en el sitio web y actualiza el campo de nombre de una cuenta de prueba con el mensaje
- Cada pocos segundos consulta el campo de nombre y, si cambia el valor, lo muestra como respuesta de la otra parte
- Se decidió no seguir enviando datos automáticos a cuentas reales de millas aéreas, y solo se verificó que fuera posible actualizar el nombre rápidamente unas 10 veces con éxito
- Ese resultado sugiere que la cuenta quizá no imponía límites de velocidad o cantidad de solicitudes
- Después, el desarrollo continuó reproduciendo el mismo principio con GitHub Gists y archivos locales
- Porque era más rápido y fácil iterar que con cuentas reales de millas aéreas
Prototipo 2: obtener información externa con un demonio en tierra
- En el siguiente paso, se ejecuta un demonio en una computadora con conexión a internet en tierra o en la nube
- El demonio consulta constantemente el campo de nombre de la cuenta de millas aéreas y busca solicitudes estructuradas enviadas desde el avión
- Ejemplo:
STOCKPRICE: APPL - Ejemplo:
SCORE: MANUNITED
- Ejemplo:
- Cuando detecta una solicitud nueva, el demonio la interpreta, obtiene la información desde la API correspondiente y la devuelve al avión a través de la cuenta de millas aéreas
- A partir de esta etapa, ya no se trata solo de chat, sino también de consultas de información en tiempo real como precios de acciones o marcadores deportivos
Arquitectura completa con sky proxy y ground daemon
- PySkyWiFi es un protocolo similar a TCP/IP que mete una solicitud HTTP completa dentro de una cuenta de millas aéreas, luego una computadora en tierra realiza la solicitud HTTP real y sube la respuesta del mismo modo
- Tiene dos componentes
- sky proxy: un proxy que corre en la laptop dentro del avión
- ground daemon: un demonio que corre en una computadora con conexión a internet en casa o en la nube
- Antes de usarlo, primero se ejecuta el demonio en tierra; luego, ya conectado al Wi‑Fi del avión, se ejecuta el sky proxy en la laptop
- El usuario envía una solicitud HTTP al proxy local con herramientas como
curl- Ejemplo:
curl localhost:1234 -H "X-PySkyWiFi: example.com" - La URL real de destino se coloca en el encabezado personalizado
X-PySkyWiFi
- Ejemplo:
- El demonio en tierra elimina el encabezado
X-PySkyWiFiy lo usa para enrutar al sitio web de destino- El cuerpo de la solicitud y los demás encabezados se reenvían sin cambios
- Cuando todo termina, se recibe una respuesta HTTP como en una solicitud normal de internet, pero según el estado de la red del avión la petición puede quedarse detenida varios minutos y avanzar a solo unos pocos bytes por segundo
Chunks, ACK y una segunda cuenta para la ida y vuelta HTTP
- El sky proxy recibe la solicitud de
curly divide toda la solicitud HTTP en chunks- Porque la cantidad de datos que cabe de una vez en el campo de nombre de una cuenta de millas aéreas es pequeña
- Cada chunk se escribe en orden en el campo de nombre de la primera cuenta de millas aéreas
- El ground daemon consulta la cuenta y, cuando detecta un chunk nuevo, lo lee y deja una confirmación de recepción indicando que ya puede enviarse el siguiente
- Una vez reensamblada toda la solicitud HTTP, el ground daemon hace la solicitud real a internet
- La respuesta HTTP sigue el mismo proceso en sentido contrario
- El ground daemon divide la respuesta en chunks y los envía
- Para simplificar la implementación, los chunks de respuesta usan una segunda cuenta de millas aéreas
- El sky proxy lee los chunks, reconstruye la respuesta HTTP y la devuelve a la llamada original de
curl
Separación de responsabilidades entre capa de transporte y capa de red
- La lógica de comunicación de PySkyWiFi se divide en capa de transporte y capa de red
- La capa de transporte decide qué datos enviar y en qué orden
- Cómo dividir mensajes largos en chunks pequeños
- Cómo indicar que el receptor está listo para recibir el siguiente chunk
- Cumple un papel muy vagamente parecido al de TCP
- La capa de red escribe y lee en el almacenamiento real los datos definidos por la capa de transporte
- Ese almacenamiento puede ser una cuenta de millas aéreas, un archivo local o un perfil de Discord
- Esta separación facilita agregar nuevas plataformas de millas aéreas
- Solo hace falta implementar una nueva capa de red y la capa de transporte puede mantenerse igual
- La capa de red de pruebas puede leer y escribir archivos locales en vez de una cuenta de millas aéreas
Reglas de transmisión con DATA, ACK y END
- La conexión de transporte de PySkyWiFi está compuesta por dos pipes
- Cada cliente tiene un pipe SEND para escribir y un pipe RECV para leer
- Una cuenta de millas aéreas puede usarse como pipe
- En un momento dado, un cliente PSWF solo puede estar enviando o recibiendo
- En modo de envío no puede ver los datos enviados por la otra parte
- En modo de recepción, aunque envíe datos, la otra parte no puede verlos
- No funciona como TCP, donde siempre hay envío y recepción bidireccional
- Los mensajes largos se transmiten con segmentos
DATA,ACKyENDDATA: se compone de la letraD, un número de secuencia rellenado a 6 dígitos y los datos reales del chunk- Ejemplo:
D000451adline": "Mudslide in Wigan causes m ACK: se compone de la letraAy el número de secuencia de 6 dígitos que se confirma- Ejemplo:
A000451 END: una sola letraEmarca el final del mensaje
- El emisor manda un
DATAy espera hasta recibir elACKdel mismo número de secuencia- Si recibe
A000451, considera procesado el chunk000451y envía el chunk000452
- Si recibe
- Cuando el receptor ve
END, trata el mensaje como terminado y emisor y receptor intercambian roles
Interfaz de implementación de la capa de red
- La capa de red ofrece una interfaz sencilla para escribir y leer datos en el almacenamiento
- Hay dos operaciones obligatorias
send(msg: str): escribemsgen el almacenamientorecv() -> str: lee un mensaje del almacenamiento
- En una implementación basada en millas aéreas, estas dos operaciones equivalen a escribir y leer el campo de nombre de la cuenta
- También hay dos propiedades obligatorias
sleep_for: tiempo en segundos que la capa de transporte debe esperar entre sondeos del pipe RECVsegment_data_size: cantidad de caracteres que caben en un segmento
sleep_forpuede ser bajo en implementaciones de prueba como archivos, pero en una implementación con cuentas de millas aéreas debe ser de al menos varios segundos para no enviar demasiadas solicitudes al servidor remotosegment_data_sizedebe coincidir con el tamaño máximo del campo de la cuenta de millas aéreas que se esté usando; en el ejemplo son unos 20 caracteres- Hay dos hooks opcionales
connect_send(): se llama al inicializar el pipe SEND y, en una implementación con millas aéreas, podría usarse para iniciar sesión con nombre de usuario y contraseña y obtener cookiesconnect_recv(): se llama al inicializar el pipe RECV
Codificación base26 e ideas para mejorar el ancho de banda
- El formulario HTML de millas aéreas puede no permitir caracteres que no sean letras en el nombre
Stephenpodría estar permitidoGET /data?id=5podría ser rechazado
- Para evitarlo, la capa de red debe codificar los segmentos en base26 antes de escribirlos en la cuenta de millas aéreas
- Base26 representa una cadena usando solo letras de
AaZ - Convierte una cadena de bytes en un número grande y luego la expresa como si fuera un número en base 26 usando caracteres
A~Z - Ejemplo:
b26_encode("Hello world")devuelveCZEZINADXFFTZEIDPKM
- Base26 representa una cadena usando solo letras de
- La capa de transporte no necesita conocer esta codificación
- La capa de red convierte los bytes a base26 al escribirlos y los restaura al leerlos
- Base26 alarga bastante las cadenas y reduce el ancho de banda
- Usar base52 con mayúsculas y minúsculas podría acortarlas, pero eso queda como mejora para una versión 2
- El ancho de banda puede mejorarse aumentando el tamaño del segmento
- Aunque un campo solo guarde 20 caracteres, si se escriben 5 campos de 20 caracteres al mismo tiempo, se puede enviar un segmento de 100 caracteres con una sola solicitud
- El receptor puede leer esos 5 campos en una sola solicitud y volver a unirlos
Espacio de mejora con HTTP CONNECT y la prueba final
- PySkyWiFi podría construir un túnel mejor si usara HTTP CONNECT requests en vez de intercambiar solicitudes HTTP manualmente
CONNECTes el método que usan la mayoría de los proxies HTTP; con eso, PySkyWiFi podría funcionar como un proxy a nivel de sistema y también manejar solicitudes del navegador- Con
CONNECT, PySkyWiFi negociaría directamente la conexión TLS con el sitio web de destino, así que el tráfico que atraviesa la cuenta de millas aéreas quedaría cifrado - La desventaja es que la implementación sería mucho más compleja
- En la prueba final, se tunelizaron datos a través de GitHub Gist para cargar con
curlla página principal del blog, y varios minutos después se recibió la respuesta HTML
1 comentarios
Opiniones de Hacker News
Hace décadas, mi pareja usaba mensajes de Google Voice leyéndolos y respondiéndolos directamente desde la bandeja de entrada de Gmail, y como odiaba los celulares llevaba consigo un viejo Kindle Keyboard con 3G ilimitado
Con el navegador simple del Kindle podía abrir la interfaz liviana de Gmail, así que podía usarlo como un dispositivo de SMS sin cuota mensual; el único problema eran las notificaciones de mensajes nuevos
Entonces, después de hacerle jailbreak intenté poner un contador en la pantalla de inicio, hasta que se me ocurrió que podía poner el contador junto al nombre del dispositivo Kindle, que se podía cambiar desde la cuenta de Amazon
Desde mi servidor casero hice que una automatización de navegador iniciara sesión en Amazon y cambiara el nombre del dispositivo a
My Kindle (x), donde x era la cantidad de mensajes de Google Voice sin leer; el Kindle actualizaba el nombre en la pantalla de inicio en menos de 1 minuto, y funcionó bien durante añosRecuerdo que reducir apenas unos bytes equivalía a ahorrar como un millón de dólares
Para entonces probablemente era casi el Kindle funcional más antiguo, así que el ladrón simplemente habrá agarrado lo que había dentro de la bolsa
Más tarde encontré otro Kindle Keyboard de 20 dólares en un mercado de pulgas, pero a los 6 meses se le murió la batería; todavía tengo el equipo, así que me da curiosidad cuánto costará una batería de reemplazo
Con el navegador apenas se podía usar Gmail, e incluso hice un sitio web de Zork amigable para Kindle donde podías elegir entre varias ROM de zmachine para jugar juegos de texto
Salió en algunos sitios de noticias y tuvo cierta repercusión
No tenía la integración ingeniosa de cambiar el nombre del Kindle, pero durante un tiempo mandé mensajes de texto con un Kindle Keyboard con 3G ilimitado
Apenas podía correr el sitio web de Google Maps
Una vez tomé un ferry de unas 20 horas de Italia a Grecia; tenía Wi-Fi pago basado en internet satelital, pero no quería pagarlo
El acceso a Stripe estaba abierto para poder pagar y resultó que también podía acceder a todas las páginas de stripe.com, como la documentación para desarrolladores, así que empecé a desperdiciar ancho de banda descargando imágenes repetidamente
Entonces recordé que para que Stripe funcionara hacía falta acceso al CDN de Fastly, y que Reddit también usa Fastly; tras conectarme a Stripe, cambié el encabezado HTTP
Hostareddit.comy pude ver RedditLas imágenes no funcionaban porque
i.redd.itno está en Fastly, pero al apuntarold.reddit.coma la IP de Fastly de Stripe en/etc/hostse ignorar los aterradores errores de TLS, también pude iniciar sesiónSi por la conexión más lenta deciden no volver a comprarlo, también perjudicas a la empresa proveedora, y podrías aumentar los costos de ancho de banda de subida de Stripe
Yo suelo evitar descargas incluso en celular para no afectar negativamente a la gente alrededor
Entiendo el experimento intelectual de explorar hasta dónde se puede acceder en una conexión bloqueada, pero desperdiciar ancho de banda a propósito es parecido a abrir la llave de agua de un baño público para tirar agua o tapar un inodoro hasta que se desborde
https://en.wikipedia.org/wiki/Domain_fronting
Hace unas semanas, en un centro comercial, llevé a mis hijos a una clase e intenté usar el Wi-Fi gratis; el inicio de sesión en la laptop fue exitoso, pero decía que no había internet
Revisé la puerta de enlace predeterminada y vi que estaba conectado a un módem Cisco; se veían las herramientas de diagnóstico y la lista de dispositivos conectados, pero la conexión a internet estaba apagada
Busqué el modelo en el celular y decía que la cuenta de administrador era el número de serie y que la contraseña se dejaba en blanco; también había un patrón de ejemplo, y el nombre de uno de los dispositivos conectados se veía exactamente como ese patrón
Inicié sesión con eso, encendí el botón de internet y 15 segundos después se puso verde; también configuré una nueva contraseña para el dispositivo
La VPN no conectaba, y como pude entrar fácilmente al router, cambié la configuración de MTU y enseguida empezó a funcionar bien
Este tipo de hacking me parece genial y me gusta, en el sentido original de la palabra
Sin embargo, al revisar hace poco, parece que en skywifi el DNS global resuelve normalmente incluso sin pagar, y en el vuelo que tomé creo que también habría funcionado un túnel iodine común
https://github.com/yarrick/iodine
Para evitar reportes de abuso, hacía que el tráfico externo del servidor pasara por Tor; también reunía logs de en qué redes de trenes, hoteles y aeropuertos funcionaba, y ofrecía otros protocolos de tunneling
Fue un proyecto divertido durante un tiempo, y ojalá lo hubiera dejado corriendo
Hoy el tunneling por DNS es un poco más difícil porque algunos servidores DNS, especialmente Google, aleatorizan mayúsculas y minúsculas en las solicitudes DNS, lo que rompe bastante ciertos esquemas de codificación
La idea y los principios son interesantes, pero por la velocidad casi no sirve en la práctica, salvo quizá para montar algo como un mensajero sobre UDP ;-)
“Olvidé cargar los audífonos y Limp Bizkit empezó a sonar por los parlantes de la laptop. Por suerte, a las demás personas del avión no pareció importarles, así que todos la pasamos genial juntos.”
A esta gente le falta etiqueta básica en público
Seguro a muchas personas alrededor sí les molestó, pero probablemente eran demasiado educadas como para decirle que no les impusiera ruido innecesario
Me pareció un chiste gracioso porque hay muchísima gente sin esa etiqueta básica y, al menos, no creo que el autor sea realmente así
Muestra la imagen del hacker que ve la posibilidad de internet gratis como una oportunidad ejecutable y, después, toma distancia dando a entender que no es alguien que realmente vaya a abusar del sistema de la aerolínea, así que el tono inicial parece un recurso estilístico
Si no, es un comportamiento extremadamente grosero e insensible
Me pregunto si soy la única persona que, apenas se sube a un avión, siempre queda tan cansada que no puede hacer nada más que cerrar los ojos y esperar a que termine
Solo pensar en sacar la laptop o un libro me agota; hay mucho ruido y, como no tengo audífonos con cancelación de ruido, cuesta concentrarse
Para entonces ya llevo al menos 2 horas desde que salí de casa, pasando por tren, tranvía y control de seguridad, y la comida poco saludable del aeropuerto tampoco ayuda
Además, durante medio año el clima es demasiado caluroso o demasiado frío, y con una mochila de 10 kg termino sudando todo el tiempo, así que al final ya no me dan ganas de hacer nada dentro del avión
Es contraintuitivo, pero he oído que muchos cerebros con TDAH funcionan así, y el tiempo que paso en aviones es el más productivo
Tienes que apoyarla sobre las rodillas o, si la persona de adelante reclina el asiento, corres el riesgo de que se rompa la pantalla; a un compañero le pasó de verdad hace unos años
Hoy en día solo saco el iPad y los audífonos con cancelación de ruido para ver una película o una serie
Mi cuerpo reacciona igual, y creo que tiene que ver con la menor cantidad de oxígeno en el aire
No es un problema de ruido, sino del aire; aunque los audífonos con cancelación de ruido realmente funcionan muy bien
Pero sí hay personas a las que no les afecta en absoluto y hacen trabajo útil en el avión
Por más cansado que esté o por más sueño que me falte, en el avión no logro dormirme ni me da cansancio, así que los vuelos transatlánticos se vuelven más sufridos; si mi acompañante duerme 8 horas, hasta siento que se está burlando de mí
Durante el vuelo se me nubla muchísimo la cabeza y me quedo con los ojos cerrados hasta el aterrizaje; aunque intente leer o trabajar, a los 5–10 minutos el cerebro se me apaga
Curiosamente, la comida de avión siempre me provoca hinchazón abdominal, así que necesito tomar algo justo después de aterrizar
Algo interesante: las dos veces que viajé en clase ejecutiva pude leer un poco antes de que el cerebro se me apagara
En trenes de larga distancia, si voy sentado mirando en la dirección de avance, de hecho me resulta más fácil trabajar; pero si el tren va bastante lleno, se me vuelve a apagar el cerebro
La historia sobre enviar cotizaciones de acciones, marcadores deportivos o el clima me recordó una función que Google ofrecía antes como servicio de mensajes de texto
La usé muchísimo antes de comprar mi primer smartphone: enviabas
W[ZIP code]al 46645(GOOGL) y te respondía el clima por SMSTambién funcionaba
stock:[symbol], y había muchas otras funciones que ya olvidéClaro que Google la cerró, pero mientras duró fue bastante genial
La estructura era: enviabas unas líneas de la letra por DM vía SMS, que Twitter soportaba en ese entonces; el bot buscaba
" lyrics"en Google, parseaba los resultados y devolvía el artista y el título por SMSNo funcionaba muy bien, pero me sentía bastante orgulloso
Gracias a eso puedo hacerle preguntas a ChatGPT desde cualquier lugar del mundo con un comunicador satelital portátil inReach Mini 2, y es bastante bueno poder preguntarle cosas incluso en medio de Death Valley
Tipear una búsqueda de Google tomaba bastante, y los resultados podían tardar 1 o 2 minutos en llegar, pero era mejor que no tener nada
Lo usaba sobre todo para buscar la dirección de lugares a los que quería ir y meterla en el TomTom; los tiempos han cambiado mucho
Alrededor de 1995, cuando trabajaba en una empresa de investigación en telecomunicaciones, subsidiaria de Ericsson, se me ocurrió una idea así, y el ejemplo típico eran las actualizaciones del estado de vuelos
Como nadie imaginaba que la mensajería P2P, donde para escribir una letra en un teclado numérico había que presionar varias veces, fuera a ser tan popular, en un contexto de aumento de datos en la web temprana los servicios de información parecían el mejor uso
Teletext todavía existía, y también había un proyecto aparte para extraer datos de ahí
Pero es interesante pensar en para qué terminamos usando SMS tanto quienes teníamos acceso a él como el público general
Me parece interesante que el autor llegó bastante cerca de un TCP sobre un campo de edición compartido abstracto
Eso, por sí solo, podría ser una herramienta muy buena
Uno podría imaginar un proxy donde solo se diseñe a alto nivel cómo leer y escribir en un recurso compartido desde ambos lados, y que se encargue de todo lo demás y lo exponga como un proxy SOCKS
Al final, cuando el Wi-Fi gratis se volvió el estándar, dejó de ser gran cosa, y ahora pasamos a la guerra del Wi-Fi gratis a bordo
Al final, el Wi-Fi a bordo también será gratis en todas partes, y varias aerolíneas ya lo hacen
Solo serviría para texto, no para imágenes ni video, pero habría sido suficiente para la navegación web normal
Hace unos años, el decano de nuestra universidad dijo algo como que “los juegos estaban afectando la asistencia” y decidió bloquear la red LAN después de las 10 p. m.
La implementación consistía en bloquear todo el tráfico hacia y desde direcciones IP, pero no bloquearon TCP en sí, y también se olvidaron por completo de IPv6, que en ese entonces tampoco era precisamente nuevo.
Así que hice una app sencilla de chat P2P que funcionaba sobre IPv6, y el único problema era tener que compartir mi dirección IPv6 con mis amigos y hacer que la guardaran en sus contactos.
Funcionaba bien, pero después descubrí que era mucho más fácil hacer túneles hacia una computadora fuera de la red.
Me parece un ejemplo casi perfecto que recuerda al artículo sobre escribir más software inútil y la discusión posterior en HN.
¿Te cambia la vida? Probablemente no.
¿Fue divertido construirlo y explorarlo? Casi seguro que sí.
Deberíamos crear más cosas así.
https://ntietz.com/blog/write-more-useless-software/
https://news.ycombinator.com/item?id=37911900