sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin 升级到V2sudo 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
clone后进入要利用的漏洞路径
此处为 /vulhub/python/PIL-CVE-2017-8291
参考以下yml文件进行实践
docker compose up -d:创建容器并在后台运行的命令
然后访问 localhost:8000/ 查看可上传文件的网页

上传同一路径下的恶意 poc.png 文件
上传后可以看到如下结果

正常功能会上传PNG文件后输出图像的宽高,但后端通过文件头识别图像类型,因此可忽略扩展名,将包含可执行命令的EPS文件改为PNG扩展名上传
利用这一点,在上传poc.png时可执行 'tocuh /tmp/aaaaa' 命令,将POC文件中的命令改为反弹shell命令即可获取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,远程代码执行)。此外,该漏洞利用了原本的图像处理功能,存在扩展为反弹shell等高级攻击的可能性。