
Docker-आधारित लैब Python PIL/Pillow EPS छवि प्रसंस्करण के माध्यम से CVE-2017-8291 (GhostButt) शोषण का प्रदर्शन करता है, एक कमजोर वेब एप्लिकेशन और प्रूफ-ऑफ-कॉन्सेप्ट शोषण के साथ।
Python PIL (Pillow) Python के लिए एक लोकप्रिय इमेज प्रोसेसिंग लाइब्रेरी है। यह विभिन्न इमेज फॉर्मेट्स को सपोर्ट करता है और शक्तिशाली इमेज मैनिपुलेशन क्षमताएँ प्रदान करता है।
Python इमेज प्रोसेसिंग मॉड्यूल PIL (Pillow) GhostButt भेद्यता (CVE-2017-8291) से प्रभावित है क्योंकि यह EPS इमेज को प्रोसेस करने के लिए आंतरिक रूप से GhostScript को कॉल करता है। यह भेद्यता हमलावरों को लक्षित सिस्टम पर मनमाना कमांड निष्पादित करने की अनुमति देती है।
जब PIL किसी इमेज को प्रोसेस करता है, तो यह फ़ाइल हेडर (Magic Bytes) के आधार पर इमेज प्रकार का निर्धारण करता है। यदि यह एक EPS फ़ाइल की पहचान करता है (हेडर %!PS से शुरू होता है), तो यह फ़ाइल को प्रोसेसिंग के लिए PIL/EpsImagePlugin.py को सौंप देता है।
इस मॉड्यूल में, PIL इमेज फ़ाइल को प्रोसेस करने के लिए सिस्टम के GhostScript कमांड (gs) को कॉल करता है:
command = ["gs",
"-q", # quiet mode
"-g%dx%d" % size, # set output geometry (pixels)
"-r%fx%f" % res, # set input DPI (dots per inch)
"-dBATCH", # exit after processing
"-dNOPAUSE", # don't pause between pages,
"-dSAFER", # safe mode
"-sDEVICE=ppmraw", # ppm driver
"-sOutputFile=%s" % outfile, # output file
"-c", "%d %d translate" % (-bbox[0], -bbox[1]),
# adjust for image origin
"-f", infile, # input file
]
# Code to check if GhostScript is installed is omitted
try:
with open(os.devnull, 'w+b') as devnull:
subprocess.check_call(command, stdin=devnull, stdout=devnull)
im = Image.open(outfile)
हालाँकि -dSAFER फ्लैग सेट किया गया है (सुरक्षित मोड), GhostScript (GhostButt CVE-2017-8291) में एक सैंडबॉक्स बाईपास भेद्यता इस सुरक्षा तंत्र को बायपास करने की अनुमति देती है, जिससे मनमाना कमांड निष्पादन संभव हो जाता है।
इस लेखन के समय, नवीनतम आधिकारिक GhostScript संस्करण 9.21 भी इस भेद्यता से प्रभावित है। इसलिए, जब तक ऑपरेटिंग सिस्टम पर GhostScript इंस्टॉल है, PIL कमांड निष्पादन के प्रति संवेदनशील है।
संदर्भ:
CVE-2017-8291 भेद्यता के प्रति संवेदनशील एक वेब एप्लिकेशन शुरू करने के लिए निम्न कमांड निष्पादित करें:
docker compose up -d
शुरू करने के बाद, अपलोड पेज तक पहुँचने के लिए http://your-ip:8000/ पर जाएँ।
इस एप्लिकेशन की सामान्य कार्यक्षमता उपयोगकर्ताओं को PNG फ़ाइल अपलोड करने की अनुमति देती है। बैकएंड इमेज को लोड करने और उसके आयाम आउटपुट करने के लिए PIL का उपयोग करता है। हालाँकि, हम एक निष्पादन योग्य EPS फ़ाइल का एक्सटेंशन PNG में बदलकर और उसे अपलोड करके इसका शोषण कर सकते हैं। चूँकि बैकएंड एक्सटेंशन के बजाय फ़ाइल हेडर के आधार पर इमेज प्रकार निर्धारित करता है, फ़ाइल एक्सटेंशन जाँच को बायपास किया जा सकता है।
उदाहरण के लिए, हम poc.png अपलोड कर सकते हैं, जो सर्वर पर touch /tmp/aaaaa कमांड निष्पादित करेगा। POC में कमांड को रिवर्स शेल कमांड में संशोधित करके, हम सर्वर पर शेल एक्सेस प्राप्त कर सकते हैं:
