
Implementazione dell'exploit CVE-2018-16858
In questo post vedremo come sfruttare un semplice difetto di un programma per aprire una backdoor nel sistema che utilizza tale programma.
Il difetto in questione è definito in CVE-2018-16858, appartenente alla suite per ufficio LibreOffice. Questo difetto riesce, in un file appositamente formato, a eseguire un directory traversal, consentendo l'esecuzione di codice Python. Tale esecuzione viene collegata o scatta all'azione dell'utente sul documento, e viene eseguita senza che l'utente riceva alcun avviso per l'esecuzione di macro.
Il presente documento è diviso in cinque parti. Nella prima spiegheremo il difetto stesso, come decomprimere un OpenDocument, come modificarne la struttura per eseguire lo script locale desiderato e come ricomporre nuovamente il documento per la sua esecuzione e test.
Nella seconda parte vedremo come utilizzare l'esecuzione locale per lanciare qualsiasi comando nel sistema in cui viene aperto il documento, e genereremo una backdoor che consenta l'esecuzione di comandi remoti.
Nella terza parte automatizzeremo il processo per generare documenti che creino backdoor con comunicazione diretta o inversa, determinando l'indirizzo IP e la porta a cui connettersi.
La quarta parte tratterà l'integrazione del difetto nel sistema Metasploit in modo che tramite msfconsole si possano generare documenti compatibili con la forma di sfruttamento di Metasploit. In questo modo si potranno scegliere come codice da eseguire qualsiasi payload definito nella suite di Metasploit.
La quinta e ultima parte mostrerà come integrare in un sistema antivirus il processo di rilevamento che consenta di identificare i file di tipo LibreOffice infetti tramite la procedura precedente. Utilizzeremo il formato di rilevamento dell'antivirus ClamAV, consentendo di comprendere meglio il processo di rilevamento degli antivirus e quindi facilitare la nostra protezione da minacce di questo tipo.
L'intero processo sarà eseguito per sistemi Linux basati su Debian, ma quanto qui spiegato può essere estrapolato ad altri sistemi, poiché viene descritto in dettaglio. Sia il difetto che i proof of concept del CVE originale sono stati realizzati per la versione di LibreOffice per Windows, quindi è sempre possibile fare riferimento a tale fonte per utilizzare quanto descritto in questo documento in modo analogo per le versioni Windows.
LibreOffice (e, per questioni genetiche, Apache OpenOffice) ha un difetto nelle versioni precedenti all'ultima (6.1.5) che consente l'esecuzione di codice Python situato in qualsiasi parte del computer senza che l'utente venga avvisato dell'esecuzione di una macro.
Per vedere il difetto in questione possiamo generare un nuovo documento nell'editor di testo in cui scriveremo qualcosa, lo selezioneremo e creeremo un collegamento ipertestuale. Per creare un collegamento ipertestuale nel testo bisogna selezionare il menu Insert e al suo interno l'opzione Hyperlink (si può ottenere anche selezionando il testo e poi usando la combinazione di tasti Ctrl+K).
Apparirà la seguente finestra di dialogo:

Per definire un collegamento ipertestuale dobbiamo inserire un URL e fare clic su Apply. Oltre all'opzione URL nella parte inferiore della finestra di dialogo, dove si legge Further Settings, avremo un pulsante con l'icona di Play che ci permetterà inoltre di associare eventi a determinate azioni. È qui che definiamo che desideriamo eseguire codice Python come azione.
Premendo tale pulsante si aprirà una nuova finestra di dialogo:

In essa possiamo selezionare tra tre eventi di base e lo script che si desidera utilizzare. Come evento selezioneremo Mouse Over Object e come script all'interno degli script della famiglia LibreOffice Macros selezioneremo Python Samples. All'interno di tale opzione esiste solo uno script predefinito chiamato TableSample, che selezioneremo.
Una volta fatto ciò, se passiamo il mouse sopra il testo che abbiamo convertito in collegamento ipertestuale, vedremo che si apre una finestra con un documento in cui c'è una tabella. Ciò significa che abbiamo associato l'evento del passaggio del mouse sopra il collegamento ipertestuale allo script Python. L'obiettivo è sostituire questa azione con un'altra che vogliamo noi.
Per fare ciò salveremo il documento che abbiamo creato e usciremo da LibreOffice per eseguire nella console una serie di comandi.
Il formato documento ODT non è altro che un zip con una serie di file al suo interno (il formato DOCX di Microsoft Office è molto simile). Pertanto, la prima cosa che faremo è decomprimere il file con un decompressore di file zip.
Nel nostro caso utilizzeremo lo strumento da riga di comando chiamato unzip, quindi eseguiremo semplicemente la seguente istruzione:
user@host:~/Documents/prueba$ unzip ~/Documents/blog/exploitlibreoffice/doc/CV.odt
Con questo vedremo i file che realmente contiene un file di tipo OpenDocument. I più rilevanti per noi sono il file mimetypes, il file content.xml e il file styles.xml.
Il file mimetype deve essere il primo ad apparire nell'elenco dei file del zip, quindi quando ri-pacchettizzeremo i file dovremo forzare con il nostro pacchettizzatore che sia così, altrimenti il file non verrà interpretato come un OpenDocument.
Il file content.xml contiene il testo del documento che abbiamo scritto, in cui abbiamo testo mescolato con determinate etichette che dicono in quale formato deve essere visualizzato il testo.
Ad esempio, nella riga seguente:
<text:p text:style-name="_5f_ECV_5f_SectionDetails">Indicar lista de documentos adjuntos a su CV. Ejemplos:</text:p>
Si può osservare un esempio di un paragrafo di testo scritto con uno stile specifico definito dall'attributo text:style-name. Il paragrafo di testo si trova tra il tag di apertura text:p e il tag di chiusura </text:p>.
Lo script associato al collegamento ipertestuale che abbiamo creato può essere visto anche in modo abbastanza semplice. Se cerchiamo tra il testo di content.xml la parola python o il nome dello script python che abbiamo caricato, nel nostro caso TableSample.py, è facile individuare la riga in cui dobbiamo variare il contenuto:
<script:event-listener script:language="ooo:script" script:event-name="dom:mouseover" xlink:href="vnd.sun.star.script:pythonSamples|TableSample.py$createTable?language=Python&location=share" xlink:type="simple"/>
In questa riga si trova il percorso dello script python che verrà caricato quando mettiamo il mouse sopra il collegamento ipertestuale chiamato TableSample.py e la funzione che verrà eseguita del codice python, in questo caso createTable.
Il problema intrinseco di LibreOffice è che quando legge i documenti non pulisce correttamente il valore del codice python da caricare. Il programma non pulisce i caratteri ../ dal percorso del file, quindi si può accedere a qualsiasi file del sistema in cui viene aperto il documento di testo. Inoltre, se quel file a cui si accede è un file con codice python, possiamo eseguire qualsiasi funzione definita in quel file.
Come primo proof of concept faremo sì che passando sopra il collegamento ipertestuale si esegua la calcolatrice, nel nostro caso il programma galculator apre la calcolatrice. Dovremo generare un programma python che permetta di eseguire un comando all'interno di una funzione, nello stile in cui l'esecuzione attesa da LibreOffice. Per fare ciò genereremo il seguente codice nel percorso /tmp/prueba.py:
import os;
def ejecuta():
os.system("galculator");