DomÀn-fronting baserat pÄ TLS 1.3

Introduktion

DomÀn-fronting baserat pÄ TLS 1.3
Moderna företagsinformationssystem för innehĂ„llsfiltret, frĂ„n vĂ€lkĂ€nda tillverkare som Cisco, BlueCoat, FireEye, har mycket gemensamt med sina kraftfullare slĂ€ktingar – DPI-system som intensivt införs pĂ„ nationell nivĂ„. BĂ„da systemen arbetar för att övervaka inkommande och utgĂ„ende internettrafik och fatta beslut om att blockera internetanslutningar baserat pĂ„ svarta/vita listor. Eftersom de bĂ„da grundar sig pĂ„ liknande principer kommer Ă€ven metoderna för att kringgĂ„ dem att ha mycket gemensamt.

En av teknologierna som gör det möjligt att effektivt kringgÄ bÄde DPI och företagsystem Àr domÀnfronting-tekniken. Dess kÀrna ligger i att vi gÄr till en blockerat resurs, döljer oss bakom en annan offentlig domÀn med gott rykte, som i förvÀg inte kommer att blockeras av nÄgot system, till exempel google.com.

Det har redan skrivits mÄnga artiklar om denna teknologi och mÄnga exempel har tagits upp. De populÀra och ofta diskuterade teknologierna DNS-over-HTTPS och encrypted-SNI, samt den nya versionen av protokollet TLS 1.3, ger oss möjlighet att övervÀga Ànnu ett alternativ för domÀnfronting.

LÄt oss reda ut teknologin

Först ska vi definiera de grundlÀggande begreppen sÄ att alla har en förstÄelse för who is who och varför allt detta Àr viktigt. Vi nÀmnde mekanismen eSNI, vars arbete kommer att behandlas vidare. Mekanismen eSNI (encrypted Server Name Indication) Àr en skyddad version av SNI, tillgÀnglig endast för protokollet TLS 1.3. Huvudsyftet Àr att kryptera Àven information om vilken domÀn som begÀran skickas till.

LÄt oss nu se hur mekanismen eSNI fungerar praktiskt.

Anta att vi har en internetresurs som blockeras av en modern DPI-lösning (lĂ„t oss ta det berömda torrent-tracker — rutracker.nl som exempel). NĂ€r vi försöker besöka torrent-trackers webbplats ser vi ISP:ns standardblockering som meddelar att resursen blockeras:

DomÀn-fronting baserat pÄ TLS 1.3

PÄ RKN:s webbplats finns denna domÀn faktiskt med pÄ stopp-listorna:

DomÀn-fronting baserat pÄ TLS 1.3

Vid en whois-förfrÄgan Àr det tydligt att sjÀlva domÀnen "döljs" bakom den molnbaserade leverantören Cloudflare.

DomÀn-fronting baserat pÄ TLS 1.3

Men till skillnad frÄn "specialisterna" frÄn RKN, har de mer tekniskt kunniga medarbetarna frÄn Beeline (eller de som lÀrt sig av den bittra erfarenheten frÄn vÄr berömda regulator) inte bara stÀngt av webbplatsen pÄ IP-adressen, utan istÀllet lagt till domÀnnamnet. Det Àr lÀtt att övertyga sig om detta genom att se vilka andra domÀner som döljer sig bakom samma IP-adress, besöka en av dem och se att tillgÄngen inte Àr blockerad:

DomÀn-fronting baserat pÄ TLS 1.3

Hur kan detta vara möjligt? Hur vet anvĂ€ndarens DPI hur vilken av domĂ€nerna som min webblĂ€sare begĂ€r, nĂ€r alla kommunikationer sker via protokollet https, och byten av https-certifikat frĂ„n Beeline har vi inte mĂ€rkt av Ă€nnu? Är det en spĂ„man eller följer nĂ„gon efter mig?

Vi ska försöka svara pÄ detta frÄga genom att titta pÄ trafiken genom Wireshark.

DomÀn-fronting baserat pÄ TLS 1.3

PÄ skÀrmdumpen syns att webblÀsaren först fÄr IP-adressen till servern via DNS, sedan sker den vanliga TCP-handshake med destinationsservern, och dÀrefter försöker webblÀsaren etablera en ssl-anslutning med servern. För detta skickar den paketet SSL Client Hello, dÀr det ursprungliga domÀnnamnet finns synligt. Detta fÀlt behövs av front-end-servern Cloudflare för korrekt routing av anslutningen. Det Àr hÀr som den provider-baserade DPI fÄngar oss genom att bryta vÄr anslutning. Vi fÄr ingen blockeringsmeddelande frÄn tjÀnsteleverantören och ser standard webblÀsarfel som om webbplatsen Àr avstÀngd eller bara inte fungerar:

DomÀn-fronting baserat pÄ TLS 1.3

Nu lÄt oss aktivera eSNI-mekanismen i webblÀsaren, som det stÄr i instruktionerna för Firefox :
DÀrför öppnar vi konfigurationssidan för Firefox about:config och aktiverar följande instÀllningar:

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

Efter detta ska vi kontrollera instÀllningarnas korrekthet pÄ Cloudflare-sidan genom lÀnken och försöka finten med vÄr torrent-tracker igen.

DomÀn-fronting baserat pÄ TLS 1.3

Voila. VÄr Àlskade tracker öppnades, utan nÄgra VPN:er eller proxyservrar. LÄt oss nu titta pÄ trafiken i Wireshark, vad hÀnde.

DomÀn-fronting baserat pÄ TLS 1.3

Den hĂ€r gĂ„ngen innehĂ„ller paketet ssl client hello inte domĂ€nnamnet i klartext, utan i paketet har ett nytt fĂ€lt tillkommit — encrypted_server_name — dĂ€r vĂ€rdet rutracker.nl finns, och endast Cloudflare front-end-servern kan dekryptera detta fĂ€lt. Eftersom det Ă€r sĂ„, finns det inget annat kvar för tjĂ€nsteleverantörens DPI Ă€n att tvĂ€tta hĂ€nderna och lĂ„ta sĂ„dan trafik passera. Det finns inga andra alternativ för kryptering.

SÄ, vi har sett hur teknologin fungerar i webblÀsaren. Nu ska vi försöka anvÀnda den för mer specifika och intressanta saker. Till att börja med ska vi lÀra curl att anvÀnda eSNI för att arbeta med TLS 1.3, och samtidigt se hur domÀnfrontning pÄ basis av eSNI fungerar.

DomÀnfrontning med eSNI

Eftersom curl för att ansluta via https anvÀnder det standardbiblioteket openssl, mÄste vi först sÀkerstÀlla stöd för eSNI dÀr. I master-grenen av openssl finns det för nÀrvarande inget stöd för eSNI, sÄ vi mÄste ladda ner en speciell gren av openssl, kompilera och installera den.

Vi klonar repositoriet frÄn GitHub och kompilerar som vanligt:

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

$ make
$ cd esnistuff
$ make

DÀrefter klonar vi repositoriet med curl och konfigurerar dess kompilering med vÄr kompilerade 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

HÀr Àr det viktigt att ange alla kataloger dÀr openssl finns korrekt (i vÄrt fall Àr det /opt/openssl/) och se till att konfigurationsprocessen har genomförts utan fel.

Vid framgÄngsrik konfiguration kommer vi att se raden:

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

$ make

Efter att paketet har byggts framgÄngsrikt ska vi anvÀnda en speciell bash-fil frÄn openssl för att konfigurera och köra curl. Vi kopierar den till katalogen med curl för bekvÀmlighet:

cp /opt/openssl/esnistuff/curl-esni 

och gör en test https-förfrÄgan till cloudflare-servern, samtidigt som vi spelar in DNS- och TLS-paket i Wireshark.

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

I svaret frÄn servern, förutom mycket felsökningsinformation frÄn openssl och curl, fÄr vi ett HTTP-svar med kod 301 frÄn 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/

vilket indikerar att vÄr förfrÄgan framgÄngsrikt nÄtt mÄservern, hörts och behandlats.

Nu ska vi titta pÄ trafikdumpen i Wireshark, det vill sÀga vad leverantörens DPI sÄg i det hÀr fallet.

DomÀn-fronting baserat pÄ TLS 1.3

Det Ă€r tydligt att curl först kontaktade DNS-servern för att fĂ„ den offentliga eSNI-nyckeln för cloudflare-servern – en TXT DNS-förfrĂ„gan pĂ„ _esni.cloudflare.com (paket nr 13). DĂ€refter, med hjĂ€lp av openssl-biblioteket, skickade curl en TLS 1.3-förfrĂ„gan till cloudflare-servern dĂ€r SNI-fĂ€ltet var krypterat med den offentliga nyckeln som erhölls i föregĂ„ende steg (paket nr 22). Men förutom eSNI-fĂ€ltet innehöll SSL-hello-paketet Ă€ven ett vanligt – öppet SNI-fĂ€lt, som vi kan ange i valfri ordning (i det hĂ€r fallet – www.hello-rkn.ru).

Detta öppna SNI-fÀlt beaktades inte av cloudflare-servrarna och fungerade endast som en maskering för leverantörens DPI. Cloudflare-servern accepterade vÄrt ssl-hello-paket, dekrypterade eSNI, extraherade den ursprungliga SNI och behandlade den som om ingenting hade hÀnt (gjorde allt precis som planerat vid utvecklingen av eSNI).

Det enda vi kan hakka upp oss pÄ ur DPI-synpunkt Àr den primÀra DNS-förfrÄgan pÄ _esni.cloudflare.com. Men vi gjorde DNS-förfrÄgan öppen bara för att visa hur denna mekanism fungerar inifrÄn.

För att helt slĂ„ undan marken under DPI anvĂ€nder vi den redan nĂ€mnda mekanismen DNS-over-HTTPS. En kort förklaring – DOH – Ă€r ett protokoll som skyddar mot "man-in-the-middle"-attacker genom att skicka DNS-förfrĂ„gan över HTTPS-protokollet.

Vi gör förfrÄgan igen, men den hÀr gÄngen fÄr vi de offentliga eSNI-nycklarna via HTTPS-protokollet, istÀllet för DNS:

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

Dumpen av förfrÄgetrafiken visas pÄ skÀrmbilden nedan:

DomÀn-fronting baserat pÄ TLS 1.3

Det Àr tydligt att curl först kontaktar servern mozilla.cloudflare-dns.com via DoH-protokollet (HTTPS-anslutning till servern 104.16.249.249) för att fÄ vÀrdena för de offentliga nycklarna för kryptering av SNI, och sedan kontaktar den destinationsservern och döljer sig bakom domÀnen. www.hello-rkn.ru.

Förutom den ovan angivna DoH-upplösaren mozilla.cloudflare-dns.com kan vi ocksÄ anvÀnda andra populÀra DoH-tjÀnster, till exempel frÄn den berömda företaget av ondska.
Vi gör en sÄdan förfrÄgan:

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

Och vi fÄr svaret:

< HTTP/1.1 301 Flyttad Permanently
< Datum: Sön, 03 Nov 2019 14:10:22 GMT
< InnehÄllstyp: text/html
< Överföringskodning: chunked
< Anslutning: keep-alive
< Set-Cookie: __cfduid=da0144d982437e77b0b37af7d00438b1a1572790222; expires=Mon, 02-Nov-20 14:10:22 GMT; path=/; domain=.rutracker.nl; HttpOnly; Secure
< Plats: 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

DomÀn-fronting baserat pÄ TLS 1.3

I det hÀr fallet kontaktade vi den blockerade servern rutracker.nl, med DoH-upplösaren dns.google (hÀr finns ingen skrivfel, det berömda företaget har nu ett sitt eget toppdomÀn) och skyddade oss med en annan domÀn som strikt förbjuds att blockera av alla DPI under hot om dödsstraff. Av det mottagna svaret kan man förstÄ att vÄr förfrÄgan har hanterats framgÄngsrikt.

Som en extra kontroll av att leverantörens DPI reagerar pĂ„ den öppna SNI som vi överför som skydd — kan vi göra en begĂ€ran till rutracker.nl och skydda oss med nĂ„gon annan förbjuden resurs, till exempel en annan "bra" torrent-tracker:

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

Vi kommer inte att fÄ nÄgot svar frÄn servern, eftersom vÄr förfrÄgan kommer att blockeras av DPI-systemet.

En liten sammanfattning till första delen

SÄ, vi lyckades visa att eSNI fungerar med hjÀlp av openssl och curl och kontrollera hur domÀn-frontering baserat pÄ eSNI fungerar. PÄ samma sÀtt kan vi anpassa vÄra favoritverktyg som anvÀnder openssl-biblioteket för att fungera "under skydd" av andra domÀner. Mer om detta i vÄra kommande artiklar.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster