Come determinare il webserver

Introduzione

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.

Osservizmo l'header HTTP

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:

Header "Server" nella risposta HTTP

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:

Bash output
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:
  • Non tutti i server web inviano l'intestazione `Server`. Alcuni amministratori la rimuovono o la modificano per ragioni di sicurezza.
  • A volte potresti vedere solo il nome del server senza la versione, o un valore fittizio (es. `nginx` senza versione).

Header "X-Powered-By"

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:

Header
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.

Fingerprinting passivo

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:

  • Nmap (con lo script http-server-header o http-fingerprint)
  • WhatWeb
  • Wappalyzer

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.

Errori HTTP specifici

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.

Response Time e Pattern

Ogni server web ha una firma unica in termini di tempi di risposta o gestione delle connessioni. Alcuni strumenti di analisi passiva possono utilizzare questi pattern per tentare di identificare il server anche in assenza di informazioni esplicite negli header.

Strumenti per l'analisi:

  • Wireshark: Può essere usato per catturare il traffico HTTP e analizzare le risposte del server.
  • cURL o wget: Con una semplice richiesta a un server, puoi vedere le intestazioni di risposta.

Ecco un esempio di comando cURL per ottenere le intestazioni di una risposta HTTP:

Bash output
$ curl -I http://libero.it

Esempio di output:

Header
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.


E se non ci sono queste intestazioni?

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:

Fingerprinting del server con strumenti specializzati

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.

Strumenti utili:

  • Nmap: Nmap non è solo uno strumento di scansione delle porte, ma offre anche script di rilevamento specifici. Gli script Nmap http-server-header e http-fingerprint sono utili per determinare il server web in esecuzione.
    Esempio di comando:
    Bash output
    $ 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.

    Bash output
    $ nmap -p 80 --script http-fingerprint example.com
  • WhatWeb: Un altro tool di fingerprinting che tenta di identificare i server web basandosi su una serie di pattern noti.
    Esempio di comando:
    Bash output
    $ whatweb http://example.com
  • Wappalyzer: Sebbene sia più utilizzato per identificare tecnologie web (framework, CMS, librerie), può rilevare anche il server web sottostante in alcuni casi.
  • Netcraft: Offre uno strumento di analisi web in grado di rilevare informazioni sui server, comprese le versioni storiche delle tecnologie utilizzate da un sito.

Osservazione del comportamento del server

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:

  • Risposte ai codici di errore: Alcuni server generano pagine di errore con informazioni specifiche che possono rivelare il tipo di server. Ad esempio:
    • Apache: Ha spesso pagine di errore predefinite che seguono uno schema ben riconoscibile, a meno che non siano state personalizzate.
    • Nginx: I messaggi di errore di default possono contenere riferimenti espliciti a "nginx" nel corpo della pagina.
  • Supporto per metodi HTTP specifici: Alcuni server web supportano metodi HTTP specifici o hanno comportamenti differenti quando rispondono a richieste come OPTIONS, HEAD, o TRACE. Questo può essere usato per inferire il server in uso.

    Puoi usare curl per testare il supporto di metodi HTTP:

    Bash output
    $ curl -X OPTIONS http://example.com

Fingerprinting TLS/SSL

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:

  • SSLyze
  • SSL Labs: Il sito web di SSL Labs offre un'analisi approfondita delle configurazioni SSL/TLS, e a volte può rivelare anche dettagli sul server.

Analisi della struttura della risposta HTTP

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:

  • Ordine degli header: Alcuni server inviano gli header HTTP in un ordine specifico.
  • Spaziatura e maiuscole: Differenze nei caratteri maiuscoli/minuscoli o negli spazi tra gli header possono rivelare il tipo di server.

Esempio:

  • Nginx spesso utilizza header come Content-Length, Connection, Server, in un ordine specifico e con un certo formato.
  • Apache potrebbe rispondere con un altro ordine o con piccole differenze nel formato.

Richieste non standard e analisi della risposta

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.

Fingerprinting basato su JavaScript o risorse statiche

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.

Metodi di "Timing Attack"

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.