3 puan yazan GN⁺ 2023-07-14 | 1 yorum | WhatsApp'ta paylaş
  • macOS’un varsayılan yerel ana makine adı kullanıcı adını içerebildiğinden, web siteleri izin almadan mDNS ad çözümleme sürelerindeki farkları kullanarak ad adaylarını daraltabilir
  • Saldırganlar ülke ve cinsiyete göre en popüler 50 adı cihaz adı adaylarıyla birleştirir; deneylerde macOS kullanıcılarının adını ortalama vakaların %65’inde doğru tahmin etti
  • Tarayıcı JavaScript’i rastgele UDP soketi açamaz, ancak fetch, iframe, Image, WebRTC istekleriyle .local adreslerinin yanıt gecikmelerini karşılaştırabilir
  • Saat dilimi, dil, IP konumu, Safari’nin navigator.language değeri, ekran çözünürlüğü ve screen.isExtended gibi bilgiler yerel ayar ve cihaz modeli adaylarını azaltmak için kullanılır
  • Pratikliği düşük ve geliştirici araçlarındaki ağ sekmesinde kolayca fark edilebilir; ancak aynı mDNS keşif yöntemi yazıcı, akıllı TV, akıllı hoparlör ve IoT cihazlarını tespit etmek için de kullanılabilir

macOS yerel ana makine adında adın sızmasına yol açan yapı

  • macOS kullanıcılarının gerçek adı, izin istemeden tarayıcıdan tahmin edilebilir; bunun temelinde mDNS protokolü ve varsayılan yerel ana makine adı biçimi vardır
  • Belirli bir ülkedeki cinsiyete göre en popüler 50 ad listesini kullanmak bile macOS kullanıcılarının adını ortalama vakaların %65’inde doğru tespit eder
  • Fingerprint bu tekniği ürününde kullanmaz ve siteler arası izleme hizmeti de sunmaz
  • Kamuya açık tartışmanın amacı, tarayıcı sağlayıcılarının bu tür teknikleri hızla düzeltmesine yardımcı olmaktır

mDNS ve Apple Bonjour nasıl çalışır?

  • multicast DNS, yerel ağda cihaz adlarını kaydetmek, keşfetmek ve yayınlamak için kullanılan bir protokoldür
  • Yazıcı gibi cihazlar, ayrılmış dahili IP 224.0.0.251 adresine UDP kayıt paketleri gönderir ve HP_LaserJet_Printer.local gibi ana makine adları içerebilir
  • .local üst seviye alan adı, ilgili ana makine adının mDNS ile çözümlenmesi gerektiğini belirtir
  • Yönlendirici bu paketleri yerel ağdaki diğer cihazlara otomatik olarak yayınlayarak ana makine adlarının önbelleğe alınmasını sağlar
  • Cihazlar, aynı ayrılmış IP’ye sorgu paketleri göndererek ağda bulunabilecek belirli adlı cihazları arar
  • Örnek ana makine adları şöyledir
    • johns-mac-mini.local
    • david-ZenBook-UX431DA-UM431DA.local
    • james-iphone.local
    • canon-mf644c.local
    • bedroom-appletv.local
    • dlinkrouter.local
  • Apple cihazlarında mDNS, Apple Bonjour özelliğinin bir parçası olarak yaygın biçimde kullanılır
  • Varsayılan yerel ana makine adında kullanıcı adı görünebilir; macOS’ta yerel ana makine adı System Settings > Sharing bölümünden kontrol edilebilir veya değiştirilebilir

Tarayıcıdan mDNS ana makine adlarını kontrol etmenin dolaylı yolu

  • mDNS, UDP paketlerine dayalı olduğundan tarayıcı JavaScript ortamında rastgele UDP soketleriyle doğrudan kullanılamaz
  • Bunun yerine, tarayıcının URL’deki ana makine adını çözümlemeye çalışma özelliğinden yararlanılarak bir zamanlama saldırısı yapılır
  • Kavram kanıtı, var olan device-1.local ve var olmayan device-2.local adreslerine sıradan fetch GET istekleri gönderme yöntemini kullanır
  • Adres çözümlenirse tarayıcı 80 numaralı porta TCP paketi gönderir; bu portun çoğu durumda kapalı olması muhtemeldir
  • Ağ düzeyinde farklı hatalar görülür
    • Var olan device-1.local: ERR_CONNECTION_REFUSED
    • Var olmayan device-2.local: ERR_NAME_NOT_RESOLVED
  • JavaScript’te iki hata da aynı Failed to fetch hatasına eşlendiğinden hata türünün kendisine güvenilemez
  • Yerel ağ hızlı olduğu için geçerli bir mDNS ana makine adı, varsayılan bağlantı zaman aşımından çok daha hızlı çözümlenir
  • Örnekte geçerli adres 4 ms, geçersiz adres ise 5 saniye olarak ayrışır
  • Bu yaklaşım kavram kanıtı için yeterince tutarlıdır ve başlıca tarayıcılarda benzer şekilde çalışır
  • Pratikte fetch dışında iframe, Image, WebRTC gibi ağ JavaScript API’leriyle de DNS çözümleme zamanlama saldırısı yapılabilir

macOS kullanıcı adını kaba kuvvetle bulma yöntemi

  • Varsayılan macOS yerel ana makine adı kullanıcı adını ve cihaz adını içerir; biçim sistem dili yerel ayarına göre değişir
    • English: <name>s-macbook-pro.local
    • French: macbook-air-de-<name>.local
    • Russian: mac-mini-<name>.local
  • Basit bir yaklaşımla en popüler 1.000 ad, en popüler 10 yerel ayar ve yaygın 5 macOS cihaz adı birleştirilirse 50.000 ana makine adının kontrol edilmesi gerekir
  • Bu durumda tam tarama 1 saatten uzun sürebilir
  • Daha verimli strateji, arama kapsamını tek bir yerel ayar, tek bir cihaz ve o yerel ayarda yaygın 50 adla sınırlamaktır
  • Kapsam daraltıldığında doğruluk düşer, ancak saldırı süresi azalır ve daha gerçekçi bir senaryo ortaya çıkar
  • Yerel ayar seçimi için tarayıcı saat dilimi, dil ve IP adresi konumu kullanılabilir
  • Safari, sistem yerel ayarını navigator.language özelliğiyle açığa çıkarır; bu değer genellikle hedef ana makine adı yerel ayarıyla eşleşir
  • Kullanıcının ülkesini bulmak için başka bir dolaylı yöntem olarak daha önce ele alınan Apple ID region detection yöntemi vardır
  • Cihaz adayları ekran çözünürlüğüyle daraltılabilir
    • Örneğin 1728x1117 çözünürlüğünün 16 inç MacBook Pro olma olasılığı yüksektir
    • Harici ekran screen.isExtended özelliğiyle tespit edilebilir
    • Harici ekran algılanırsa cihaz adayları en yaygın 3–5 Apple macOS cihazına geri döndürülebilir

Sınırlamalar ve diğer olası kullanımlar

  • Bu saldırı, yapısal zayıflıkları ve çeşitli sınırlamaları nedeniyle pratik değildir
  • Bir web sitesi işletmecisi ziyaretçileri kasıtlı olarak anonimlikten çıkarmak istemiyorsa, tarayıcı geliştirici araçlarının ağ sekmesinde kolayca tespit edilebilir
  • Bu yöntem installed applications detection ile birleştirildiğinde, izin almadan kullanıcının gerçek adını ve kullandığı profesyonel uygulamalar listesine dayalı unvanını gösteren zararlı bir web sitesi oluşturma olasılığı vardır
  • macOS çalıştıran Apple cihazları ana örnek olsa da mDNS keşif tekniği çeşitli şekillerde genişletilebilir
  • Yerel ağ taramasıyla yazıcıları, akıllı TV’leri, akıllı hoparlörleri ve diğer ev tipi IoT cihazlarını tespit etmek için de kullanılabilir
  • iPhone ve iPad’lere de uygulanabilir; bunun koşulu Wi-Fi eşzamanlama veya Safari uzaktan hata ayıklama özelliğinin etkin olmasıdır

1 yorum

 
GN⁺ 2023-07-14
Hacker News görüşleri
  • macOS’te Little Snitch kullanıyorum; ağ isteklerine izin vermeden önce yerel kullanıcıya açıkça sormak üzere ayarlanabilen iyi bir arayüzü var
    https://www.obdev.at/products/littlesnitch/index.html
    Uzaktan oturum açmışken ara sıra yakalanıyorum; genelde SSH oturumu, NPM’den NodeJS bileşenleri almak gibi yeni bir şey indirmeye çalıştığında oluyor. Metin terminalindeki SSH indirmesi duruyor; sebebin Little Snitch olduğunu anlayınca alt kattaki masama gidip fareyi oynatarak monitörü uyandırmam, ekran koruyucuyu açmam ve Little Snitch iletişim kutusunda “Allow” düğmesine basmam gerekiyor
    Yani amaçlandığı gibi çalışıyor. Yalnız bu tür araçlar çoğu zaman yerel ağ isteklerine varsayılan olarak sessizce izin verecek şekilde ayarlandığından, asıl yazıdaki numaranın benim ortamımda da işe yarayıp yaramayacağını bilmiyorum

    • Benim açımdan tarayıcıda yalnızca belirli ana makine adlarına izin verecek şekilde LittleSnitch ayarlamak hayal etmesi zor bir şey. “53/80/443’e giden tüm trafiğe izin ver” kuralım var; aksi halde çoğu web sitesi yüzlerce LittleSnitch açılır penceresi çıkarırdı
    • Jailbreak yapılmış iPhone’da NetFence kullanıyorum
      Uygulamaların gizlice hangi soket bağlantılarını açtığını görmek şaşırtıcı; buna banka uygulamaları da dahil
      https://havoc.app/package/netfence
    • Ancak Little Snitch engellerken bile IP sızıyor :(
      https://news.ycombinator.com/item?id=35363343
    • Linux’ta benzer bir yazılım olan OpenSnitch’i denedim. Tuhaf bir şey yakalayamadı ama temel işler genelinde epey can sıkıcı hale getirdi
    • Not olarak, DNS çözümlemesi bağlantıya izin ver/engelle açılır penceresinden önce gerçekleşir. Örneğin www.example.com 1.1.1.1’e çözümlenir, ancak Confirm düğmesine basana kadar 1.1.1.1’e gerçek bir bağlantı kurulmaz
      Ağınıza Pi-hole eklerseniz harcadığınız zamandan/paradan/yatırımdan pişman olmazsınız
  • Daha geniş internetteki web sitelerinin yerel ağıma ağ isteği yapmasını engellemenin bir yolu var mı? Bunun neden varsayılan olarak izinli olması gerektiğini hayal etmek zor
    IE’nin Local Intranet Zone izinlerini geri getirelim demiyorum

    • Genel olarak CORS yüzünden bunu yapamazlar. Bu “hack”in çalışmasının tek nedeni, çözümlenemeyen alan adı istekleri ile çözümlenmiş ama reddedilen istekler arasında ret zamanlamasının farklı olması
      Ama https://192.168.2.1 üzerinde bir şey çalıştırıyor olsanız bile, 192.168.2.1’deki servis Origin olarak my-own-domain.com’a izin vermediği sürece https://my-own-domain.com üzerinde çalışan web uygulaması ona erişemez
    • Brave yakın zamanda yerel ağ erişimi için izin isteme özelliği ekledi
      https://brave.com/privacy-updates/27-localhost-permission/
      HN yazısı: https://news.ycombinator.com/item?id=36574775
    • Bu yöntemi sıkça kötüye kullanan bir uygulama Discord masaüstü uygulaması; yerel bir port açıp dinlemede bırakıyor
      Tarayıcı bir Discord kanal davet sayfasına gittiğinde, bu port üzerinden localhost’a istek gönderip kanal ID’sini istemciye iletiyor. Böylece uygulama yerel “Join Channel” deneyimini gösterebiliyor
      Gizli modda da çalıştığını ve tarayıcı Discord’dan çıkış yapmış durumdayken bile bu davranışın sürdüğünü görünce fark ettim. İyi değil. Masaüstü dünyasında tüm uygulamaların sandbox’lanmasının ciddi biçimde iyileştirilmesi gerekiyor
    • uBlock Origin statik filtresiyle engellenebilir:
      ||local^$all
      Bu, .local’ın kendisinden gelen istekler dahil .local’a giden tüm istekleri engeller. Web sunucusu çalıştırmak gibi nedenlerle foo.local’ın kendi kendisiyle iletişim kurmasına izin vermek istiyorsanız her alan adı için ek istisna gerekir:
      @@||foo.local^$domain=foo.local,all
      Ya da .local’ın tamamına güvenip herhangi bir foo.local’ın herhangi bir bar.local ile iletişim kurmasına izin vermek istiyorsanız .local’ın tamamı için tek bir istisna ekleyebilirsiniz:
      @@||local^$domain=local,all
    • Karışıklığı önlemek için: Bu, internet sunucusunun yerel ağa istek göndermesi sorunu değil; yerel web tarayıcısının o isteği göndermesi sorunu. Elbette tarayıcıda çalışan JavaScript internet sunucusundan yüklenmiş olabilir
  • Zaman geçtikçe interneti çoğunlukla bir Qubes makinesinde, tek kullanımlık Whonix/Tor VM içinde, JavaScript kapalıyken kullanmak daha içime siniyor
    Bu gerçekten iğrenç. Şaşırtıcı değil ama bunun mümkün olması bile birçok açıdan korkunç
    fingerprint.com’u bilmiyorsanız, “derin kullanıcı profillemesi” yapıyorlar. Bilgisayar, tarayıcı ve işletim sistemi farklı olsa bile aynı kullanıcı kimliğini koruyabiliyorlar diye düşünebilirsiniz. Ana sayfada bir demo var; ne kadar isabetli tahmin ettiği biraz ürkütücü

    • Farklı VPN IP’lerinde bile aynı cihaz olduğunu tamamen tanıyor. Gerçekten ürkütücü
    • Bu iğrenç. Standart bir iPhone’un gizli modunda iki IP değiştirsem bile bunu başarması etkileyici; üstelik diğer iPhone’larla aynı görünüyor olmalı
      Demoyu bozan uBlock Origin filtresi:
      ||fpjscdn.net
  • Benzer türde bir zamanlama saldırısıyla tarayıcıdan yerel makine ve yerel ağdaki diğer cihazlar üzerinde port taraması yapılabiliyor
    https://github.com/Flu1dTeam/PortScanner
    eBay’in geçmişte bunu yaparken yakalandığı olmuştu
    https://blog.nem.ec/2020/05/24/ebay-port-scanning/

    • Ne yani, bu bayağı ürkütücü; şimdiye kadar nasıl duymamışım?
  • Cihaz adını her zaman değiştirmiş olmam iyi olmuş
    Apple’ın varsayılan adlandırması bir gizlilik hatası. Bir zamanlar kolluk kuvvetlerinde çalışan biriyle ilk randevuya çıkmıştım; tek başına gelen bir kadındı ve kendini korumaya açıkça önem veren biriydi. Benim hakkımda geçmiş araştırması yaptığını ve çevresindeki topluluktan birkaç kişiye de konumumuzu bildirdiğini söylemişti
    Buna karşılık ben onun soyadını bile bilmiyordum ve bunu şaka konusu yaptım. Akşam yemeğinden sonra arabaya bindiğimizde, gösterge paneli ekranında iPhone’un otomatik eşleştiği göründü; iPhone adı da kişinin adı ve soyadıydı, bu ilgimi çekti. Bunu ona söylemedim; yolculuğun sonuna kadar adını nasıl bildiğimi tahmin etmesini istedim

    • Kiralık araçlarda daha önce eşleştirilmiş onlarca telefon profilinin kalmış olması ve bunlara telefon rehberi, kayıtlı harita konumları, geçmiş gibi şeylerin bağlı olması gerçekten çok yaygın. Elbette pek işe yarar bilgiler değiller ama fazla düşünmeden bilgi sızmış oluyor
      Sorun şu ki, aracı iade etmeden önce kendi profilimi silmem gerektiğini kendime hatırlatmak en zor kısmı
  • Yukarıdaki örnekte geçerli adres 4 milisaniye, geçersiz adres ise 5 saniye sürüyor
    Bu şaşırtıcı. DNS sorgusu başarısızlığının, başarılı bir DNS sorgusundan sonra gelen varsayılan bağlantı zaman aşımından çok daha hızlı olmasını beklerdim
    Yine de s-mac-xxxx bana hep biraz tuhaf bir tercih gibi gelmişti. Özellikle gizliliği büyük bir satış noktası olarak öne çıkaran bir şirket olduğu düşünülürse daha da öyle. Gerçek adın kullanılmayacağını ummuş olabilirler ya da burada “kullanıcı dostluğu” öncelik kazanmış olabilir. Gizlilik açısından Windows’un rastgele üretilmiş ana makine adları daha iyi

    • Normal DNS, tek bir IP’deki tek bir sunucuya evet/hayır yanıtı sorar; mDNS ise multicast olduğu için herhangi bir sunucu yetkili şekilde “hayır” diyemez†. Sunucu yanıt vermeyip sorgu zaman aşımına uğradığında ancak kaydın olmadığını anlayabilirsiniz
      † Kesin konuşursak tamamen doğru değil. Bir cihaz o adın kendisine ait olduğunu biliyorsa hayır diyebilir
    • Kullanıcının gerçek adının ana makine adına girmesinin nedeni muhtemelen AirDrop olabilir. Sistem, Personal Hotspot veya AirDrop gibi işlevlerde ana makine adını kullanıyor gibi görünüyor; başka tür bir ad, dosya paylaşırken geniş çaplı karışıklığa yol açabilir
    • Varsayılan bağlantı zaman aşımı kısmına ek olarak, burada connection refused, yani RST alınmış olması ve bunun bir bağlantı zaman aşımı olmaması da var
  • Yazı iyi yazılmış ve ilginç. Özellikle “doğasında bulunan zayıflıklar ve birçok sınırlama düşünüldüğünde bu saldırı pratik değil” gibi abartısız tonu hoşuma gitti

    • Başka bir evrende bunun adı “FINGERBleed” olurdu; havalı bir web sitesi ve logosu da olurdu
    • Emin değilim
      Bu yöntem, ağda belirli bir ana makine adının var olup olmadığını test etmeyi sağlıyor
      Tek bir benzersiz ana makine adıysa büyük sorun olmayabilir; peki IoT dünyasında yaygın olan sabit ana makine adları veya varsayılan ana makine adları ne olacak?
      Bir web sitesi, kullanıcının belirli bir cihaza sahip olup olmadığını gizlice tahmin edebilir hale geliyor. Hedefli saldırılarda kullanılırsa daha da kötü. Ağdaki bazı cihazları biliyorsanız, bağlanan kullanıcının hedef ağın içinde olup olmadığını tahmin edebilirsiniz
  • JavaScript’i kapatmak, son kullanıcı deneyimini de kapatmasaydı keşke

    • JavaScript’i küresel olarak devre dışı bırakmamamın tek nedeni bu
      Yine de gizlilik endişeleri yüzünden ileride varsayılan olarak kapalı tutmak zorunda kalacakmışım gibi geliyor
    • JavaScript motorunun yapabildiklerini güçlü şekilde sınırlamanın bir yolu yok mu?
  • Neyse ki benim cihaz adlarım genelde “xxxs's MacBook Pro (34)” gibi oluyor. Bu bir bug değil, özellik

    • Dizüstünün kullanıcı adını user, ana makine adını hostname olarak ayarlayalım. Bunu ne kadar çok kişi yaparsa o kadar iyi
  • İlginç, yazı da iyi yazılmış ve düzgün bir kavram kanıtı da var. İyi iş çıkarmışlar
    Eğlenceli bir karşı önlem olarak cihazın ana makine adını atemptingurl.local gibi bir şeye değiştirip saldırganın o web sitesini ziyaret etmek istemesini sağlayabilirsiniz. O sayfa aynı tekniği saldırgana uygulayacak şekilde özenle hazırlanır ve şöyle bir mesaj döndürür:
    “Merhaba [hacker’ın cihaz adı]! Makine bilgileriniz, IP adresiniz, coğrafi konumunuz ve diğer parmak izi bilgileriniz toplanarak [korkutucu siber kurum adı ekleyin] kurumuna bildirilmiştir.” Deneyimli bir uzman olup script kiddie olmasa bile en azından güldürebilir
    İnsanların gülmek için daha fazla sebebe ihtiyacı var :-)

    • Bunu yapmak için CORS’a tamamen izin veren bir HTTP sunucusu çalıştırmanız gerekir. Bu da sizi seçtiğiniz HTTP sunucusundaki tüm hatalara açık hale getirir, yani kendi güvenliğinizi de düşürür