Vai al contenuto
EuroVPSEuroVPS

IP di origin dietro una CDN: come trapela e come bloccarlo

Una scansione dell'hostname pubblico testa l'edge della CDN. L'origin è spesso rintracciabile dal DNS stesso del dominio: trovatelo, scansionatelo e bloccatelo sulla CDN.

Di EuroVPS EngineeringLa sala macchine

6 min di lettura
In questo articolo 5 sezioni
In breve
  • Una scansione dell'hostname pubblico passa attraverso la CDN e riferisce sulla CDN. Non dice nulla del server che sta dietro.
  • L'indirizzo dell'origin lo pubblica di solito il dominio stesso: il record SPF, gli host MX, un sottodominio non proxato, un certificato nei transparency log, un header Received su una mail in uscita.
  • Trovatelo come farebbe un attaccante, fissatelo, scansionate il server stesso dall'esterno, poi bloccate il firewall dell'origin sui range pubblicati dalla CDN e autenticate gli origin pull, così l'indirizzo è inutile anche quando è noto.

La porta davanti e la porta sul retro

Una CDN o un WAF cloud sta davanti al server e gestisce l'hostname. Puntate uno scanner su quell'hostname e la richiesta va all'edge: il TLS dell'edge, gli header dell'edge, i rate limit e le regole dell'edge. Un report verde è un report sull'edge. L'origin, il server vero, non è stato toccato da quella scansione, e qualunque cosa esponga direttamente resta esposta a chiunque lo raggiunga per indirizzo invece che per nome.

Cosa viene scansionatoCosa testaCosa dimostra sull'origin
L'hostname pubblico, attraverso la CDNL'edge: il suo WAF, il TLS e i rate limitNiente
L'indirizzo dell'origin fissatoIl server stesso, come lo raggiunge un attaccanteCosa può toccare uno sconosciuto su internet

Dove trapela l'origin

L'indirizzo è raramente ben nascosto, perché il dominio lo pubblica per altri scopi. Il record SPF è il caso più comune. Una policy SPF che usa il meccanismo a autorizza il record A del dominio stesso a inviare posta, e quel record A è l'origin dietro la CDN. Il meccanismo mx punta agli host di posta, che spesso stanno nello stesso range. Un ip4: letterale lo scrive per esteso.

TERMINAL
$ dig +short TXT example.com
"v=spf1 a mx ip4:<address> include:_spf.<mail-provider> ~all"
$ dig +short MX example.com
$ dig +short A mail.example.com ftp.example.com staging.example.com origin.example.com

Oltre allo SPF: sottodomini che non sono mai stati messi dietro la CDN (mail, ftp, un pannello di controllo, staging, un host origin nudo), che risolvono direttamente al server. I certificate transparency log, che registrano ogni certificato emesso per un nome, compreso quello sull'host origin. I database di passive DNS, che conservano il record A di prima che la CDN fosse introdotta. Gli header Received di qualsiasi mail inviata dal web server, che nominano l'host da cui proviene. E le funzioni applicative che fanno connettere il server verso l'esterno su richiesta, come i pingback e i test dei webhook, che mostrano l'indirizzo di connessione a chiunque riceva la chiamata.

Fissate l'origin e scansionate ciò che scansiona un attaccante

Una volta noto l'indirizzo, fate in modo che gli strumenti ignorino la CDN. curl può farlo per singola richiesta; gli scanner che non lo permettono prendono una riga nel file hosts. Eseguitelo da una macchina che non sta sulla vostra rete e non sta in nessuna allowlist di cui l'origin si fida, perché una scansione da un indirizzo fidato riferisce ciò che vedono gli indirizzi fidati.

TERMINAL
# per request, no hosts-file change
$ curl --resolve example.com:443:<address> -sI https://example.com/

# for tools without --resolve
$ echo "<address>  example.com" | sudo tee -a /etc/hosts

Tenete due colonne nel risultato. La colonna infrastruttura: quali porte rispondono, quali versioni TLS sono accettate, se i banner rivelano spontaneamente nomi di software. La colonna applicazione: endpoint non autenticati che enumerano gli utenti, file di debug o di log leggibili nella web root, percorsi amministrativi raggiungibili senza un secondo fattore, componenti indietro rispetto alla release corrente. Una macchina hardenizzata che serve un'applicazione aperta non è un sito sicuro, e le due colonne non si fanno confluire in un unico verdetto.

Bloccate l'origin sulla CDN

La correzione strutturale sta all'origin, non all'edge. Le porte web rispondono solo ai range di indirizzi pubblicati dalla CDN, con tutto il resto negato per default. Su un host con firewalld:

TERMINAL
# load the CDN's published ranges into an ipset, then allow only them on 443
$ firewall-cmd --permanent --new-ipset=cdn-v4 --type=hash:net
$ firewall-cmd --permanent --ipset=cdn-v4 --add-entries-from-file=cdn-ranges-v4.txt
$ firewall-cmd --permanent --zone=public --remove-service=http
$ firewall-cmd --permanent --zone=public --remove-service=https
$ firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source ipset="cdn-v4" port port="443" protocol="tcp" accept'
$ firewall-cmd --reload
$ firewall-cmd --ipset=cdn-v4 --get-entries

Due dettagli decidono se questo regge. I range della CDN cambiano, quindi il file viene aggiornato dalla lista pubblicata dalla CDN secondo un calendario e l'ipset ricaricato con esso. E ogni prefisso in una allow list viene riletto dopo il caricamento: una lunghezza di prefisso sbagliata di un carattere ammette una larga parte di internet e nel file sembra normale.

I range di indirizzi sono il primo blocco, non l'unico. La maggior parte delle CDN può autenticare i propri pull verso l'origin con un certificato client; richiedetelo sul web server, così una richiesta proveniente da un range della CDN che non presenta il certificato viene comunque rifiutata. Poi rimuovete le fughe che restano: un record SPF che nomina solo gli host che inviano posta, nessun sottodominio non proxato che punti all'origin e, dove è praticabile, un nuovo indirizzo di origin una volta che il blocco è in posizione, perché quello vecchio resta nel passive DNS a tempo indeterminato.

Verificate dall'esterno

Rieseguite la scansione fissata dallo stesso punto di osservazione non fidato. L'origin rifiuta la connessione sulla 443, e l'hostname continua a servire attraverso la CDN. Ripetete dopo ogni modifica ai range o alla configurazione del web server; trasformarlo in un controllo permanente invece che in un'operazione una tantum è l'argomento di dimostrate che è chiuso dall'esterno.

TERMINAL
$ curl --resolve example.com:443:<address> -m 5 -sI https://example.com/ ; echo "exit $?"
exit 28
# a timeout (28) or a refused connection (7) is the correct answer from the locked origin

Risposte dirette

Una CDN protegge il mio server origin?+

Solo per il traffico che la attraversa. Il WAF, il TLS e i rate limit si applicano all'edge. Una richiesta fatta direttamente all'indirizzo dell'origin non ne incontra nessuno, quindi l'origin deve rifiutare tutto ciò che non è la CDN.

Come trova un attaccante l'IP dell'origin dietro una CDN?+

Il più delle volte dal DNS stesso del dominio: un record SPF con i meccanismi a, mx o ip4, host MX nello stesso range, sottodomini che non sono mai stati proxati. E poi dai certificate transparency log, dalla storia del passive DNS e dagli header della posta che il server invia. Date per scontato che verrà trovato, e bloccate l'origin come se lo fosse già stato.

Qual è la differenza tra scansionare l'hostname e scansionare l'origin?+

L'hostname risolve alla CDN, quindi la scansione testa l'edge. L'origin è il server. Fissare l'indirizzo dell'origin con curl --resolve o con una riga nel file hosts, da una rete di cui l'origin non si fida, testa ciò che testa un attaccante.

Una volta bloccato l'origin sulla CDN, la fuga via SPF conta ancora?+

Le porte web non rispondono più, ma l'indirizzo resta noto, e qualsiasi altro servizio su di esso (SSH, posta, un pannello di controllo) resta raggiungibile se non viene limitato a sua volta. Restringete il record SPF ai veri host di posta, spostate l'origin su un indirizzo nuovo dove è praticabile, e mettete in allowlist i servizi che restano.

Volete che l'origin venga trovato, fissato e bloccato da qualcuno che lavora dall'esterno della vostra rete?

Parlate con un ingegnere.

Parla con un ingegnere (shell cta.talkToEngineer)

Siete arrivati alla fine.

Mettete la lettura al lavoro

Cosa fate girare?

Raccontateci il carico di lavoro, il traffico e i requisiti di ripristino. Partite dal configuratore di server, oppure discutete i dettagli con un ingegnere.

Scritto dagli ingegneri che costruiscono e gestiscono l'infrastruttura che descrive.
Parla con un ingegnere
XIn

6 min rimasti