
مختبر تعليمي يوضح CVE-2017-8291 (PIL/GhostScript RCE) عبر رفع ملف EPS مصمم بامتداد PNG، بما في ذلك إعداد Docker وتنفيذ PoC.
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginsudo apt remove docker docker-engine docker.io containerd runc -ysudo apt updatesudo apt install -y ca-certificates curl gnupg lsb-releasesudo mkdir -p /etc/apt/keyringscurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpgecho "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullsudo apt updatesudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugindocker compose versiongit clone https://github.com/vulhub/vulhub.git
بعد الاستنساخ، ادخل إلى مسار الثغرة الذي تريد العمل عليه.
هنا: /vulhub/python/PIL-CVE-2017-8291
اتبع ملف yml التالي لإجراء التمارين.
docker compose up -d : أمر لإنشاء حاوية وتشغيلها في الخلفية.
ثم قم بزيارة localhost:8000/ لترى صفحة ويب تسمح برفع الملفات.

قم برفع ملف poc.png المعدل الموجود في نفس المسار.
بعد الرفع، ستظهر كما يلي.

في الوظيفة العادية، بعد رفع ملف PNG يتم عرض عرض وارتفاع الصورة. ولكن نظرًا لأن الخادم الخلفي يصنف نوع الصورة بناءً على ترويسة الملف (header)، فيمكن تجاهل الامتداد ورفع ملف EPS يحتوي على أوامر قابلة للتنفيذ بعد تغيير امتداده إلى PNG.
باستخدام هذا، عند رفع ملف poc.png، سيكون من الممكن تنفيذ الأمر 'tocuh /tmp/aaaaa'، وإذا قمت بتغيير الأمر داخل ملف POC إلى أمر قشرة عكسية (reverse shell)، يمكنك الحصول على قشرة.
بعد رفع هذا الملف، ادخل إلى حاوية Docker واذهب إلى /tmp وسترى أن الأمر أنشأ ملفًا باسم aaaaa.
command = ["gs",
"-q", # 조용한 모드(출력 최소화)
"-g%dx%d" % size, # 출력 이미지 크기 설정 (픽셀 단위)
"-r%fx%f" % res, # 입력 이미지 해상도(DPI) 설정
"-dBATCH", # 작업 완료 후 자동 종료
"-dNOPAUSE", # 페이지 간 일시 정지 없이 연속 실행
"-dSAFER", # 안전 모드 활성화
"-sDEVICE=ppmraw", # 출력 디바이스를 ppmraw로 설정
"-sOutputFile=%s" % outfile, # 출력 파일 경로 지정
"-c", "%d %d translate" % (-bbox[0], -bbox[1]),
# 이미지 원점을 보정 (이동)
"-f", infile, # 입력 파일 지정
]
try:
with open(os.devnull, 'w+b') as devnull:
subprocess.check_call(command, stdin=devnull, stdout=devnull)
im = Image.open(outfile)

هذه الثغرة هي ثغرة في مكتبة Python Imaging Library (PIL) وقد تم إجراؤها على CVE-2017-8291. تحدث الثغرة بسبب خاصية PIL في تحديد نوع الصورة بناءً على ترويسة الملف وليس على الامتداد، وبالتالي يمكن رفع ملف في الواقع بصيغة EPS ولكن مع تغيير الامتداد إلى PNG، وعندما يقوم الخادم باستدعاء GhostScript، يمكن تنفيذ أوامر عشوائية مدمجة في الملف. من خلال رفع ملف poc.png المعدل في المشروع وتأكيد إنشاء ملف /tmp/aaaaa داخل الخادم، تم إعادة إنتاج أن الثغرة يمكن أن تؤدي بالفعل إلى تنفيذ أوامر (RCE). بالإضافة إلى ذلك، لوحظ أن هذه الثغرة تحمل إمكانية التوسع إلى هجمات متقدمة مثل القشرة العكسية عن طريق استغلال وظيفة معالجة الصور الأصلية.