
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
Após o clone, entre no diretório da vulnerabilidade que deseja explorar
Aqui, /vulhub/python/PIL-CVE-2017-8291
Siga a prática consultando o arquivo yml a seguir
docker compose up -d: comando que cria os contêineres e os executa em segundo plano
Em seguida, acesse localhost:8000/ e verifique a página web com upload de arquivos

Proceda com o upload do poc.png manipulado localizado no mesmo diretório
Ao realizar o upload, você pode ver que a seguinte mensagem é exibida

Em condições normais, após o upload de um arquivo png, as dimensões de largura e altura da imagem são exibidas. No entanto, como o backend classifica o tipo de imagem pelo cabeçalho do arquivo, é possível ignorar a extensão e enviar um arquivo EPS contendo comandos executáveis renomeado com a extensão PNG.
Usando isso, ao fazer upload do arquivo poc.png, será possível executar o comando 'tocuh /tmp/aaaaa', e se você alterar o comando dentro do arquivo POC para um comando de reverse shell, será possível obter uma shell.
Após fazer o upload do arquivo, acesse o docker e verifique em /tmp; é possível confirmar que o arquivo aaaaa foi criado pelo comando.
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)

Essa vulnerabilidade ocorre na Python Imaging Library (PIL) e foi explorada utilizando o CVE-2017-8291.
A vulnerabilidade ocorre porque o PIL identifica o tipo de imagem com base no cabeçalho do arquivo, e não na extensão. Com isso, mesmo que o arquivo seja realmente do formato EPS, basta alterar a extensão para PNG e fazer o upload: ao chamar o GhostScript no lado do servidor, comandos arbitrários inseridos no arquivo podem ser executados.
Durante o projeto, ao enviar o arquivo poc.png manipulado e confirmar a criação do arquivo /tmp/aaaaa dentro do servidor, foi reproduzido que a vulnerabilidade pode, de fato, levar à execução remota de comandos (RCE, Remote Code Execution). Além disso, foi possível verificar que essa vulnerabilidade tem potencial para ser estendida a ataques avançados, como reverse shell, abusando da funcionalidade legítima de processamento de imagens.