Cuma, Ocak 2

Python Process Injection Meselesi - 1


Merhabalar, bugün Python Process Injection ile ilgili bir kaç satır karalamak istedim. Şimdi haliyle sql injection, app injection vs. gibi şeyler alışagelmiş duyulmuş şeylerdir ve bir çok yerde bunlarla ilgili makaleler bulabilir ve uygulayabiliriz. Lakin Python Process Injection mevzusu geniş çerçevede araştırılası ve son 6 senedir hakkında makaleler yazılası bir durum haline gelmiş bulunuyor. Peki nedir bu python process injection ?
Kısaca açıklamak gerekirse bu mevzu process üzerinde bulunan stacklere dayanıyor. Stack durumlarında process üstünde inject olarak kontrolü size devrediyor. Bunu bildiğimiz yönde uygulamasına geçmeden önce şöyle açıklayabiliriz. Bir argv[1] fonksiyonu oluşturduk ve default olarak bu fonksiyonun içine gelecek olan "16 Byte" veri var bunun üstüne çıkıldığında stack overflow meydana geliyor yani "17" byte olduğunda stack patlıyor ve kontrolü kaybediyor. Nasıl bir balona haddinde fazla su doldurduğunuzda patlıyorsa oda bu şekil daha nasıl açık bir şekilde örnek verebilirim bilmiyorum ek olarak yazmaya başladığım ve yakında sizinlede paylaşacağım Linux & Windows Stack Overflow derslerinde bunu tam manasıyla zaten anlamış olacaksınız. Burda bu kavramları anlayabilmek için öncelike eip, ebp, esp gibi assembly terimlerini iyi bir şekilde kavramamız gerekiyor. Hangi tanım ne işe yarar ecx fonksiyonunun döngüler için sayaç olarak kullanıldığını bilmeliyiz örneğin. Bu sayede daha sağlıklı şekilde hareket ederek kendi algoritmalarımızla "-aaa burda bu symbol varmış demek ki birşeyler var." diyebilelim. Bunun için açıklayıcı kıssadan hisse bir kaynaktan bunları görebiliriz;

http://www.enginkuzu.org/assembly03.php açık ve net bir dille fonksiyonların işlevleri hakkında bilgi vermeye çalışmış tabi ki bende stack overflow derslerinde baştan sona bunların kullanımını sizlerle paylaşmaya çalışacağım. Ama öncelikle şu "Python Process Injection" işine olan merakımızı giderelim bir kaç örnekle bakmaya çalışalım. Aslında detaylı olarak bakmak istiyorsak process inj. mevzusuna şu şekilde kabataslak bir anlatım gerçekleştirmeye çalışalım. (Ek olarak DLL inj. merakımda giderek artıyor onunla ilgili yazıyıda bu yazıdan sonra felan eklemiş olurum sanırım.)


Yukarıda gördüğümüz şekilde 32Bit işlemcide mevcut olan registers görmekteyiz. "ESP" registerına baktığımızda "SP" adlı child register görmekteyiz. Peki bu nedir ? "SP" child register içine gelen son değerin byte adresini gösterir "ESP" registerında LIFO(Last in First out) kuralı işlemektedir. Yani son giren ilk çıkar bu yüzden sondan başa doğru işlem devam etmektedir. Bunu açıklamayı uygun gördüm lakin Stack Overflow elde edeceğimiz bir process varsa önce değer EIP üstünden işlenmelidir çünkü yük ESP aktarılmadan önce EIP'de yazılan değer görülür. Örneğin: "10,000 adet A" kullandığımız bir process crash olduysa burdan çıkan data EIP'de görünür. Kısaca EIP bir sonra ki çalıştıracağımız komutun yerini gösterir bu yüzden stack ovf. çalışmalarında öncelikle EIP değerlerine bakılarak hareket edilir ki hangi segmentte hangi karakter ile crash olduğu ve kontrol edilebilindiği görülebilsin. Onuda resimle şu şekilde özetleyelim;



Evet application normal şekilde çalıştığında aldığı değer bu şekilde herşey yolunda gözüküyor. Peki bu gidişata bir çomak sokmak istersek haddinden fazla bir yük yüklersek bir torbaya patlayabilir bu kötü işçilikten ve baştan sağma iş yapmaktan felan kaynaklıdır sanırım.
Evet torbamız patladı gördüğünüz gibi EIP register üstünde deminde anlattığımız gibi kontrol sağlayacağımız karakter görüldü EIP deminde dediğimiz gibi bir sonra ki çalıştırağımız değeri bize göstermektedir. Peki biz boş bir argv[1] fonksiyonu oluşturursak ve buna yükleme yapmaya çalışırsak neler meydana gelecektir ? Şöyle ki belli başlı bir process oluşturulur ve buna aşırı derecede yüklenme yapılırsa burda bir stack meydana gelmiş olur. Bunun sebebi boş torbaya istediğimiz kadar yükleme yapmak ve yükün ağırlığını belirlememizden meydana gelir. Bilmiyorum daha nasıl açık anlatabilirim kusura bakmayın bu şekilde geliyor aklıma terimlerle kafanızı allak bullak etmek istemiyorum. 

Python Process Inj. manual bir şekilde uygulamadan önce bunu bir uygulama haline getirmiş ve açık kaynak olarak yayınlanmış "Pyrasite" ile göstermek istiyorum aslında mantık aynı yapılacak olay aynı, aynı adımlarla ismi değiştirilerek tamamlanmış güzel bir uygulama göstermeye çalışalım.
Evet python ile bir adet boş process oluşturduk.



Process çalışır vaziyetteyken o process pyrasite ile bu şekilde müdahale edeceğiz. 

Sonucu görelim;



Evet oluşturduğumuz process müdahalede bulunduk python ile başlattığımız process üstünde istediğimiz gibi kontrol sağladık demek ki shellcode başarılı şekilde çalıştırıldı ve process üstüne kendi oluşturduğumuz dosyamızı okutmayı başarabildik. Arbitrary File Reader yani keyfi olarak dosya okuyucu haline getirdiğimiz bu process üstünde istersek "netcat" ile bağlanabilirdik istersek uzaktan kodlar okutabilirdik ki zaten istediğimiz dosyayı kurbanın ekranında yazdırdık istediğimiz tools vs. kurabilirdik. Bunun yanı sıra network üstünde paket injection'da aklımda onuda yazacağım bir sonra ki yazıda Python Process İnjection derinlemesine araştırma, netcat ile bağlantı olacak burda kavrayabilmeniz ve mevzuyu anlayabilmeniz için hali hazırda bulunan bir script kullandık diğer derste kendin pişir kendin ye yapacağız.

Sevgiyle, diğer yazılarda görüşmek umuduyla.

2 yorum:

  1. ilk defa görüyorum python process injection ilginç bir işlem daha detaylı anlatırsan tam manasıyla kavrayarak farklı process üstünde de çalışmalar olabilir. Eline sağlık

    YanıtlaSil
  2. ikinci seriyi bekliyorum gayet güzel bir yazı olmuş emeğine sağlık

    YanıtlaSil

Blogger tarafından desteklenmektedir.