Sissejuhatus

Moodne ettevĂ”tte sisu filtreerimise sĂŒsteemid, nagu Cisco, BlueCoat ja FireEye, omavad palju ĂŒhist oma vĂ”imsamate kolleegidega â DPI sĂŒsteemidega, mis on laialdaselt kasutusele vĂ”etud riiklikul tasandil. Nende töö tuumik on sama: uurida saabuvat ja vĂ€ljaminevat interneti liiklust ning mustade/valgete serverite pĂ”hjal otsustada internetiĂŒhenduse blokeerimise ĂŒle. Kuna mĂ”lemad tuginevad oma töös sarnastele pĂ”himĂ”tetele, on ka nende ĂŒletamise viisidel palju ĂŒhist.
Ăks tehnoloogiatest, mis vĂ”imaldab tĂ”husalt vĂ€ltida nii DPI-d kui ka ettevĂ”tte sĂŒsteeme, on domeenifrontimine. Selle olemus seisneb selles, et me pÀÀseme blokeeritud ressursile, varjates end teise, avaliku domeeni, hea mainega, millel ei ole mingit sĂŒsteemi poolt blokeerimise ohtu, nĂ€iteks google.com.
Selle tehnoloogia kohta on juba kirjutatud piisavalt palju artikleid ja toodud esile palju nĂ€iteid. Kuid populaarsed ja viimastel aegadel arutelud teema DNS-over-HTTPS ja krĂŒptitud SNI, samuti uus protokoll TLS 1.3 annavad vĂ”imaluse vaadelda veel ĂŒhte domeenide peitmise varianti.
Uurime tehnoloogiat
Alustame natuke pĂ”himĂ”istetega, et kĂ”igil oleks arusaam, kes on kes ja miks see kĂ”ik vajalik on. Oleme maininud eSNI mehhanismi, mille tööle saab edaspidi lĂ€hemalt vaatama. eSNI (krĂŒptitud Server Name Indication) on SNI kaitstud variant, mis on saadaval ainult protokolli TLS 1.3 jaoks. PĂ”himĂ”te on selles, et krĂŒptida ka teavet selle kohta, millisele domeenile pĂ€ring saadetakse.
NĂŒĂŒd vaatame eSNI mehhanismi tööd praktikas.
Oletame, et meil on internetiressurss, mis on blokeeritud kaasaegse DPI lahendusega (vĂ”tame nĂ€iteks kuulus torrentide jĂ€lgija â rutracker.nl). Kui proovime kĂŒlastada torrentide jĂ€lgija saiti, nĂ€eme teenusepakkuja tavalist teavitust, et ressurss on blokeeritud:

RKNi lehelt on see domeen tÔepoolest mustades nimekirjades:

Whois pĂ€ringut tehes on nĂ€ha, et domeen on âpeidetudâ Cloudflare'i pilveteenuse pakkuja taha.

Kuid erinevalt RKN-i âspetsialistidestâ ei otsustanud tehniliselt paremini haritud töötajad Beeline'is (vĂ”i kellel on olnud valusat kogemust meie tuntud regulaatoriga) lihtsalt IP-aadressi pĂ”hjal saiti blokeerida, vaid lisasid musta nimekirja just domeeninime. Selle tĂ”elisusesse veendumiseks vaadake, millised teised domeenid on sama IP-aadressiga, kĂŒlastage ĂŒhte neist ja nĂ€ete, et juurdepÀÀs ei ole blokeeritud:

Kuidas see nii juhtub? Kuidas teab teenusepakkuja DPI, kuhu minu brauser suundub, kui kÔik suhtlused toimuvad https-protokolli kaudu, ja Beeline'i poolt sertifikaatide valevahetust me siiani pole mÀrganud? Kas ta on kaugeleulatuv vÔi jÀlgib keegi mind?
Proovime sellele kĂŒsimusele vastata, vaadates liiklust Wiresharki kaudu.

Ekraanipildil on nĂ€ha, et esmalt saab brauser DNS-i kaudu serveri IP-aadresse, seejĂ€rel toimub standardne TCP kĂ€tlemine sihiserveriga, ja siis pĂŒĂŒab brauser SSL-ĂŒhendust serveriga luua. Selleks edastab ta paketi SSL Client Hello, milles on algse domeeni nimi avatud kujul. See vĂ€li on vajalik cloudflare'i esirakenduse serverile, et korralikult suunata ĂŒhendust. Just siin tabab meid teenusepakkuja DPI, katkestades meie ĂŒhenduse. Sel juhul me ei saa teenusepakkujalt mingit tĂ”kestust ja nĂ€eme standardset brauseri viga justkui sait oleks vĂ€lja lĂŒlitatud vĂ”i lihtsalt ei tööta:

NĂŒĂŒd lĂŒlitame brauseris sisse eSNI mehhanismi, nagu on kirjutatud juhendis Firefox :
Selleks avame Firefoxi konfiguratsioonilehe about:config ja aktiveerime jÀrgmised seaded:
network.trr.mode = 2;
network.trr.uri = https://mozilla.cloudflare-dns.com/dns-query
network.security.esni.enabled = true
PÀrast seda kontrollime seadete Ôigsust cloudflare'i saidil lingi kaudu ja proovime meie torrent-trackeriga trikki veel kord.

VoilĂ . Meie lemmik tracker avanes, ilma igasuguste VPNide ja proksiserveriteta. Vaatame nĂŒĂŒd wireshark'is liiklusdummit, mis juhtus.

Sel korral ssl kliendi tervituse pakett ei sisalda selgesĂ”naliselt sihtdomeeni, vaid selle asemel on paketi koostises uus vĂ€li â encrypted_server_name â just seal paikneb vÀÀrtus rutracker.nl, ning seda vĂ€lja suudab dekrĂŒpteerida ainult Cloudflare'i frontend-server. Seega ei jÀÀ teenusepakkuja DPI-le muud ĂŒle, kui kĂ€ed ĂŒles tĂ”sta ja selline liiklus lubada. Teisi ĆĄifreerimise variante pole.
NĂŒĂŒd, kui me oleme vaadanud, kuidas tehnoloogia brauseris töötab, proovime rakendada seda spetsiifilisematel ja huvitavatel viisidel. Esmalt Ă”petame curl'i kasutama eSNI-d TLS 1.3 puhul ning vaatame, kuidas toimib domeenifronting eSNI alusel.
Domeenifronting eSNI-ga
Kuna curl kasutab https-protokolli jaoks standardset OpenSSL teeki, peame kÔigepealt tagama eSNI toe just seal. OpenSSL-i master-haru ei toeta veel eSNI-d, seega peame laadima alla erilise OpenSSL haru, selle kompileerima ja installima.
Kloonime GitHubi hoidla ja kompileerime nagu tavaliselt:
$ git clone https://github.com/sftcd/openssl
$ cd openssl
$ ./config
$ make
$ cd esnistuff
$ make
SeejÀrel kloonime curl'i reposti ja konfigureerime selle kompileerimise meie kompileeritud openssl teegi kasutamisega:
$ 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
Siin on oluline Ôigesti nÀidata kÔik kataloogid, kus openssl asub (meie korral on see /opt/openssl/) ja veenduda, et konfigureerimisprotsess kulgeb ilma vigadeta.
Edasi, kui konfigureerimine Ă”nnestus â nĂ€eme rida:
WARNING: esni ESNI enabled but marked EXPERIMENTAL. Use with caution!
$ makePÀrast paketi eduka koostamise lÔpetamist kasutame openssl'i koosseisust spetsiaalset bash-faili curl'i seadistamiseks ja kÀivitamiseks. Kopeerime selle curl'i katalooge mugavuse huvides:
cp /opt/openssl/esnistuff/curl-esni ja teeme testimise https-pÀringu cloudflare'i serverisse, samal ajal salvestades DNS ja TLS pakette Wireshark'i.
$ ESNI_COVER="www.hello-rkn.ru" ./curl-esni https://cloudflare.com/Serveri vastuses lisaks paljudele avastusinfodele openssl'ilt ja curl'ilt saame HTTP-vastuse 301 koodiga cloudflare'ilt.
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/
mis nÀitab, et meie pÀring on edukalt jÔudnud sihtserverisse, kuulatud ja töödeldud.
NĂŒĂŒd vaatame Wiresharkis liiklust, st mida nĂ€gi antud juhul teenusepakkuja DPI.

On nĂ€ha, et esmalt kĂŒsis curl DNS-serverilt avalike eSNI vĂ”tmete kohta Cloudflare'i serveri jaoks â TXT DNS-kĂŒsimus _esni.cloudflare.com (pakett nr 13). SeejĂ€rel saatis curl, kasutades openssl-i teeki, TLS 1.3 pĂ€ringu Cloudflare'i serverile, kus SNI vĂ€li oli krĂŒpteeritud eelnevalt saadud avaliku vĂ”tmega (pakett nr 22). Kuid lisaks eSNI vĂ€ljale oli SSL-hello paketi koostisesse lisatud veel ka tavapĂ€rase, avaliku SNI vĂ€li, mille saame mÀÀrata suvalises jĂ€rjekorras (antud juhul â www.hello-rkn.ru).
Antud avaliku SNI vĂ€li ei mĂ”jutanud Cloudflare'i serverites töötlemist ja see oli lihtsalt teenusepakkuja DPI jaoks maskeeriv. Cloudflare'i server vĂ”ttis meie ssl-hello paketi vastu, dekrĂŒpteeris eSNI, ekstrakteeris sealt algse SNI ja töötles selle nagu tavaliselt (tegi kĂ”ik just nii, nagu eSNI vĂ€ljatöötamisel oli planeeritud).
Ainus, millele sellisel juhul DPI mÔttes toetuda, on esmase DNS-pÀringu tegemine _esni.cloudflare.com. Kuid me tegime DNS-pÀringu avalikuks vaid selleks, et nÀidata, kuidas see mehhanism seestpoolt töötab.
DPI alt vĂ€ljasaamiseks kasutame juba mainitud DNS-over-HTTPS mehhanismi. VĂ€ike selgitus â DOH on protokoll, mis kaitseb keskmise inimese rĂŒnnaku eest, edastades DNS-pĂ€ringu HTTPS-protokolli kaudu.
Teeme pÀringu uuesti, kuid seekord saame avalikud eSNI vÔtmed HTTPS-protokolli, mitte DNS kaudu:
ESNI_COVER="www.hello-rkn.ru" DOH_URL=https://mozilla.cloudflare-dns.com/dns-query ./curl-esni https://cloudflare.com/PĂ€ringu liikluse dump on esitatud alloleval ekraanipiltidel:

On nĂ€ha, et esmalt pöördub curl serveri mozilla.cloudflare-dns.com poole DoH protokolli kaudu (HTTPS-ĂŒhendus serveriga 104.16.249.249), et saada neilt avalikud vĂ”tmed SNI krĂŒpteerimiseks, ning seejĂ€rel juba sihtserveri poole, kaitstes end samas domeeni kaudu. www.hello-rkn.ru.
Lisaks eelnevale DoH resolvijale mozilla.cloudflare-dns.com saame kasutada ka teisi populaarseid DoH teenuseid, nĂ€iteks ĂŒhte kurikuulsast kurjast ettevĂ”ttest.
Teeme sellise pÀringu:
ESNI_COVER="www.kremlin.ru" DOH_URL=https://dns.google/dns-query ./curl-esni https://rutracker.nl/Ja saame vastuse:
< 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

Antud juhul pöördusime blokeeritud serveri rutracker.nl poole, kasutades DoH-resolutsiooni dns.google (siin pole trĂŒkiviga, nĂŒĂŒd on kuulsal korporatsioonil oma tippdomeen) ja kattisime end teise domeeniga, mille blokeerimine on kĂ”igile DPI-dele rangelt keelatud surmaohuga. Saadud vastusest saab aru, et meie pĂ€ring töötati edukalt lĂ€bi.
Lisaks selle kontrollimiseks, et teenusepakkuja DPI reageerib avatud SNI-le, mida me varjuna edastame â saame esitada pĂ€ringu rutracker.nl-le, kattudes mĂ”ne muu keelatud ressursiga, nĂ€iteks teise "heade" torrentide jĂ€lgijaga:
$ ESNI_COVER="rutor.info" DOH_URL=https://dns.google/dns-query ./curl-esni https://rutracker.nl/Serverilt vastust ei saa, kuna meie pĂ€ring blokeeritakse DPI-sĂŒsteemi poolt.
LĂŒhike kokkuvĂ”te esimesele osale
Nii Ônnestus meil demonstreerida eSNI toimimist openssl ja curl abil ning kontrollida eSNI-pÔhise domeeni esiotsa töökindlust. Samamoodi saame kohandada oma lemmikinstrumente, mis kasutavad openssl raamatukogu, et töötada "varjatult" teiste domeenide all. Rohkem teavet selle kohta leiate meie jÀrgmistest artiklitest.
Allikas: habr.com
