
webmod v0.48 में भेद्यता के लिए PoC कोड। मूल रूप से 2007 में लिखा गया, CVE-2007-1260 निर्दिष्ट किया गया।
द्वारा cybermind (Kevin Masterson)
[email protected]
WebMod साइट (पुरालेखित): https://web.archive.org/web/20080517044559/http://djeyl.net/w.php
असुरक्षित संस्करण:
0.48, Win32 और Linux दोनों। पिछले संस्करण असुरक्षित हो सकते हैं। यह HLDS के किसी भी संस्करण के साथ काम करना चाहिए।
असुरक्षा प्रकार:
DoS, उपयोगकर्ता HLDS के अंतर्गत चल रहे रिमोट कोड निष्पादन।
विवरण: जब HTTP POST अनुरोध प्राप्त होता है, तो यह Content-Length के मान को संग्रहीत करने के लिए स्टैक पर 11 बाइट्स आवंटित करता है, लेकिन उस बफ़र में तब तक लिखता है जब तक कि कोई न्यूलाइन या नल टर्मिनेटर प्राप्त न हो जाए। आपकी Content-Length स्ट्रिंग 158308 बाइट्स तक पहुँचने के बाद, यह EIP को ओवरराइट करना शुरू कर देता है। पैडिंग के कारण Linux पर यह संख्या थोड़ी भिन्न हो सकती है। आपके शेलकोड में 0x00, 0x0A, या 0x0D नहीं होना चाहिए अन्यथा यह सॉकेट से डेटा पढ़ना बंद कर देगा।
यह आपके शेलकोड को निष्पादित करने में सहायता कर सकता है:
प्रूफ-ऑफ-कॉन्सेप्ट कोड:
w48crash.c
नोट: PoC में उपयोग किया गया "shellcode" विशेष रूप से Win2K SP4/kernel32.dll/user32.dll v5.0.2195.6688 पर चलने वाले सर्वर के साथ काम करने के लिए हार्डकोडेड है। हालाँकि, वास्तविक बफ़र ओवरफ़्लो किसी भी Windows संस्करण पर यथावत काम करेगा। इसका परीक्षण करने के लिए, आप "our_eip" ग्लोबल वेरिएबल को 0xFFFFFFFF पर सेट कर सकते हैं ताकि केवल एक क्रैश हो।
कारण/समाधान:
समस्या कोड server.cpp में पंक्तियाँ 542-552 से है:
542 char clbuf[11];
543
544 for(i=0;(size_t)i<strlen(input)-17;i++)
545 {
546 if(!strnicmp(input+i,"\nContent-Length: ",17))
547 {
548 LOG_DBG_SERVER(("Content-length spotted"));
549 i+=17;
550 for(j=0;input[i]!='\n'&&input;[i];i++,j++)
551 clbuf[j]=input[i];
552 clbuf[j]='\0';
बफ़र, clbuf, जो पंक्ति 542 पर आवंटित किया गया है, पंक्तियाँ 550-551 पर लूप द्वारा लिखा जाता है, और फिर नल-टर्मिनेट किया जाता है। समाधान पंक्ति 550 को इससे बदलना है:
550 for(j=0;input[i]!='\n'&&input[i]&&j<10;i++,j++)