Ghidra ile Web Hacking I

GHIDRA-1024x694

CVE-2021-31667

Bismillâhirrahmânirrahîm
Son zamanlarda merak edilen Ghidra aracı ile birkaç analiz yapmak hem de çok detaya girmeden yeni nesil ‘Web Application’ kategorisine bir nebze de olsa katkıda bulunmak amacıyla bu yazıyı yazmak istedim. Bugün incelenecek olan yazılım ise Lumenvox uygulaması. Uygulamaya ait olan web arayüzünü Ghidra yardımıyla analiz edecek ve bulduğumuz sonuçları deneyerek sömürgeç haline getireceğiz.

Lumenvox Linux kurulumu için gerekli dosyaların elde edilmesiyle CentOS üstüne kurulum gerçekleştirildikten sonra binary dosyaları için işlemleri başlatabiliriz.
L1

Yukarıda gördüğünüz üzere “elf” dosyalarımız kurulumdan sonra bu şekilde “/usr/bin” altında toplanacak. Biz burada web arayüzü için işlem yapacağımızdan dolayı “lv_manager” kendi makinemize alıyoruz ve Ghidra ile işlemi başlatıyoruz.

L3

Ekranımız yukarıda gördüğünüz haliyle ham şekilde olacak ve arayüzümüzün dikkat çeken bol parametreli tarafları için araştırmalarımıza başlayabiliriz.

L2

Lumenvox ürününün paneli default olarak açık şekilde geliyor. Biz de bu paneli derinlemesine analiz etmek ve parametreleri araştırmak için kısa süreli incelemelerden sonra yukarıdaki sayfaya ulaşıyoruz
Bu sayfa genel olarak backup işlemleri ve disk dahilinde atılacak olan adımları barındırıyor.

Run Diagnostic Tests adlı fonksiyonu çağırdığımızda karşımıza default olarak ayarlanmış yönetimsel ve bu minvalde bilgiler geliyor.

Backup Config To Disk ise varolan ayarları saklamak üzere tanımlamış bir fonksiyon, isterseniz nasıl işlediğini görelim;
L6
L+

Defined Data tanımlanan parametreleri kolay şekilde çıkartabilmek için ideal bir araç. Tespit ettiğimiz fonksiyonun işlevini görelim(burada [CTRL+E] kısayol tuşuyla Decompile edebilirsiniz).
L5

Yukarıda gördüğünüz üzere “hostname”, "config_bk"ve “time” alınarak backup dosya ismi oluşturuluyor. Oluşturulan dosyamızın dizini ve adı ise “/etc/lumenvox/www/info/localhost._config_bk_2021-04-16-19-21.zip” bu şekilde oluşuyor.
(Detaya vakıf olmak ve geliştirmek için lütfen clsBackupConfigurationManger inceleyiniz)

L7

Send Report To Disk Gelelim bir diğer fonksiyonumuza, bu fonksiyonun çalışma mantığı ise diske rapor gönderme işlevidir. Bir adet rapor üretilir ve bu rapor diske kaydedilerek orada tutulur.
Şimdi bir de Ghidra ile nasıl işlevler gerçekleştirdiğini görelim;

L12

Yukarıda ardışık şekilde bulunan fonksiyonlar önce kullanıcıdan gelecek değerleri alacak(isim,mail vb) sonrasında ise eklenen eklerle birlikte servera gönderecek. Evet kodu okuya okuya gidelim biraz;

                  __fd = mg_get_var(pvVar21,lVar15,0x60d8d3,paVar26,lVar15);
                  if (__fd < 1) {
                /* try { // try from 004fcf7d to 004fcf93 has its CatchHandler @ 004fd2d9 */
                    LogAppEvent(0xb,8,"save_report","Missing parameter : Company");
                    Value(local_1a58,"Missing Parameter: Company");
                /* try { // try from 004fcfa1 to 004fcfb5 has its CatchHandler @ 004fcfe5 */
                    this_02 = (Value *)operator[](local_1e58,"Result");
                    operator=(this_02,local_1a58);
                    ~Value(local_1a58);
                  }
                  else {
                    operator=(abStack1632,(char *)paVar26);
                    *paVar26 = (allocator)0x0;
                    __fd = mg_get_var(pvVar21,lVar15,0x60d90a,paVar26,lVar15);

Yukarıda görülen Decompile edilmiş değer, “Company” parametresinin giriş şartlarını sağlamadığı takdirde “Missing Parameter” ile günlüğü log düştüğünü ve bunun neticesinde “Value” değerinin bu eksikliği belirttiğini görüyoruz. ilgimizi çeken "__fd(file descriptor) değişkeninin ise “mg_get_var” ile çağırılarak işlendiği ve hata olması durumunda if koşuluna değilse else ile devam ediyor olması.

L13
L10
L11

Ardışık görsellerin bize anlattığı; dosyanın diske yazıldığı ve bu yazım sırasında içeriğin işlendiğidir. Bir önceki imajlardan yola çıkarak decompile edilen kod bloğunun altına inerek geçici bir dizin oluşturulduğu ve bu dizinin içine işlenen geçiçi değerlerin silindiğini göreceksiniz. Burada ise dikkatimizi çeken bir fonksiyon var “rmdir”, korumasız şekilde direkt olarak tanımlanan ve parametreye adapte edilen değişkene, dışarıdan müdahale edilmesi olasıdır.

Deneyelim ve görelim;

Kaynaklar:
https://man7.org/linux/man-pages/man2/rmdir.2.html

https://www.lumenvox.com/knowledgebase/index.php?/article/AA-00628/0/Linux-Installation.html

Eğitim amaçlıdır.
For Educational Purposes Only

7 Beğeni

Kısacası bir 0day çalışmasıda diyebiliriz değil mi?

1 Beğeni

Evet sanırım o yollarla kesişen metotlar diyebiliriz, umarım ilerletmek isteyen arkadaşlar için bir ilham kaynağı olur. Saygılar, selamlar KraL :upside_down_face:

1 Beğeni

Çok güzel ve faydalı bir yazı olmuş hocam, teşekkürler :slightly_smiling_face:

Eline saglik abi cidden guzel ve degerli bir makale olmus.