Translated ['src/binary-exploitation/rop-return-oriented-programing/srop

This commit is contained in:
Translator 2025-08-19 21:11:58 +00:00
parent 3053d78cd6
commit f8586ace0a
2 changed files with 17 additions and 17 deletions

View File

@ -32,7 +32,7 @@ p = process(binary.path)
p.send(bytes(frame))
p.interactive()
```
## bof przykład
## bof example
### Kod
```c
@ -103,7 +103,7 @@ payload += bytes(frame)
p.sendline(payload)
p.interactive()
```
## bof przykład bez sigreturn
## przykład bof bez sigreturn
### Kod
```c
@ -136,7 +136,7 @@ W sekcji **`vdso`** można znaleźć wywołanie **`sigreturn`** w przesunięciu
<figure><img src="../../../images/image (17) (1).png" alt="" width="563"><figcaption></figcaption></figure>
Dlatego, jeśli zostanie wycieknięty, możliwe jest **użycie tego adresu do uzyskania dostępu do `sigreturn`**, jeśli binarka go nie ładuje:
Dlatego, jeśli zostanie ujawnione, możliwe jest **użycie tego adresu do uzyskania dostępu do `sigreturn`**, jeśli binarka go nie ładuje:
```python
from pwn import *
@ -189,9 +189,9 @@ python3 -m ROPGadget --binary /proc/$(pgrep srop)/mem --only "svc #0" 2>/dev/nul
# With rp++ ≥ 1.0.9 (arm64 support)
rp++ -f ./binary --unique -r | grep "mov\s\+x8, #0x8b" # 0x8b = __NR_rt_sigreturn
```
Oba narzędzia rozumieją **AArch64** kodowania i będą wyświetlać kandydatów na sekwencje `mov x8, 0x8b ; svc #0`, które mogą być użyte jako *gadget SROP*.
Oba narzędzia rozumieją **AArch64** encodings i będą wyświetlać kandydatów na sekwencje `mov x8, 0x8b ; svc #0`, które mogą być użyte jako *SROP gadget*.
> Uwaga: Gdy binaria są kompilowane z **BTI**, pierwsza instrukcja każdego ważnego celu pośredniego skoku to `bti c`. Trampoliny `sigreturn` umieszczone przez linker już zawierają poprawny punkt lądowania BTI, więc gadget pozostaje użyteczny z kodu nieuprzywilejowanego.
> Uwaga: Gdy binaria są kompilowane z **BTI**, pierwsza instrukcja każdego ważnego celu pośredniego jest `bti c`. Trampoliny `sigreturn` umieszczone przez linker już zawierają poprawny BTI landing pad, więc gadget pozostaje użyteczny z kodu nieuprzywilejowanego.
## Łączenie SROP z ROP (pivot przez `mprotect`)
@ -215,7 +215,7 @@ Linux 5.16 wprowadził surowszą walidację ramek sygnałów przestrzeni użytko
* Zarezerwowane słowo w `struct rt_sigframe` musi być zerowe.
* Każdy wskaźnik w rekordzie *extra_context* jest wyrównany i wskazuje wewnątrz przestrzeni adresowej użytkownika.
`pwntools>=4.10` automatycznie tworzy zgodne ramki, ale jeśli budujesz je ręcznie, upewnij się, że zainicjalizujesz *reserved* na zero i pomiń rekord SVE, chyba że naprawdę go potrzebujesz—w przeciwnym razie `rt_sigreturn` dostarczy `SIGSEGV` zamiast zwracać.
`pwntools>=4.10` automatycznie tworzy zgodne ramki, ale jeśli budujesz je ręcznie, upewnij się, że zainicjalizujesz *reserved* na zero i pomiń rekord SVE, chyba że naprawdę go potrzebujesz—w przeciwnym razie `rt_sigreturn` zwróci `SIGSEGV` zamiast powrotu.
Zaczynając od mainstreamowego Androida 14 i Fedory 38, przestrzeń użytkownika jest kompilowana z włączonym **PAC** (*Pointer Authentication*) i **BTI** domyślnie (`-mbranch-protection=standard`). *SROP* sam w sobie nie jest dotknięty, ponieważ jądro bezpośrednio nadpisuje `PC` z utworzonej ramki, omijając uwierzytelniony LR zapisany na stosie; jednak każdy **kolejny łańcuch ROP**, który wykonuje pośrednie skoki, musi skakać do instrukcji włączających BTI lub adresów PAC. Pamiętaj o tym przy wyborze gadżetów.

View File

@ -45,7 +45,7 @@ var secret = "child secret"
alert(parent.secret)
</script>
```
Jeśli uzyskasz dostęp do poprzedniego html za pomocą serwera http (takiego jak `python3 -m http.server`), zauważysz, że wszystkie skrypty będą wykonywane (ponieważ nie ma CSP, które by temu zapobiegało). **Rodzic nie będzie mógł uzyskać dostępu do zmiennej `secret` wewnątrz żadnego iframe** i **tylko iframes if2 i if3 (które są uważane za tej samej witryny) mogą uzyskać dostęp do sekretu** w oryginalnym oknie.\
Jeśli uzyskasz dostęp do poprzedniego html za pomocą serwera http (takiego jak `python3 -m http.server`), zauważysz, że wszystkie skrypty będą wykonywane (ponieważ nie ma CSP, które by temu zapobiegało). **Rodzic nie będzie mógł uzyskać dostępu do zmiennej `secret` wewnątrz żadnego iframe** i **tylko iframes if2 i if3 (które są uważane za tej samej witryny) mogą uzyskać dostęp do secret** w oryginalnym oknie.\
Zauważ, że if4 jest uważany za mający `null` origin.
### Iframes z CSP <a href="#iframes_with_csp_40" id="iframes_with_csp_40"></a>
@ -53,8 +53,8 @@ Zauważ, że if4 jest uważany za mający `null` origin.
> [!TIP]
> Proszę zauważyć, że w poniższych obejściach odpowiedź na stronę w iframe nie zawiera żadnego nagłówka CSP, który zapobiega wykonaniu JS.
Wartość `self` dla `script-src` nie pozwoli na wykonanie kodu JS przy użyciu protokołu `data:` lub atrybutu `srcdoc`.\
Jednak nawet wartość `none` CSP pozwoli na wykonanie iframe'ów, które umieszczają adres URL (pełny lub tylko ścieżkę) w atrybucie `src`.\
Wartość `self` dla `script-src` nie pozwoli na wykonanie kodu JS używając protokołu `data:` lub atrybutu `srcdoc`.\
Jednak nawet wartość `none` CSP pozwoli na wykonanie iframe, które umieszczają URL (pełny lub tylko ścieżkę) w atrybucie `src`.\
Dlatego możliwe jest obejście CSP strony za pomocą:
```html
<html>
@ -77,7 +77,7 @@ src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert
</html>
```
Zauważ, że **poprzedni CSP zezwala tylko na wykonanie skryptu inline**.\
Jednak **wykonane zostaną tylko skrypty `if1` i `if2`, ale tylko `if1` będzie miał dostęp do tajemnicy rodzica**.
Jednakże, **tylko skrypty `if1` i `if2` będą wykonywane, ale tylko `if1` będzie miał dostęp do tajemnicy rodzica**.
![](<../../images/image (372).png>)
@ -107,7 +107,7 @@ app.run()
Społeczność badawcza nadal odkrywa kreatywne sposoby wykorzystywania iframe do pokonywania restrykcyjnych polityk. Poniżej znajdują się najbardziej znaczące techniki opublikowane w ciągu ostatnich kilku lat:
* **Dangling-markup / named-iframe data-exfiltration (PortSwigger 2023)** Gdy aplikacja odzwierciedla HTML, ale silny CSP blokuje wykonanie skryptów, można nadal wyciekować wrażliwe tokeny, wstrzykując *dangling* `<iframe name>` atrybut. Gdy częściowy markup jest analizowany, skrypt atakującego działający w osobnym pochodzeniu nawiguję ramkę do `about:blank` i odczytuje `window.name`, które teraz zawiera wszystko do następnego znaku cudzysłowu (na przykład token CSRF). Ponieważ żaden JavaScript nie działa w kontekście ofiary, atak zazwyczaj omija `script-src 'none'`. Minimalny PoC to:
* **Dangling-markup / named-iframe data-exfiltration (PortSwigger 2023)** Gdy aplikacja odzwierciedla HTML, ale silny CSP blokuje wykonanie skryptów, można nadal wyciekować wrażliwe tokeny, wstrzykując atrybut `<iframe name>` z *dangling*. Gdy częściowy markup zostanie sparsowany, skrypt atakującego działający w innym pochodzeniu nawiguję ramkę do `about:blank` i odczytuje `window.name`, które teraz zawiera wszystko do następnego znaku cudzysłowu (na przykład token CSRF). Ponieważ żaden JavaScript nie działa w kontekście ofiary, atak zazwyczaj omija `script-src 'none'`. Minimalny PoC to:
```html
<!-- Punkt wstrzyknięcia tuż przed wrażliwym <script> -->
@ -120,7 +120,7 @@ victim.location = 'about:blank';
console.log(victim.name); // → wyciekła wartość
```
* **Kradzież nonce za pomocą iframe o tym samym pochodzeniu (2024)** Nonce CSP nie są usuwane z DOM; są jedynie ukryte w DevTools. Jeśli atakujący może wstrzyknąć *iframe o tym samym pochodzeniu* (na przykład przez przesłanie HTML na stronę), ramka podrzędna może po prostu zapytać `document.querySelector('[nonce]').nonce` i stworzyć nowe węzły `<script nonce>`, które spełniają politykę, dając pełne wykonanie JavaScript mimo `strict-dynamic`. Następujący gadżet eskaluje wstrzyknięcie markup do XSS:
* **Kradzież nonce za pomocą iframe o tym samym pochodzeniu (2024)** Nonce CSP nie są usuwane z DOM; są jedynie ukryte w DevTools. Jeśli atakujący może wstrzyknąć iframe o *tym samym pochodzeniu* (na przykład przez przesłanie HTML na stronę), ramka podrzędna może po prostu zapytać `document.querySelector('[nonce]').nonce` i stworzyć nowe węzły `<script nonce>`, które spełniają politykę, dając pełne wykonanie JavaScript mimo `strict-dynamic`. Następujący gadżet eskaluje wstrzyknięcie markup do XSS:
```javascript
const n = top.document.querySelector('[nonce]').nonce;
@ -130,7 +130,7 @@ s.nonce = n;
top.document.body.appendChild(s);
```
* **Przechwytywanie form-action (PortSwigger 2024)** Strona, która pomija dyrektywę `form-action`, może mieć swój formularz logowania *przeadresowany* z wstrzykniętego iframe lub inline HTML, tak aby menedżery haseł automatycznie wypełniały i przesyłały dane uwierzytelniające do zewnętrznej domeny, nawet gdy `script-src 'none'` jest obecny. Zawsze uzupełniaj `default-src` o `form-action`!
* **Przechwytywanie form-action (PortSwigger 2024)** Strona, która pomija dyrektywę `form-action`, może mieć swój formularz logowania *przekierowany* z wstrzykniętego iframe lub inline HTML, tak aby menedżery haseł automatycznie wypełniały i przesyłały dane logowania do zewnętrznej domeny, nawet gdy `script-src 'none'` jest obecne. Zawsze uzupełniaj `default-src` o `form-action`!
**Notatki obronne (szybka lista kontrolna)**
@ -164,11 +164,11 @@ Gdy jest używany, atrybut `sandbox` nakłada kilka ograniczeń:
- Zapobiega interakcji linków z innymi kontekstami przeglądania.
- Użycie wtyczek za pomocą `<embed>`, `<object>`, `<applet>` lub podobnych tagów jest zabronione.
- Nawigacja w górnym kontekście przeglądania przez samą zawartość jest zablokowana.
- Funkcje, które są uruchamiane automatycznie, takie jak odtwarzanie wideo czy automatyczne skupienie na kontrolkach formularza, są blokowane.
- Funkcje, które są uruchamiane automatycznie, takie jak odtwarzanie wideo lub automatyczne skupianie na kontrolkach formularzy, są blokowane.
Tip: Nowoczesne przeglądarki obsługują szczegółowe flagi, takie jak `allow-scripts`, `allow-same-origin`, `allow-top-navigation-by-user-activation`, `allow-downloads-without-user-activation` itp. Połącz je, aby przyznać tylko minimalne możliwości wymagane przez osadzoną aplikację.
Tip: Nowoczesne przeglądarki obsługują szczegółowe flagi, takie jak `allow-scripts`, `allow-same-origin`, `allow-top-navigation-by-user-activation`, `allow-downloads-without-user-activation` itd. Połącz je, aby przyznać tylko minimalne możliwości wymagane przez osadzoną aplikację.
Wartość atrybutu może być pozostawiona pusta (`sandbox=""`), aby zastosować wszystkie powyższe ograniczenia. Alternatywnie, może być ustawiona na listę wartości oddzielonych spacjami, które zwalniają iframe z niektórych ograniczeń.
Wartość atrybutu może być pozostawiona pusta (`sandbox=""`), aby zastosować wszystkie powyższe ograniczenia. Alternatywnie, może być ustawiona na listę specyficznych wartości oddzielonych spacjami, które zwalniają iframe z niektórych ograniczeń.
```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>
@ -177,7 +177,7 @@ Wartość atrybutu może być pozostawiona pusta (`sandbox=""`), aby zastosować
Jak wyjaśniono w [tym artykule](https://blog.slonser.info/posts/make-self-xss-great-again/), flaga `credentialless` w iframe jest używana do ładowania strony wewnątrz iframe bez wysyłania poświadczeń w żądaniu, zachowując jednocześnie politykę tego samego pochodzenia (SOP) ładowanej strony w iframe.
Od **Chrome 110 (luty 2023) funkcja jest włączona domyślnie** i specyfikacja jest standaryzowana w przeglądarkach pod nazwą *anonymous iframe*. MDN opisuje to jako: „mechanizm do ładowania iframe'ów stron trzecich w nowej, efemerycznej partycji pamięci, aby żadne pliki cookie, localStorage ani IndexedDB nie były dzielone z rzeczywistym pochodzeniem”. Konsekwencje dla atakujących i obrońców:
Od **Chrome 110 (luty 2023) funkcja jest włączona domyślnie** i specyfikacja jest standaryzowana w przeglądarkach pod nazwą *anonymous iframe*. MDN opisuje to jako: „mechanizm do ładowania iframe'ów zewnętrznych w nowej, efemerycznej partycji pamięci, aby żadne ciasteczka, localStorage ani IndexedDB nie były dzielone z prawdziwym pochodzeniem”. Konsekwencje dla atakujących i obrońców:
* Skrypty w różnych iframe'ach bez poświadczeń **wciąż dzielą to samo pochodzenie na najwyższym poziomie** i mogą swobodnie wchodzić w interakcje za pośrednictwem DOM, co czyni ataki multi-iframe self-XSS wykonalnymi (zobacz PoC poniżej).
* Ponieważ sieć jest **pozbawiona poświadczeń**, każde żądanie wewnątrz iframe działa efektywnie jako sesja nieautoryzowana punkty końcowe chronione przed CSRF zazwyczaj zawodzą, ale publiczne strony, które można wyciekować za pośrednictwem DOM, wciąż są w zasięgu.