TR | Misfortune Cookie (CVE-2014-9222) Analizi
Bu yazımızda sizlerle etki alanı oldukça geniş olan ve yüksek risk içeren bir zafiyeti inceleyeceğiz. Misfortune Cookie olarak adlandırılan zafiyet routerlarda web arayüzü sunmak için kullanılan Allegro Rompager adlı gömülü web server uygulamasında bulunuyor. Bu yazılımın birçok marka/model routerda kullanılması zafiyetin etki alanını bir hayli genişletiyor. Zafiyet aracılığıyla saldıgan herhangi bir şifreye ihtiyaç duymadan router'ın web kontrol paneline erişim sağlayabiliyor. Bu da zafiyeti oldukça riskli bir hale getiriyor. Hadi incelemeye başlayalım. NOT: Yazıda kullanılan kod parçaları ve görseller alıntıdır.
0x00: Zafiyet Tespiti
Zafiyetimizin istismar vektörü, adından da anlaşılacağı gibi, cookie verisi. Gelin önce sunucuya gönderilen cookie değerine bir bakalım.Gönderilen cookie'nin formatı "CX=value" şeklinde. Bunun sebebini web server'ın cookie'yi parse eden kısmına bakınca daha iyi anlıyoruz.
ROM:8010E5B0 loc_8010E5B0: # CODE XREF: sub_8010E574+EC j ROM:8010E5B0 li $t7, 0x43 # 0x43='C' ROM:8010E5B4 bne $v0, $t7, loc_8010E618 ROM:8010E5B8 li $a1, 0x3D ROM:8010E5BC addiu $s0, 1 ROM:8010E5C0 move $a0, $s0 ROM:8010E5C4 jal sub_8016C340 ROM:8010E5C8 nop ROM:8010E5CC move $a0, $s0 ROM:8010E5D0 move $s1, $v0 ROM:8010E5D4 addiu $s1, 1 ROM:8010E5D8 jal sub_801F2E74 ROM:8010E5DC sb $zero, -1($s1) ROM:8010E5E0 move $a0, $s1 ROM:8010E5E4 jal sub_8016CA24 ROM:8010E5E8 move $s3, $v0 ROM:8010E5EC li $a2, 0x28 ROM:8010E5F0 mul $t2, $s3, $a2 ROM:8010E5F4 move $a1, $s1 ROM:8010E5F8 addiu $t5, $s4, 0x6B28 ROM:8010E5FC move $s0, $v0 ROM:8010E600 addu $at, $s1, $s0 ROM:8010E604 addu $a0, $t5, $t2 ROM:8010E608 jal sub_8016A784 ROM:8010E60C sb $zero, 0($at) ROM:8010E610 j loc_8010E644 ROM:8010E614 addu $s0, $s1, $s0 ROM:8010E618 # ---------------------------------------------------------------------------Yukarıdaki MIPS Assembly kodlarını anlamakta sıkıntı çekiyorsanız (ben çektim) şu kaynaklara göz gezdirmenizi öneririm: MIPS Quick Tutorial MIPS Instruction Set Burada yapılan işlemler özetle şu şekilde ("CX=value" formatını hatırlayın);
- Ilk karakter 'C' ye eşitmi?
- Evet ise => "X=value" olan kısmı al
- '=' ayracı ile string'i iki kısıma ayır ("X" ve "value")
- *(0x6B28 + X*0x28) = value
- *(base_addr + i*sizeof(item)) = value
0x10: Exploitation
ZynOS'in zafiyeti istismar etmemizi kolaylaştıracak bir özelliği var; pswauthen. Komut arayüzünden bu komutu '0' argümanıyla birlikte girdiğiniz takdirde geçici bir süre için web arayüzüne şifresiz erişim sağlayabiliyorsunuz. Komutun yaptığı şey ise belli bir adresteki flag değerini sıfıra eşitlemek. Daha sonradan Rompager bu adresteki değere bakıp 0'ı gördüğünde kullanıcıya şifresiz erişim sağlıyor. Bu da demek oluyor ki elimizdeki zafiyeti kullanarak bu adresin içerisini sıfırlayıp modem arayüzüne şifresiz şekilde erişebiliriz! Tek yapmamız gereken flag adresi ile dizinin adresi arasındaki farkı bulup 40'a bölmek ve bunu uygun cookie formatında yazıp request halinde sunucuya göndermek.- 0x8034FF94 - 0x804163D4 = 0xFFF39BC0
- 0xFFF39BC0 / 0x28 = 0x0666171
- 0x06661718 = 107353880 (indis karşılığı)
Böylece zafiyetimizi istismar etmiş olduk. Bu zafiyeti kullanan bir malware salgını hakkında yazdığım raporu buradan okuyabilirsiniz.
Yorumlar
Yorum Gönder