
CVE-2017-8291 CTF com docker e exemplos
O módulo PIL (Pillow) para processamento de imagens em Python é afetado pela vulnerabilidade GhostButt (CVE-2017-8291) porque ele chama o GhostScript internamente, resultando em uma vulnerabilidade de execução remota de comandos.
O PIL determina internamente o tipo de imagem com base no cabeçalho da imagem (Magic Bytes). Se for identificado como um arquivo EPS (o cabeçalho é %!PS), ele é distribuído para PIL/EpsImagePlugin.py para processamento.
Neste módulo, o PIL chama o comando gs do sistema, que é o GhostScript, para processar arquivos 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
]
# 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)
Embora -dSAFER, ou seja, o modo seguro, esteja definido, devido a uma vulnerabilidade de bypass de sandbox no GhostScript (GhostButt CVE-2017-8291), esse modo seguro é contornado e comandos arbitrários podem ser executados.
Além disso, até agora, a versão oficial mais recente do GhostScript 9.21 ainda é afetada por esta vulnerabilidade, portanto, pode-se dizer que, enquanto o GhostScript estiver instalado no sistema operacional, nosso PIL tem uma vulnerabilidade de execução de comandos.
Ambiente de operação:
docker-compose up -d
Após a execução, visite http://your-ip:8000/ para ver uma página de upload. A função normal é que enviamos um arquivo PNG, o backend chama o PIL para carregar a imagem e exibe a largura e altura. Mas podemos alterar o sufixo do arquivo EPS com comando executável para PNG para fazer o upload, porque o backend determina o tipo de imagem com base no cabeçalho do arquivo, então a verificação de sufixo é ignorada.
Por exemplo, se enviarmos poc.png, podemos executar touch /tmp/youhavebeenpwned. Altere o comando no POC para um comando reverso para obter um shell: