Як я використовую AirDrop замість Тіндера

Як я використовую AirDrop замість Тіндера

У пристроях Apple є чудова функція Airdrop - вона зроблена для пересилання даних між пристроями. При цьому ніякого налаштування та попереднього сполучення пристроїв не потрібно, все працює з коробки в два кліки. Для передачі даних використовується надбудова над Wi-Fi, тому дані передаються з величезними швидкостями. При цьому використовуючи деякі трюки, можна не просто пересилати файли, а й дізнатися про телефонний номер людини, яка перебуває з тобою в одному вагоні метро.

Останній рік я використовую цю функцію для цікавих знайомств по дорозі на роботу, у громадському транспорті, у закладах громадського харчування. У середньому за день мені вдається заводити кілька нових знайомств, і іноді я виходжу з метро в компанії нової людини.

Під катом я розповім за всю хурму.

Як працює AirDrop

Як я використовую AirDrop замість Тіндера

AirDrop це протокол передачі файлів всередині одноранговой сети. Він може працювати як по звичайній локальній мережі, так і по повітрю між будь-якими пристроями Apple. Ми будемо розбирати останній випадок, коли два пристрої не підключені до спільної мережі, а просто знаходяться поруч, наприклад дві людини з телефонами їдуть у вагоні метро і не підключені до спільного Wi-Fi.

Як я використовую AirDrop замість Тіндера
Перший етап передачі через AirDrop – розсилка BLE пакета

Щоб ініціювати передачу даних через AirDrop, телефон ініціатора посилає широкомовний BLE-пакет, в якому міститься захешована інформація про iCloud акаунті та телефонний номер власника пристроїв ініціатора, з пропозицією встановити підключення через протокол AWDL (Apple Wireless Direct Link), щось на зразок Fi Direct зі світу Android. Структура цього BLE пакета дуже цікава, ми розберемо її далі.

На стороні одержувача AirDrop може бути у трьох станах:

  • Вимкнено — не виявлятиметься взагалі
  • Тільки для контактів — приймати файли лише від контактів із записника. При цьому контактом вважається номер телефону або email, до якого прив'язаний icloud обліковий запис. Тут працює та ж логіка прив'язки облікових записів, що і з месенджером iMessages.
  • Для всіх — телефон виявлятиметься для всіх

Як я використовую AirDrop замість Тіндера
Налаштування приватності AirDrop. Стандартний стан встановлено на «Для контактів».

Залежно від установок приватності, телефон або продовжить встановлення з'єднання через AWDL, або просто проігнорує BLE-пакет. Якщо для AirDrop встановлено налаштування «для всіх», то на наступному кроці пристрої з'єднаються один з одним через AWDL, піднімуть між собою IPv6-мережу, всередині якої AirDrop буде працювати як звичайний прикладний протокол за допомогою mDNS через стандартний протокол IP.

Як я використовую AirDrop замість Тіндера

Для експериментів ви можете подивитися за тим, як працює AWDL на макбуку. Весь обмін цим протоколом відбувається через інтерфейс awdl0, який можна легко зняти за допомогою Wireshark або tcpdump.

На цьому етапі ми знаємо три сутності:

Bluetooth LowEnergy (BLE) пакет — цей пакет містить дані, на підставі яких телефон вирішує, чи є ініціатор у списку контактів чи ні.
Apple Wireless Direct Link (AWDL) — фірмова заміна Wi-Fi Direct від Apple, включається, якщо спілкування по BLE пройшло успішно.
десантний - прикладний протокол, який працює всередині звичайної IP-мережі з використанням mDNS, HTTP і т.д. Може працювати всередині будь-якої мережі Ethernet.

Структура BLE-пакету

Може здатися, що цей BLE-пакет пролітає лише один раз від ініціатора до одержувача, а далі обмін відбувається лише AWDL. Насправді з'єднання AWDL живе дуже мало, лише кілька хвилин або менше. Так що у випадку, якщо одержувач файлу захоче вам відповісти, він також виступить ініціатором і надішле BLE-пакет.

Як телефон на стороні, що приймає, розуміє, чи є номер/email ініціатора в його списку контактів чи ні? Я дуже здивувався, коли дізнався про відповідь: ініціатор шле свій номер та email у вигляді хеша sha256, але не цілком, а лише перші 3 байти.

Як я використовую AirDrop замість Тіндера
Структура BLE-пакету від ініціатора AirDrop. По хешах від телефонного номера та email відповідач розуміє, чи є ініціатор у його списку контактів.

Наприклад, якщо ваш Apple-акаунт (він же iCloud, він же iMessages) прив'язаний до номера +79251234567, хеш від нього вважатиметься так:

echo -n "+79251234567" | shasum -a 256
07de58621e5d274f5844b6663a918a94cfd0502222ec2adee0ae1aed148def36

І в результаті в BLE-пакеті відлетить значення 07de58 для телефонного номера Цього здається мало, але часто цих трьох байт достатньо, щоб дізнатися про реальний номер телефону.

Важливо також пам'ятати, що налаштування приватності AirDrop не впливає на дані в BLE-пакеті. Хеш від телефонного номера буде в ньому, навіть якщо встановлено налаштування «Для всіх». Також BLE-пакет з хешем телефонного номера надсилається у разі відкриття вікна Share (Поділитися) та при введенні пароля до Wi-Fi мережі.

Докладний розбір структури BLE-пакетів та можливих атак на нього читайте у дослідженні Apple Bleee та російська переклад на Хабре.

У дослідженні Apple Bleee опубліковано готові скрипти на python для автоматизації аналізу даних у BLE-пакетах. Я дуже рекомендую вивчити дослідження та спробувати програми, там багато чого цікавого.

AWDL (Apple Wireless Direct Link)

AWDL - це така пропрієтарна надбудова Apple над звичайним Wi-Fi, що реалізує щось на зразок Wi-Fi Direct. Я до кінця не знаю, як вона працює, там особливий спосіб анонсування та узгодження каналів, і працює це тільки на пропрієтарних драйверах Apple. Тобто, тільки макбуки/айфони можуть з'єднуватися через AWDL.

Сумні власники телефонів Android поки що тільки мріють про функцію Wi-Fi Direct, що нормально працює.

Як я використовую AirDrop замість Тіндера

Але не так давно хлопці з seemoo-lab написали повністю відкриту реалізацію AWDL та назвали її Open Wireless Link (OWL). Для запуску OWL адаптер Wi-Fi повинен підтримувати моніторний режим та ін'єкції пакетів, тому запускається не на кожному залізі. На сайті є приклади налаштування на raspberry pi. Працює це істотно гірше за оригінальний AWDL, наприклад час встановлення підключення розтягується на ~10 секунд замість пари секунд у оригіналу, але працює.

Як я використовую AirDrop замість Тіндера

Також ці хлопці написали з нуля реалізацію протоколу AirDrop на пітоні. OpenDrop. Його можна використовувати як у зв'язці з OWL, для запуску AirDrop на лінукс так і з оригінальним AWDL на macOS.

Як підкочувати через AirDrop

Як я використовую AirDrop замість Тіндера
Типова ситуація із підкочуванням через AirDrop

Вистачить нудної теорії, настав час приступати до практики. Отже, ти озброївся всім необхідним обладнанням і готовий висуватися підкочувати кулі за допомогою високих технологій.

Для початку слід запам'ятати основні моменти:

  • AirDrop спрацює лише якщо телефон розблоковано — найкраще, якщо ціль безперервно дивиться в телефон. Найчастіше це відбувається у місцях де нудно, наприклад у метро.
  • Потрібен час — зазвичай, позитивна конверсія відбувається на 3-5 відправленій картинці, тому потрібно хоча б 5 хвилин спокійного перебування на одному місці. Позитивною конверсією я вважаю момент, коли ви домовилися через AirDrop продовжити спілкування в месенджері. Це складно реалізувати на ходу, тому що не відразу зрозуміло, хто прийняв твій пейлоад, і швидше за все ви розминетеся раніше, ніж зможете про щось домовитися.
  • Персоналізований креатив працює краще — я називаю пейлоадом той медіаконтент, який ти надсилаєш через AirDrop. Просто картинка з мемом, швидше за все, ні до чого не приведе, контент має бути релевантним до ситуації і мати зрозумілий call to action.

Спосіб класичний – тільки телефон

Підходить всім, хто має айфон, не вимагає особливих навичок крім соціальних. Переводимо AirDrop в режим Everyone і спускаємось у метро. У звичайний день (до самоізоляції) у вагоні московського метро я спостерігав приблизно таку картину:

Як я використовую AirDrop замість Тіндера
Список цілей

Як видно, майже всі телефони броадкастять ім'я власника, за яким ми легко можемо визначити його підлогу та підготувати відповідний пейлоад.

Пейлоад

Як я писав вище, унікальний пейлоад працює краще. В ідеалі картинка повинна звертатися до власниці на ім'я. Раніше мені доводилося робити креатив за допомогою графічного редактора в додатку «нотатки» та якогось огризку мобільного фотошопу. У результаті, наразі поки потрібна картинка була відмальована, вже потрібно було виходити з вагона.

Моя подруга Аня koteeq, спеціально на моє прохання, написала Телеграм-бота, який генерує потрібні картинки з підписом на льоту: @AirTrollBot. Дякую їй величезне за те, що я тепер можу підкочувати кулі набагато технологічніше, ніж раніше.

Досить відправити роботу рядок з текстом, і він згенерує її у вигляді картинки, що точно підходить по співвідношенню сторін для превью у вікні AirDrop. Можна вибрати персонажа на зображенні натисканням кнопок. Також опціонально можна включити додавання вашого телеграм-логіну на картинку в кутку.

Як я використовую AirDrop замість Тіндера
Payload generator

Самий жир був у тому, що картинка з'являлася відразу на екрані жертви без будь-яких дій. Не треба було навіть натискати «прийняти». Можна було бачити миттєву реакцію на обличчі від завантаження пейлоаду. На жаль, з версії iOS 13 картинки від незнайомих контактів більше не з'являються на екрані. Ось, як це виглядало раніше:

Як я використовую AirDrop замість Тіндера
Payload delivered on iOS ≤12

Зараз замість прев'ю показується лише ім'я пристрою відправника. Тому єдиний спосіб звернутися до жертви з iOS ≥13 на ім'я, це задати його в налаштуваннях вашого пристрою, наприклад, назвати телефон «Юля, привет». Hint: у назві пристрою можна використовувати емодзі. Звичайно такий спосіб не настільки яскравий, як із картинкою, але сильно підвищує шанс натискання кнопки «прийняти».

Подальший опис дій виходить за межі технічної статті і залежить тільки від вашої фантазії, імпровізації та гумору. Можу сказати тільки, що ті, хто вступають у цю гру і починають відповідати вам картинками або посилати нотатки, як правило, дуже веселі, відкриті та цікаві люди. Ті, хто подивившись картинку просто не відповідають, або того гірше, просто відхиляють повідомлення, зазвичай нудні сноби та ханжі. Також нерідко відіграє роль фактор страху: тендітні полохливі люди бояться взаємодіяти з таким нахабним анонімним незнайомцем.

Автоматична дикпік-машина

Якщо тобі ліньки генерувати і розсилати пейлоади вручну, і ти хочеш автоматизувати процес, можна виготовити автоматичну дикпік-машину, яка у фоні розсилатиме картинки AirDrop всім, хто знаходиться в радіусі дії. Як апаратна платформа будемо використовувати raspberry pi zero, але підійде будь-який комп'ютер з лінуксом, головне щоб Wi-Fi картка підтримувала моніторний режим та ін'єкції пакетів.

Як я використовую AirDrop замість Тіндера
Розсилач дикпіків Airdrop на базі raspberry pi zero w + батарейний шилд UPS Lite

Є програми AirDrop флудерів для айфонів Jailbreak, вони працюють стабільніше, ніж відкриті варіанти на raspberry pi

Налаштування OWL на raspberry pi детально описано на сайті проекту, але я віддаю перевагу використанню складання Kali Linux для Raspberry Pi Zero, тому що в ній вже встановлені патчі nexmon, для активації моніторного режиму Wi-Fi на rpi0.

Важливо пам'ятати, що Airdrop (вірніше AWDL) у пацієнтів активується лише після отримання BLE-пакету. Тому ми маємо його посилати з інтервалом у кілька секунд. Це можна зробити за допомогою утиліти py-bluetooth-utils. Використовуючи функцію start_le_advertising(), я надсилаю рядок даних із прикладів apple bleee: 000000000000000001123412341234123400.

Після того, як ви отримали працюючий OWL-демон, далі можна запускати мій форк opendrop. У репозиторії лежить скрипт flooder.py, який розсилає всім картинку kak_dela.jpeg.

За моїми спостереженнями, raspberry pi zero w працює нестабільно в моніторному режимі. Приблизно через 20 хвилин активної роботи флудера вилітає підсистема Wi-Fi. Проблема описана у автора pwnagotchi, Імовірно викликана перегрівом. Потрібно передбачити watchdog або використовувати стабільніше залізо

Режим маньячелло – я знаю твій номер

Якщо ти хочеш показати себе неадекватним маніяком і назавжди відбити бажання продовжувати спілкування з тобою, можна спробувати дізнатися номер телефону людини, яка знаходиться поруч.

Як ми вже дізналися раніше, у BLE-пакетах, які посилає ініціатор, містяться перші три байти від sha256 телефонного номера. Цей хеш можна спіймати в момент, коли жертва натисне кнопку «поділитися» і запустить сканування airdrop пристроїв або тапне в поле введення Wi-Fi пароля від нової мережі (отже apple шукає друзів у радіусі дії, у яких можна запросити пароль від мережі).

Тобі потрібно якимось чином тригернути посилку хеша від жертви, і зловити його. Я використовую утиліти з репозиторію Apple Bleee. Так як Bluetooth MAC-адреси пристроїв рандомні та постійно змінюються, тобі доведеться знайти інший спосіб визначити потрібний пристрій у цьому списку. Завдання спрощується тим, що iOS транслює поточний стан телефону на кшталт: вимкнено екран, включено екран, lock screen, розблоковано і т.д. Тому, просто спостерігаючи за діями жертви можна зіставити поточний стан пристрою з пристроєм у таблиці. Найпростіше зловити момент, коли користувач дістав телефон з кишені, увімкнув екран і розблокував телефон пальцем або обличчям. Все це буде видно у сніфері.

Як я використовую AirDrop замість Тіндера
Значок Х означає, що спійманий пакет із хешами телефону.

Їхній парсер іноді ламається, але найчастіше працює. Я не повністю переказуватиму суть вразливості, оскільки це докладно розібрано авторами Apple Blee, опишу лише свій досвід. Скажу тільки, що я використовую USB Bluetooth-адаптер на чіпі CSR 8510, так як у мене він працює значно стабільніше, ніж вбудований у макбук Bluetooth-адаптер, прокинутий у віртуальну машину.

Отже, ми зловили хеш від телефону жертви і отримали заповітні три байти від хеша номера телефону.

Як я використовую AirDrop замість Тіндера
Перехоплений BLE-пакет із хешем номера телефону, за допомогою утиліти read_ble_state.py

Ми знаємо, що в Росії всі мобільні номери починаються з коду +79 і, швидше за все, у нашої жертви телефон має такий самий код. Виходить, ми маємо діапазон номерів від +79000000000 до +79999999999, близько мільярда номерів.

Щоб звузити діапазон, беремо лише коди, які реально зареєстровані за будь-яким оператором і викидаємо інші. У результаті діапазон стає вдвічі меншим, близько півмільярда номерів.

Далі генеруємо sha256 від усіх номерів і зберігаємо від кожного хеша лише перші 3 байти. Заносимо цей список в базу Sqlite, для прискорення пошуку будуємо індекс.

Так виглядають дані у базі:

Як я використовую AirDrop замість Тіндера
Всі російські телефонні номери та перші три байти хешу

Далі, маючи хеш жертви, ми можемо знайти всі збіги в базі. Зазвичай однією хеш виходить 15-30 збігів.

Як я використовую AirDrop замість Тіндера
Усі номери, що збіглися з хешем жертви

Очевидно, що не всі ці номери використовуються реально. Ми можемо відсікти зайві за допомогою HLR-запиту або невидимої SMS. З 30 номерів у мережі виявилося 5.

Як я використовую AirDrop замість Тіндера
Результат виконання HLR-запиту. Зеленим виділено номери у мережі.

Я б міг продовжувати просівати номери, наприклад, додати їх у Telegram/Whatsapp і подивитися аватарки, перевірити через бази на кшталт Getcontact і так далі. Але простіше виявилося просто подзвонити на всі п'ять номерів і дивитися коли у жертви задзвонить телефон.

Як я використовую AirDrop замість Тіндера
Target located

Всі

  • Флудер на raspberry pi дуже нестабільний, потрібно скуштувати інші одноплатники.
  • Нативний флудер для iOS буде набагато кращим, але я не зміг знайти працюючий на iOS 12-13 навіть з джейлбрейком.
  • Скрипт flooder.py дуже тупий. Напевно, він міг би генерувати іменну картинку, беручи ім'я з імені пристрою одержувача і вирізаючи слово iPhone.
  • Спосіб визначення номера телефону можна оптимізувати, перевіряючи лише факт прив'язки номера до iMessage. Швидше за все це дасть близьке до 100% потрапляння.

Висновок

Це ідеальна розвага для метро. Є вау-ефект, цікавим людям таке цікаво. Багато імпровізації, були дуже курйозні випадки. Виявляється, багато людей готові підігрувати і навіть скасовувати свої плани щоб вийти на твоїй станції метро і піднятися випити кави. За рік я познайомився з купою народу та з деякими продовжую спілкуватися.

Іноді я відключаю відображення Телеграм-логіна та розважаюсь ось так.

Як я використовую AirDrop замість Тіндера

Як я використовую AirDrop замість Тіндера

Джерело: habr.com

Додати коментар або відгук