Google kullanıcı telefon numaralarına kaba kuvvet saldırısı
(brutecat.com)- Google’ın No-JS kullanıcı adı kurtarma formu, telefon numarası ve görünen ad kombinasyonunu doğrulayabildiği için belirli bir Google kullanıcısının tam telefon numarasını ortaya çıkarabilen bir saldırı zinciri oluşturuldu
- Kritik nokta,
/signin/usernamerecoveryve/signin/usernamerecovery/lookuparasındaki yönlendirme farkıydı; bu sayede hesap yok durumu ile hesap var durumu ayırt edilebiliyordu - IP tabanlı istek kısıtlaması ve CAPTCHA vardı, ancak JS formundaki BotGuard token değeri No-JS formunun
bgresponsealanına konunca kısıtlama olmadan çalıştı ve buna IPv6 rotasyonu da eklendi - Saldırgan, Looker Studio üzerinden Google hesap görünen adını elde edip parola kurtarma akışındaki maskelenmiş telefon numarası ile ülkeye özgü numara biçimlerini birleştirerek adayları büyük ölçüde daraltabildi
- Saatlik 0,30 dolarlık 16 vCPU sınıfı bir sunucuda yaklaşık saniyede 40 bin doğrulama yapılabildi; Google ise 6 Haziran 2025’te No-JS kullanıcı adı kurtarma formunu tamamen kaldırdı ve toplam 5.000 dolar ödedi
No-JS kullanıcı adı kurtarma formunda başlayan açık
- Tarayıcıda JavaScript kapalıyken Google servislerinin nasıl davrandığı incelenirken, kullanıcı adı kurtarma formunun hâlâ çalıştığı fark edildi
- Hesap kurtarma formunun geçmişten beri, gizlenmiş proof-of-work JavaScript kodunun ürettiği BotGuard tabanlı savunmalara dayandığı için JavaScript gerektirdiği düşünülüyordu
- Ancak No-JS formu, kurtarma e-postasının veya telefon numarasının belirli bir görünen adla bağlantılı olup olmadığını doğrulayabilen bir akış sunuyordu
İki istekle hesap varlığını doğrulama
- İlk istekte
/signin/usernamerecoveryadresine telefon numarası gönderiliyor ve yanıttakiLocationüzerinden bu telefon numarasına bağlıessdeğeri alınıyordu- Çerezler ve
gxfdeğeri başlangıç sayfasının HTML’inden alınıyordu
- Çerezler ve
- Ardından
/signin/usernamerecovery/lookupadresineess, ad, soyad vebgresponse=js_disabledgönderiliyordu - Yanıttaki yönlendirme değiştiği için, bu telefon numarası ve görünen ada sahip bir Google hesabı olup olmadığı anlaşılabiliyordu
- Hesap yok:
usernamerecovery/noaccountsfound - Hesap var:
usernamerecovery/challenge
- Hesap yok:
IP kısıtlaması, IPv6 ve BotGuard atlatma
- İlk denemelerde birkaç isteğin ardından IP adresi istek kısıtlamasına takılıyor ve CAPTCHA gösteriliyordu
- Hollanda mobil numarası örneğinde parola kurtarma akışı
•• ••••••03gibi bir ipucu veriyordu- Hollanda mobil numaraları
06ile başladığı için kalan 6 haneyi, yani10^6 = 1,000,000adayı denemek gerekiyordu
- Hollanda mobil numaraları
- Vultr gibi sağlayıcılar
/64IPv6 aralığı veriyor; teorik olarak18,446,744,073,709,551,616adres kullanılabiliyor reqwestiçindekiClientBuilder.local_addressile alt ağdan rastgele bir IPv6 adresini her istekte ayarlayan bir PoC hazırlandı- Veri merkezi IP’siyle JS kapalı form kullanıldığında sürekli CAPTCHA çıkıyordu, ancak JS açık hesap kurtarma formunun BotGuard token değeri No-JS formunun
bgresponsealanına konunca istekler geçmeye başladı- No-JS formunda bu BotGuard token için bir istek kısıtlaması yokmuş gibi görünüyordu
Hatalı eşleşmeleri eleme
- İlk çalıştırma sonuçlarında adı
Henry, soyadı boş ve telefon numarasının son iki hanesi03olan çok sayıda hesap yer aldı - Bu durumda ad
Henryise soyad ne olursa olsunusernamerecovery/challengedönüyordu - Olası eşleşmeleri doğrulamak için aynı adla
0fasfk1AFko1wfgibi rastgele bir soyad tekrar denendi- Sonuç yine eşleşme gelirse bunun yanlış pozitif olduğu kabul edilip filtrelendi
- Aynı tam görünen ad, aynı ülke kodu ve aynı son iki numara hanesine sahip başka Google kullanıcılarının bulunma olasılığının düşük olduğu değerlendirildi
Ülke kodu ve görünen adı elde etme
- Parola kurtarma akışındaki telefon numarası maskesi, ülke kodunu tahmin etmek için kullanılabiliyordu
- Google her numara için libphonenumber içindeki national format biçimini kullanıyor
- Ülkeye göre maskelenmiş national format’lar toplanarak mask.json oluşturuldu
- Rusya, Hollanda, Birleşik Krallık ve ABD farklı maske desenlerine sahip
- Google 2023’te adı yalnızca hedefle doğrudan etkileşim olduğunda gösteren bir politikaya geçti; Nisan 2024’te ise Internal People API, kimliği doğrulanmamış hesaplar için görünen ad döndürmeyi tamamen durdurdu
- Ancak Looker Studio üzerinde bir belge oluşturulup kurbana sahiplik devredilirse, kurbanın herhangi bir etkileşimi olmadan ana ekranda görünen ad açığa çıkıyor
Aday aralığını optimize etme ve araçlar
- libphonenumber’ın numara doğrulaması kullanılarak ülkeye göre mobil önekler, bilinen alan kodları ve hane sayılarını içeren format.json üretildi
- Hollanda örneği; ülke kodu
31, alan kodları61,62,63,64,65,68ve hane sayısı[7]içeriyor
- Hollanda örneği; ülke kodu
- Gerçek zamanlı libphonenumber doğrulaması ile geçersiz numaralara yönelik Google API sorguları azaltıldı
- BotGuard token üretmek için chromedp kullanan bir Go betiği yazıldı
http://localhost:7912/api/generate_bgtokençağrısıylabgTokenalınabiliyor
- Tüm saldırı akışı üç aşamadan oluşuyordu
- Looker Studio ile Google hesap görünen adını sızdırma
- Parola kurtarma akışından maskelenmiş telefon numarasını alma
- Görünen ad ve maskelenmiş telefon numarasıyla
gpbkullanarak tam telefon numarasına kaba kuvvet uygulama
Kaba kuvvet performansı ve tahmini süre
- Saatlik 0,30 dolarlık sunucuda ve tüketici sınıfı 16 vCPU yapılandırmasında yaklaşık saniyede 40 bin doğrulama yapılabildi
- Parola kurtarma akışında yalnızca son iki hane verildiğinde tahmini süreler:
- ABD
+1: 20 dakika - Birleşik Krallık
+44: 4 dakika - Hollanda
+31: 15 saniye - Singapur
+65: 5 saniye
- ABD
- PayPal gibi diğer servislerin parola sıfırlama akışları daha fazla rakam ipucu verirse süre ciddi biçimde kısalabiliyor
- Örnek:
+14•••••1779
- Örnek:
Google’a bildirim ve aksiyon zaman çizelgesi
- 2025-04-14: Rapor üreticiye gönderildi
- 2025-04-15: Üretici raporu aldı ve sınıflandırdı
- 2025-04-25: “Nice catch!” yanıtı verildi
- 2025-05-15: Panel, 1.337 dolar + swag ödül belirledi
- Gerekçe olarak kötüye kullanım olasılığının düşük görülmesi gösterildi ve konu, etkisi yüksek kötüye kullanım odaklı metodoloji olarak kabul edildi
- 2025-05-15: Ödül gerekçesine itiraz edildi
- Abuse VRP tablosuna göre probability/exploitability, saldırı ön koşulları ve kurbanın kötüye kullanımı fark edip edemeyeceğine göre belirleniyor
- Bu saldırıda ön koşul olmadığı ve kurbanın kötüye kullanımı fark edemeyeceği belirtildi
- 2025-05-22: Panel ek 3.663 dolar ödeyerek toplam ödülü 5.000 dolar olarak güncelledi
- Likelihood seviyesi medium’a yükseltildi
- 2025-05-22: Üretici, dünya çapındaki endpoint kaldırımı tamamlanana kadar geçerli olacak azaltma önlemlerini devreye aldığını doğruladı
- 2025-05-22: 2025-06-09 açıklama tarihi üzerinde uzlaşıldı
- 2025-06-06: Üretici, No-JS kullanıcı adı kurtarma formunun tamamen kaldırıldığını doğruladı
- 2025-06-09: Rapor yayımlandı
Henüz yorum yok.