Register Now

Login

Lost Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Login

Register Now

Canyoupwn.me ~

TR | Misfortune Cookie (CVE-2014-9222) Analizi

cm

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.

req

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

 

Son adım bana biyerden tanıdık geliyor..

  • *(base_addr + i*sizeof(item)) = value

Bu pattern x86 mimarisinde de sıklıkla karşılaştığım dizi elemanlarına erişme pattern’i. (bkz: x86 Asm Cheat Sheet). Buradan anlaşılacağı üzere gönderdiğimiz cookie’ler, her elemanı 40 byte olan -nitekim cookie ile gönderilen değerimiz 40 karakter- bir dizide tutuluyor. Biz sunucuya “C0=blabla” şeklinde bir cookie gönderdiğimizde aslında cookie dizisinin 0. indexine “blabla” değerini yazmış oluyoruz. Uygulama girdiyi alırken herhangi bir sınır kontrolü yapmadığı içinde write-what-where durumu oluşuyor (yani istediğimiz adrese istediğimiz değeri yazabiliyoruz).

Zafiyeti tanımladığımıza göre şimdi istismarına geçelim.

 

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ığı)

Göndermemiz gereken cookie değeri: “C107353880=\0”

Cookie değeri null-byte içereceğinden request’i netcat ile göndermeniz gerekir.

aaasss

Böylece zafiyetimizi istismar etmiş olduk.

Bu zafiyeti kullanan bir malware salgını hakkında yazdığım raporu buradan okuyabilirsiniz.

 

Kaynakça:
  1. http://mis.fortunecook.ie/
  2. http://mis.fortunecook.ie/too-many-cooks-exploiting-tr069_tal-oppenheim_31c3.pdf
  3. http://cawanblog.blogspot.com.tr/2015/02/misfortune-cookie-cve-2014-9222.html

About CanYouPwnMe

Hero!

Follow Me