
CVE-2017-8291 CTF डॉकर और उदाहरणों के साथ
Python में छवियों को संसाधित करने के लिए PIL (Pillow) मॉड्यूल GhostButt भेद्यता (CVE-2017-8291) से प्रभावित है, क्योंकि यह आंतरिक रूप से GhostScript को कॉल करता है, जिसके परिणामस्वरूप दूरस्थ कमांड निष्पादन भेद्यता उत्पन्न होती है।
PIL आंतरिक रूप से छवि हेडर (मैजिक बाइट्स) के आधार पर छवि प्रकार निर्धारित करता है। यदि यह एक EPS फ़ाइल (हेडर %!PS है) पाया जाता है, तो इसे प्रसंस्करण के लिए PIL/EpsImagePlugin.py को भेजा जाता है।
इस मॉड्यूल में, PIL छवि फ़ाइलों को संसाधित करने के लिए सिस्टम के gs कमांड को कॉल करता है, जो कि GhostScript है:
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
]
# Omit the code to determine whether GhostScript is installed
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 में कमांड निष्पादन भेद्यता है।
ऑपरेटिंग वातावरण:
docker-compose up -d
चलाने के बाद, एक अपलोड पृष्ठ देखने के लिए http://your-ip:8000/ पर जाएं। सामान्य कार्य यह है कि हम एक PNG फ़ाइल अपलोड करते हैं, बैकएंड छवि को लोड करने के लिए PIL को कॉल करता है, और लंबाई और चौड़ाई आउटपुट करता है। लेकिन हम निष्पादन योग्य कमांड EPS फ़ाइल के एक्सटेंशन को PNG में बदलकर अपलोड कर सकते हैं, क्योंकि बैकएंड फ़ाइल हेडर के आधार पर छवि प्रकार निर्धारित करता है, इसलिए एक्सटेंशन जाँच को अनदेखा किया जाता है।
उदाहरण के लिए, यदि हम poc.png अपलोड करते हैं, तो हम touch /tmp/youhavebeenpwned निष्पादित कर सकते हैं। शेल प्राप्त करने के लिए POC में कमांड को रिबाउंड कमांड में बदलें: