Дізнайтесь про унікальний та хитрий спосіб отримати безкоштовний доступ до Wi-Fi в літаку, використовуючи програму для обходу платного підключення через аккаунт програм лояльності. Прочитайте детальний гайд із прикладами та кодом.
Дисклеймер: Вся інформація, представлена в цьому матеріалі, призначена виключно для ознайомлення. Матеріали не мають на меті порушення прав чи захисту незаконної діяльності. Усі методи та інструменти, що згадуються, призначені виключно для освітніх і дослідницьких цілей.
Літак набрав висоту близько трьох кілометрів, і пасажир витягнув свій ноутбук із надією скористатися Інтернетом або трохи попрацювати. Після підключення до Wi-Fi літака, відкрилось вікно авторизації, яке вимагало введення даних кредитної картки. Під час пошуків карти, що виявилась у паспорті, він помітив, що система пропонує безкоштовний вхід до облікового запису програми авіамиль, незважаючи на те, що оплата ще не була проведена. Це, ймовірно, вказувало на вразливість у файрволлі.
Зацікавлений ситуацією, пасажир увійшов до свого акаунту JetStreamers Diamond Altitude і побачив кнопку редагування профілю. Спочатку вона здавалася звичайною — зі стандартними параметрами редагування і можливістю змінити ім’я та адресу. Але детальніший аналіз показав, що через цю кнопку можна отримати доступ до Інтернету, використовуючи обліковий запис програми лояльності. Цей процес, хоч і був досить повільним та нелогічним, все ж міг дати позитивний результат.
Для реалізації цього задуму потрібно було створити кілька програмних прототипів. Спочатку розглядалась можливість використання мови програмування Go, але остаточний вибір упав на Python, що дозволило назвати інструмент PySkyWiFi.
Перший прототип передбачає можливість використання поля імені в обліковому записі програми авіаміль як своєрідний тунель для обміну миттєвими повідомленнями. Суть ідеї полягає в тому, що після входу в обліковий запис можна змінити своє ім’я, і будь-хто, хто також увійде в цей обліковий запис, зможе побачити нове ім’я. Таким чином, при кожній зміні імені можна передавати короткі повідомлення. Наприклад, змінити ім’я на “Привіт, як справи”, отримати відповідь “Добре, а в тебе” через зміну імені співрозмовника.
Ця система, хоча і здається незручною, може бути першим кроком до подальшого розвитку методу для обходу файрволла літакового Wi-Fi. Використовуючи цей примітивний метод, можна обмінюватися повідомленнями з іншими людьми без потреби платити за доступ до Інтернету.
Експерименти проводилися на двох ноутбуках, один з яких був старим, і після входу в обліковий запис авіаміль вдалося пересилати повідомлення через зміну імені. Хоча процес не дуже зручний, він все ж довів можливість обходу певних обмежень мережі.

Завдяки цьому інструменту можна обмінюватися повідомленнями через термінал із кимось на землі, обходячи необхідність оплати за Wi-Fi. Обидві сторони не будуть турбуватися про те, що повідомлення передаються через обліковий запис програми лояльності SkyVenture Premium Gold Rewards.
Хоча потрібно знайти співрозмовника для спілкування, інструмент вже демонструє гарний потенціал. Важливо зазначити, що надсилання автоматизованих даних через обліковий запис може викликати проблеми, тому в майбутньому варто бути обережним із подібними діями. Переконатися в роботі PySkyWiFi допомогли успішні експерименти, де ім’я в акаунті програми авіаміль було змінене багато разів без обмежень.
Після цього залишалося лише завершити решту коду, використовуючи інші сервіси на зразок GitHub Gist, які дозволяли відправляти дані за аналогічним принципом. Це спрощувало роботу і прискорювало процеси, роблячи PySkyWiFi ще ефективнішим для обміну даними через облікові записи програм лояльності, таких як Star Power UltimateBlastOff.
Нижче пояснюемо, як це працює (вихідний код).
PySkyWiFi складається з двох компонентів:
Небесний проксі – проксі, запущений на ноутбуці в літаку
Наземний демон — демон, запущений на наземному комп’ютері з підключенням до Інтернету або у хмарі.
Ось спрощена діаграма:
Підготовка до використання PySkyWiFi починається ще до відправлення з дому. Спочатку на наземному комп’ютері або сервері потрібно запустити демон. Після цього, коли вже опинитеся в літаку і підключитеся до Wi-Fi, запустіть на ноутбуці небесний проксі-сервер. Тепер ретранслятор PySkyWiFi готовий до роботи.
Для відправлення HTTP-запитів до небесного проксі використовують інструменти на зразок curl. Запит відправляється через локальний проксі (наприклад, localhost:1234/) із заголовком X-PySkyWiFi, де вказується URL-адреса веб-сайту для запиту.
Наприклад:
curl localhost:1234 -H "X-PySkyWiFi: example.com"
Наземний демон отримує заголовок X-PySkyWiFi, обробляє його і перенаправляє запит на цільовий веб-сайт. Весь інший вміст запиту залишається без змін.
Після цього потрібно почекати кілька хвилин, поки не надійде HTTP-відповідь. Якщо все пройде успішно, ви отримаєте відповідь від веб-сайту, ніби відправили запит через звичайний Інтернет. Головна перевага цього методу — це безкоштовний доступ до мережі. Однак, врешті-решт, ймовірно, доведеться оплатити Wi-Fi, після того як цікавість буде задоволена, бо не варто витрачати занадто багато часу на подібні експерименти.
Ось, як все влаштовано всередині:
Небесний проксі отримує HTTP-запит із дзвінка
curl. Він розбиває запит на фрагменти, тому що весь запит занадто великий для передачі через обліковий запис програми авіаміль за раз.
Небесний проксі записує кожен фрагмент по черзі в полі імені облікового запису.
Наземний демон опитує обліковий запис. Коли він виявляє, що поле імені змінилося і в ньому новий фрагмент, він зчитує цей фрагмент і передає відправнику підтвердження, щоб той знав, що можна передавати наступний фрагмент. Одержувач об’єднує фрагменти та відтворює вихідний HTTP-запит.
Після отримання та відтворення наземним демоном повного HTTP-запиту він надсилає запит через Інтернет.
Наземний демон отримує HTTP-відповідь.
Наземний демон відправляє HTTP-відповідь небесному проксі, виконуючи описаний вище процес у зворотному порядку. Цього разу наземний демон поділяє на фрагменти HTTP-відповідь і по черзі відправляє ці фрагменти в поле імені облікового запису (насправді, щоб спростити протокол, він записує ці фрагменти відповіді в поле імені другого облікового запису).
Небесний проксі опитує другий обліковий запис. Він зчитує кожен фрагмент і склеює їх назад, щоб відтворити відповідь HTTP.
Небесний проксі повертає HTTP-відповідь вихідному дзвінку
curl. При цьомуcurlпрацює з абсолютно звичайним HTTP-відповіддю, лише трохи повільним. Він і поняття не має про всю ту нісенітницю, що зараз сталася.
Небесний проксі та наземний демон досить прості: вони надсилають HTTP-запити та парсят HTTP-відповіді. Магія полягає в тому, як вони протискують ці запити та відповіді через обліковий запис програми авіаміль. Давайте розглянемо це докладніше.
Логіка комунікацій PySkyWiFi побудована на двох основних шарах: транспортному та мережевому.
Завдання транспортного шару полягає у тому, щоб організувати обмін даними між клієнтами. Він відповідає за те, як довгі повідомлення мають розбиватися на менші фрагменти для зручної передачі, і як клієнти повідомляють один одного про готовність отримати наступні частини. Цей шар працює подібно до протоколу TCP, який використовується в Інтернеті для надійної передачі даних.
Мережевий шар відповідає за фактичну передачу даних між клієнтами після того, як транспортний шар визначив, що передавати. Він нагадує IP-протокол, але в спрощеному вигляді. Завдяки цьому поділу шарів, кожен шар виконує своє завдання незалежно: транспортний шар працює з даними, а мережевий – з їх передачею.
Ця архітектура дозволяє легко додавати підтримку нових платформ або типів облікових записів. Наприклад, для роботи з іншими програмами лояльності авіакомпаній потрібно лише змінити мережевий шар, тоді як транспортний шар залишається незмінним.
Транспортний шар створює з’єднання між двома клієнтами за допомогою двох каналів: SEND (відправка) і RECV (отримання). Клієнт записує дані у свій канал SEND, а для отримання даних опитує канал RECV. Таким чином, двосторонній обмін даними реалізується через постійне опитування та запис у відповідні канали.
Ця система забезпечує ефективний спосіб передачі інформації, незалежно від того, де знаходяться клієнти – у літаку чи на землі.
З точки зору транспортного шару, канал в системі PySkyWiFi розглядається як середовище для передачі даних, де можна виконувати операції запису та читання. Транспортний шар не заглиблюється в деталі того, як саме працюють ці канали — його основне завдання полягає у правильному розподілі даних.
Ключовою особливістю є те, що клієнт PSWF може або надсилати дані, або отримувати, але не одночасно. У режимі відправки клієнт не отримуватиме дані від іншого клієнта, а в режимі отримання — не може надсилати свої. Це відрізняє PySkyWiFi від протоколу TCP, де передача і отримання можуть здійснюватися паралельно.
При передачі HTTP-запитів через вузький канал (наприклад, через поле імені в обліковому записі програми лояльності), небесний проксі надсилає запит, а наземний демон отримує його. Після цього небесний проксі перемикається в режим отримання, а наземний демон виконує запит і відправляє відповідь назад. Таким чином, вони постійно змінюють ролі, щоб забезпечити двосторонній обмін даними.
Оскільки канал є вузьким, обсяг даних, який можна передати за раз, невеликий. Тому довгі повідомлення (наприклад, HTTP-запити) розбиваються на менші фрагменти, кожен з яких відправляється по черзі через канал SEND. Це робить процес досить тривалим, але в кінцевому підсумку ефективним для досягнення повного циклу передачі даних. Щоб розпочати повідомлення, відправник передає перший фрагмент даних повідомлення всередині сегмента DATA.
Сегмент
DATAмає таку структуру :
Літера
D
Порядковий номер фрагмента (шестизначне число, що унікально ідентифікує фрагмент)
Сам фрагмент даних.
Наприклад, сегмент даних у середині повідомлення може виглядати так: D000451adline": "Mudslide in Wigan causes m
Після того, як відправник передасть сегмент DATA, він робить паузу. Він хоче передати наступний сегмент DATA, але не може переписати поле імені облікового запису, поки не знатиме, що одержувач прийняв і обробив попередній.
Одержувач повідомляє відправнику, що можна безпечно передавати новий сегмент DATA, підтверджуючи зчитування кожного сегмента. Одержувач робить це, записуючи сегмент ACK у власний канал SEND:
Сегмент
ACKмає таку структуру :
Літера
A
Шестизначний порядковий номер сегмента, здобуття якого підтверджується. Наприклад:
A000451
У системі PySkyWiFi, транспортний шар використовує сегменти DATA і ACK для передачі та підтвердження отримання даних між двома клієнтами. Відправник постійно опитує свій канал RECV, очікуючи на сегмент ACK. Коли він отримує такий сегмент із певним порядковим номером, наприклад, 000451, це свідчить про те, що одержувач успішно прийняв сегмент даних із цим номером, і тепер можна відправляти наступний сегмент з номером 000452.
Процес продовжується, поки всі фрагменти повідомлення не будуть відправлені, і тоді передається сегмент END, що складається з літери E, який сигналізує про завершення передачі. Після цього клієнти змінюють ролі: колишній відправник стає отримувачем і починає опитувати свій канал RECV у пошуках нових даних, а колишній отримувач починає надсилати свою відповідь, розбиваючи її на фрагменти.
Важливим є те, що транспортний шар не турбується про те, як саме працює мережевий шар — йому лише потрібно, щоб було два канали: один для запису, інший для читання. Мережевий шар може використовувати будь-яку доступну технологію для передачі даних, будь то локальні файли, профіль у Discord або обліковий запис програми авіаміль. Це забезпечує гнучкість PySkyWiFi у роботі з різними програмами лояльності авіакомпаній, що дозволяє системі бути універсальною.
Ось як PSWF використовує сегменти транспортного протоколу для обміну довгими повідомленнями:
Транспортний шар вирішує, які дані клієнти повинні передавати один одному, але не говорить нічого про те, як вони мають їх передавати. Цим займається мережевий шар.
Завдання мережного шару – надсилання даних між клієнтами. Йому не має значення, звідки взялися дані і що вони означають; він просто отримує якісь дані з транспортного шару та відправляє їх іншому клієнту (зазвичай через обліковий запис).
Це означає, що мережевий шар досить простий. А ще це означає, що додавання нового мережевого шару для нової платформи програми авіаміль теж немає нічого складного. Ми використовуємо нову платформу для реалізації кількох операцій та кількох властивостей (див. нижче), а потім транспортний шар може автоматично використовувати нову платформу без додаткових зусиль.
Мережевий шар складається з двох операцій:
send(msg: str)– Записmsgу сховище. У разі реалізації на основі програми авіаміль він записує значенняmsgв полі імені облікового запису.
recv() -> str– Читання повідомлення зі сховища. У разі реалізації на основі програми авіаміль він зчитує значення з поля імені облікового запису.
Крім того, реалізація мережевого шару має визначити дві властивості:
sleep_for— кількість секунд, протягом якого транспортний шар має очікувати між опитуванням нових сегментів із каналу RECV. У разі тестових реалізаційsleep_forможе бути дуже низьким, але у разі реалізації, наприклад, на основі облікового запису програми авіаміль він повинен складати багато секунд, щоб не перевантажувати віддалений сервер надто великою кількістю запитів.
segment_data_size— кількість символів, які транспортний шар повинен передавати в одному сегменті. Повинне бути рівним максимальному розміру поля облікового запису, що використовується для передачі сегментів (часто приблизно 20 символів).
Опціонально реалізація мережного шару також може надавати ще дві операції:
connect_send()– хук, що викликається відправником під час ініціалізації каналу SEND. У реалізації на основі облікового запису програми авіаміль це дозволяє клієнту залогінитися на платформі за допомогою імені користувача та пароля. Це дає клієнтові cookie, який він може використовувати для аутентифікації майбутніх дзвінківsendіrecv.
connect_recv()– хук, що викликається одержувачем під час ініціалізації каналу RECV.
Якщо ви реалізуєте всі ці методи, зможете використовувати PySkyWiFi на літаках іншої авіакомпанії. Але, повторюся, не варто це робити.
При написанні мережного шару, що використовує нову систему авіаміль, можна використовувати пару трюків, що підвищують швидкість та надійність реалізації.
def b26_encode(input_string: str) -> int:
# Перетворимо вхідний рядок на ціле число base-256
base256_int = 0
for char in input_string:
base256_int = base256_int * 256 + ord(char)
# Перетворимо ціле число base-256 у рядок base26
if base256_int == 0:
return 'A' # Особливий випадок порожніх вхідних даних або вхідних даних, рівних нулю
base26_str = ""
while base256_int > 0:
base26_str = chr(base256_int % 26 + 65) + base26_str
base256_int //= 26
return base26_str
b26_encode("Hello world")
# => 'CZEZINADXFFTZEIDPKM'
Транспортний шар у системі PySkyWiFi не бере участі у процесі кодування даних. Мережевий шар отримує байти, перетворює їх у закодовані рядки за допомогою base26, і ці рядки, що містять тільки літери від A до Z, записуються в обліковий запис. Коли потрібно отримати дані назад, мережевий шар зчитує рядок, декодує його назад у байти та передає їх транспортному шару. Таким чином, транспортний шар працює з байтами і не потребує знати про методи кодування, використовувані для передачі даних.
Недоліком використання base26 є те, що рядок стає набагато довшим, що знижує пропускну спроможність протоколу, подібно до того, як двійковий вигляд числа довший за десятковий. Щоб покращити ефективність, можна було б використовувати base52, який включає літери як верхнього, так і нижнього регістрів, дозволяючи передавати більше даних у меншому обсязі. Це поліпшення може бути запроваджене у майбутній версії системи.
Ще один спосіб збільшення пропускної спроможності PSWF – розширення розміру сегмента, що може обробляти мережевий шар. Якщо ми подвоїмо розмір сегментів, то й подвоїмо пропускну спроможність протоколу.
Поля в облікових записах програм авіаміль зазвичай мають обмеження на довжину. Наприклад, може бути дозволено ім’я не довше 20 символів. Однак можна максимізувати пропускну здатність:
Використовуючи повну довжину поля
Розбивши сегмент на кілька полів
Допустимо, ми можемо керувати п’ятьма полями, у кожному з яких може зберігатися до 20 символів. Замість використання одного поля для передачі сегментів із 20 символів ми можемо розбити сегмент із 100 символів на 5 блоків по 20 і оновлювати їх усі разом в одному запиті. Тоді одержувач зможе теж за один запит рахувати всі 5 полів та пошити їх разом, щоб відтворити повний сегмент.
Було б ефективніше використовувати запити CONNECT для налаштування тунелю між небесним проксі та цільовим веб-сайтом в PySkyWiFi, оскільки це дозволило б системі працювати на рівні системного проксі. Більшість HTTP-проксі реалізовані на основі запитів CONNECT, що забезпечує пряме встановлення TLS-з’єднання з веб-сайтом. Це означало б, що трафік, переданий через обліковий запис авіаміль, був би зашифрований, що значно підвищило б безпеку та ефективність передачі даних.
Однак, впровадження цього механізму вимагало б більшого обсягу роботи, ніж просте перекидання HTTP-запитів вручну, як це робиться зараз у PySkyWiFi. Використання CONNECT вимагає більш складного налаштування та контролю над з’єднанням.
Після експерименту з PySkyWiFi, тунель через GitHub Gist був успішно використаний для завантаження домашньої сторінки блогу через curl. Хоча це зайняло багато часу, результат показав потенціал такого підходу, і це можна вважати водночас найпродуктивнішим та найменш продуктивним польотом.