Quando si analizzano le connessioni HTTP, una delle informazioni più utili da ottenere è il tipo di server web in esecuzione e la sua versione. Questa informazione può aiutare a capire meglio l'ambiente di hosting, a scoprire potenziali vulnerabilità o semplicemente a ottimizzare le interazioni con il server stesso. Tuttavia, non sempre le intestazioni HTTP forniscono queste informazioni in modo esplicito. In questi appunti, esploreremo tecniche semplici ed avanzate per determinare il tipo di server web anche quando i dati tradizionalmente disponibili, come le intestazioni Server
o X-Powered-By
, sono assenti.
Per determinare il tipo di server web e la sua versione dall'analisi delle connessioni HTTP, ci sono diversi metodi che puoi utilizzare esaminando specifici dettagli all'interno delle risposte HTTP. Ecco i passaggi più comuni:
Uno dei modi più semplici per identificare il server web è tramite l'intestazione `Server` presente nella risposta HTTP. Quando effettui una richiesta HTTP (di solito una richiesta `GET`), il server risponde con un'intestazione che potrebbe contenere dettagli come il nome del server e la versione. Ad esempio:
http
HTTP/1.1 200 OK
Date: Sun, 17 Sep 2024 10:00:00 GMT
Server: Apache/2.4.41 (Ubuntu)
Content-Length: 1234
Content-Type: text/html
In questo caso, l'intestazione `Server: Apache/2.4.41 (Ubuntu)` indica che il server sta eseguendo Apache versione 2.4.41 su un sistema operativo Ubuntu.
Nota:In alcuni casi, il server web potrebbe non fornire informazioni dirette tramite l'intestazione `Server`, ma potresti trovare un'indicazione nel campo X-Powered-By
, che rivela la tecnologia utilizzata per generare le risposte. Ad esempio:
X-Powered-By: PHP/7.4.3
Questo mostra che il server sta utilizzando PHP versione 7.4.3, il che potrebbe essere utile per inferire altre caratteristiche del server.
Esistono strumenti che analizzano il comportamento di un server (come i modelli di risposta, i valori specifici delle intestazioni e il modo in cui gestisce certe richieste) per cercare di identificare il software del server e la sua versione. Alcuni strumenti utili includono:
http-server-header
o http-fingerprint
)Questi strumenti possono analizzare vari aspetti di una connessione HTTP per rilevare dettagli sul server web, anche quando l'intestazione `Server` è stata modificata o nascosta.
A volte, puoi ottenere informazioni sul server web osservando i messaggi di errore HTTP. Alcuni server hanno formati di errori specifici che rivelano il tipo di software in uso. Ad esempio, i server Apache e Nginx hanno formati distinti per le pagine di errore 404 o 500.
$ curl -I http://libero.it
Esempio di output:
HTTP/1.1 302 Found
Date: Tue, 17 Sep 2024 15:34:12 GMT
Server: Microsoft-IIS/10.0
Strict-Transport-Security: max-age=16070400; includeSubDomains; preload
X-Xss-Protection: 1; mode=block
Location: https://it.finecobank.com/
Keep-Alive: timeout=62, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
Da questo, sai che il server sta eseguendo Microsoft-IIS
versione 10.0
.
Se le intestazioni Server
o X-Powered-By
non vengono fornite (ad esempio, se sono state rimosse o modificate per ragioni di sicurezza), ci sono altri metodi per determinare il tipo di server web utilizzato. Vediamo alcune tecniche alternative:
Esistono strumenti che possono analizzare vari aspetti del comportamento del server per determinarne il tipo e la versione anche in assenza di informazioni dirette negli header HTTP.
http-server-header
e http-fingerprint
sono utili per determinare il server web in esecuzione.$ nmap -p 80 --script http-server-header example.com
Se l'intestazione Server
non è presente, puoi usare http-fingerprint
per cercare di rilevare il server tramite pattern noti.
$ nmap -p 80 --script http-fingerprint example.com
$ whatweb http://example.com
Anche se non ci sono informazioni esplicite negli header HTTP, puoi osservare come il server risponde a richieste particolari o come gestisce determinati codici di stato HTTP. Ecco alcuni approcci:
OPTIONS
, HEAD
, o TRACE
. Questo può essere usato per inferire il server in uso.Puoi usare curl
per testare il supporto di metodi HTTP:
$ curl -X OPTIONS http://example.com
Se il server supporta HTTPS, puoi cercare di ottenere informazioni sulla sua configurazione TLS/SSL. Alcuni server utilizzano impostazioni specifiche di certificati, cifrari, e protocolli SSL/TLS che possono indicare quale server è in esecuzione.
Strumenti utili per analizzare la configurazione TLS:
Anche in assenza di header specifici, ogni server web ha peculiarità nel formato delle risposte HTTP. Alcuni dettagli possono aiutarti a riconoscere il software del server:
Esempio:
Content-Length
, Connection
, Server
, in un ordine specifico e con un certo formato.Alcuni server reagiscono in modo diverso a richieste insolite, come richieste malformate o contenenti intestazioni particolari. Puoi provare a inviare richieste non standard e osservare le risposte per cercare di identificare il server.
Un'altra tecnica consiste nel fare il fingerprinting delle risorse statiche o degli script JavaScript caricati dal server. Alcuni framework backend (es. Django, Ruby on Rails, etc.) e server web aggiungono firme specifiche ai file statici (come il modo in cui gestiscono i percorsi o i nomi dei file).
Ad esempio, il modo in cui un server organizza o serve file come robots.txt
, favicon.ico
, o risorse CSS
/JS
può fornire indizi sul tipo di server o framework in uso.
Osservare i tempi di risposta di un server per diverse richieste può rivelare informazioni su come il server gestisce le connessioni. Alcuni server hanno caratteristiche specifiche che influenzano il tempo di risposta in modo prevedibile, soprattutto quando vengono inviate richieste particolari.
Questi approcci combinati possono aiutare a meglio identificare il server web.