
CVE-2021-21972 – VMware क्लाइंट अनधिकृत कोड इंजेक्शन (ʀᴄᴇ)
[CVE-2021-21972] VMware vSphere Client अनधिकृत फ़ाइल अपलोड से रिमोट कोड एक्सेक्यूशन (RCE)
vSphere Web Client (HTML5) अनिवार्य रूप से एक प्रशासनिक इंटरफ़ेस है जो vSphere इंस्टॉलेशन के प्रबंधन को सक्षम बनाता है। vSphere Client प्रशासक को vSphere सर्वर तक सीधे पहुँच की आवश्यकता के बिना vSphere के प्रमुख कार्यों तक पहुँच प्रदान करता है। यह प्रशासकों को नई वर्चुअल मशीनें बनाने और मौजूदा मशीनों तथा उनके संसाधनों को प्रबंधित करने की अनुमति देता है। एक क्रॉस-प्लेटफ़ॉर्म वेब एप्लिकेशन के रूप में, इसे विभिन्न वेब ब्राउज़रों के समर्थित संस्करणों के माध्यम से सभी समर्थित ऑपरेटिंग सिस्टम पर उपयोग किया जा सकता है।
CVE-2021-21972 vCenter Server में एक अनधिकृत फ़ाइल अपलोड भेद्यता है जो रिमोट सर्वर पर रिमोट कोड एक्सेक्यूशन की ओर ले जाती है। यह समस्या vRealize Operations vCenter Plugin में प्रमाणीकरण की कमी से उत्पन्न होती है। इसे 10.0 में से 9.8 का गंभीर CVSSv3 स्कोर प्राप्त हुआ। एक अनप्रमाणित, रिमोट हमलावर सार्वजनिक रूप से सुलभ कमजोर vCenter Server एंडपॉइंट पर एक विशेष रूप से तैयार की गई फ़ाइल अपलोड करके इस भेद्यता का शोषण कर सकता है। VMware vCenter Server संस्करण 6.5, 6.7 और 7.0 इस भेद्यता से प्रभावित हैं। इस भेद्यता का सफलतापूर्वक शोषण करने पर हमलावर को vCenter Server के अंतर्निहित ऑपरेटिंग सिस्टम में अप्रतिबंधित रिमोट कोड एक्सेक्यूशन (RCE) विशेषाधिकार प्राप्त होंगे। इस तथ्य के बावजूद कि यह भेद्यता vRealize Operations vCenter Plugin से उत्पन्न होती है, VMware सलाहकार पुष्टि करता है कि यह प्लगइन vCenter Server की सभी डिफ़ॉल्ट इंस्टॉलेशन में शामिल है। इसका मतलब है कि कमजोर एंडपॉइंट vRealize Operations की उपस्थिति के बावजूद उपलब्ध है।
मूल ब्लॉगपोस्ट यहाँ में, भेद्यता की खोज को यथासंभव विस्तार से समझाया गया है, साथ ही RCE प्राप्त करने के दो अलग-अलग तरीके भी बताए गए हैं। Windows सिस्टम के लिए, एक हमलावर अंतर्निहित ऑपरेटिंग सिस्टम पर NT AUTHORITY\SYSTEM विशेषाधिकार प्राप्त करने के लिए एक विशेष रूप से तैयार की गई .jsp फ़ाइल अपलोड कर सकता है। Linux सिस्टम के लिए, एक हमलावर को सर्वर के authorized_keys पथ पर एक सार्वजनिक कुंजी उत्पन्न और अपलोड करनी होगी, और फिर vsphere-ui उपयोगकर्ता विशेषाधिकार प्राप्त करने के लिए SSH के माध्यम से कमजोर सर्वर से कनेक्ट करना होगा। (यदि SSH सेवा चल रही है और नेटवर्क पर सुलभ है)
vropsplugin-service.jar vropspluginui प्लगइन की एक जावा आर्काइव फ़ाइल है और इसमें कुछ क्लासेस और अन्य संबंधित फ़ंक्शन तथा मेथड शामिल हैं। कोड का कमजोर हिस्सा नीचे दर्शाया गया है। यह कोड स्निपेट vropsplugin-service.jar के कंट्रोलर में ServicesController.class से संबंधित है। जैसा कि आप नीचे दिए गए कोड स्निपेट में देख सकते हैं, uploadOvaFile फ़ंक्शन उस एंडपॉइंट/URL /ui/vropspluginui/rest/services/uploadova के लिए ज़िम्मेदार है
कमजोर क्लास का पूरा पथ: vropsplugin-service\com\vmware\vropspluginui\mvc\ServicesController.class
@RequestMapping(value = {"/uploadova"}, method = {RequestMethod.POST})
public void uploadOvaFile(@RequestParam(value = "uploadFile", required = true) CommonsMultipartFile uploadFile, HttpServletResponse response) throws Exception {
logger.info("Entering uploadOvaFile api");
int code = uploadFile.isEmpty() ? 400 : 200;
PrintWriter wr = null;
try {
if (code != 200) {
response.sendError(code, "Arguments Missing");
return;
}
wr = response.getWriter();
} catch (IOException e) {
e.printStackTrace();
logger.info("upload Ova Controller Ended With Error");
}
response.setStatus(code);
String returnStatus = "SUCCESS";
if (!uploadFile.isEmpty())
try {
logger.info("Downloading OVA file has been started");
logger.info("Size of the file received : " + uploadFile.getSize());
InputStream inputStream = uploadFile.getInputStream();
File dir = new File("/tmp/unicorn_ova_dir");
if (!dir.exists()) {
dir.mkdirs();
} else {
String[] entries = dir.list();
for (String str : entries) {
File currentFile = new File(dir.getPath(), str);
currentFile.delete();
}
logger.info("Successfully cleaned : /tmp/unicorn_ova_dir");
}
TarArchiveInputStream in = new TarArchiveInputStream(inputStream);
TarArchiveEntry entry = in.getNextTarEntry();
List<String> result = new ArrayList<String>();
while (entry != null) {
if (entry.isDirectory()) {
entry = in.getNextTarEntry();
continue;
}
File curfile = new File("/tmp/unicorn_ova_dir", entry.getName());
File parent = curfile.getParentFile();
if (!parent.exists())
parent.mkdirs();
OutputStream out = new FileOutputStream(curfile);
IOUtils.copy((InputStream)in, out);
out.close();
result.add(entry.getName());
entry = in.getNextTarEntry();
}
in.close();
logger.info("Successfully deployed File at Location :/tmp/unicorn_ova_dir");
} catch (Exception e) {
logger.error("Unable to upload OVA file :" + e);
returnStatus = "FAILED";
}
wr.write(returnStatus);
wr.flush();
wr.close();
}
हमलावर के दृष्टिकोण से, इस क्लास का हैंडलर निम्नलिखित क्रियाएँ कर रहा है
uploadFile पैरामीटर प्राप्त करना (पंक्ति 2)uploadFile पैरामीटर पढ़ना और इस पैरामीटर की सामग्री को inputStream वेरिएबल में लिखना (पंक्ति 22)/tmp/unicorn_ova_dir + entry.getName() (पंक्ति 42 और 47)प्रूफ ऑफ कॉन्सेप्ट: इस भेद्यता का शोषण करने के लिए, आप निम्नलिखित चरणों का उपयोग कर सकते हैं
../../ हो/statsreport/uploadedFileName.jspभेद्यता सत्यापित करने के लिए, आप निम्नलिखित अनुरोध का उपयोग कर सकते हैं
GET /ui/vropspluginui/rest/services/getstatus HTTP/1.1
Host: vulnerablehost
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36
Connection: close
यदि उपरोक्त अनुरोध की प्रतिक्रिया नीचे दिए गए प्रतिक्रियाओं के समान है, तो इसका मतलब है कि रिमोट होस्ट CVE-2021-21972 के प्रति कमजोर है
HTTP/1.1 200
Strict-Transport-Security: max-age=30758400;includeSubDomains
X-XSS-Protection: 1; mode=block
Set-Cookie: VSPHERE-UI-JSESSIONID=35CB9D3F277D6B8413F099F93FB3A5CE; Path=/ui; Secure; HttpOnly
Content-Type: text/plain;charset=ISO-8859-1
Content-Length: 141
Date: Tue, 06 Apr 2021 14:32:30 GMT
Connection: close
Server: Anonymous
{"States":"[]","Install Progress":"UNKNOWN","Config Progress":"UNKNOWN","Config Final Progress":"UNKNOWN","Install Final Progress":"UNKNOWN"}
HTTP/1.0 200 OK
strict-transport-security: max-age=30758400;includeSubDomains
x-xss-protection: 1; mode=block
set-cookie: VSPHERE-UI-JSESSIONID=3D8FE882F9BD3DD1C66C10DFD00022C9; Path=/ui; Secure; HttpOnly
content-type: text/plain;charset=ISO-8859-1
content-length: 374
date: Tue, 06 Apr 2021 14:33:22 GMT
server: envoy
x-envoy-upstream-service-time: 1
connection: close
{"States":"[OVF_DEPLOY_START, OVF_DEPLOY_IN_PROGRESS, OVF_DEPLOY_SUCCESS, VROPS_CONFIGURATION_START, VROPS_CONFIGURE_MASTER_START, VROPS_INIT_CLUSTER_START, VROPS_INIT_CLUSTER_ERROR, VROPS_CONFIGURATION_SUCCESS]","Install Progress":"UNKNOWN","Config Progress":"VROPS_CONFIGURATION_SUCCESS","Config Final Progress":"CONFIGURE_VROPS_FAILED","Install Final Progress":"UNKNOWN"}