• Speedtest
  • I provider reindirizzano gli speedtest sui propri server?

LATIITAY Ma fai bene a non fidarti se non ti torna eh: il problema e' che stavi ripetendo in continuazione le stesse cose senza provare prima a fare le cose che ti venivano dette al fine di farti dimostrare a te in maniera indipendente quello che ti veniva detto 😅

chiedo scusa per l'ignoranza, ma avevo la testa parzialmente altrove, giuro che appena mi libero riprovo, sono stato così somaro che ho buttato la sessione di cap 🤣

Dopo la rifaccio 🙂

Oggi a mente fresca ho rifatto il capture. L'ho condiviso sul Google drive, è grandino perché uno Speedtest ovviamente trasferisce svariati megabytes:

https://drive.google.com/file/d/1-4D-_jz8CLL7OScA9WVUKsZU8aKarGYj/view?usp=sharing

Aprendo il file prima cerco i TCP SYN verso 88.149.202.248, e abbiamo conferma che sono tutte connessioni verso la 8080/TCP. Ci sono 17 diverse sessioni ma le prime sono solo dei check che fa mentre seleziono "cambia server" dal sito Ookla. Peraltro, se qualcuno ha la pazienza di scaricarsi il capture, il sito Speedtest fa una quantità di traffico assurdo, si vede all'inizio della sessione.

La sessione Speedtest vera e propria (la prima di tante) è quella che inizia con ordinale 11664, quasi tutti questi 11000 pacchetti li ha fatti Speedtest.net solo per selezionare quale server usare, ho volutamente fermato tutto sul PC da cui ho fatto il capture per non avere ciarpame nella sessione. Ci sono giusto due o tre pacchetti di Windows qua e la.

Tolgo la forzatura 8080->HTTP dalla config di wireshark, così è costretto a usare l'euristica:

Se lascio fare l'euristica non lo riconosce. Quindi forzo che si tratta di Websocket:

A questo punto posso anche seguire il flusso TCP partendo dall'ordinale 11664, il primo pacchetto dopo il TCP ACK (ordinale 11667) decodificato come Websocket da origine a qualcosa di sensato:

Ovviamente il contenuto non è visibile, ma come era atteso sembra proprio trattarsi di una sessione WebSocket.

Tutto ciò premesso: la sessione WebSocket non avviene verso il sito https://www.speedtest.net bensì verso l'IP 88.149.202.248 che è l'IP del server Speedtest di EOLO, dove è presente la servlet. Detta sessione è ovviamente cifrata ma non c'è uno scambio di certificati né tantomeno una verifica verso una certification authority.

Questo significa che nattando la destinazione 88.149.202.248 verso un altro IP, a patto che sull'IP verso cui si dirotta il traffico ci sia una servlet Ookla in ascolto, potrebbe benissimo funzionare. Del resto $ISPdimerda lo faceva e il dato che vedo, a labile memoria, non mi è poi così nuovo. Non avevo mai verificato che si trattasse di un WebSocket ma il meccanismo che avevo in mente c'è, ovvero l'applet che carichi dal sito Speedtest.net quando avvii il test vero e proprio parla direttamente con la servlet del server che hai selezionato per i fatti suoi in base ad un elenco di IP distribuiti senza passare attraverso Speedtest.net

Poi se mi sbalio mi corigerete 😅

    aternopae Detta sessione è ovviamente cifrata ma non c'è uno scambio di certificati né tantomeno una verifica verso una certification authority.

    Questa frase non sta in cielo né in terra, di sicuro c'è uno scambio di chiavi e certificati, esso può avvenire in infiniti modi

    aternopae Questo significa che nattando la destinazione 88.149.202.248 verso un altro IP, a patto che sull'IP verso cui si dirotta il traffico ci sia una servlet Ookla in ascolto, potrebbe benissimo funzionare. Del resto $ISPdimerda lo faceva e il dato che vedo, a labile memoria, non mi è poi così nuovo

    Il fatto che lo faceva, magari all'epoca degli speedtest in flash player senza ssl non significa che sia ancora possibile.

    aternopae Detta sessione è ovviamente cifrata ma non c'è uno scambio di certificati né tantomeno una verifica verso una certification authority.

    Perché si parte da una sessione HTTP(S) preesistente facendo una richiesta 101 Switching Protocols, la parte di autenticazione è stata fatta prima (da specifiche, non ho guardato il pcap)

      aternopae Poi se mi sbalio mi corigerete

      Devi forzarli come tls, non come websocket.... Websocket gira dentro tls. Ormai non so più come dirlo .

      Toh, l'handshake TLS è al pacchetto 11664 e seguenti

      Si vedere pure SNI che è usato per salutare il server nel caso sotto lo stesso IP ci siano più vhost

      Tanto per concludere. Non puoi dirmi:

      aternopae non faccio quasi mai un cap live da wireshark, mi metto su un routerboard da cui passa il traffico e poi apro il capture scaricato col wireshark proprio per questo motivo.

      E poi negli sniff vedo il traffico catturato su un PC windows tra un PC asus e un device Huawei... E no, non c'è nemmeno tzsp prima che mi dici "ho usato il PC come remote target del packet sniffer di mikrotik"

        aternopae Poi se mi sbalio mi corigerete 😅

        Guarda, ti dimostro che abbiamo ragione senza nemmeno passare dal via.

        Mischiare http ed https viene definito come "mixed content", e sai qual è la parte divertente?
        Ai browser il mixed content non piace troppo, un po' come ai Pisani non piacciono quelli di Livorno.

        Finché sei sugli indirizzi "di sviluppo", vedasi 127.0.0.1 o localhost, la maggior parte dei browser (escluso safari) non si incazzano, quando vai sul pubblico i browser se la prendono particolarmente sul personale e ti stroncano la richiesta ancora prima che parta.

        Una buona lettura.

          nanomad E poi negli sniff vedo il traffico catturato su un PC windows tra un PC asus e un device Huawei... E no, non c'è nemmeno tzsp prima che mi dici "ho usato il PC come remote target del packet sniffer di mikrotik"

          questo l'ho fatto da casa dove ho un setup diverso e non ho a disposizione un Mikrotik, puoi usare o tshark.exe da riga di comando, che è molto simile al tcpdump, per evitare di scomodare la GUI di Wireshark che pianta tutto a causa del fatto che elabora il traffico in realtime, oppure puoi usare direttamente Windows:

          netsh trace start capture=yes captureinterface=N maxsize=50 tracefile=c:\sniff.etl

          dove N è l'ordinale dell'interfaccia (netsh trace show interfaces), poi esiste un meraviglioso etl2pcapng che lo converte nel formato leggibile a Wireshark, ma dal momento che tshark.exe usa direttamente npcap puoi evitare tutto sto giro. Il risultato è identico.

          eutampieri Perché si parte da una sessione HTTP(S) preesistente facendo una richiesta 101 Switching Protocols, la parte di autenticazione è stata fatta prima (da specifiche, non ho guardato il pcap)

          No, la sessione TCP è appena iniziata, il primo pacchetto dopo TCP SYN, TCP SYN-ACK, TCP ACK è un TLS 1.3 Client Hello.

          C'è una precedente sessione sempre TLS all'ordinale 2071, con uno scambio di chiavi praticamente identico, ma avvenuta prima che lanciassi lo speedtest. Presumo sia una specie di discovery. Ma quello che si dicono l'applet e la servlet non è del tutto rilevante ai fini della comprensione se sia possibile nattare la destinazione e ottenere uno speedtest falsato.

          Effettivamente sbagliavo io a usare Wireshark, anche se trovo strano che l'euristica nel momento in cui togli l'associazione alla porta TCP non lo riconosca, ma questo è un altro discorso. Non ci ho dedicato che pochi minuti (e la fretta mi ha effettivamente fuorviato), però se dissezioni la sessione TLS vedi che fa un banale scambio di chiavi.

          Il che non esclude appunto che se fai un dnat verso un diverso IP dove c'è in ascolto una servlet Ookla non possa salire comunque una sessione TLS diversa e che l'applet non se ne accorga e faccia comunque tutto lo speedtest.

            aternopae ma tu ti rendi conto della conseguenza di questa determinata affermazione? Cioè tu stai implicitamente dicendo che tutto ciò che usa wss è insicuro perché a tuo dire non c'è uno scambio di chiavi, quindi decine di applicazioni web sicure secondo te sarebbero insicure, e per fortuna non è così perché uno scambio di chiavi può essere utilizzato intra e inter sessione tcp.


            Rimane il fatto che sia l'app che la console sono suscettibili a natting di questo tipo, ma non il browser.

              aternopae Il che non esclude

              Manco lo prova.

              aternopae Il che non esclude appunto che se fai un dnat verso un diverso IP dove c'è in ascolto una servlet Ookla non possa salire comunque una sessione TLS diversa e che l'applet non se ne accorga e faccia comunque tutto lo speedtest

              La servlet ookla è in grado di generare un certificato TLS valido a nome di un dominio qualiasi? (test.eolo.it nel nostro caso). Perchè se così fosse è un baco di sicurezza bello grosso lato OOKLA. Hai prove al riguardo?

              edit: il trick del DNAT funziona solo se la gente usa speedtest da CLI o da app
              Vedi questo bellissimo test fatto su "Eolo MI" da console con un PC collegato in wifi 2.4Ghz: https://www.speedtest.net/result/c/96fc34e6-83c8-47b8-961a-722c8df8e89a

              O da app windows:

              Il problema è che da browser.... si spacca tutto (come previsto)

                simonebortolin Cioè tu stai implicitamente dicendo che tutto ciò che usa wss è insicuro perché a tuo dire non c'è uno scambio di chiavi

                Mai detto niente di simile:

                lo scambio di chiavi c'è altrimenti non andrebbe su la sessione TLS, però un conto è se io e te ci scambiamo delle chiavi e cifriamo la connessione. Questo rende la connessione difficile da decifrare per terzi, ma non dice niente su me e te.

                Il motivo per cui c'è una differenza sostanziale tra un semplice scambio di chiavi, dei certificati self-signed e dei certificati trusted da una certification authority è proprio che se tu semplicemente cifri una connessione con uno scambio di chiavi non hai la certezza di parlare con l'interlocutore giusto.

                Lo stesso dicasi per i certificati self-signed: tu dichiari di essere tu e io dichiaro di essere io.

                Mentre se usi dei certificati emessi da una CA entrambi gli interlocutori possono verificare se c'è corrispondenza tra i nomi DNS dell'host con cui parli e il certificato che dichiarano di avere. Peraltro esistono anche diversi tipi di certificati: i wildcard sono meno sicuri, ma puoi addirittura trustare un certificato che punta ad un FQDN ed una porta precisa (ma non lo fa nessuno perché poi la cosa va gestita ed è una delle cose più antipatiche da gestire in assoluto).

                La sessione TLS dove avviene uno scambio di certificati è più complessa di questa (vedi che ho reso pubblico il capture dei dati se non ti fidi), in questa sessione avviene unicamente uno scambio di chiavi DH e viene negoziata la cifratura TLS_AES_128_GCM_SHA256

                Questo non garantisce all'applet di sapere se sta veramente parlando con test.eolo.it, si deve fidare della chiave che questi gli manda perché non c'è scambio di certificati.

                Poi se a livello applicativo avvengano ulteriori controlli questo non lo possiamo sapere salvo fare una retroingegneria del protocollo, ma a quanto pare è a sorgenti aperti, serve qualcuno che sappia leggere del Java e ne abbia voglia.

                  aternopae peccato che un browser non ammetta certificati self-signed senza dare un bel messaggio di errore

                    nanomad La servlet ookla è in grado di generare un certificato TLS valido a nome di un dominio qualiasi? (test.eolo.it nel nostro caso). Perchè se così fosse è un baco di sicurezza bello grosso lato OOKLA. Hai prove al riguardo?

                    La sessione TLS con scambio certificati è diversa (più complessa) di quella che si vede nel capture, se hai voglia leggiti la RFC 8446, ma dal capture è evidente che la applet Ookla si accontenta di un banale scambio chiavi.

                    A questo punto bisogna provare che la applet fa ulteriori controlli perché dalla sessione catturata non c'è evidenza che li faccia.

                    • nanomad ha risposto a questo messaggio

                      simonebortolin peccato che un browser non ammetta certificati self-signed senza dare un bel messaggio di errore

                      evidentemente c'è modo di forzare il trust di un host a monte prima di aprire la connessione, probabilmente quando il browser parla con https://www.speedtest.net gli viene fornita una applet scritta in qualche modo che contiene dei dati specifici per trustare tutti gli host ufficiali.

                      La prima sessione breve la fa quando selezioni il server dalla lista. Sembra una specie di discovery o di esistenza in vita. Non ho spulciato tutto il cap, però di default era selezionato Fastweb Milano (la linea da cui ho fatto il test è una linea Fastweb), probabile che ci sia la stessa breve sessione verso lo speedtest di Fastweb e forse in tutto quel traffico che fa ci sono una serie di prove che fa fare al browser per capire il contesto.

                      Onestamente non ho voglia di mettermi a retroingegnerizzare tutto il flusso che fa.

                        aternopae Ma da browser è una banale connessione HTTPS. Javacript non ha modo di fare altro.

                        Case in point:

                        • Ho fatto dnat di test.eolo.it verso lo speedtest di cwnet
                        • cwnet ha una certification chain valida, oltretutto su dominio ookla

                        Ovviamente non parte lo speedtest perchè il BROWSER blocca tutto:

                        Non ci sono applet, magie o altro. E' una banale connessione HTTPS. Stai usando parole random che non formano frasi di senso compiuto nel contesto dei browser web moderni (che, per tua info, non supportano più applet o altro)

                        aternopae evidentemente c'è modo di forzare il trust di un host a monte prima di aprire la connessione, probabilmente quando il browser parla con https://www.speedtest.net gli viene fornita una applet scritta in qualche modo che contiene dei dati specifici per trustare tutti gli host ufficiali.

                        No è un banale file json che contiene gli hostname dei server, i loro ID e poco altro. Il trust è fatto appunto dal motore HTTPS del browser che controlla che:

                        • Non stia provando a caricare risorse HTTP in chiaro a partire da un URL "nella barra" in HTTPS
                        • Il server abbia un certificato HTTPS
                        • Il certificato HTTPS sia emesso per lo stesso nome host a cui ti stai connettendo
                        • Il certificato HTTPS ha una trust chain valida (i self signed non sono ammessi)

                        aternopae evidentemente c'è modo di forzare il trust di un host a monte prima di aprire la connessione, probabilmente quando il browser parla con https://www.speedtest.net gli viene fornita una applet scritta in qualche modo che contiene dei dati specifici per trustare tutti gli host ufficiali.

                        Non esiste più flash player è tutto javascript e json è tutto ciò è impossibile

                        mark129 abbiamo mai visto Speedtest.net rotto perché qualche ISP dirotta il traffico? Mi pare di no... Quindi il problema nella pratica non esiste

                          Informativa privacy - Informativa cookie - Termini e condizioni - Regolamento - Disclaimer - 🏳️‍🌈
                          P.I. IT16712091004 - info@fibraclick.it

                          ♻️ Il server di questo sito è alimentato al 100% con energia rinnovabile