
Laborat?rio baseado em Docker demonstrando explora??o de CVE-2017-8291 (GhostButt) via processamento de imagens EPS em Python PIL/Pillow, com uma aplica??o web vulnerável e exploit de prova de conceito.
O Python PIL (Pillow) é uma biblioteca popular de processamento de imagens para Python. Ela suporta vários formatos de imagem e fornece recursos poderosos de manipulação de imagens.
O módulo de processamento de imagens 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 da imagem com base no cabeçalho do arquivo (Magic Bytes). Se identificar um arquivo EPS (cabeçalho começando com %!PS), ele passa o arquivo para PIL/EpsImagePlugin.py para processamento.
Neste módulo, o PIL chama o comando GhostScript do sistema (gs) para processar o arquivo de imagem:
command = ["gs",
"-q", # modo silencioso
"-g%dx%d" % size, # definir geometria de saída (pixels)
"-r%fx%f" % res, # definir DPI de entrada (pontos por polegada)
"-dBATCH", # sair após o processamento
"-dNOPAUSE", # não pausar entre páginas,
"-dSAFER", # modo seguro
"-sDEVICE=ppmraw", # driver ppm
"-sOutputFile=%s" % outfile, # arquivo de saída
"-c", "%d %d translate" % (-bbox[0], -bbox[1]),
# ajustar para a origem da imagem
"-f", infile, # arquivo de entrada
]
# O código para verificar se o GhostScript está instalado foi omitido
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 arbitrária de comandos.
Até o momento desta escrita, mesmo a versão mais recente oficial do GhostScript, a 9.21, ainda é afetada por essa vulnerabilidade. Portanto, desde que o GhostScript esteja instalado no sistema operacional, o PIL está vulnerável à execução de comandos.
Referências:
Execute o seguinte comando para iniciar uma aplicação web vulnerável à vulnerabilidade CVE-2017-8291:
docker compose up -d
Após iniciar, 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 carregando-o. Como o backend determina o tipo da 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 carregar poc.png, que executará o comando touch /tmp/aaaaa no servidor. Modificando o comando no POC para um comando de reverse shell, podemos obter acesso shell ao servidor:
