
Dimostrazione educativa dello sfruttamento dell'iniezione SQL CVE-2014-2323 in mod_mysql_vhost di lighttpd, con laboratorio basato su Docker per l'analisi pratica della vulnerabilità e l'applicazione delle patch.
title: Ep4 - Vulnerabilità relativa alle reti members:
Vulnerabilità correlata:
CVE-2014-2323 [1] was assigned to SQL injection bug.
CVE-2014-2324 [2] was assigned to the path traversal bug.
Conferma: http://download.lighttpd.net/lighttpd/security/lighttpd_sa_2014_01.txt
Il servizio da esplorare è Lighttpd. È un webserver open source (licenza BSD) ottimizzato per essere leggero e veloce. Nacque come 'proof-of-concept' del famoso problema c10k (come gestire 10.000 connessioni simultanee su un server), guadagnando quindi molta popolarità all'epoca (2003), ed è attualmente utilizzato da Whatsapp.com, Xkcd e, in passato, Youtube. Il suo posizionamento sul mercato è piuttosto interessante, come possiamo verificare nel grafico:

Il server cerca di gestire il problema delle molte connessioni tramite l'uso di meccanismi asincroni basati su eventi (kqueue su BSD, epoll su Linux), riducendo la necessità di più thread, risultando quindi in un'impronta di memoria molto più ridotta e un migliore utilizzo della CPU (strategia utilizzata anche dai server Nginx, il cui uso è aumentato significativamente nel corso degli anni):

Una delle funzionalità di lighty è la facile gestione dei virtual host.
Si tratta di un metodo utilizzato per ospitare più di un nome di dominio la cui risoluzione avviene su un unico IP, riducendo i costi di hosting per le aziende che cercano di offrire siti web, poiché non è necessario riservare un server dedicato per ogni sito web.
La tecnica può essere basata su IP (un'interfaccia per ogni host) o basata sul nome (un nome per ogni host, condividendo l'interfaccia) - esplorata in questa presentazione.
Basato sul nome
: utilizza l'Hostname fornito dal client per identificare quale servizio usare per rispondere di conseguenza. Tale metodo presenta due difficoltà: complicazioni nel gestire sessioni sicure (TLS) - l'handshake deve avvenire prima di qualsiasi passaggio di intestazione che indichi l'Host al server, complicando quindi la determinazione di quale certificato presentare durante l'handshake. Una soluzione a questo problema è un'estensione al TLS chiamata Server Name Indication (SNI) che consente di presentare il nome all'inizio dell'handshake, permettendo quindi la scelta del certificato corretto. Un secondo problema riguarda il tentativo di connessione senza un'intestazione Host ben definita, che comporta l'indeterminazione del servizio da utilizzare.
Basato su IP
: utilizza IP separati per ogni applicazione. Il webserver viene quindi configurato per più interfacce di rete fisiche (o virtuali sulla stessa interfaccia) e risponde in modo corrispondente in base all'indirizzo IP (di destinazione).
IP aliasing consente di creare interfacce virtuali per ogni servizio.
Nel caso di una grande azienda, amministrare tale mappatura può diventare complesso a seconda del numero di clienti. Lighty offre quindi supporto all'uso di un database per questa finalità, come mostreremo in seguito.
Prima, vediamo come fare "a mano" la configurazione di un server e poi aggiungere il vhosting.
Preparare un server di base lighttpd è molto facile. Basta eseguire l'installazione e creare un file di configurazione che imposti la porta da usare, come rispondere a determinate richieste e altre configurazioni.
Possiamo preparare un esempio di configurazione che gestisce solo la ricezione di richieste di file statici (.html o .txt):
server.document-root = "/usr/lighttpd/mysite.com/"
server.port = 80
mimetype.assign = (
".html" => "text/html",
".txt" => "text/plain"
)
Immaginate ora di voler creare un'attività basata sulla vendita di siti web e di offrire un dominio proprio all'acquirente. Per minimizzare i costi, vogliamo quindi creare vhosts per ogni cliente. Diciamo che il corso della disciplina di reti desidera acquisire tre siti web: redes.io, mac0448.io e mac5910.io. La nostra azienda registra quindi i domini, tutti puntanti all'IP del nostro unico server, con una sola interfaccia.
ps: poiché vogliamo simulare questo, possiamo modificare il file /etc/hosts:
172.17.0.2 redes.io
172.17.0.2 mac0448.io
172.17.0.2 mac5910.io
Per essere in grado di servire i diversi siti web dei clienti risolvendo da un singolo IP, possiamo quindi configurare il server a mano:
server.document-root = "/usr/lighttpd/default/"
server.port = 80
mimetype.assign = (
".html" => "text/html",
".txt" => "text/plain"
)
$HTTP["host"] == "redes.io" {
server.document-root = "/usr/lighttpd/redes/"
} else $HTTP["host"] == "mac0448.io" {
server.document-root = "/usr/lighttpd/mac0448/"
} else $HTTP["host"] == "mac5910.io" {
server.document-root = "/usr/lighttpd/mac5910/"
}
Ma, come possiamo immaginare, questo può diventare un problema man mano che vogliamo gestire molti clienti e fornire configurazioni diverse per ogni sito web, come citato in precedenza.
Con il modulo mod_mysql_vhost possiamo quindi collegare il nostro server a un database mysql responsabile di tale mappatura. Specifichiamo quindi il nome del database, come trovarlo nella nostra rete e quale comando usare per effettuare la ricerca.
server.modules = (
"mod_accesslog",
"mod_mysql_vhost"
)
mysql-vhost.db = "NOME_DO_BANCO"
mysql-vhost.user = "USUARIO"
mysql-vhost.pass = "SENHA"
(!!!!!!!!!!!!!!!)
mysql-vhost.sql = "SELECT docroot FROM domains WHERE domain='?';"
(!!!!!!!!!!!!!!!)
mysql-vhost.hostname = "HOSTNAME"
mysql-vhost.port = "PORTA"
SQL è un linguaggio dichiarativo per amministrare database relazionali, essendo utilizzato (...) ecc.
TODO
TODO
I problemi sorgono quindi dal fatto che i sistemi di gestione dei database che utilizzano SQL presuppongono che i comandi inseriti siano comandi noti all'amministratore e da lui ben gestiti. Tale presupposto non è sempre vero, poiché i sistemi che interagiscono con il sistema di database possono presentare falle, soprattutto sul web, dove l'interazione con l'utente è elevata.