GitHub private pages hata ödülüyle 35.000 dolar kazanmak
(robertchen.cc)- 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.ioadresinden bayrağı okumak.private-orgorganizasyonu 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.ioadresinden 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/loginadresine 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.
- Bu çerez
-
/login,/pages/auth?nonce=&page_id=&path=adresine yönlendirir. -
Burada
tokenparametresindenhttps://pages-auth.github.com/redirectadresine iletilecek geçici bir kimlik doğrulama çerezi üretilir. -
/redirect,https://repo.org.github.io/__/authadresine yönlendirir. -
Bu son uç nokta
repo.org.github.ioalan adında kimlik doğrulama çerezleri olan__Host-gh_pages_tokenve__Host-gh_pages_iddeğerlerini ayarlar. -
Burada daha önce ayarlanan
__Host-gh_pages_sessioniçindekinonceda 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/__/authiçindekipage_idparametresinde CRLF enjeksiyonuydu. -
page_idayrıştırmasının boşluk karakterlerini yok saydığını ve bu değerin doğrudanSet-Cookiebaş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-Cookiebaş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 çerezlerprivate-page.private-org.github.ioadresine 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
__HOSTile__Hostdeğ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ı, sahtepage_iddeğ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.iohedefine 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ırganprivileged.org.github.iohedefine 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.