mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/binary-exploitation/rop-return-oriented-programing/srop
This commit is contained in:
parent
0696a5dd78
commit
6c8f9765f1
@ -191,11 +191,11 @@ rp++ -f ./binary --unique -r | grep "mov\s\+x8, #0x8b" # 0x8b = __NR_rt_sigret
|
||||
```
|
||||
Her iki araç da **AArch64** kodlamalarını anlar ve *SROP gadget* olarak kullanılabilecek `mov x8, 0x8b ; svc #0` dizilerini listeleyecektir.
|
||||
|
||||
> Not: Binaries **BTI** ile derlendiğinde, her geçerli dolaylı dalış hedefinin ilk talimatı `bti c` olur. Bağlayıcı tarafından yerleştirilen `sigreturn` trampolinleri zaten doğru BTI iniş padini içerdiğinden, gadget yetkisiz koddan kullanılabilir durumda kalır.
|
||||
> Not: Binaries **BTI** ile derlendiğinde, her geçerli dolaylı dal hedefinin ilk talimatı `bti c` olur. Bağlayıcı tarafından yerleştirilen `sigreturn` trampolinleri zaten doğru BTI iniş padini içerdiğinden, gadget yetkisiz koddan kullanılabilir durumda kalır.
|
||||
|
||||
## SROP'u ROP ile Zincirleme (pivot `mprotect` aracılığıyla)
|
||||
|
||||
`rt_sigreturn` bize *tüm* genel amaçlı kayıtları ve `pstate`'i kontrol etme imkanı verir. x86'da yaygın bir desen: 1) `mprotect` çağrısı için SROP kullanmak, 2) shell-code içeren yeni bir çalıştırılabilir yığına geçmek. Aynı fikir ARM64'te de çalışır:
|
||||
`rt_sigreturn` bize *tüm* genel amaçlı kayıtları ve `pstate`'i kontrol etme imkanı verir. x86'da yaygın bir desen: 1) `mprotect` çağrısı için SROP kullanmak, 2) shell-code içeren yeni bir çalıştırılabilir yığına geçiş yapmak. Aynı fikir ARM64'te de çalışır:
|
||||
```python
|
||||
frame = SigreturnFrame()
|
||||
frame.x8 = constants.SYS_mprotect # 226
|
||||
@ -205,25 +205,25 @@ frame.x2 = 7 # PROT_READ|PROT_WRITE|PROT_EXEC
|
||||
frame.sp = 0x400000 + 0x100 # new pivot
|
||||
frame.pc = svc_call # will re-enter kernel
|
||||
```
|
||||
`0x400000+0x100` adresinde ham shell-code içeren ikinci bir aşama gönderebilirsiniz. **AArch64** *PC-relative* adresleme kullandığı için bu genellikle büyük ROP zincirleri oluşturmaktan daha kullanışlıdır.
|
||||
After sending the frame you can send a second stage containing raw shell-code at `0x400000+0x100`. Because **AArch64** uses *PC-relative* addressing this is often more convenient than building large ROP chains.
|
||||
|
||||
## Kernel doğrulaması, PAC & Shadow-Stacks
|
||||
## Kernel validation, PAC & Shadow-Stacks
|
||||
|
||||
Linux 5.16, kullanıcı alanı sinyal çerçevelerinin daha sıkı bir doğrulamasını tanıttı (commit `36f5a6c73096`). Kernel artık şunları kontrol eder:
|
||||
Linux 5.16, kullanıcı alanı sinyal çerçevelerinin daha sıkı bir şekilde doğrulanmasını tanıttı (commit `36f5a6c73096`). Kernel artık şunları kontrol eder:
|
||||
|
||||
* `uc_flags`, `extra_context` mevcut olduğunda `UC_FP_XSTATE` içermelidir.
|
||||
* `struct rt_sigframe` içindeki ayrılmış kelime sıfır olmalıdır.
|
||||
* *extra_context* kaydındaki her işaretçi hizalanmış olmalı ve kullanıcı adres alanı içinde bir yere işaret etmelidir.
|
||||
|
||||
`pwntools>=4.10`, uyumlu çerçeveleri otomatik olarak oluşturur, ancak bunları manuel olarak oluşturursanız *reserved*'ı sıfırla başlatmayı ve gerçekten ihtiyaç duymadıkça SVE kaydını atlamayı unutmayın—aksi takdirde `rt_sigreturn`, döndürmek yerine `SIGSEGV` ile sonuçlanır.
|
||||
`pwntools>=4.10`, uyumlu çerçeveleri otomatik olarak oluşturur, ancak bunları manuel olarak oluşturursanız, *reserved*'ı sıfırla başlatmayı ve gerçekten ihtiyaç duymadıkça SVE kaydını atlamayı unutmayın—aksi takdirde `rt_sigreturn`, döndürmek yerine `SIGSEGV` ile sonuçlanır.
|
||||
|
||||
Ana akım Android 14 ve Fedora 38 ile birlikte, kullanıcı alanı varsayılan olarak **PAC** (*Pointer Authentication*) ve **BTI** etkin olarak derlenmektedir (`-mbranch-protection=standard`). *SROP* kendisi etkilenmez çünkü kernel, yığın üzerinde kaydedilen doğrulanmış LR'yi atlayarak, oluşturulan çerçeveden doğrudan `PC`'yi yazar; ancak, dolaylı dallanmalar gerçekleştiren herhangi bir **sonraki ROP zinciri**, BTI etkin talimatlara veya PAC'li adreslere atlamak zorundadır. Gadget'ları seçerken bunu aklınızda bulundurun.
|
||||
Ana akım Android 14 ve Fedora 38 ile başlayarak, kullanıcı alanı varsayılan olarak **PAC** (*Pointer Authentication*) ve **BTI** etkin olarak derlenir (`-mbranch-protection=standard`). *SROP* kendisi etkilenmez çünkü kernel, oluşturulan çerçeveden doğrudan `PC`'yi yazarak, yığında kaydedilen kimlik doğrulamalı LR'yi atlar; ancak, dolaylı dallanmalar gerçekleştiren herhangi bir **sonraki ROP zinciri**, BTI etkin talimatlara veya PAC'li adreslere atlamak zorundadır. Gadget'ları seçerken bunu aklınızda bulundurun.
|
||||
|
||||
ARMv8.9'da tanıtılan Shadow-Call-Stacks (ve zaten ChromeOS 1.27+ üzerinde etkin) bir derleyici düzeyinde hafifletme yöntemidir ve *SROP* ile *müdahale etmez* çünkü hiçbir dönüş talimatı yürütülmez—kontrol akışı kernel tarafından aktarılır.
|
||||
ARMv8.9'da tanıtılan Shadow-Call-Stacks (ve zaten ChromeOS 1.27+ üzerinde etkin) bir derleyici düzeyinde hafifletme yöntemidir ve *SROP* ile çelişmez çünkü hiçbir dönüş talimatı yürütülmez—kontrol akışı kernel tarafından aktarılır.
|
||||
|
||||
## Referanslar
|
||||
## References
|
||||
|
||||
* [Linux arm64 sinyal işleme belgeleri](https://docs.kernel.org/arch/arm64/signal.html)
|
||||
* [Linux arm64 signal handling documentation](https://docs.kernel.org/arch/arm64/signal.html)
|
||||
* [LWN – "AArch64 branch protection comes to GCC and glibc" (2023)](https://lwn.net/Articles/915041/)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -46,7 +46,7 @@ alert(parent.secret)
|
||||
</script>
|
||||
```
|
||||
Eğer önceki html'ye bir http sunucusu (örneğin `python3 -m http.server`) aracılığıyla erişirseniz, tüm scriptlerin çalıştırılacağını göreceksiniz (çünkü bunu engelleyen bir CSP yok). **Ana sayfa, herhangi bir iframe içindeki `secret` değişkenine erişemeyecek** ve **sadece if2 ve if3 iframe'leri (aynı site olarak kabul edilenler) orijinal penceredeki secret'a erişebilir**.\
|
||||
if4'ün `null` kökenine sahip olduğu not edilmelidir.
|
||||
if4'ün `null` kökenine sahip olduğu dikkate alın.
|
||||
|
||||
### CSP ile Iframe'ler <a href="#iframes_with_csp_40" id="iframes_with_csp_40"></a>
|
||||
|
||||
@ -81,7 +81,7 @@ Ancak, **yalnızca `if1` ve `if2` script'leri çalıştırılacak, fakat yalnız
|
||||
|
||||
.png>)
|
||||
|
||||
Bu nedenle, **eğer bir JS dosyasını sunucuya yükleyip iframe aracılığıyla yükleyebiliyorsanız CSP'yi atlatmak mümkündür, hatta `script-src 'none'` ile bile**. Bu, **aynı site JSONP uç noktasını kötüye kullanarak da potansiyel olarak yapılabilir**.
|
||||
Bu nedenle, **eğer bir JS dosyasını sunucuya yükleyip iframe aracılığıyla yükleyebiliyorsanız CSP'yi atlatmak mümkündür, hatta `script-src 'none'` ile bile**. Bu, **potansiyel olarak aynı site JSONP uç noktasını kötüye kullanarak da yapılabilir**.
|
||||
|
||||
Bunu, `script-src 'none'` ile bile bir çerezin çalındığı aşağıdaki senaryo ile test edebilirsiniz. Uygulamayı çalıştırın ve tarayıcınızla erişin:
|
||||
```python
|
||||
@ -120,7 +120,7 @@ victim.location = 'about:blank';
|
||||
console.log(victim.name); // → sızdırılan değer
|
||||
```
|
||||
|
||||
* **Aynı kök iframeden nonce çalınması (2024)** – CSP nonceleri DOM'dan kaldırılmaz; yalnızca DevTools'ta gizlenir. Bir saldırgan *aynı kök* bir iframe enjekte edebilirse (örneğin HTML'yi siteye yükleyerek), çocuk çerçeve basitçe `document.querySelector('[nonce]').nonce` sorgulayabilir ve politikayı karşılayan yeni `<script nonce>` düğümleri oluşturabilir, bu da `strict-dynamic` olmasına rağmen tam JavaScript yürütümü sağlar. Aşağıdaki gadget, bir markup enjesini XSS'ye yükseltir:
|
||||
* **Aynı kök iframeden nonce çalınması (2024)** – CSP nonceleri DOM'dan kaldırılmaz; yalnızca DevTools'ta gizlenir. Bir saldırgan *aynı kök* iframeyi enjekte edebilirse (örneğin HTML'yi siteye yükleyerek), çocuk çerçeve basitçe `document.querySelector('[nonce]').nonce` sorgulayabilir ve politikayı karşılayan yeni `<script nonce>` düğümleri oluşturabilir, bu da `strict-dynamic` olmasına rağmen tam JavaScript yürütümü sağlar. Aşağıdaki gadget, bir markup enjesini XSS'ye yükseltir:
|
||||
|
||||
```javascript
|
||||
const n = top.document.querySelector('[nonce]').nonce;
|
||||
@ -130,7 +130,7 @@ s.nonce = n;
|
||||
top.document.body.appendChild(s);
|
||||
```
|
||||
|
||||
* **Form-action kaçırma (PortSwigger 2024)** – `form-action` direktifini atlayan bir sayfanın giriş formu, enjekte edilmiş bir iframe veya satır içi HTML'den *yeniden hedeflenebilir*, böylece şifre yöneticileri kimlik bilgilerini otomatik olarak doldurup dış bir domaine gönderebilir, hatta `script-src 'none'` mevcut olduğunda bile. Her zaman `default-src`'yu `form-action` ile tamamlayın!
|
||||
* **Form-action kaçırma (PortSwigger 2024)** – `form-action` direktifini atlayan bir sayfanın giriş formu, enjekte edilmiş bir iframe veya satır içi HTML'den *yeniden hedeflenebilir*, böylece şifre yöneticileri otomatik olarak dış bir alana kimlik bilgilerini doldurup gönderebilir, hatta `script-src 'none'` mevcutken bile. Her zaman `default-src`'yu `form-action` ile tamamlayın!
|
||||
|
||||
**Savunma notları (hızlı kontrol listesi)**
|
||||
|
||||
@ -158,7 +158,7 @@ Iframe içindeki içerik, `sandbox` niteliği kullanılarak ek kısıtlamalara t
|
||||
Kullanıldığında, `sandbox` niteliği birkaç sınırlama getirir:
|
||||
|
||||
- İçerik, benzersiz bir kaynaktan geliyormuş gibi muamele görür.
|
||||
- Form gönderme girişimleri engellenir.
|
||||
- Formları göndermeye yönelik herhangi bir girişim engellenir.
|
||||
- Scriptlerin çalıştırılması yasaktır.
|
||||
- Belirli API'lere erişim devre dışı bırakılır.
|
||||
- Bağlantıların diğer tarayıcı bağlamlarıyla etkileşimde bulunması engellenir.
|
||||
@ -168,7 +168,7 @@ Kullanıldığında, `sandbox` niteliği birkaç sınırlama getirir:
|
||||
|
||||
İpucu: Modern tarayıcılar, `allow-scripts`, `allow-same-origin`, `allow-top-navigation-by-user-activation`, `allow-downloads-without-user-activation` gibi ayrıntılı bayrakları destekler. Gömülü uygulamanın ihtiyaç duyduğu minimum yetenekleri sağlamak için bunları birleştirin.
|
||||
|
||||
Nitelik değeri, yukarıda belirtilen tüm kısıtlamaları uygulamak için boş bırakılabilir (`sandbox=""`). Alternatif olarak, iframe'i belirli kısıtlamalardan muaf tutan, boşlukla ayrılmış belirli değerler listesi olarak ayarlanabilir.
|
||||
Nitelik değeri boş bırakılabilir (`sandbox=""`) ve yukarıda belirtilen tüm kısıtlamalar uygulanır. Alternatif olarak, iframe'i belirli kısıtlamalardan muaf tutan boşlukla ayrılmış özel değerler listesine ayarlanabilir.
|
||||
```html
|
||||
<!-- Isolated but can run JS (cannot reach parent because same-origin is NOT allowed) -->
|
||||
<iframe sandbox="allow-scripts" src="demo_iframe_sandbox.htm"></iframe>
|
||||
@ -179,8 +179,8 @@ As explained in [this article](https://blog.slonser.info/posts/make-self-xss-gre
|
||||
|
||||
Since **Chrome 110 (Şubat 2023) bu özellik varsayılan olarak etkin** ve spesifikasyon, *anonymous iframe* adı altında tarayıcılar arasında standart hale getirilmektedir. MDN bunu şöyle tanımlıyor: “gerçek kökenle hiçbir çerez, localStorage veya IndexedDB paylaşılmayacak şekilde üçüncü taraf iframeleri yüklemek için yeni, geçici bir depolama bölümü oluşturma mekanizması”. Saldırganlar ve savunucular için sonuçlar:
|
||||
|
||||
* Farklı credentialless iframelerdeki **scriptler hala aynı üst düzey kökeni paylaşır** ve DOM aracılığıyla serbestçe etkileşimde bulunabilir, bu da çoklu iframe self-XSS saldırılarını mümkün kılar (aşağıdaki PoC'ye bakın).
|
||||
* Ağ **credential-stripped** olduğu için, iframedeki herhangi bir istek etkili bir şekilde kimlik doğrulaması yapılmamış bir oturum gibi davranır – CSRF korumalı uç noktalar genellikle başarısız olur, ancak DOM aracılığıyla sızdırılabilir kamu sayfaları hala kapsamda kalır.
|
||||
* Farklı credentialless iframelerdeki scriptler **hala aynı üst düzey kökeni paylaşır** ve DOM aracılığıyla serbestçe etkileşimde bulunabilir, bu da çoklu iframe self-XSS saldırılarını mümkün kılar (aşağıdaki PoC'ye bakın).
|
||||
* Ağ **credential-stripped** olduğu için, iframe içindeki herhangi bir istek etkili bir şekilde kimlik doğrulaması yapılmamış bir oturum gibi davranır – CSRF korumalı uç noktalar genellikle başarısız olur, ancak DOM aracılığıyla sızdırılabilir kamu sayfaları hala kapsamda kalır.
|
||||
* Credentialless iframeden oluşturulan pop-up'lar, bazı OAuth akışlarını bozarak örtük bir `rel="noopener"` alır.
|
||||
```javascript
|
||||
// PoC: two same-origin credentialless iframes stealing cookies set by a third
|
||||
@ -217,7 +217,7 @@ alert(window.top[1].document.cookie);
|
||||
|
||||
[Bu makalede](https://blog.slonser.info/posts/make-self-xss-great-again/) belirtildiği gibi, `fetchLater` API'si bir isteğin daha sonra (belirli bir süre sonra) yürütülmesi için yapılandırılmasına olanak tanır. Bu nedenle, örneğin, bir kurbanı bir saldırganın oturumu içinde (Self-XSS ile) oturum açmak, bir `fetchLater` isteği ayarlamak (örneğin, mevcut kullanıcının şifresini değiştirmek için) ve saldırganın oturumundan çıkmak için kötüye kullanılabilir. Ardından, kurban kendi oturumuna giriş yapar ve `fetchLater` isteği yürütülerek, kurbanın şifresi saldırgan tarafından ayarlanan şifreye değiştirilir.
|
||||
|
||||
Bu şekilde, kurban URL'si bir iframe içinde yüklenemese bile (CSP veya diğer kısıtlamalar nedeniyle), saldırgan yine de kurbanın oturumunda bir isteği yürütme yeteneğine sahip olabilir.
|
||||
Bu şekilde, kurbanın URL'si bir iframe içinde yüklenemese bile (CSP veya diğer kısıtlamalar nedeniyle), saldırgan yine de kurbanın oturumunda bir isteği yürütme yeteneğine sahip olabilir.
|
||||
```javascript
|
||||
var req = new Request("/change_rights",{method:"POST",body:JSON.stringify({username:"victim", rights: "admin"}),credentials:"include"})
|
||||
const minute = 60000
|
||||
@ -250,5 +250,5 @@ Aşağıdaki sayfalara göz atın:
|
||||
## Referanslar
|
||||
|
||||
* [PortSwigger Araştırma – CSP'yi aşmak için form kaçırma kullanma (Mart 2024)](https://portswigger.net/research/using-form-hijacking-to-bypass-csp)
|
||||
* [Chrome Geliştiricileri – Iframe kimlik bilgisi olmadan: COEP ortamlarında iframe'leri kolayca gömme (Şub 2023)](https://developer.chrome.com/blog/iframe-credentialless)
|
||||
* [Chrome Geliştiricileri – Iframe kimlik bilgisi olmadan: COEP ortamlarına iframe'leri kolayca gömün (Şub 2023)](https://developer.chrome.com/blog/iframe-credentialless)
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user