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

This commit is contained in:
Translator 2025-08-19 21:11:56 +00:00
parent c3df6156d0
commit 6712012a66
2 changed files with 18 additions and 18 deletions

View File

@ -74,7 +74,7 @@ echo 0 | sudo tee /proc/sys/kernel/randomize_va_space # Disable ASLR
```
## Exploit
यह एक्सप्लॉइट bof का उपयोग **`sigreturn`** को कॉल करने के लिए करता है और स्टैक को **`execve`** को `/bin/sh` के पॉइंटर के साथ कॉल करने के लिए तैयार करता है
यह एक्सप्लॉइट bof का दुरुपयोग करता है ताकि **`sigreturn`** को कॉल पर वापस लौट सके और स्टैक को **`execve`** को `/bin/sh` के पॉइंटर के साथ कॉल करने के लिए तैयार कर सके
```python
from pwn import *
@ -191,7 +191,7 @@ rp++ -f ./binary --unique -r | grep "mov\s\+x8, #0x8b" # 0x8b = __NR_rt_sigret
```
दोनों उपकरण **AArch64** एन्कोडिंग को समझते हैं और संभावित `mov x8, 0x8b ; svc #0` अनुक्रमों को सूचीबद्ध करेंगे जिन्हें *SROP गेजेट* के रूप में उपयोग किया जा सकता है।
> नोट: जब बाइनरी को **BTI** के साथ संकलित किया जाता है, तो हर मान्य अप्रत्यक्ष शाखा लक्ष्य का पहला निर्देश `bti c` होता है। लिंक द्वारा रखे गए `sigreturn` ट्रैम्पोलिन पहले से ही सही BTI लैंडिंग पैड शामिल करते हैं, इसलिए गेजेट अप्रिविलेज्ड कोड से उपयोग रहता है।
> नोट: जब बाइनरी को **BTI** के साथ संकलित किया जाता है, तो हर मान्य अप्रत्यक्ष शाखा लक्ष्य का पहला निर्देश `bti c` होता है। लिंक द्वारा रखे गए `sigreturn` ट्रैम्पोलिन पहले से ही सही BTI लैंडिंग पैड शामिल करते हैं, इसलिए गेजेट अप्रिविलेज्ड कोड से उपयोग करने योग्य रहता है।
## SROP को ROP के साथ जोड़ना (pivot `mprotect` के माध्यम से)
@ -215,7 +215,7 @@ Linux 5.16 ने उपयोगकर्ता स्पेस सिग्न
* `struct rt_sigframe` में आरक्षित शब्द शून्य होना चाहिए।
* *extra_context* रिकॉर्ड में हर पॉइंटर संरेखित है और उपयोगकर्ता एड्रेस स्पेस के अंदर इंगित करता है।
`pwntools>=4.10` स्वचालित रूप से अनुपालन फ्रेम बनाता है, लेकिन यदि आप उन्हें मैन्युअल रूप से बनाते हैं तो सुनिश्चित करें कि *reserved* को शून्य-प्रारंभ करें और SVE रिकॉर्ड को छोड़ दें जब तक कि आपको वास्तव में इसकी आवश्यकता न हो—अन्यथा `rt_sigreturn` `SIGSEGV` ेगा बजाय इसके कि लौटे।
`pwntools>=4.10` स्वचालित रूप से अनुपालन फ्रेम बनाता है, लेकिन यदि आप उन्हें मैन्युअल रूप से बनाते हैं तो सुनिश्चित करें कि *reserved* को शून्य-प्रारंभ करें और SVE रिकॉर्ड को छोड़ दें जब तक कि आपको वास्तव में इसकी आवश्यकता न हो—अन्यथा `rt_sigreturn` `SIGSEGV` भेजेगा बजाय इसके कि लौटे।
मुख्यधारा Android 14 और Fedora 38 से शुरू होकर, उपयोगकर्ता भूमि को **PAC** (*Pointer Authentication*) और **BTI** डिफ़ॉल्ट रूप से सक्षम किया गया है (`-mbranch-protection=standard`)। *SROP* स्वयं अप्रभावित है क्योंकि कर्नेल सीधे निर्मित फ्रेम से `PC` को ओवरराइट करता है, स्टैक पर सहेजे गए प्रमाणित LR को बायपास करता है; हालाँकि, कोई भी **पश्चात ROP चेन** जो अप्रत्यक्ष शाखाएँ करती है, उसे BTI- सक्षम निर्देशों या PACed पतों पर कूदना चाहिए। जब गैजेट्स का चयन करते समय इसे ध्यान में रखें।

View File

@ -7,8 +7,8 @@
एक iframed पृष्ठ की सामग्री को इंगित करने के 3 तरीके हैं:
- `src` के माध्यम से एक URL को इंगित करना (URL क्रॉस ओरिजिन या समान ओरिजिन हो सकता है)
- `src` के माध्यम से `data:` प्रोटोकॉल का उपयोग करके सामग्री को इंगित करना
- `srcdoc` के माध्यम से सामग्री को इंगित करना
- `data:` प्रोटोकॉल का उपयोग करके सामग्री को इंगित करने के लिए `src` के मध्यम से
- सामग्री को इंगित करने के लिए `srcdoc` के माध्यम से
**Parent & Child vars तक पहुँच**
```html
@ -45,7 +45,7 @@ var secret = "child secret"
alert(parent.secret)
</script>
```
यदि आप पिछले html को http सर्वर (जैसे `python3 -m http.server`) के माध्यम से एक्सेस करते हैं, तो आप देखेंगे कि सभी स्क्रिप्ट्स निष्पादित होंगी (क्योंकि इसे रोकने के लिए कोई CSP नहीं है)।, **माता-पिता किसी भी iframe के अंदर `secret` var तक पहुँच नहीं पाएंगे** और **केवल if2 और if3 (जिन्हें समान-साइट माना जाता है) ही मूल विंडो में secret तक पहुँच सकते हैं।**\
यदि आप पिछले HTML को HTTP सर्वर (जैसे `python3 -m http.server`) के माध्यम से एक्सेस करते हैं, तो आप देखेंगे कि सभी स्क्रिप्ट्स निष्पादित होंगी (क्योंकि इसे रोकने के लिए कोई CSP नहीं है)।, **माता-पिता किसी भी iframe के अंदर `secret` var तक पहुँच नहीं पाएंगे** और **केवल iframes if2 और if3 (जिन्हें समान-साइट माना जाता है) ही मूल विंडो में secret तक पहुँच सकते हैं।**\
ध्यान दें कि if4 को `null` उत्पत्ति माना जाता है।
### CSP के साथ Iframes <a href="#iframes_with_csp_40" id="iframes_with_csp_40"></a>
@ -77,13 +77,13 @@ src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert
</html>
```
ध्यान दें कि **पिछला CSP केवल इनलाइन स्क्रिप्ट के निष्पादन की अनुमति देता है**।\
हालांकि, **केवल `if1` और `if2` स्क्रिप्ट्स निष्पादित होने जा रही हैं लेकिन केवल `if1` ही पैरेंट सीक्रेट तक पहुच सकेगा**।
हालांकि, **केवल `if1` और `if2` स्क्रिप्ट्स निष्पादित होने जा रही हैं लेकिन केवल `if1` ही पैरेंट सीक्रेट तक पहुच सकेगा**।
![](<../../images/image (372).png>)
इसलिए, यह संभव है कि **यदि आप सर्वर पर एक JS फ़ाइल अपलोड कर सकते हैं और इसे iframe के माध्यम से लोड कर सकते हैं, तो CSP को बायपास किया जा सकता है, भले ही `script-src 'none'` हो**। यह **संभावित रूप से एक ही साइट JSONP एंडपॉइंट का दुरुपयोग करके भी किया जा सकता है**
आप इस परिदृश्य के साथ इसका परीक्षण कर सकते हैं जहा एक कुकी चुराई जाती है, भले ही `script-src 'none'` हो। बस एप्लिकेशन चलाए और इसे अपने ब्राउज़र के साथ एक्सेस करें:
आप इस परिदृश्य के साथ इसका परीक्षण कर सकते हैं जहा एक कुकी चुराई जाती है, भले ही `script-src 'none'` हो। बस एप्लिकेशन चलाए और इसे अपने ब्राउज़र के साथ एक्सेस करें:
```python
import flask
from flask import Flask
@ -120,7 +120,7 @@ victim.location = 'about:blank';
console.log(victim.name); // → leaked value
```
* **Nonce theft via same-origin iframe (2024)** CSP nonces DOM से हटा नहीं जाते; वे केवल DevTools में छिपे होते हैं। यदि एक हमलावर *same-origin* iframe इंजेक्ट कर सकता है (उदाहरण के लिए साइट पर HTML अपलोड करके) तो चाइल्ड फ्रेम सरलता से `document.querySelector('[nonce]').nonce` को क्वेरी कर सकता है और नई `<script nonce>` नोड्स बना सकता है जो नीति को संतुष्ट करती हैं, जिससे `strict-dynamic` के बावजूद पूर्ण JavaScript निष्पादन मिलता है। निम्नलिखित गैजेट एक मार्कअप इंजेक्शन को XSS में बढ़ाता है:
* **Nonce theft via same-origin iframe (2024)** CSP nonces DOM से हटा नहीं जाते; वे केवल DevTools में छिपे होते हैं। यदि एक हमलावर *same-origin* iframe इंजेक्ट कर सकता है (उदाहरण के लिए साइट पर HTML अपलोड करके) तो चाइल्ड फ्रेम बस `document.querySelector('[nonce]').nonce` को क्वेरी कर सकता है और नई `<script nonce>` नोड्स बना सकता है जो नीति को संतुष्ट करती हैं, जिससे `strict-dynamic` के बावजूद पूर्ण JavaScript निष्पादन मिलता है। निम्नलिखित गैजेट एक मार्कअप इंजेक्शन को XSS में बढ़ाता है:
```javascript
const n = top.document.querySelector('[nonce]').nonce;
@ -130,12 +130,12 @@ s.nonce = n;
top.document.body.appendChild(s);
```
* **Form-action hijacking (PortSwigger 2024)** एक पृष्ठ जो `form-action` निर्देश को छोड़ता है, उसके लॉगिन फॉर्म को एक इंजेक्टेड iframe या इनलाइन HTML से *re-targeted* किया जा सकता है ताकि पासवर्ड प्रबंधक स्वचालित रूप से क्रेडेंशियल्स को एक बाहरी डोमेन में भरें और सबमिट करें, भले ही `script-src 'none'` मौजूद हो। हमेशा `default-src` को `form-action` के साथ पूरा करें!
* **Form-action hijacking (PortSwigger 2024)** एक पृष्ठ जो `form-action` निर्देश को छोड़ देता है, उसके लॉगिन फॉर्म को एक इंजेक्टेड iframe या इनलाइन HTML से *re-targeted* किया जा सकता है ताकि पासवर्ड प्रबंधक स्वचालित रूप से क्रेडेंशियल्स को एक बाहरी डोमेन में भरें और सबमिट करें, भले ही `script-src 'none'` मौजूद हो। हमेशा `default-src` को `form-action` के साथ पूरा करें!
**Defensive notes (quick checklist)**
1. हमेशा *सभी* CSP निर्देश भेजें जो द्वितीयक संदर्भों को नियंत्रित करते हैं (`form-action`, `frame-src`, `child-src`, `object-src`, आदि)।
2. गुप्त होने के लिए nonces पर भरोसा न करें—`strict-dynamic` **और** इंजेक्शन बिंदुओं को समाप्त करें।
2. गुप्त होने पर nonces पर भरोसा न करें—`strict-dynamic` **और** इंजेक्शन बिंदुओं को समाप्त करें।
3. जब आपको अविश्वसनीय दस्तावेज़ों को एम्बेड करना हो तो `sandbox="allow-scripts allow-same-origin"` **बहुत सावधानी से** (या यदि आपको केवल स्क्रिप्ट निष्पादन अलगाव की आवश्यकता है तो बिना `allow-same-origin` के) उपयोग करें।
4. एक रक्षा-में-गहराई COOP+COEP तैनाती पर विचार करें; नया `<iframe credentialless>` विशेषता (§ नीचे) आपको ऐसा करने की अनुमति देता है बिना तीसरे पक्ष के एम्बेड्स को तोड़े।
@ -153,7 +153,7 @@ src='data:text/html,<script defer="true" src="data:text/javascript,document.body
```
### Iframe sandbox
एक iframe के भीतर का सामग्री `sandbox` विशेषता के उपयोग के माध्यम से अतिरिक्त प्रतिबंधों के अधीन हो सकता है। डिफ़ॉल्ट रूप से, यह विशेषता लागू नहीं होती है, जिसका अर्थ है कि कोई प्रतिबंध नहीं है।
एक iframe के भीतर की सामग्री को `sandbox` विशेषता के उपयोग के माध्यम से अतिरिक्त प्रतिबंधों के अधीन किया जा सकता है। डिफ़ॉल्ट रूप से, यह विशेषता लागू नहीं होती है, जिसका अर्थ है कि कोई प्रतिबंध नहीं है।
जब उपयोग किया जाता है, तो `sandbox` विशेषता कई सीमाएँ लगाती है:
@ -163,7 +163,7 @@ src='data:text/html,<script defer="true" src="data:text/javascript,document.body
- कुछ APIs तक पहुँच अक्षम है।
- यह लिंक को अन्य ब्राउज़िंग संदर्भों के साथ बातचीत करने से रोकता है।
- `<embed>`, `<object>`, `<applet>` या समान टैग के माध्यम से प्लगइन्स का उपयोग निषिद्ध है।
- सामग्री के शीर्ष स्तर के ब्राउज़िंग संदर्भ में सामग्री द्वारा नेविगेशन को रोका जाता है।
- सामग्री द्वारा स्वयं के शीर्ष-स्तरीय ब्राउज़िंग संदर्भ में नेविगेशन को रोका जाता है।
- स्वचालित रूप से सक्रिय होने वाली सुविधाएँ, जैसे वीडियो प्लेबैक या फॉर्म नियंत्रणों का ऑटो-फोकस, अवरुद्ध होती हैं।
Tip: आधुनिक ब्राउज़र्स ग्रैन्युलर फ्लैग्स का समर्थन करते हैं जैसे `allow-scripts`, `allow-same-origin`, `allow-top-navigation-by-user-activation`, `allow-downloads-without-user-activation`, आदि। उन्हें संयोजित करें ताकि केवल एम्बेडेड एप्लिकेशन द्वारा आवश्यक न्यूनतम क्षमताएँ प्रदान की जा सकें।
@ -175,7 +175,7 @@ Tip: आधुनिक ब्राउज़र्स ग्रैन्यु
```
### Credentialless iframes
जैसा कि [इस लेख](https://blog.slonser.info/posts/make-self-xss-great-again/) में बताया गया है, एक iframe में `credentialless` फ्लैग का उपयोग बिना क्रेडेंशियल्स भेजे एक पृष्ठ को iframe के अंदर लोड करने के लिए किया जाता है, जबकि iframe में लोड किए गए पृष्ठ की समान मूल नीति (SOP) को बनाए रखा जाता है।
जैसा कि [इस लेख](https://blog.slonser.info/posts/make-self-xss-great-again/) में बताया गया है, एक iframe में `credentialless` फ्लैग का उपयोग बिना अनुरोध में क्रेडेंशियल भेजे एक पृष्ठ को iframe के अंदर लोड करने के लिए किया जाता है, जबकि iframe में लोड किए गए पृष्ठ की समान मूल नीति (SOP) को बनाए रखा जाता है।
चूंकि **Chrome 110 (फरवरी 2023) में यह सुविधा डिफ़ॉल्ट रूप से सक्षम है** और यह स्पेक सभी ब्राउज़रों में *anonymous iframe* के नाम से मानकीकृत किया जा रहा है। MDN इसे इस प्रकार वर्णित करता है: “तीसरे पक्ष के iframes को एक नए, अस्थायी स्टोरेज विभाजन में लोड करने का एक तंत्र ताकि कोई कुकीज़, localStorage या IndexedDB वास्तविक मूल के साथ साझा न हों।” हमलावरों और रक्षकों के लिए परिणाम:
@ -225,7 +225,7 @@ let arr = [minute, minute * 60, minute * 60 * 24, ...]
for (let timeout of arr)
fetchLater(req,{activateAfter: timeout})
```
## SOP में Iframes
## Iframes in SOP
निम्नलिखित पृष्ठों की जांच करें:
@ -247,8 +247,8 @@ fetchLater(req,{activateAfter: timeout})
## संदर्भ
## References
* [PortSwigger Research CSP को बायपास करने के लिए फॉर्म हाईजैकिंग का उपयोग करना (मार्च 2024)](https://portswigger.net/research/using-form-hijacking-to-bypass-csp)
* [Chrome Developers Iframe credentialless: COEP वातावरण में आसानी से iframes एम्बेड करें (फरवरी 2023)](https://developer.chrome.com/blog/iframe-credentialless)
* [PortSwigger Research Using form hijacking to bypass CSP (March 2024)](https://portswigger.net/research/using-form-hijacking-to-bypass-csp)
* [Chrome Developers Iframe credentialless: Easily embed iframes in COEP environments (Feb 2023)](https://developer.chrome.com/blog/iframe-credentialless)
{{#include ../../banners/hacktricks-training.md}}