
PoC educacional para CVE-2017-8291 (GhostButt) demonstrando execução remota de comandos via processamento de imagens EPS com Python PIL/Pillow e bypass da sandbox do GhostScript.
O Python PIL (Pillow) é uma biblioteca popular de processamento de imagens para Python. Ela suporta vários formatos de imagem e fornece poderosas capacidades de manipulação de imagens.
O módulo de processamento de imagens do Python, PIL (Pillow), é afetado pela vulnerabilidade GhostButt (CVE-2017-8291) porque ele chama internamente o GhostScript para processar imagens EPS. Essa vulnerabilidade permite que atacantes executem comandos arbitrários no sistema alvo.
Quando o PIL processa uma imagem, ele determina o tipo de imagem com base no cabeçalho do arquivo (Magic Bytes). Se ele identificar um arquivo EPS (cabeçalho iniciando com %!PS), ele passa o arquivo para o PIL/EpsImagePlugin.py para processamento.
Neste módulo, o PIL chama o comando GhostScript (gs) do sistema para processar o arquivo de imagem:
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)
Embora a flag -dSAFER esteja definida (modo seguro), uma vulnerabilidade de bypass de sandbox no GhostScript (GhostButt CVE-2017-8291) permite que esse mecanismo de segurança seja contornado, possibilitando a execução de comandos arbitrários.
Até o momento em que este texto foi escrito, até mesmo a versão oficial mais recente do GhostScript, a 9.21, ainda é afetada por essa vulnerabilidade. Portanto, desde que o GhostScript esteja instalado no sistema operacional, o PIL é vulnerável à execução de comandos.
Referências:
Execute o seguinte comando para iniciar uma aplicação web vulnerável à CVE-2017-8291:
docker compose up -d
Após a inicialização, visite http://your-ip:8000/ para acessar a página de upload.
A funcionalidade normal desta aplicação permite que os usuários carreguem um arquivo PNG. O backend usa o PIL para carregar a imagem e exibir suas dimensões. No entanto, podemos explorar isso alterando a extensão de um arquivo EPS executável para PNG e fazendo o upload. Como o backend determina o tipo de imagem com base no cabeçalho do arquivo e não na extensão, a verificação da extensão do arquivo pode ser contornada.
Por exemplo, podemos fazer o upload de poc.png, que executará o comando touch /tmp/aaaaa no servidor. Ao modificar o comando no POC para um comando de reverse shell, podemos obter acesso ao shell do servidor:
