Domene-fronting basert pÄ TLS 1.3

Innledning

Domene-fronting basert pÄ TLS 1.3
Moderne bedriftsinnhold filtreringssystemer fra prominente produsenter som Cisco, BlueCoat, og FireEye har mye til felles med de mer kraftfulle sĂžsknene sine — DPI-systemene, som blir sterkt implementert pĂ„ nasjonalt nivĂ„. Kjernen i bĂ„de dem og de andre er Ă„ inspisere innkommende og utgĂ„ende internett-trafikk, og basert pĂ„ svarte/hvite lister, ta beslutninger om Ă„ blokkere internettforbindelser. Siden bĂ„de bruker lignende prinsipper i sin funksjonalitet, vil ogsĂ„ metodene for Ă„ omgĂ„ dem ha mye til felles.

En av teknologiene som gjÞr det mulig Ä omgÄ bÄde DPI og bedriftsfiltreringssystemer effektivt, er domain fronting-teknologi. Den gÄr ut pÄ Ä fÄ tilgang til en blokkert ressurs ved Ä dekke seg bak et annet, offentlig domene med et godt omdÞmme, som engelske google.com, og sÄledes ikke vil bli blokkert av noe system.

Det er skrevet en god del artikler om denne teknologien, og mange eksempler er blitt gitt. Imidlertid gir populĂŠre og nylig omtalte teknologier som DNS-over-HTTPS og encrypted-SNI, samt den nye versjonen av protokollen TLS 1.3, muligheten til Ă„ vurdere en annen variant av domain fronting.

La oss se nÊrmere pÄ teknologien

PÄ fÞrst, la oss definere de grunnleggende begrepene slik at alle har en forstÄelse av hvem som er hvem og hvorfor alt dette er nÞdvendig. Vi har nevnt mekanismen eSNI, hvis funksjon vil bli gjennomgÄtt videre. Mekanismen eSNI (encrypted Server Name Indication) er den sikre versjonen av SNI, kun tilgjengelig for protokoll TLS 1.3. Hovedpoenget er Ä kryptere, inkludert informasjon om hvilket domene forespÞrselen sendes til.

La oss nÄ se pÄ hvordan eSNI-mekanismen fungerer i praksis.

La oss si at vi har en nettressurs som blokkeres av et moderne DPI-lÞsning (la oss ta et kjent torrenttracker som eksempel - rutracker.nl). NÄr vi prÞver Ä fÄ tilgang til torrenttrackeren, ser vi en vanlig provider-feilmelding om at ressursen er blokkert:

Domene-fronting basert pÄ TLS 1.3

PĂ„ nettstedet til RKN oppfĂžres dette domenet virkelig i svartelistene:

Domene-fronting basert pÄ TLS 1.3

Ved Ă„ forespĂžrre whois kan vi se at selve domenet er 'skjult' bak den skybaserte tjenesteleverandĂžren Cloudflare.

Domene-fronting basert pÄ TLS 1.3

Men i motsetning til «ekspertene» fra RKN, sÄ valgte de mer teknisk kyndige ansatte fra Beeline (eller de som har lÊrt av den bitre erfaringen med vÄr berÞmte regulator) Ä ikke bare blokkere nettsiden etter IP-adressen, men spesifikt legge til domenenavnet. Dette kan lett bekreftes hvis man ser hva andre domener som skjuler seg bak dette samme IP-adressen, besÞker et av dem og ser at tilgangen ikke er blokkert:

Domene-fronting basert pÄ TLS 1.3

Hvordan kan dette skje? Hvordan finner providerens DPI ut hvilket domene nettleseren min gÄr til, nÄr all kommunikasjon skjer over https-protokollen, og vi har ikke lagt merke til at Beeline har byttet ut https-sertifikater? Er det en form for klarsyn eller blir jeg overvÄket?

La oss prÞve Ä svare pÄ dette spÞrsmÄlet ved Ä se pÄ trafikken gjennom Wireshark.

Domene-fronting basert pÄ TLS 1.3

PÄ skjermbildet ser vi at nettleseren fÞrst fÄr IP-adressen til serveren via DNS, deretter skjer den standard TCP-hÄndtrykkingen med destinasjonsserveren, og til slutt prÞver nettleseren Ä etablere en SSL-tilkobling til serveren. For dette sender den pakken SSL Client Hello, som inneholder navnet pÄ den opprinnelige domenen i klartekst. Dette feltet er nÞdvendig for front-end-serveren til Cloudflare for Ä kunne rute forbindelsen riktig. Det er her providerens DPI fanger oss, og bryter forbindelsen. Vi fÄr ingen melding fra provider, og ser bare den vanlige nettleserfeilen, som om nettsiden er stengt eller bare ikke fungerer:

Domene-fronting basert pÄ TLS 1.3

NĂ„ la oss aktivere eSNI-mekanismen i nettleseren, slik det er skrevet i instruksjonen for Firefox :
For dette Äpner vi konfigurasjonssiden i Firefox about:config og aktiverer fÞlgende innstillinger:

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

Etter dette vil vi sjekke om innstillingene fungerer korrekt pÄ Cloudflare-siden med lenken og prÞve trikset med torrent-trackeren vÄr igjen.

Domene-fronting basert pÄ TLS 1.3

Voilà. VÄr favoritt tracker Äpnet seg, uten bruk av VPN eller proxy-servere. La oss nÄ se pÄ trafikks dumpen i Wireshark, hva skjedde.

Domene-fronting basert pÄ TLS 1.3

Denne gangen inneholder pakken SSL Client Hello ikke domenenavnet i klartekst, men en ny felt er lagt til pakken - encrypted_server_name - der verdien rutracker.nl befinner seg, og dette feltet kan kun dekrypteres av front-end-serveren til Cloudflare. Dermed har ikke providerens DPI noe annet Ă„ gjĂžre enn Ă„ vaske hendene sine og la slik trafikk passere. Det er ikke noen andre muligheter med kryptering.

NĂ„, hvordan fungerer teknologien i nettleseren — vi har sett pĂ„ det. NĂ„ la oss prĂžve Ă„ bruke den til mer spesifikke og interessante ting. FĂžrst vil vi lĂŠre curl Ă„ bruke eSNI for Ă„ jobbe med TLS 1.3, og samtidig se hvordan domenefronting fungerer basert pĂ„ eSNI.

Domenefronting med eSNI

Siden curl for Ä koble til via https-protokollen bruker standardbiblioteket openssl, mÄ vi fÞrst sÞrge for at eSNI stÞttes der. Det finnes for Þyeblikket ingen stÞtte for eSNI i master-grenene av openssl, sÄ vi mÄ laste ned en spesialgren av openssl, kompilere den og installere den.

Vi kloner depotet fra GitHub og komprimerer som vanlig:

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

$ make
$ cd esnistuff
$ make

Videre kloner vi depotet fra curl og konfigurerer kompileringen med vÄr sammensatte openssl-bibliotek:

$ 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

Det er viktig Ă„ angi alle katalogene hvor openssl befinner seg riktig (i vĂ„rt tilfelle — det er /opt/openssl/) og sĂžrge for at konfigurasjonsprosessen gĂ„r uten feil.

Ved vellykket konfigurasjon — vil vi se linjen:

WARNING: esni ESNI enabled but marked EXPERIMENTAL. Use with caution!

$ make

Etter vellykket bygging av pakken vil vi bruke en spesiell bash-fil fra openssl for Ă„ konfigurere og kjĂžre curl. Vi kopierer den til katalogen med curl for enkelhet:

cp /opt/openssl/esnistuff/curl-esni 

og utfĂžrer en test https-forespĂžrsel til cloudflare-serveren, samtidig som vi registrerer DNS- og TLS-pakker i Wireshark.

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

I serverens svar, i tillegg til en mengde feilsĂžkingsinformasjon fra openssl og curl, mottar vi et HTTP-svar med kode 301 fra 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/

som vitner om at forespÞrselen vÄr ble vellykket levert til destinasjonsserveren, hÞrt og behandlet.

La oss nÄ se pÄ trafikksdumpen i Wireshark, altsÄ hva leverandÞrens DPI sÄ i dette tilfellet.

Domene-fronting basert pÄ TLS 1.3

Det er tydelig at curl fĂžrst kontaktet DNS-serveren for den offentlige eSNI-nĂžkkelen for cloudflare-serveren — TXT DNS-forespĂžrsel til _esni.cloudflare.com (pakke nr. 13). Deretter, ved hjelp av openssl-biblioteket, sendte curl en TLS 1.3-forespĂžrsel til cloudflare-serveren hvor SNI-feltet var kryptert med den offentlige nĂžkkelen som ble mottatt i forrige trinn (pakke nr. 22). Men i tillegg til eSNI-feltet ble det i SSL-hello-pakken ogsĂ„ lagt inn et felt med standard — Ă„pen SNI, som vi kan spesifisere i vilkĂ„rlig rekkefĂžlge (i dette tilfellet — www.hello-rkn.ru).

Dette Äpne SNI-feltet ble ikke vurdert av cloudflare-serverne og fungerte bare som en maskering for providers DPI. Cloudflare-serveren mottok vÄr ssl-hello-pakke, dekrypterte eSNI, hentet den originale SNI og hÄndterte den som om ingenting hadde skjedd (gjorde alt akkurat slik det var planlagt under utviklingen av eSNI).

Det eneste som kan bli et problem for DPI i dette tilfellet er den primÊre DNS-forespÞrselen til _esni.cloudflare.com. Men vi gjorde DNS-forespÞrselen Äpen bare for Ä vise hvordan denne mekanismen fungerer innvendig.

For Ă„ fjerne grunnlaget for DPI helt bruker vi den allerede nevnte mekanismen DNS-over-HTTPS. En liten forklaring – DOH – er en protokoll som beskytter mot «man-in-the-middle»-angrep ved Ă„ sende DNS-forespĂžrselen via HTTPS-protokollen.

La oss gjÞre forespÞrselen pÄ nytt, men denne gangen vil vi fÄ de offentlige eSNI-nÞklene over HTTPS, ikke DNS:

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

Trafikkdumpen for forespĂžrselen er presentert i skjermbildet nedenfor:

Domene-fronting basert pÄ TLS 1.3

Det er tydelig at curl fÞrst kontakter serveren mozilla.cloudflare-dns.com via DoH-protokollen (HTTPS-forbindelse til server 104.16.249.249), for Ä fÄ de offentlige nÞkkelvektene for kryptering av SNI, og deretter til mÄlserveren, mens den skjuler seg bak domenet. www.hello-rkn.ru.

I tillegg til den nevnte DoH-oppleveren mozilla.cloudflare-dns.com kan vi ogsÄ bruke andre populÊre DoH-tjenester, for eksempel fra den berÞmte ondskapens korporasjon.
La oss gjĂžre en slik forespĂžrsel:

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

Og vi fÄr svaret:

< 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

Domene-fronting basert pÄ TLS 1.3

I dette tilfellet har vi kontaktet den blokkerte serveren rutracker.nl ved Ä bruke DoH-opplÞser dns.google (det er ikke en skrivefeil, nÄ har det berÞmte selskapet fÄtt sitt eget toppnivÄdomene) og skjult oss bak et annet domene, som er strengt forbudt Ä blokkere av alle DPI-systemer under trussel om dÞdsstraff. Svarene vi mottar viser at forespÞrselen vÄr ble behandlet vellykket.

Som en ekstra sjekk pĂ„ at leverandĂžrens DPI reagerer pĂ„ Ă„pen SNI, som vi bruker som dekning — kan vi sende en forespĂžrsel til rutracker.nl mens vi skjuler oss bak en annen forbudt ressurs, for eksempel en annen "god" torrent-tracker:

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

Vi fÄr ikke noe svar fra serveren, da forespÞrselen vÄr vil bli blokkert av DPI-systemet.

En liten konklusjon til fĂžrste del

Vi har klart Ä demonstrere funksjonaliteten til eSNI ved hjelp av openssl og curl og sjekke ytelsen til domene-fronting basert pÄ eSNI. PÄ samme mÄte kan vi tilpasse vÄre favorittverktÞy som bruker openssl-biblioteket for Ä fungere "under dekke" av andre domener. Mer om dette i vÄre kommende artikler.

Kilde: habr.com

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster