close

Kabuk kodu

Gezinmeye atla Aramaya atla

Bilgisayar biliminde, bir kabuk kodu , DOS ve Microsoft Windows işletim sistemlerinde Unix kabuğu '/ bin / sh' veya komut.com kabuğu gibi geleneksel olarak bir kabuk çalıştıran bir derleme dili programıdır . Kabuk kodu, bir açıktan yararlanma yoluyla bir hatadan yararlanmak için kullanılabilir , bu da bir bilgisayar korsanının veya korsanın bir bilgisayarın komut satırına erişmesine veya daha genel olarak kodu yürütmesine olanak tanır. keyfi.

Açıklama

Kabuk Kodu Türleri

Yerel ve uzak olmak üzere iki farklı kabuk kodu türü vardır. Ayrım, yerel veya uzak (eğer ağ üzerinden gerçekleşirse) olabilen, hedef makinede kabuk kodu yürütmesinin sağladığı kontrol türüne bağlıdır.

Yerel

Yerel bir kabuk kodu, makineye sınırlı erişimi olan bir saldırgan tarafından kullanılır, ancak daha yüksek ayrıcalıklara sahip bir işlemdeki bir güvenlik açığından yararlanan, örneğin bir arabellek taşması, kabuk kodu yürütmesi başarılı olursa aynı ayrıcalıkları elde edebilir.

Uzak

Bunun yerine uzak kabuk kodu, bir saldırgan yerel ağdaki veya intranetteki başka bir makinenin işlemindeki güvenlik açığından yararlanmak istediğinde kullanılır. Shellcode doğru bir şekilde yürütülürse, ağ üzerinden hedef makinenin kontrolünü döndürür. Uzak kabuk kodları , hedef makinenin kabuğuna erişime izin vermek için normalde standart TCP / IP soketini kullanır. Diğer ayrımlar, bağlantının kurulduğu yönteme göre sınıflandırılabilir. Bağlantıyı kurabilen kabuk kodunun kendisiyse, buna "ters kabuk" veya geri bağlantı kabuk kodu denir, çünkü uzak makinede çalışan kabuk kodu saldırganın makinesine bağlanır. Öte yandan, saldırganın bağlantı oluşturması gerekiyorsa, kabuk kodu, saldırgan tarafından hedef makineyi bağlamak ve kontrol etmek için kullanılacak belirli bir bağlantı noktasına bağlandığından, kabuk koduna bindshell adı verilir. Üçüncü, daha az yaygın bir kabuk kodu türü, soket yeniden kullanım kabuk kodudur. Bu tür kabuk kodu genellikle, bir açıklardan yararlanma, kabuk kodu yürütülmeden önce kapatılmayan savunmasız süreçle bir bağlantı kurduğunda kullanılır. Kabuk kodu, saldırganla iletişim kurmak için bu bağlantıyı yeniden kullanabilir. Socket yeniden kullanım kabuk kodunun uygulanması daha karmaşıktır, çünkü kabuk kodunun hangi bağlantıyı kullanabileceğini (makinede açık olan olası bağlantılar arasında) tanımlaması gerekir. [1] Bir güvenlik duvarı , bir geri bağlantı kabuk kodu ve bir bindshell'in gelen bağlantı girişimi tarafından yapılan giden bağlantıları tanımlamak için kullanılabilir. Güvenlik duvarı, kabuk kodunu çalıştırarak oluşturulan kabuğa erişimi önleyici olarak engelleyerek, sistem savunmasız olsa bile bir saldırgana karşı ek koruma sağlayabilir. Bu, kabuk kodunu yeniden kullanan bir soketin bazen kullanılmasının nedenlerinden biridir, çünkü yeni bağlantılar oluşturmamanın tanımlanması ve engellenmesi daha zordur.

İndirin ve yürütün

İndir ve çalıştır, indirme gerçekleştiren ve hedef sistemde bir tür kötü amaçlı yazılım çalıştıran bir tür uzak kabuk kodudur . Bu tür kabuk kodu bir kabuk oluşturmaz, ancak makineye ağdan belirli bir yürütülebilir dosyayı indirmesini, diske kaydetmesini ve ardından çalıştırmasını söyler. Günümüzde, kurbanın bir indirme başlatmaya ve kurban makinesine yazılım yüklemek için bir kabuk kodu çalıştırmaya çalışan kötü niyetli bir siteyi ziyaret ettiği, doğrudan indirme saldırılarında yaygın olarak kullanılmaktadır . Bu tür kabuk kodunun bir varyasyonu "bir kitaplığı indir ve yükle"dir. [2] [3] Bu tekniğin avantajları, kabuk kodu kodunun daha küçük olabilmesi, hedef makinede yeni bir işlem oluşturulmasını gerektirmemesi ve kabuk kodunun hedefleneni temizlemek için kodu uygulamasına gerek olmamasıdır. process , ancak bu, sürece yüklenen bir kitaplıktan yapılabilir.

Aşamalı

Bir saldırganın hedef sürece enjekte edebileceği veri miktarı, kabuk kodunun doğru çalışması için çok küçük olduğunda, aşamalı olarak çalıştırılabilir. İlk olarak, küçük bir kabuk kodu parçası (1. aşama) yürütülür. Bu kod, kabuk kodunun daha büyük bir bölümünü (aşama 2) işlemin belleğine atar ve çalıştırır.

Yumurta avı

Yumurta avı, başka bir aşamalı kabuk kodu türüdür. Saldırgan bir işleme büyük bir kabuk kodu ekleme yeteneğine sahip olduğunda, ancak bellekte nereye yerleştirileceğini belirleyemediğinde kullanılır. Ardından, öngörülebilir bir yerde sürece küçük bir yumurta avı eklenir ve ardından yürütülür. Kod, bellek alanında daha büyük bir kabuk kodu (yumurta) arar ve onu çalıştırır.

Omlet

Bu tür kabuk kodu, yumurta avına benzer, ancak daha küçük bloklar (yumurtalar) arar ve bunları daha sonra yürütülen daha büyük bir blokta (omlet) yeniden birleştirir. Bu teknik, bir saldırganın herhangi bir nedenle sürece küçük veri blokları eklemekle sınırlı olduğu durumlarda kullanılır. [4]

İşlem

Shellcode Yürütme Stratejisi

Bir istismar, program sayacı üzerinde kontrol elde etmek için, genellikle bir güvenlik açığından yararlanma meydana gelmeden önce veya aynı anda hedef sürece bir kabuk kodu ekler . Program sayacı, yürütülecek kabuk kodunu işaret edecek şekilde yönlendirilir. Kabuk kodunun enjekte edilmesi genellikle, kodun ağ üzerinden güvenlik açığı bulunan sürece gönderilen verilerde depolanması ve işlem tarafından okunan bir dosyada veya yerel açıklardan yararlanma durumunda komut satırı veya ortam değişkenleri aracılığıyla kullanılabilir hale getirilmesiyle yapılır.

Kabuk kodu kodlaması

Birçok işlem girilebilecek verileri filtrelediğinden veya sınırladığından, bu kısıtlamaların üstesinden gelmek için genellikle kabuk kodunun yazılması gerekir, bu da kodu küçük, boş veya alfasayısal karakterlerden arındırır. Bu kısıtlamaları aşmak için çeşitli çözümler bulunmuştur:

  • Kabuk kodu boyutunu azaltmak için tasarım ve uygulama optimizasyonları.
  • Kabuk kodunda kullanılan bayt aralığındaki sınırlamaları aşmak için uygulama değişiklikleri.
  • Normalde sürece eklenemeyen baytları yeniden oluşturmak için, çalıştırmadan önce kodunun bayt sayısını değiştiren kendi kendini değiştiren kod .

İzinsiz giriş tespit araçları, ağ üzerinden gönderilen basit kabuk kodlarının imzasını tanımlayabildiğinden, tanınmamak için kodlanır ve kendi kendini çözen veya polimorfik hale getirilir.

Yüzde kodlaması

Tarayıcıları hedefleyen istismarlar, kabuk kodunu genellikle yüzde kodlama veya URL kodlama gösterimi kullanarak, "\ uXXXX" karakterinden kaçarak veya entity kullanarak bir JavaScript dizesine kodlar . Bazı açıklardan yararlanmalar, IDS araçları tarafından algılanmaktan kaçınmak için dize kodlu kabuk kodunu daha da karmaşık hale getirir . Örneğin, bir IA-32 mimarisinde , iki (işlemsiz) komut NOPkodlanmadan önce bu forma sahiptir.

90 NOP
90 NOP

Yüzde kodlamalı bir dizgede kodlanırlar. (kod çözme için unescape () yöntemini kullanarak)

unescape ("% u9090");

Daha sonra "\ uXXXX" gösteriminde kodlanır:

"\ u9090";

Ve son olarak varlık kodlamasında.

"& # x9090;"

veya

"& # 37008;"

Shellcode Null-Free

Birçok kabuk kodu boş bayt kullanılmadan yazılır , çünkü bunlar boş sonlandırılmış bir dize aracılığıyla hedef işleme eklenmek üzere tasarlanmıştır. Boş sonlandırılmış bir dize kopyalandığında, kopya ilk boş karakteri içerecek , ancak bunu izleyen baytlar işlenmeyecektir. Boş değeri içeren kabuk kodu bu şekilde girildiğinde, kabuk kodunun yalnızca bir kısmı eklenerek daha sonra çalıştırılamaz. Boş bayt içeren biriyle başlayan boş olmayan bir kabuk kodu üretmek için , sıfır içeren makine yönergeleri, aynı etkiyi üreten ancak boş baytları olmayan yönergelerle değiştirilebilir. Örneğin, bir IA-32 mimarisinde bu değiştirme gerçekleştirilebilir:

B8 01000000     MOV EAX, 1 // EAX kaydını 0x000000001 olarak ayarla

bu ifade, şu ifadelerle birlikte değişmezin bir parçası olarak sıfırlar içerir (1, 0x000000001 olarak genişletilir:

33C0            XOR EAX, EAX // EAX kaydını 0x000000000 olarak ayarlayın
40              INC EAX // EAX değerini 0x00000001'e yükseltin

aynı etkiye sahip ancak kodlama için daha az bayt gerektiren ve boş bayt içermeyen.

Alfanümerik ve yazdırılabilir kabuk kodları

Belirli koşullar altında, bir hedef işlem, girilen kabuk kodundan yazdırılamayan veya alfanümerik olmayan tüm baytları filtreleyebilir. Bu koşullar altında, bir kabuk kodu yazmak için kullanılabilecek talimatların aralığı çok sınırlı hale gelir. Bu soruna bir çözüm Rix tarafından Phrack 57'de [5] yayınlanmıştır, burada herhangi bir kod türünü alfasayısal bir koda dönüştürmenin nasıl mümkün olduğu gösterilmiştir. Yaygın olarak kullanılan bir teknik, kendi kendini değiştiren kod oluşturmaktır, çünkü bu, kodun, izin verilenler arasında yer almayan diğerlerini dahil etmek ve kullanılabilir talimatların aralığını genişletmek için kendi baytlarını değiştirmesine izin verir. Bu tür bir hileyle, başlangıçta yalnızca izin verilen aralıktaki baytlar kullanılarak kendi kendini değiştiren bir kod çözücü oluşturulabilir. Giden kabuk kodu yürütmeye geçtiğinde, kod çözücü, kodunu doğru şekilde çalışmasına izin vermek için gerekli herhangi bir talimatı kullanabilmek ve aynı zamanda orijinal kabuk kodunun kodunu çözmeye devam etmek için değiştirebilir. Kod çözme işlemini yaptıktan sonra, kod çözücü kontrolü kabuk koduna aktarır, böylece normal şekilde çalışabilir. Normal İngilizce metne benzeyen rastgele karmaşıklıkta kabuk kodları oluşturmanın nasıl mümkün olduğu gösterilmiştir. [6]

Unicode karakter geçirmez kabuk kodu

Birçok modern program, metnin içselleştirilmesine izin vermek için Unicode biçimi dize kodlamasını kullanır. Genellikle bu programlar, giriş ASCII dizelerini işlemeden önce dönüştürür. UTF-16'da kodlanan Unicode dizeleri, her karakterin kodunu çözmek için iki bayt (veya bazı özel karakterler için dört bayt) kullanır. Bir ASCII dizesi UTF-16'ya dönüştürüldüğünde, orijinal dizenin her baytından sonra bir sıfır bayt eklenir. Obscu, Phrack 61'de [7] bu dönüşümden sonra bile doğru şekilde çalışabilen kabuk kodları yazmanın mümkün olduğunu gösterdi. Her bir kabuk kodunu UTF-16 tarafından kodlanmış bir koda otomatik olarak değiştirebilen ve orijinal kabuk kodunu çözen kendi kendini değiştiren bir kod çözücüyle aynı prensibe dayanan programlar vardır.

Platformlar

Güvenlik açığından yararlanılabilir hale geldiği düşük seviye nedeniyle birçok kabuk kodu makine koduna yazılır. Kabuk kodu genellikle, genellikle platform olarak adlandırılan belirli bir işlemci, işletim sistemi ve hizmet paketi kombinasyonuna saldırmak için oluşturulur. Bazı açıklardan yararlanmalar için, hedef sürecin getirdiği kısıtlamalar nedeniyle, belirli bir kabuk kodu oluşturmak gerekir. Ancak, bir shellocde'un birden çok istismar, hizmet paketi, işletim sistemi ve muhtemelen işlemci için çalışması her zaman mümkün değildir. [8] Saldırıya uğrayacak çeşitli platformlara dayalı olarak kabuk kodunun farklı sürümleri oluşturularak ve kullanılan platform için doğru sürümü tanımlayan bir başlık oluşturularak çok yönlülük sağlanabilir. Yürütüldüğünde, kod platforma göre farklı davranır ve kabuk kodunun doğru sürümünü yürütme yeteneğine sahiptir.

Notlar

  1. ^ BHA, Shellcode / Socket-reuse , blackhatlibrary.net üzerinde , 6 Haziran 2013. Erişim tarihi: 7 Haziran 2013 .
  2. ^ SkyLined, Download ve LoadLibrary kabuk kodu, 11 Ocak 2010'da skypher.com'da yayınlandı . Erişim tarihi : 19 Ocak 2010 ( 23 Ocak 2010'da orijinalinden arşivlendi ) .
  3. ^ x86 Windows için SkyLined, Download ve LoadLibrary kabuk kodu , code.google.com , 11 Ocak 2010. Erişim tarihi : 19 Ocak 2010 .
  4. ^ SkyLined, w32 SEH omlet shellcode , skypher.com'da , 16 Mart 2009. Erişim tarihi: 19 Mart 2009 ( 23 Mart 2009 tarihinde orijinalinden arşivlendi ) .
  5. ^ Rix, ia32 alfanümerik kabuk kodları yazma , phrack.org , Phrack, 8 Kasım 2001. Erişim tarihi : 29 Şubat 2008 .
  6. ^ Joshua Mason, Small, Sam, Monrose, Fabian and MacManus, Greg, English Shellcode ( PDF ), cs.jhu.edu , Kasım 2009. Erişim tarihi: 10 Ocak 2010 .
  7. ^ Obscou, Building IA32 'Unicode-Proof' Shellcodes , phrack.org , Phrack, 13 Ağustos 2003. Erişim tarihi : 29 Şubat 2008 .
  8. ^ Eugene, Architecture Spanning Shellcode , phrack.org , Phrack, 11 Ağustos 2001. Erişim tarihi : 29 Şubat 2008 .

İlgili öğeler

Dış bağlantılar