10 puan yazan outsideris 2021-04-07 | Henüz yorum yok. | WhatsApp'ta paylaş
  1. sınıf bir öğrencinin Covid döneminde boş zamanı olunca bug bounty avına çıkıp GitHub'un private pages açığından 35.000 dolar ödül almasının hikayesi.

Bunu GitHub'un private pages hata ödül programına bildirdi ve iki CTF bonusu vardı.

  • 10.000 dolar: Kullanıcı etkileşimi olmadan flag.private-org.github.io adresinden bayrağı okumak. private-org organizasyonu dışındaki bir hesaptan bu bayrak okunabilirse ek 5.000 dolarlık bonus var.

  • 5.000 dolar: Kullanıcı etkileşimiyle flag.private-org.github.io adresinden bayrağı okumak.

Kimlik doğrulama akışı

GitHub Pages ayrı bir github.io alan adında barındırıldığı için github.com kimlik doğrulama çerezleri private pages sunucusuna gönderilmez. Bu yüzden private page kimlik doğrulaması, github.com ile ek entegrasyon olmadan kullanıcının kimliğini anlayamaz. Bu nedenle GitHub özel bir kimlik doğrulama akışı oluşturdu.

  • Private page ziyaret edildiğinde sunucu __Host-gh_pages_token çerezinin varlığını kontrol eder.

  • Çerez yoksa ya da geçersizse private page sunucusu https://github.com/login adresine yönlendirir.

  • Bu yönlendirme ayrıca __Host-gh_pages_session çerezine bir nonce da yazar.

    • Bu çerez __Host- çerez önekini kullandığı için host alan adı dışındaki yerlerden JavaScript ile ayarlanmasını engeller.
  • /login, /pages/auth?nonce=&page_id=&path= adresine yönlendirir.

  • Burada token parametresinden https://pages-auth.github.com/redirect adresine iletilecek geçici bir kimlik doğrulama çerezi üretilir.

  • /redirect, https://repo.org.github.io/__/auth adresine yönlendirir.

  • Bu son uç nokta repo.org.github.io alan adında kimlik doğrulama çerezleri olan __Host-gh_pages_token ve __Host-gh_pages_id değerlerini ayarlar.

  • Burada daha önce ayarlanan __Host-gh_pages_session içindeki nonce da kontrol edilir.

Orijinal istek yolu ve sayfa kimliği sırasıyla path, page_id sorgu parametrelerinde saklanır; nonce da nonce parametresinde tutulur.

İstismar

CRLF dönüşü

  • İlk zafiyet https://repo.org.github.io/__/auth içindeki page_id parametresinde CRLF enjeksiyonuydu.

  • page_id ayrıştırmasının boşluk karakterlerini yok saydığını ve bu değerin doğrudan Set-Cookie başlığı olarak yazıldığını fark etti.

  • Geleneksel CRLF enjeksiyonuyla ayrıştırmayı bozmak mümkün ama başka bir etkisi yok.

  • Location: başlığı Set-Cookie başlığından sonra eklendiği için, 302 yönlendirmesi olmasına rağmen Location başlığı yok sayılıyor ve gövde işleniyor.

Saldırı

  • GitHub Enterprise koduna bakarak private page sunucusunun openresty nginx ile uygulandığını öğrendi.

  • Null byte ekleyerek XSS elde etti. Bu null byte gövdenin başında olmak zorunda olduğundan header enjeksiyonu saldırısı yapılamıyor.

  • Böylece private page alan adında rastgele JavaScript kodu çalıştırabilir hale geldi.

  • Artık geriye nonce'u atlatmanın bir yolunu bulmak kalmıştı.

nonce'u atlatma

  • Gözlemler sonucunda aynı organizasyondaki sibling private page'lerin birbirleri için çerez ayarlayabildiğini keşfetti.

  • private-org.github.io üzerinde ayarlanan çerezler private-page.private-org.github.io adresine de gönderiliyor.

  • __Host- önek koruması aşılabilirse nonce'u atlatmak kolay.

  • Bunu tüm tarayıcılar desteklemiyor; örneğin IE __Host- önekini desteklemiyor.

  • Ama daha iyi bir yol ararken ilginç bir fikir buldu.

  • Çerezlerin büyük/küçük harfleri nasıl işlediğini kontrol ettiğinde __HOST ile __Host değerlerinin farklı ele alındığını, GitHub private pages'in ise çerez ayrıştırırken büyük harfleri yok saydığını fark etti.

  • Böylece JavaScript ile nonce belirleyebilir hale geldi.

  • Bunun için 5.000 dolarlık bonus aldı.

Önbellek kirletme

  • /__/auth? uç noktasının yanıtı, sahte page_id değerinin tamsayı kısmına göre önbelleğe alınıyor.

  • Bu sayede XSS payload'ı ile önbellek kirletme başarılırsa etkileşime girmemiş kullanıcılar da etkileniyor.

  • Saldırgan unprivileged.org.github.io hedefine saldırıp kimlik doğrulamayı kirletirse XSS payload'ı önbelleğe alınıyor.

  • Çerezler üst alan adı olan org.github.io üzerinde paylaşıldığı için saldırgan privileged.org.github.io hedefine de saldırabiliyor.

Herkese açık private page'ler

  • 15.000 dolarlık bonusu alabilmek için organizasyona ait olmayan bir kullanıcının bu saldırıyı yapabilmesi gerekiyordu.

  • Bu saldırı, public depoda private pages ayarlayan hatalı bir yapılandırma üzerinden yapılabiliyordu.

    • Yani private depoda Pages oluşturup daha sonra depoyu public yapma durumu.
  • Bu hatalı yapılandırılmış private page, tüm kullanıcıları kimlik doğrulama akışına sokuyor ve organizasyon dışındaki kullanıcılara okuma yetkisi veriyordu.

Henüz yorum yok.

Henüz yorum yok.