Ievads
MÅ«sdienu korporatÄ«vÄ satura filtrÄÅ”anas sistÄmÄm no tÄdiem slaveniem ražotÄjiem kÄ Cisco, BlueCoat, FireEye ir diezgan daudz kopÄ«ga ar jaudÄ«gÄkajiem lÄ«dziniekiem - DPI sistÄmÄm, kuras tiek aktÄ«vi ieviestas valsts lÄ«menÄ«. Abu darba bÅ«tÄ«ba ir pÄrbaudÄ«t ienÄkoÅ”o un izejoÅ”o interneta trafiku un, balstoties uz melnajiem/baltajiem sarakstiem, pieÅemt lÄmumu par interneta pieslÄguma aizliegÅ”anu. Un tÄ kÄ viÅi abi savÄ darba pamatos paļaujas uz lÄ«dzÄ«giem principiem, arÄ« to apieÅ”anas metodÄm bÅ«s daudz kopÄ«ga.
Viena no tehnoloÄ£ijÄm, kas ļauj diezgan efektÄ«vi apiet gan DPI, gan korporatÄ«vÄs sistÄmas, ir domÄna frontes tehnoloÄ£ija. TÄs bÅ«tÄ«ba ir tÄda, ka mÄs ejam uz bloÄ·Ätu resursu, slÄpjoties aiz cita, publiska domÄna ar labu reputÄciju, kuru acÄ«mredzot nebloÄ·Äs neviena sistÄma, piemÄram, google.com.
Par Å”o tehnoloÄ£iju jau ir rakstÄ«ts diezgan daudz rakstu un sniegti daudzi piemÄri. TomÄr populÄrÄs un nesen apspriestÄs DNS-over-HTTPS un Å”ifrÄtÄ SNI tehnoloÄ£ijas, kÄ arÄ« jaunÄ TLS 1.3 protokola versija ļauj apsvÄrt citu domÄna frontes iespÄju.
Izpratne par tehnoloģiju
PirmkÄrt, definÄsim nedaudz pamatjÄdzienus, lai ikvienam bÅ«tu izpratne par to, kas ir kas un kÄpÄc tas viss ir vajadzÄ«gs. PieminÄjÄm eSNI mehÄnismu, par kura darbÄ«bu tiks runÄts tÄlÄk. eSNI (Å”ifrÄta servera nosaukuma indikÄcijas) mehÄnisms ir droÅ”a SNI versija, kas pieejama tikai TLS 1.3 protokolam. GalvenÄ ideja ir cita starpÄ Å”ifrÄt informÄciju par to, uz kuru domÄnu tiek nosÅ«tÄ«ts pieprasÄ«jums.
Tagad apskatÄ«sim, kÄ eSNI mehÄnisms darbojas praksÄ.
PieÅemsim, ka mums ir interneta resurss, kuru bloÄ·Ä moderns DPI risinÄjums (Åemsim, piemÄram, slaveno torrentu izsekotÄju rutracker.nl). MÄÄ£inot piekļūt torrentu izsekotÄja vietnei, mÄs redzam pakalpojumu sniedzÄja standarta apakÅ”nodaļu, kas norÄda, ka resurss ir bloÄ·Äts:
RKN vietnÄ Å”is domÄns faktiski ir norÄdÄ«ts pieturas sarakstos:
Kad vaicÄjat whois, jÅ«s varat redzÄt, ka pats domÄns ir āpaslÄptsā aiz mÄkoÅa nodroÅ”inÄtÄja Cloudflare.
Bet atŔķirÄ«bÄ no RKN āspeciÄlistiemā tehniski gudrÄki darbinieki no Beeline (vai mÄcÄ«ja mÅ«su slavenÄ regulatora rÅ«gtÄ pieredze) vietni muļķīgi neaizliedza pÄc IP adreses, bet pievienoja domÄna nosaukumu pieturas sarakstam. Varat to viegli pÄrbaudÄ«t, ja aplÅ«kojat, kÄdi citi domÄni ir paslÄpti aiz tÄs paÅ”as IP adreses, apmeklÄjiet kÄdu no tiem un redzat, vai piekļuve nav bloÄ·Äta:
KÄ tas notiek? KÄ pakalpojumu sniedzÄja DPI zina, kurÄ domÄnÄ darbojas mana pÄrlÅ«kprogramma, jo visi sakari notiek, izmantojot https protokolu, un mÄs vÄl neesam pamanÄ«juÅ”i https sertifikÄtu aizstÄÅ”anu no Beeline? Vai viÅÅ” ir gaiÅ”reÄ£is vai arÄ« man seko?
MÄÄ£inÄsim atbildÄt uz Å”o jautÄjumu, aplÅ«kojot trafiku caur wireshark
EkrÄnuzÅÄmums parÄda, ka vispirms pÄrlÅ«kprogramma iegÅ«st servera IP adresi, izmantojot DNS, pÄc tam notiek standarta TCP rokasspiediens ar mÄrÄ·a serveri un pÄc tam pÄrlÅ«kprogramma mÄÄ£ina izveidot SSL savienojumu ar serveri. Lai to izdarÄ«tu, tas nosÅ«ta SSL Client Hello paketi, kas satur avota domÄna nosaukumu skaidrÄ tekstÄ. Å is lauks ir nepiecieÅ”ams Cloudflare priekÅ”gala serverim, lai pareizi marÅ”rutÄtu savienojumu. Å eit pakalpojumu sniedzÄjs DPI mÅ«s pieÄ·er, pÄrtraucot mÅ«su savienojumu. TajÄ paÅ”Ä laikÄ mÄs nesaÅemam no pakalpojumu sniedzÄja nevienu ziÅojumu, un mÄs redzam standarta pÄrlÅ«kprogrammas kļūdu, it kÄ vietne bÅ«tu atspÄjota vai vienkÄrÅ”i nedarbojas:
Tagad pÄrlÅ«kprogrammÄ iespÄjosim eSNI mehÄnismu, kÄ rakstÄ«ts instrukcijÄs
Lai to izdarÄ«tu, atveram Firefox konfigurÄcijas lapu about: config un aktivizÄjiet Å”Ädus iestatÄ«jumus:
network.trr.mode = 2;
network.trr.uri = https://mozilla.cloudflare-dns.com/dns-query
network.security.esni.enabled = true
PÄc tam mÄs pÄrbaudÄ«sim, vai Cloudflare vietnÄ iestatÄ«jumi darbojas pareizi.
Voila. MÅ«su iecienÄ«tÄkais izsekotÄjs tika atvÄrts bez VPN vai starpniekserveriem. Tagad apskatÄ«sim satiksmes izgÄztuvi Wireshark, lai redzÄtu, kas noticis.
Å oreiz ssl klienta hello pakotnÄ nav skaidri norÄdÄ«ts mÄrÄ·a domÄns, bet tÄ vietÄ pakotnÄ parÄdÄ«jÄs jauns lauks - encrypted_server_name - Å”eit ir ietverta rutracker.nl vÄrtÄ«ba, un tikai cloudflare frontend serveris var to atÅ”ifrÄt. lauks. Un ja tÄ, tad pakalpojumu sniedzÄjam DPI neatliek nekas cits kÄ mazgÄt rokas un atļaut Å”Ädu trafiku. Citu Å”ifrÄÅ”anas iespÄju nav.
TÄtad, mÄs apskatÄ«jÄm, kÄ tehnoloÄ£ija darbojas pÄrlÅ«kprogrammÄ. Tagad mÄÄ£inÄsim to attiecinÄt uz konkrÄtÄkÄm un interesantÄkÄm lietÄm. Un vispirms mÄs iemÄcÄ«sim to paÅ”u loku izmantot eSNI darbam ar TLS 1.3, un tajÄ paÅ”Ä laikÄ mÄs redzÄsim, kÄ darbojas pati eSNI balstÄ«tÄ domÄna fronte.
DomÄna frontÄÅ”ana ar eSNI
SakarÄ ar to, ka curl izmanto standarta openssl bibliotÄku, lai izveidotu savienojumu, izmantojot https protokolu, vispirms mums ir jÄnodroÅ”ina eSNI atbalsts. PagaidÄm openssl master filiÄlÄs eSNI atbalsta nav, tÄpÄc mums ir jÄlejupielÄdÄ speciÄla openssl filiÄle, jÄapkopo un jÄinstalÄ.
MÄs klonÄjam repozitoriju no GitHub un kompilÄjam kÄ parasti:
$ git clone https://github.com/sftcd/openssl
$ cd openssl
$ ./config
$ make
$ cd esnistuff
$ make
PÄc tam mÄs klonÄjam repozitoriju ar curl un konfigurÄjam tÄ kompilÄciju, izmantojot mÅ«su apkopoto openssl bibliotÄku:
$ 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
Å eit ir svarÄ«gi pareizi norÄdÄ«t visus direktorijus, kuros atrodas openssl (mÅ«su gadÄ«jumÄ tas ir /opt/openssl/), un pÄrliecinÄties, ka konfigurÄcijas process norit bez kļūdÄm.
Ja konfigurÄcija ir veiksmÄ«ga, mÄs redzÄsim rindu:
BRÄŖDINÄJUMS: esni ESNI ir iespÄjots, bet atzÄ«mÄts EKSPERIMENTÄLS. Lietojiet piesardzÄ«gi!
$ make
PÄc veiksmÄ«gas pakotnes izveidoÅ”anas mÄs izmantosim Ä«paÅ”u bash failu no openssl, lai konfigurÄtu un palaistu curl. ÄrtÄ«bas labad kopÄsim to uz direktoriju ar curl:
cp /opt/openssl/esnistuff/curl-esni
un veiciet pÄrbaudes https pieprasÄ«jumu cloudflare serverim, vienlaikus ierakstot DNS un TLS paketes programmÄ Wireshark.
$ ESNI_COVER="www.hello-rkn.ru" ./curl-esni https://cloudflare.com/
Servera atbildÄ papildus lielai atkļūdoÅ”anas informÄcijai no openssl un curl mÄs saÅemsim HTTP atbildi ar kodu 301 no 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/
kas norÄda, ka mÅ«su pieprasÄ«jums tika veiksmÄ«gi piegÄdÄts galamÄrÄ·a serverim, uzklausÄ«ts un apstrÄdÄts.
Tagad apskatÄ«sim satiksmes dump in wireshark, t.i. ko Å”ajÄ gadÄ«jumÄ redzÄja pakalpojumu sniedzÄjs DPI.
Var redzÄt, ka curl vispirms vÄrsÄs pie DNS servera, lai iegÅ«tu publisku eSNI atslÄgu cloudflare serverim - TXT DNS pieprasÄ«jums uz _esni.cloudflare.com (pakete Nr. 13). PÄc tam, izmantojot openssl bibliotÄku, curl nosÅ«tÄ«ja TLS 1.3 pieprasÄ«jumu cloudflare serverim, kurÄ SNI lauks tika Å”ifrÄts ar publisko atslÄgu, kas iegÅ«ta iepriekÅ”ÄjÄ darbÄ«bÄ (pakete #22). Bet, papildus laukam eSNI, SSL-hello paketÄ bija arÄ« lauks ar parasto - atvÄrto SNI, kuru mÄs varam norÄdÄ«t jebkurÄ secÄ«bÄ (Å”ajÄ gadÄ«jumÄ -
Å is atvÄrtais SNI lauks nekÄdÄ veidÄ netika Åemts vÄrÄ, kad to apstrÄdÄja cloudflare serveri, un tas kalpoja tikai kÄ maska āānodroÅ”inÄtÄja DPI. Cloudflare serveris saÅÄma mÅ«su ssl-hello paketi, atÅ”ifrÄja eSNI, izvilka no turienes sÄkotnÄjo SNI un apstrÄdÄja to tÄ, it kÄ nekas nebÅ«tu noticis (izstrÄdÄjot eSNI, tas visu darÄ«ja tieÅ”i tÄ, kÄ bija plÄnots).
VienÄ«gais, ko Å”ajÄ gadÄ«jumÄ var uztvert no DPI viedokļa, ir primÄrais DNS pieprasÄ«jums vietnei _esni.cloudflare.com. Bet mÄs padarÄ«jÄm DNS pieprasÄ«jumu atvÄrtu tikai tÄpÄc, lai parÄdÄ«tu, kÄ Å”is mehÄnisms darbojas no iekÅ”puses.
Lai beidzot izvilktu paklÄju no zem DPI, mÄs izmantojam jau minÄto DNS-over-HTTPS mehÄnismu. Neliels paskaidrojums ā DOH ir protokols, kas ļauj aizsargÄties pret uzbrukuma starpnieku, nosÅ«tot DNS pieprasÄ«jumu, izmantojot HTTPS.
IzpildÄ«sim pieprasÄ«jumu vÄlreiz, bet Å”oreiz publiskÄs eSNI atslÄgas saÅemsim caur https protokolu, nevis DNS:
ESNI_COVER="www.hello-rkn.ru" DOH_URL=https://mozilla.cloudflare-dns.com/dns-query ./curl-esni https://cloudflare.com/
PieprasÄ«juma trafika dump ir parÄdÄ«ts zemÄk esoÅ”ajÄ ekrÄnuzÅÄmumÄ:
Var redzÄt, ka curl vispirms piekļūst mozilla.cloudflare-dns.com serverim, izmantojot DoH protokolu (https savienojums ar serveri 104.16.249.249), lai iegÅ«tu no tiem publisko atslÄgu vÄrtÄ«bas SNI Å”ifrÄÅ”anai un pÄc tam galamÄrÄ·im. serveris, kas slÄpjas aiz domÄna
Papildus iepriekÅ” minÄtajam DoH atrisinÄtÄjam mozilla.cloudflare-dns.com mÄs varam izmantot citus populÄrus DoH pakalpojumus, piemÄram, no slavenÄs ļaunÄs korporÄcijas.
IzpildÄ«sim Å”Ädu vaicÄjumu:
ESNI_COVER="www.kremlin.ru" DOH_URL=https://dns.google/dns-query ./curl-esni https://rutracker.nl/
Un mÄs saÅemam atbildi:
< 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
Å ajÄ gadÄ«jumÄ mÄs vÄrsÄmies pie bloÄ·ÄtÄ rutracker.nl servera, izmantojot DoH solver dns.google (Å”eit nav drukas kļūdas, tagad slavenajai korporÄcijai ir savs pirmÄ lÄ«meÅa domÄns) un piesedzÄmies ar citu domÄnu, kas ir stingri aizliegts visiem DPI bloÄ·Ät nÄves sÄpju gadÄ«jumÄ. Pamatojoties uz saÅemto atbildi, varat saprast, ka mÅ«su pieprasÄ«jums tika veiksmÄ«gi apstrÄdÄts.
KÄ papildu pÄrbaudi, vai pakalpojumu sniedzÄja DPI reaÄ£Ä uz atvÄrto SNI, ko mÄs pÄrsÅ«tÄm kÄ segumu, mÄs varam veikt pieprasÄ«jumu rutracker.nl cita aizliegta resursa aizsegÄ, piemÄram, cita ālabaā torrentu izsekotÄja aizsegÄ:
$ ESNI_COVER="rutor.info" DOH_URL=https://dns.google/dns-query ./curl-esni https://rutracker.nl/
No servera atbildi nesaÅemsim, jo... mÅ«su pieprasÄ«jumu bloÄ·Äs DPI sistÄma.
ÄŖss secinÄjums pirmajai daļai
TÄtad, mÄs varÄjÄm demonstrÄt eSNI funkcionalitÄti, izmantojot openssl un curl, un pÄrbaudÄ«t domÄna frontes darbÄ«bu, pamatojoties uz eSNI. TÄdÄ paÅ”Ä veidÄ mÄs varam pielÄgot savus iecienÄ«tÄkos rÄ«kus, kas izmanto openssl bibliotÄku, lai tie darbotos citu domÄnu āaizsegÄā. PlaÅ”Äka informÄcija par to ir mÅ«su nÄkamajos rakstos.
Avots: www.habr.com