Fronting di duminiu basatu annantu à TLS 1.3

Introduzione

Fronting di duminiu basatu annantu à TLS 1.3
Sistemi muderni di filtru di cuntenutu corporativu da i pruduttori rinumati cum'è Cisco, BlueCoat, FireEye anu assai in cumunu cù i so contraparti più putenti - i sistemi DPI, chì sò attivamente implementati à u livellu naziunale. L'essenza di u travagliu di i dui hè di inspeccionà u trafficu di l'Internet entrante è in uscita è, basatu nantu à listi neri / bianchi, piglià una decisione di pruibisce a cunnessione Internet. E postu chì i dui si basanu nantu à i principii simili in i principii di u so travagliu, i metudi per eludirli anu ancu assai in cumunu.

Una di e tecnulugii chì vi permette di passà in modu abbastanza efficace sia DPI sia sistemi corporativi hè a tecnulugia di u duminiu. A so essenza hè chì andemu à una risorsa bluccata, ammucciatu daretu à un altru, duminiu publicu cù una bona reputazione, chì ovviamente ùn serà micca bluccatu da alcun sistema, per esempiu google.com.

Molti articuli sò digià scrittu annantu à sta tecnulugia è parechji esempi sò stati dati. In ogni casu, i tecnulugii DNS-over-HTTPS è criptati-SNI populari è recentemente discututi, è ancu a nova versione di u protocolu TLS 1.3, permettenu di cunsiderà una altra opzione per u fronting di domini.

Capisce a tecnulugia

Prima, definiscemu un pocu di cuncetti basi per chì ognunu hà una cunniscenza di quale hè quale è perchè tuttu questu hè necessariu. Avemu mintuatu u mecanismu eSNI, u funziunamentu di u quale serà discutitu più. U mecanismu eSNI (indicazione di u nome di u servitore criptatu) hè una versione sicura di SNI, dispunibule solu per u protocolu TLS 1.3. L'idea principale hè di criptà, frà altre cose, l'infurmazioni nantu à quale duminiu hè mandatu a dumanda.

Avà guardemu cumu funziona u mecanismu eSNI in pratica.

Diciamu chì avemu una risorsa Internet chì hè bluccata da una suluzione moderna DPI (pigliemu, per esempiu, u famosu torrent tracker rutracker.nl). Quandu pruvemu à accede à u situ web di un tracker torrent, vedemu u stub standard di u fornitore chì indica chì a risorsa hè bluccata:

Fronting di duminiu basatu annantu à TLS 1.3

In u situ RKN, stu duminiu hè in realtà listatu in i listi di stop:

Fronting di duminiu basatu annantu à TLS 1.3

Quandu dumandate whois, pudete vede chì u duminiu stessu hè "oculatu" daretu à u cloud provider Cloudflare.

Fronting di duminiu basatu annantu à TLS 1.3

Ma à u cuntrariu di i "specialisti" da RKN, l'impiegati più tecnichi di Beeline (o insignatu da l'amara spirienza di u nostru famosu regulatore) ùn anu micca stupidu pruibitu u situ per l'indirizzu IP, ma aghjunghjenu u nome di duminiu à a lista di stop. Pudete facilmente verificate questu s'è guardate ciò chì altri domini sò oculati daretu à u listessu indirizzu IP, visitate unu di elli è vede chì l'accessu ùn hè micca bluccatu:

Fronting di duminiu basatu annantu à TLS 1.3

Cumu succede questu? Cumu u DPI di u fornitore sapi quale duminiu hè u mo navigatore, postu chì tutte e cumunicazioni si facenu via u protokollu https, è ùn avemu micca ancu nutatu a sustituzzioni di i certificati https da Beeline? Hè clarividente o mi seguitanu ?

Pruvemu di risponde à sta quistione fighjendu u trafficu attraversu wireshark

Fronting di duminiu basatu annantu à TLS 1.3

A screenshot mostra chì prima u navigatore uttene l'indirizzu IP di u servitore via DNS, dopu un standard TCP handshake accade cù u servitore di destinazione, è dopu u navigatore prova di stabilisce una cunnessione SSL cù u servitore. Per fà questu, manda un pacchettu SSL Client Hello, chì cuntene u nome di u duminiu fonte in testu chjaru. Stu campu hè necessariu da u servitore frontend cloudflare per indirizzà currettamente a cunnessione. Hè quì chì u fornitore DPI ci piglia, rompendu a nostra cunnessione. À u listessu tempu, ùn ricevemu micca stub da u fornitore, è vedemu l'errore standard di u navigatore cum'è se u situ hè disattivatu o simpricimenti ùn funziona micca:

Fronting di duminiu basatu annantu à TLS 1.3

Avà attivemu u mecanismu eSNI in u navigatore, cum'è scrittu in l'istruzzioni per brumann :
Per fà questu, apremu a pagina di cunfigurazione di Firefox circa: config è attivate i seguenti paràmetri:

network.trr.mode = 2;
network.trr.uri = https://mozilla.cloudflare-dns.com/dns-query
network.security.esni.enabled = true

Dopu questu, verificaremu chì i paràmetri funzionanu bè in u situ web di cloudflare. a lea è pruvemu di novu u truccu cù u nostru tracker torrent.

Fronting di duminiu basatu annantu à TLS 1.3

Voila. U nostru tracker preferitu hà apertu senza VPN o servitori proxy. Fighjemu avà u dump di trafficu in wireshark per vede ciò chì hè accadutu.

Fronting di duminiu basatu annantu à TLS 1.3

Questa volta, u pacchettu di u cliente ssl ùn cuntene micca esplicitamente u duminiu di destinazione, ma invece, un novu campu apparsu in u pacchettu - encrypted_server_name - questu hè induve u valore di rutracker.nl hè cuntenutu, è solu u servitore frontend cloudflare pò decifrare questu. campu. È s'ellu hè cusì, allura u fornitore DPI ùn hà micca altra scelta ma di lavà e mani è permette un tali trafficu. Ùn ci hè micca altre opzioni cù criptografia.

Allora, avemu vistu cumu a tecnulugia funziona in u navigatore. Avà pruvemu à applicà à e cose più specifiche è interessanti. E prima, avemu da insignà u listessu curl à aduprà eSNI à travaglià cù TLS 1.3, è à u listessu tempu avemu da vede cumu u duminiu basatu in eSNI fronting stessu travaglia.

Fronting di duminiu cù eSNI

A causa di u fattu chì curl usa a libreria standard openssl per cunnette via u protocolu https, prima di tuttu avemu bisognu di furnisce un supportu eSNI quì. Ùn ci hè ancu un supportu eSNI in i rami master openssl, cusì avemu bisognu di scaricà un ramu openssl speciale, compilà è installate.

Clonemu u repository da GitHub è compilemu cum'è di solitu:

$ git clone https://github.com/sftcd/openssl
$ cd openssl
$ ./config

$ make
$ cd esnistuff
$ make

Dopu, clonemu u repository cù curl è cunfigurà a so compilazione usendu a nostra biblioteca openssl compilata:

$ cd $HOME/code
$ git clone https://github.com/niallor/curl.git curl-esni
$ cd curl-esni

$ export LD_LIBRARY_PATH=/opt/openssl
$ ./buildconf
$ LDFLAGS="-L/opt/openssl" ./configure --with-ssl=/opt/openssl --enable-esni --enable-debug

Quì hè impurtante di specificà currettamente tutti i cartulari induve openssl hè situatu (in u nostru casu, questu hè / opt / openssl /) è assicuratevi chì u prucessu di cunfigurazione passa senza errore.

Se a cunfigurazione hè successu, vedemu a linea:

ATTENZIONE: esni ESNI attivatu ma marcatu EXPERIMENTALE. Aduprate cun prudenza!

$ make

Dopu avè custruitu u pacchettu cù successu, useremu un schedariu bash speciale da openssl per cunfigurà è eseguisce curl. Copiemu in u cartulare cù curl per comodità:

cp /opt/openssl/esnistuff/curl-esni 

è fà una dumanda https di prova à u servitore cloudflare, mentre registra simultaneamente i pacchetti DNS è TLS in Wireshark.

$ ESNI_COVER="www.hello-rkn.ru" ./curl-esni https://cloudflare.com/

In a risposta di u servitore, in più di assai infurmazione di debugging da openssl è curl, riceveremu una risposta HTTP cù u codice 301 da cloudflare.

HTTP/1.1 301 Moved Permanently
< Date: Sun, 03 Nov 2019 13:12:55 GMT
< Transfer-Encoding: chunked
< Connection: keep-alive
< Cache-Control: max-age=3600
< Expires: Sun, 03 Nov 2019 14:12:55 GMT
< Location: https://www.cloudflare.com/

chì indica chì a nostra dumanda hè stata mandata bè à u servitore di destinazione, intesu è processatu.

Avà guardemu à u dump di trafficu in wireshark, i.e. ciò chì u fornitore DPI hà vistu in questu casu.

Fronting di duminiu basatu annantu à TLS 1.3

Pò esse vistu chì curl hà vultatu prima à u servitore DNS per una chjave publica eSNI per u servitore cloudflare - una dumanda TXT DNS à _esni.cloudflare.com (pacchettu No. 13). Allora, utilizendu a libreria openssl, curl hà mandatu una dumanda TLS 1.3 à u servitore cloudflare in quale u campu SNI hè statu criptatu cù a chjave publica ottenuta in u passu precedente (packet #22). Ma, in più di u campu eSNI, u pacchettu SSL-hello include ancu un campu cù u solitu - SNI apertu, chì pudemu specificà in ogni ordine (in questu casu - www.hello-rkn.ru).

Stu campu SNI apertu ùn hè statu pigliatu in contu in ogni modu quandu trattatu da i servitori cloudflare è serve solu cum'è una maschera per u fornitore DPI. U servitore cloudflare hà ricivutu u nostru pacchettu ssl-hello, hà decriptatu l'eSNI, hà estrattu u SNI originale da quì è l'hà processatu cum'è s'ellu ùn era nunda (hà fattu tuttu esattamente cum'è previstu quandu si sviluppau eSNI).

L'unicu ciò chì pò esse pigliatu in questu casu da un puntu di vista DPI hè a dumanda DNS primaria à _esni.cloudflare.com. Ma avemu fattu a dumanda di DNS aperta solu per vede cumu stu mecanismu funziona da l'internu.

Per finalmente tirà u tappettu da sottu DPI, usemu u mecanismu DNS-over-HTTPS digià citatu. Una piccula spiegazione - DOH hè un protokollu chì vi permette di prutezzione di un attaccu di l'omu in u mediu mandendu una dumanda DNS per HTTPS.

Eseguimu a dumanda di novu, ma sta volta riceveremu chjavi eSNI publichi via u protocolu https, micca DNS:

ESNI_COVER="www.hello-rkn.ru" DOH_URL=https://mozilla.cloudflare-dns.com/dns-query ./curl-esni https://cloudflare.com/

A dumanda di dump di trafficu hè mostrata in a screenshot sottu:

Fronting di duminiu basatu annantu à TLS 1.3

Pò esse vistu chì curl accede prima à u servitore mozilla.cloudflare-dns.com via u protocolu DoH (collegamentu https à u servitore 104.16.249.249) per ottene da elli i valori di chjavi publichi per a criptografia SNI, è dopu à u destinazione. servitore, ammucciatu daretu à u duminiu www.hello-rkn.ru.

In più di u resolutore DoH sopra mozilla.cloudflare-dns.com, pudemu usà altri servizii DoH populari, per esempiu, da a famosa corporazione male.
Eseguimu a seguente dumanda:

ESNI_COVER="www.kremlin.ru" DOH_URL=https://dns.google/dns-query ./curl-esni https://rutracker.nl/

È avemu a risposta:

< HTTP/1.1 301 Moved Permanently
< Date: Sun, 03 Nov 2019 14:10:22 GMT
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: keep-alive
< Set-Cookie: __cfduid=da0144d982437e77b0b37af7d00438b1a1572790222; expires=Mon, 02-Nov-20 14:10:22 GMT; path=/; domain=.rutracker.nl; HttpOnly; Secure
< Location: https://rutracker.nl/forum/index.php
< CF-Cache-Status: DYNAMIC
< Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
< Server: cloudflare
< CF-RAY: 52feee696f42d891-CPH

Fronting di duminiu basatu annantu à TLS 1.3

In questu casu, avemu vultatu à u servitore rutracker.nl bluccatu, utilizendu u resolutore DoH dns.google (ùn ci hè micca un typo quì, avà a famosa corporazione hà u so propiu duminiu di primu livellu) è ci hè cupartu cù un altru duminiu, chì hè strettu. pruibitu per tutti i DPI di bluccà sottu pena di morte. Basatu nantu à a risposta ricevuta, pudete capisce chì a nostra dumanda hè stata trattata bè.

Cum'è un verificatu supplementu chì u DPI di u fornitore risponde à l'SNI apertu, chì trasmettemu cum'è una tappa, pudemu fà una dumanda à rutracker.nl sottu u preghjudiziu di qualchì altra risorsa pruibita, per esempiu, un altru "bon" tracker torrent:

$ ESNI_COVER="rutor.info" DOH_URL=https://dns.google/dns-query ./curl-esni https://rutracker.nl/

Ùn riceveremu micca una risposta da u servitore, perchè ... a nostra dumanda serà bluccata da u sistema DPI.

Una breve cunclusione à a prima parte

Cusì, avemu statu capaci di dimustrà a funziunalità di eSNI usendu openssl è curl è pruvà l'operazione di fronting di duminiu basatu annantu à eSNI. In u listessu modu, pudemu adattà i nostri arnesi preferiti chì utilizanu a libreria openssl per travaglià "sottu u guise" di altri domini. Più dettagli nantu à questu in i nostri prossimi articuli.

Source: www.habr.com

Add a comment