Apple-enheter har en utmärkt Airdrop-funktion – den är gjord för att skicka data mellan enheter. I det här fallet krävs ingen installation eller preliminär ihopparning av enheter, allt fungerar ur lådan med två klick. Ett tillägg över Wi-Fi används för att överföra data, och därför överförs data med enorma hastigheter. Samtidigt, med hjälp av några knep, kan du inte bara skicka filer, utan också ta reda på telefonnumret till den person som är i samma tunnelbanevagn med dig.
Det senaste året har jag använt den här funktionen för att göra intressanta bekantskaper på vägen till jobbet, i kollektivtrafiken och i offentliga serveringar. I genomsnitt lyckas jag träffa flera nya bekantskaper per dag, och ibland lämnar jag tunnelbanan i sällskap med en ny person.
Under snittet kommer jag att berätta om alla persimmons.
Hur fungerar AirDrop?
AirDrop är ett protokoll för överföring av filer inom ett peer-to-peer-nätverk. Det kan fungera både över ett vanligt lokalt nätverk och trådlöst mellan alla Apple-enheter. Vi kommer att analysera det sista fallet, när två enheter inte är anslutna till ett gemensamt nätverk, utan helt enkelt är i närheten, till exempel, två personer med telefoner reser i en tunnelbanevagn och inte är anslutna till ett gemensamt Wi-Fi.
Det första steget av överföring via AirDrop är att skicka ett BLE-paket
För att initiera dataöverföring via AirDrop skickar initiativtagarens telefon ett BLE-utsändningspaket, som innehåller hashad information om iCloud-kontot och telefonnummer till ägaren av initiativtagarens enheter, med ett förslag om att upprätta en anslutning via AWDL (Apple Wireless Direct Link )-protokoll, något som Wi-Fi. Fi Direkt från Androids värld. Strukturen för detta BLE-paket är mycket intressant, vi kommer att analysera det vidare.
På mottagarens sida kan AirDrop vara i tre tillstånd:
Avstängd - kommer inte att upptäckas alls
Endast för kontakter — acceptera endast filer från kontakter i din adressbok. I det här fallet anses kontakten vara det telefonnummer eller e-postmeddelande som icloud-kontot är länkat till. Samma logik för att länka konton fungerar här som med iMessages messenger.
för alla – telefonen kommer att vara synlig för alla
AirDrop sekretessinställningar. Standardstatusen är inställd på "För kontakter".
Beroende på dina sekretessinställningar kommer telefonen antingen att fortsätta att upprätta en anslutning via AWDL eller helt enkelt ignorera BLE-paketet. Om AirDrop är inställt på "för alla" kommer enheterna i nästa steg att ansluta till varandra via AWDL, skapa ett IPv6-nätverk mellan dem, inom vilket AirDrop kommer att fungera som ett vanligt applikationsprotokoll med hjälp av mDNS över standard IP-protokollet.
För experiment kan du se hur AWDL fungerar på en MacBook. Allt utbyte under detta protokoll sker via gränssnittet awdl0, som enkelt kan fångas med Wireshark eller tcpdump.
I detta skede känner vi till tre enheter:
Bluetooth LowEnergy (BLE)-paket - detta paket innehåller data baserat på vilken telefonen bestämmer om initiatorn finns i sin kontaktlista eller inte. Apple Wireless Direct Link (AWDL) — en proprietär ersättning för Wi-Fi Direct från Apple, aktiverad om kommunikationen via BLE lyckades. LUFTLANDSÄTTNING - ett applikationsprotokoll som fungerar inom ett vanligt IP-nätverk med hjälp av mDNS, HTTP, etc. Kan arbeta inom alla Ethernet-nätverk.
BLE-paketstruktur
Det kan tyckas att detta BLE-paket bara flyger en gång från initiatorn till mottagaren, och då sker utbytet endast via AWDL. I verkligheten har en AWDL-anslutning en mycket kort livslängd, bara några minuter eller mindre. Så, om mottagaren av filen vill svara dig, kommer han också att agera som initiativtagare och skicka ett BLE-paket.
Hur förstår telefonen på den mottagande sidan om initiativtagarens nummer/e-post finns i kontaktlistan eller inte? Jag blev väldigt förvånad när jag fick reda på svaret: initiativtagaren skickar sitt nummer och e-post som en sha256-hash, men inte helt, utan bara de första 3 byten.
Struktur för ett BLE-paket från AirDrop-initiatorn. Med hjälp av hash från telefonnumret och e-posten förstår svaranden om initiativtagaren finns i sin kontaktlista.
Till exempel, om ditt Apple-konto (aka iCloud, aka iMessages) är länkat till numret +79251234567, kommer hashen från det att beräknas så här:
echo -n "+79251234567" | shasum -a 256
07de58621e5d274f5844b6663a918a94cfd0502222ec2adee0ae1aed148def36
Och som ett resultat kommer värdet i BLE-paketet att flyga iväg 07de58 för ett telefonnummer. Detta verkar inte tillräckligt, men ofta räcker dessa tre byte för att ta reda på det verkliga telefonnumret.
Det är också viktigt att komma ihåg att integritetsinställningen AirDrop inte påverkar data i BLE-paketet. Telefonnumrets hash kommer att finnas i det, även om inställningen "För alla" är inställd. Dessutom skickas ett BLE-paket med en hash av telefonnumret när Share-fönstret öppnas och när lösenordet för Wi-Fi-nätverket anges.
För en detaljerad analys av strukturen för BLE-paket och möjliga attacker på dem, läs studien Apple Bleee och ryska översättning till Habré.
Apple Bleee-studien publicerade färdiga python-skript för automatisering av dataanalys i BLE-paket. Jag rekommenderar starkt att kolla in forskningen och testa programmen, det finns mycket intressant där ute.
AWDL (Apple Wireless Direct Link)
AWDL är ett proprietärt Apple-tillägg till vanlig Wi-Fi som implementerar något som Wi-Fi Direct. Jag vet inte helt hur det fungerar, det finns ett speciellt sätt att annonsera och koordinera kanaler, och det fungerar bara på proprietära Apple-drivrutiner. Det vill säga bara MacBooks/iPhones kan ansluta via AWDL.
Tråkiga Android-telefonägare drömmer fortfarande bara om en korrekt fungerande Wi-Fi Direct-funktion.
Men inte så länge sedan killarna från seemoo-lab skrev en helt öppen källkodsimplementering av AWDL och kallade den Öppna Wireless Link (UGGLA). För att köra OWL måste Wi-Fi-adaptern stödja monitorläge och paketinjektion, så den körs inte på alla hårdvara. Webbplatsen har exempel på konfiguration på Raspberry pi. Detta fungerar betydligt sämre än original-AWDL, till exempel förlängs anslutningstiden med ~10 sekunder istället för ett par sekunder för originalet, men det fungerar.
Dessa killar skrev också från grunden en implementering av AirDrop-protokollet i Python, kallad OpenDrop. Den kan användas både i kombination med OWL för att starta AirDrop på Linux och med den ursprungliga AWDL på macOS.
Hur man rullar upp via AirDrop
Typisk situation med upprullning via AirDrop
Nog tråkig teori, det är dags att börja träna. Så du är beväpnad med all nödvändig utrustning och är redo att gå framåt och rulla ihop bollar med hjälp av högteknologi.
Först måste du komma ihåg huvudpunkterna:
AirDrop fungerar bara om telefonen är upplåst – det är bäst om målet ständigt tittar på telefonen. Oftast sker detta på ställen där det är tråkigt, till exempel i tunnelbanan.
Behöver tid — vanligtvis sker en positiv konvertering på den 3-5:e bilden som skickas, så du behöver minst 5 minuters tyst tid på ett ställe. Jag anser att en positiv konvertering är det ögonblick då du via AirDrop gick med på att fortsätta kommunicera i messengern. Detta är svårt att implementera i farten, eftersom det inte är direkt klart vem som accepterade din nyttolast, och troligen kommer du att värma upp innan du kan komma överens om något.
Personlig kreativ fungerar bättre — Jag kallar nyttolast det medieinnehåll som du skickar via AirDrop. Bara en bild med ett meme leder med största sannolikhet ingenstans, innehållet bör vara relevant för situationen och ha en tydlig uppmaning till handling.
Den klassiska metoden - bara en telefon
Passar alla som har en iPhone, kräver inga speciella färdigheter förutom sociala. Vi byter AirDrop till Alla-läge och går ner till tunnelbanan. En vanlig dag (före självisolering) i en tunnelbanebil i Moskva, observerade jag något i stil med detta:
Lista över mål
Som du kan se sänder nästan alla telefoner ägarens namn, genom vilket vi enkelt kan bestämma hans kön och förbereda lämplig nyttolast.
Nyttolast
Som jag skrev ovan fungerar en unik nyttolast bättre. Helst ska bilden tilltala ägaren med namn. Tidigare var jag tvungen att skulptera kreativitet med hjälp av en grafisk redigerare i anteckningsapplikationen och någon form av mobil Photoshop-stubb. Som ett resultat, när den önskade bilden ritades, var det redan nödvändigt att gå ut ur bilen.
Min vän Anya koteeq, specifikt på min begäran, skrev en Telegram-bot som genererar de nödvändiga bilderna med en bildtext i farten: @AirTrollBot. Jag tackar henne så mycket för att jag nu kan rulla bollar mycket mer tekniskt än tidigare.
Det räcker med att skicka en textrad till boten, och den genererar den i form av en bild som exakt matchar bildförhållandet för förhandsvisningen i AirDrop-fönstret. Du kan välja ett tecken i bilden genom att trycka på knapparna. Du kan också valfritt aktivera att lägga till din Telegram-inloggning till bilden i hörnet.
Nyttolastgenerator
Det värsta var att bilden visades direkt på offrets skärm utan någon åtgärd. Du behövde inte ens klicka på "acceptera". Du kunde se den omedelbara reaktionen i ansiktet från att lasta nyttolasten. Tyvärr, från och med iOS 13, visas inte längre bilder från okända kontakter på skärmen. Så här såg det ut innan:
Nyttolast levererad på iOS ≤12
Nu, istället för en förhandsgranskning, visas bara namnet på avsändarens enhet. Därför är det enda sättet att kontakta ett offer med iOS ≥13 med namn att ställa in det i inställningarna på din enhet, till exempel ring telefonen "Yulia, hej." Tips: Du kan använda emoji i enhetsnamnet. Naturligtvis är den här metoden inte lika ljus som med en bild, men den ökar avsevärt chansen att klicka på "acceptera" -knappen.
Ytterligare beskrivning av åtgärderna ligger utanför ramen för en teknisk artikel och beror bara på din fantasi, improvisation och humor. Jag kan bara säga att de som går med i det här spelet och börjar svara dig med bilder eller skickar anteckningar vanligtvis är väldigt glada, öppna och intressanta människor. De som efter att ha tittat på bilden helt enkelt inte svarar, eller ännu värre, helt enkelt avvisar budskapet, är oftast tråkiga snobbar och pruder. Rädslafaktorn spelar också ofta in: sköra, blyga människor är rädda för att interagera med en så arrogant anonym främling.
Automatisk plockmaskin
Om du är för lat för att generera och skicka nyttolaster manuellt, och du vill automatisera processen, kan du göra en automatisk röstvalsmaskin, som i bakgrunden skickar bilder via AirDrop till alla inom räckhåll. Vi kommer att använda raspberry pi zero som en hårdvaruplattform, men vilken dator som helst med Linux kommer att göra det, det viktigaste är att Wi-Fi-kortet stöder monitorläge och paketinjektion.
Högtalarsändare via Airdrop baserad på raspberry pi zero w + UPS Lite batterisköld
Det finns AirDrop flooder-program för Jailbreak iPhones, de fungerar stabilare än öppna versioner på raspberry pi
Att ställa in OWL på raspberry pi beskrivs i detalj på projektwebbplats, men jag föredrar att använda Kali Linux-bygget för Raspberry Pi Zero eftersom det redan har nexmon-patchar installerade för att aktivera Wi-Fi-monitorläge på rpi0.
Det är viktigt att komma ihåg att Airdrop (eller snarare AWDL) aktiveras för patienter först efter att ha fått ett BLE-paket. Därför måste vi skicka det med flera sekunders intervall. Detta kan göras med hjälp av verktyget py-bluetooth-utils. Med hjälp av start_le_advertising()-funktionen skickar jag datasträngen från apple blee-exemplen: 000000000000000001123412341234123400.
När du har en fungerande OWL-demon kan du starta min gaffel opendrop. Det finns ett skript i förvaret flooder.py, som skickar en bild till alla kak_dela.jpeg.
Enligt mina observationer är raspberry pi zero w instabil i monitorläge. Efter cirka 20 minuters aktiv flooder-drift kraschar Wi-Fi-undersystemet. Problemet beskrivs av författaren pwnagotchi, och orsakas förmodligen av överhettning. Det är nödvändigt att tillhandahålla en vakthund eller använda mer stabil hårdvara
Maniacello-läge - jag vet ditt nummer
Om du vill visa dig själv som en otillräcklig galning och för alltid avskräcka lusten att fortsätta kommunicera med dig, kan du försöka ta reda på telefonnumret till personen som är i närheten.
Som vi lärde oss tidigare innehåller BLE-paketen som skickas av initiatorn de första tre byten av sha256-telefonnumret. Denna hash kan fångas när offret klickar på "dela"-knappen och börjar skanna airdrop-enheter eller trycker på Wi-Fi-lösenordet för ett nytt nätverk i inmatningsfältet (på så sätt letar Apple efter vänner inom räckhåll från vilka du kan begära nätverkslösenordet).
Du måste på något sätt utlösa hashmeddelandet från offret och fånga det. Jag använder verktyg från förvaret Apple Bleee. Eftersom Bluetooth MAC-adresser för enheter är slumpmässiga och ständigt förändras, måste du hitta ett annat sätt att bestämma den önskade enheten i den här listan. Uppgiften förenklas av det faktum att iOS sänder telefonens nuvarande tillstånd som: skärm av, skärm på, låsskärm, olåst, etc. Därför, helt enkelt genom att observera offrets handlingar, kan du jämföra enhetens nuvarande tillstånd med enheten i tabellen. Det enklaste sättet är att fånga ögonblicket när användaren tar upp telefonen ur fickan, slår på skärmen och låser upp telefonen med fingret eller ansiktet. Allt detta kommer att synas i sniffern.
icon Х betyder att ett paket med telefonhaschar fångades upp.
Deras parser går ibland sönder, men oftast fungerar det. Jag kommer inte helt att återberätta kärnan i sårbarheten, eftersom den analyserades i detalj av författarna till Apple Blee, jag kommer bara att beskriva min upplevelse. Jag ska bara säga att jag använder en USB Bluetooth-adapter på ett CSR 8510-chip, eftersom det fungerar mycket mer stabilt för mig än Bluetooth-adaptern som är inbyggd i en MacBook och satts in i en virtuell maskin.
Så vi fångade hashen från offrets telefon och fick de eftertraktade tre byten från hashen på telefonnumret.
Avlyssnat BLE-paket med telefonnummer-hash med hjälp av verktyget read_ble_state.py
Vi vet att i Ryssland börjar alla mobilnummer med koden +79 och troligen har vårt offers telefon samma kod. Det visar sig att vi har en rad siffror från +79000000000 till +79999999999, ungefär en miljard nummer.
För att begränsa intervallet tar vi bara de koder som faktiskt är registrerade hos vilken operatör som helst och kasserar resten. Som ett resultat blir utbudet hälften så stort, cirka en halv miljard siffror.
Därefter genererar vi sha256 från alla nummer och sparar endast de första 3 byten från varje hash. Vi lägger in den här listan i SQLite-databasen och bygger ett index för att påskynda sökningen.
Så här ser data i databasen ut:
Alla ryska telefonnummer och de första tre byten av hashen
Sedan, med offrets hash, kan vi söka efter alla matchningar i databasen. Vanligtvis är det 15-30 matchningar per hash.
Alla siffror som matchar offrets hash
Uppenbarligen används inte alla dessa siffror faktiskt. Vi kan skära av de onödiga med hjälp av en HLR-förfrågan eller ett osynligt SMS. Av 30 nummer hittades 5 online.
Resultatet av HLR-begäran. Nätverksnummer är markerade i grönt.
Jag skulle kunna fortsätta att sålla bland siffrorna, till exempel lägga till alla i Telegram/Whatsapp och titta på avatarerna, kolla igenom databaser som Getcontact och så vidare. Men det visade sig vara lättare att bara ringa alla fem nummer ett efter ett och se när offrets telefon ringer.
Målet lokaliserat
Alla
Floodern på raspberry pi är väldigt instabil, du måste prova andra singelbrädor.
En native flooder för iOS skulle vara mycket bättre, men jag kunde inte hitta en som fungerar på iOS 12-13 även med jailbreak.
Flooder.py-skriptet är väldigt dumt. Det skulle förmodligen kunna generera en personlig bild genom att ta namnet från mottagarens enhetsnamn och klippa ut ordet iPhone.
Metoden för att fastställa ett telefonnummer kan optimeras genom att endast kontrollera det faktum att numret är kopplat till iMessage. Detta kommer med största sannolikhet att ge dig nära 100 % träfffrekvens.
Slutsats
Detta är den perfekta underhållningen för tunnelbanan. Det finns en wow-effekt, nyfikna människor är intresserade av detta. Det blev mycket improvisation, det var väldigt roliga fall. Det visar sig att många är redo att spela med och till och med avbryta sina planer för att kunna kliva av vid din tunnelbanestation och gå upp för att fika. Under året träffade jag många människor och fortsätter att kommunicera med några av dem.
Ibland stänger jag av Telegram-inloggningen och har kul så här.