Neler Yeni

Moddle RCE Code Injection

Katılım
22 Nis 2020
Mesajlar
86
Tepkime puanı
23
Puanları
150
code_injection_moodle.png


Moodle, öğretmenlerin ve öğrencilerin ders etkinliklerini dijital olarak yönetmelerine ve genellikle büyük üniversiteler tarafından kullanılan öğrenme materyallerini paylaşmalarına olanak sağlayan fazla kullanıcısı olan, yaygın olarak kullanılan açık kaynaklı bir e-Öğrenim yazılımıdır. Bu yazıda, RIPS Kod Analizi tarafından tespit edilen önceki Moodle sürümündeki teknik özelliklerini inceleyeceğiz. Bu Moodle Sınav bileşeninde bulunur ve gerçekleştirmek için öğretmen rolü ile istismar edilebilir. Moodle lt;3.5.0 kullanıyorsanız, bu açığın sömürülmesini engellemek için hemen en güncellemelisiniz.


Etkisi - Kim neyi kullanabilir?


Açıktan yararlanmak isteyen kişi, varsayılan konfigürasyonlarla çalışan en son Moodle‘da (3.5.0‘dan önceki) bir kursta kendisine “öğretmen” rolü atanmalıdır. Bu role XSS gibi başka bir güvenlik açığı aracılığıyla erişmek de mümkün olabilir. Bu gereksinimler ve güvenlik açığı bilgisi göz önüne alındığında, Moodle‘ı çalıştıran sunucunun temel işletim sistemi üzerinde rasgele komutlar çalıştırabilir. Saldırı yapacak kişi, Moodle tarafından değerlendirilen özel hazırlanmış bir matematik formülü kullanarak, kötü niyetli komutların yürütülmesini engelleyen dahili bir güvenlik mekanizmasını atlar.



Sınav Bileşeninde ki Matematik Formülleri

Moodle, öğretmenlerin birçok soru türüyle bir test hazırlamasına izin verir. Bunların arasında öğretmenlerin, Moodle tarafından rastgele girdi değişkenleri üzerinde dinamik olarak değerlendirilecek olan matematiksel bir formüle girmelerini sağlayan hesaplanmış sorular vardır. Bu, öğrencilerin kopya çekmelerini ve cevaplarının başkası ile paylaşmalarını önler. Örneğin, öğretmen {y}, {x} ‘e nasıl eklenir? diye sorduğunda, cevap olarak {x} + {y} formulünü gösterir. Moodle daha sonra iki rastgele sayı üretir ve bunları soru ve cevap metnine {x} ve {y} yer tutucuları için ekler. Örneğin (3.9 + 2.1). Sonunda, rastgele PHP kodunun yürütülmesine izin verdiği için kötü niyetli potansiyeli ile bilinen formül girdisi üzerinde, güvenlik açısından hassas PHP işlevini eval() olarak adlandırmak suretiyle cevabı 6.0 değerlendirir.


bug1.png


Sadece zararsız PHP kodunun kullanımını uygulamak için Moodle geliştiricileri, öğretmen tarafından sağlanan formülde yasadışı ve kötü amaçlı kod tespit etme niyetiyle tehlikeli eval() çağrısından önce çağrılan qtype_calculated_fınd_formula_errors() doğrulayıcı işlevi tanıttı.

bug2.png



Yukarıdaki kaynak kodunda gördüğünüz gibi,1939. satırda preg_match (),formülde görüldüğü üzere -+/*% gt;: ^ ~ lt;? = |!. 0-9eE dışında herhangi bir karakter izin vermez. Bununla birlikte, 1927 satırında bir süre döngüsü içine yerleştirilmiş olan önceki bir str_replace (), tekrarlayan bir 1 için {x} ‘e benzer formüldeki tüm placeholder’ların yerini alacak. Placeholder adlarının, {system(ls)} gibi geçerli bir placeholder olduğu ve aynı zamanda satırdaki 1 ile değiştirileceği göz önüne alındığında, karakter kümesinde sınırlı olduğunu gösterir. Bu durum zayıflığa işaret eder çünkü potansiyel olarak zararlı tüm karakterleri, fonksiyon geçerli bir formül belirterek yanlış döndürmeden önce, preg_match () işlevini koruma altına alır. Kötü amaçlı kodları gizlemek için bu tekniği kullanmak, placeholder lar ile birlikte birleştirilebilir bir güvenlik açığı ortaya çıkar.


bug3.png


İlk kötü amaçlı formül, onaylayıcı kodu olan qtype_calculated_find_formula_errors () tarafından reddedilir. Bir placeholders yaparsak ve ikinci veri yükünde görüldüğü gibi küme parantezlerine koyarsak, validator kodu saldırımızı tespit etmeyecektir ancak Moodle, değerlendiriciye ulaşmadan önce placeholder rastgele bir sayı 1.2 ile değiştirecektir. Bununla birlikte, başka bir placeholder’i tanıtır ve onu zaten sahip olduğumuzun içine yerleştirirsek, Moodle yalnızca iç placeholder’ı değiştirir ve üçüncü satırında görüldüğü gibi eval() değerine ulaşır. Tam bu noktada, eval() girişinin geçersiz PHP kodu olması nedeniyle oluşturduğumuz payload bir PHP sözdizimi hatası atacaktır.
Bu nedenle, PHP sözdizimini düzeltmek zorundayız, bu da son olarak GET parametresi 0 ile kod yürütülmesine izin veren dördüncü satırdaki son geçerli formülümüzle sonuçlanır.

Yetersiz Yamalara Adaptasyon

Konu Moodle‘a bildirdikten sonra yamalar yayınlandı fakat oluşan yamalar da yeterli olmadı ve bu yamaların da yetersizlikleri ortaya çıktı

İlk yama: Blacklist

Moodle geliştiricileri tarafından önerilen ilk yama, istismarın taşıma yükünde kullanılan PHP yorumlarını içeren formülleri reddetme fikrine dayanıyordu. Kodda görebileceğiniz gibi, yama formülün belirli dizeler içerip içermediğini kontrol eden bir foreach döngüsü hazırladı.

bug4.png


Bu yama, exploitimize kullanılan PHP yorumlarını “ //, /* , #” başlatan dizeleri algılar qtype_calculated_fınd_formula_errors() hatası ile, doğrulayıcı işlevi olarak işe yaramaz hale getirir. Bu yamada blacklist yaklaşımı uygulandı ama yama yeterli gelmedi ve basit şekilde oluşturulan bu yama bu yapının sömürülmesini engelleyemedi.


bug5.png


İkinci Yama: İç İçe Placeholder’ları Reddetmek


İkinci yama, placeholder’ları tespit ederken “recursion(özyineleme)” i kaldırarak, yükümüzde kullanılan iç içe olan placeholder’ları önlemekti. Ancak yine de, uygulamayı RIPS ile yeniden taramak, aşağıdaki yeni kod çizgilerine daha kesin bir şekilde bakmamıza neden olan aynı güvenlik açığını oluşturdu.

bug6.png


İç içe geçmiş bir placeholder’ı {a{b}} girdisi girilirse, qtype_calculated_find_formula_errors () yöntemi şimdi yalnızca {b} ‘yi placeholder olarak değiştirir ve artık formül olan {a1} geçersiz kabul edilir. Bununla birlikte, formülümüzü {b} {a1} {a {b}} olarak değiştirirsek, tam olarak iki yer tutucu {b} ve {a1}, find_dataset_names () işlevi tarafından algılanır ve döndürülür. Sonunda {a1} değiştirildikten sonra formül 111‘e eşittir ve validatör iç içe geçmiş placeholder’ları onaylar ve böylece bu yamayı da etkisiz kılar.

bug7.png


Üçüncü yama ilk iki yaklaşımı birleştiriyor ve oluşturulmuş placeholder’ları önlemede gerçekten iyi görünüyordu. Bununla birlikte, eğer bir saldırgan Quiz(sınav) bileşeninin içe aktarma özelliğini hedef aldıysa ve kötü niyetli sabote edilmiş bir XML soru dosyasını tekrar içe aktardıysa, saldırgan, substitute_variables () ‘ın $ veri kümesi argümanını kontrol edebildi ve placeholder tutma işlemini geçersiz kılabilir.


bug8.png


Vurgulanan satırlar, XML dosyasının 1951 satırındaki {x} placeholder’ının adını tanımladığını gösterir. Bu placeholder, 1946 satırındaki formülde hiçbir zaman kullanılmaz. Bu, tehlikeli placeholder’in {{($ _ GET [0]) ‘i geçersiz kılar ve önceki yamalardaki aynı kod ekleme güvenlik açığına yol açar.



Sonuç Olarak

Moodle genellikle WebMailer, e-Öğrenim Platformları ve diğer teknolojileri birleştiren daha büyük sistemlere, kimliği doğrulanmamış saldırganların bir öğretmen hesabının kimlik bilgilerini kimlik avı yapmak veya kimlik bilgilerini çıkarmak için büyük bir saldırı yüzeyi oluşturacak şekilde paylaşılan hesap kimlik bilgileriyle birleştirir. Bazı durumlarda, bir Moodle kursu istemek için otomatik bir hizmet mevcuttur; bu, bir öğrenciyi, istediği kötü niyetli yazılımı uygulayabileceği ve katıldığı üniversite kurslarında kendini uzun süreli en iyi notu getirebileceği bir konuma getirecektir.

 

Konuyu görüntüleyen kullanıcılar

Üst