{"id":53317,"date":"2019-11-29T00:00:00","date_gmt":"2019-11-28T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/domen-fronting-na-baze-tls-1-3-chast-2"},"modified":"2020-02-18T14:01:12","modified_gmt":"2020-02-18T11:01:12","slug":"domen-fronting-na-baze-tls-1-3-chast-2","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/domen-fronting-na-baze-tls-1-3-chast-2","title":{"rendered":"Fronting de domeniu pe baza TLS 1.3. Partea 2","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h3>Introducere<\/h3>\n<p>\n\u00cen prima parte <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/475372\/\">recomand\u0103rile sunt aplicabile coronavirusurilor \u00een general \u0219i COVID-19 \u00een particular. A\u0219adar, recomand s\u0103 desc\u0103rca\u021bi \u0219i s\u0103 printa\u021bi articolul (pentru cei interesa\u021bi de acest subiect).<\/a><\/noindex> am oferit o descriere scurt\u0103 a mecanismului encrypted SNI (eSNI). Am ar\u0103tat cum poate fi folosit pentru a evita detectarea de c\u0103tre sistemele moderne DPI (pe exemplul DPI-ului de la Beeline \u0219i al tracker-ului RuNet interzis), precum \u0219i am cercetat o nou\u0103 variant\u0103 de domain fronting bazat\u0103 pe acest mecanism.<\/p>\n<p>\u00cen a doua parte a articolului, ne vom concentra pe aspecte mai practice, care vor fi utile speciali\u0219tilor RedTeam \u00een munca lor dificil\u0103. \u00cen fond, scopul nostru nu este ob\u021binerea accesului la resursele blocate (pentru astfel de lucruri banale, avem vechiul \u0219i bunul VPN). Din fericire, exist\u0103 o mul\u021bime de furnizori VPN, dup\u0103 cum se spune, pentru orice gust, culoare \u0219i buget.<\/p>\n<p>Ne vom str\u0103dui s\u0103 aplic\u0103m mecanismul domain fronting pentru instrumentele moderne RedTeam, cum ar fi Cobalt Strike, Empire etc., \u0219i s\u0103 le oferim func\u021bionalit\u0103\u021bi suplimentare de mimetizare \u0219i de evitare a sistemelor moderne de filtrare a con\u021binutului.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nData trecut\u0103, am integrat mecanismul eSNI \u00een biblioteca OpenSSL \u0219i l-am utilizat cu succes \u00een binecunoscuta unealt\u0103 curl. Dar cu un singur curl, cum se spune, nu te po\u021bi s\u0103tura. Desigur, dorim s\u0103 realiz\u0103m ceva similar \u00een limbaje de programare de nivel \u00eenalt. Din p\u0103cate, c\u0103utarea rapid\u0103 pe internet ne dezam\u0103ge\u0219te, deoarece suportul pentru mecanismul eSNI este realizat pe deplin doar \u00een GOLANG. Astfel, op\u021biunile noastre nu sunt foarte multe: fie scriem \u00een C sau C++ folosind o bibliotec\u0103 OpenSSL patch-uit\u0103, fie folosim un fork GOLANG de la CloudFlare \u0219i \u00eencerc\u0103m s\u0103 port\u0103m instrumentele noastre acolo. De fapt, exist\u0103 o alt\u0103 variant\u0103, mai clasic\u0103, dar \u0219i mai consumatoare de timp \u2013 implementarea suportului eSNI pentru Python. \u00cen fond, Python folose\u0219te de asemenea OpenSSL pentru a lucra cu https. Dar aceast\u0103 variant\u0103 o vom l\u0103sa pentru dezvoltare altcuiva, \u00een timp ce noi ne vom mul\u021bumi cu implementarea \u00een golang, mai ales c\u0103 iubitul nostru Cobalt Strike este foarte bun \u00een a lucra cu canale de comunica\u021bie construite prin mijloace externe (External C2 channel) \u2013 despre aceasta vom povesti la finalul articolului.<\/p>\n<h3>Try Harder\u2026<\/h3>\n<p>\nUnul dintre instrumentele implementate pe Go este dezvoltarea noastr\u0103 pentru pivotarea \u00een re\u021bea \u2013 tunelul <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mis-team\/rsockstun\">rsockstun<\/a><\/noindex>, care, de altfel, este acum detectat\u0103 de solu\u021biile companiei Microsoft \u0219i Symantec ca un software extrem de d\u0103un\u0103tor, destinat s\u0103 submineze stabilitatea global\u0103\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/13d2635b92051416b2f33415783a2837.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAr fi grozav s\u0103 utiliz\u0103m dezvoltarea anterioar\u0103 \u0219i \u00een acest caz. Dar aici apare o mic\u0103 problem\u0103. Problema este c\u0103 rsockstun presupune ini\u021bial utilizarea unui canal de comunicare SSL sincronizat cu serverul. Aceasta \u00eenseamn\u0103 c\u0103 conexiunea este stabilit\u0103 o singur\u0103 dat\u0103 \u0219i exist\u0103 pe toat\u0103 perioada de func\u021bionare a tunelului. \u0218i, dup\u0103 cum \u00een\u021belege\u021bi, protocolul https nu este chiar destinat acestui mod de func\u021bionare \u2013 func\u021bioneaz\u0103 \u00een modul cerere-r\u0103spuns, unde fiecare nou\u0103 cerere http exist\u0103 \u00een cadrul unei noi conexiuni tcp.<\/p>\n<p>Principala dezavantaj\u0103 a acestui sistem este c\u0103 serverul nu poate trimite date clientului p\u00e2n\u0103 c\u00e2nd clientul nu trimite o nou\u0103 cerere http. Dar, din fericire, exist\u0103 multe solu\u021bii pentru aceast\u0103 problem\u0103 \u2013 pentru transmiterea continu\u0103 a datelor prin protocolul http (la urma urmei, reu\u0219im s\u0103 ne uit\u0103m la serialele noastre preferate \u0219i s\u0103 ascult\u0103m muzic\u0103 de pe portaluri care func\u021bioneaz\u0103 pe https, iar transmiterea video \u0219i audio nu este altceva dec\u00e2t transmiterea continu\u0103 a datelor). Una dintre tehnologiile de emulare a func\u021bion\u0103rii unei conexiuni tcp complete peste protocolul http este tehnologia websocket (WebSockets), al c\u0103rei principiu de baz\u0103 este organizarea unei conexiuni complete \u00eentre client \u0219i serverul web.<\/p>\n<p>Din fericire (hurra!!!), aceast\u0103 tehnologie este activat\u0103 implicit \u00een toate planurile tarifare CloudFlare \u0219i func\u021bioneaz\u0103 excelent \u00een combina\u021bie cu eSNI. Tocmai aceasta vom folosi pentru a \u00eenv\u0103\u021ba tunelul nostru s\u0103 utilizeze domeniul-frontend \u0219i s\u0103 se ascund\u0103 de DPI moderne. <\/p>\n<h3>C\u00e2teva cuvinte despre WebSockets<\/h3>\n<p>\n\u00cen primul r\u00e2nd, vom explica pe scurt \u0219i \u00een termeni simpli despre websocket-uri, pentru ca toat\u0103 lumea s\u0103 aib\u0103 o idee despre ce vom lucra. <\/p>\n<p>Tehnologia websocket permite comutarea temporar\u0103 de la o conexiune http la transmiterea standard a datelor printr-un socket de re\u021bea, f\u0103r\u0103 a \u00eentrerupe conexiunea tcp stabilit\u0103. C\u00e2nd clientul dore\u0219te s\u0103 comute la websocket, acesta seteaz\u0103 c\u00e2teva antete http \u00een cererea sa http. Dou\u0103 antete obligatorii sunt <i><b>Connection: Upgrade<\/b><\/i> \u0219i <i><b>Upgrade: websocket<\/b><\/i>. De asemenea, poate specifica for\u021bat versiunea protocolului websocket (<i><b>Sec-Websockset-Version: 13<\/b><\/i>) \u0219i ceva asem\u0103n\u0103tor unui identificator base64 pentru WebSocket (<i><b>Sec-WebSocket-Key: DAGDJSiREI3+KjDfwxm1FA==<\/b><\/i>). Serverul r\u0103spunde cu codul http 101 Switching Protocols \u0219i stabile\u0219te, de asemenea, anteturile <i><b>Connection, Upgrade<\/b><\/i> \u0219i <i><b>Sec-WebSocket-Accept<\/b><\/i>. Procesul de schimbare este ilustrat \u00een captura de ecran de mai jos:<\/p>\n<p><img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/1ee9af28074e5e190daea9b4b4a4a524.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDup\u0103 aceasta, stabilirea conexiunii WebSocket poate fi considerat\u0103 finalizat\u0103. Orice date, at\u00e2t de la client, c\u00e2t \u0219i de la server, vor fi acum \u00eenso\u021bite de anteturile WebSocket (care \u00eencep cu byte-ul 0x82). Acum serverul nu trebuie s\u0103 a\u0219tepte o solicitare din partea clientului pentru a transmite datele, deoarece conexiunea TCP nu este \u00eentrerupt\u0103.<\/p>\n<p>\u00cen Go, exist\u0103 mai multe biblioteci pentru a lucra cu WebSocket-uri. Cele mai populare dintre acestea sunt <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/gorilla\/websocket\">Gorilla WebSocket<\/a><\/noindex> \u0219i standardul <noindex><a rel=\"nofollow\" href=\"https:\/\/godoc.org\/golang.org\/x\/net\/websocket\">WebSocket<\/a><\/noindex>. Vom folosi ultima, deoarece este mai simpl\u0103, mai mic\u0103 \u0219i func\u021bioneaz\u0103, se spune, pu\u021bin mai repede.<\/p>\n<p>\u00cen codul clientului rsockstun, va trebui s\u0103 \u00eenlocuim apelurile net.dial sau tls.dial cu apelurile corespunz\u0103toare pentru WebSocket:<\/p>\n<p><img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/e7ffc8aadeed32b8c456ef03cff4cdf8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/035b3190717482f6aaac22b06cd25bc9.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVrem s\u0103 facem partea clientului din tunelul nostru universal \u0219i capabil s\u0103 func\u021bioneze at\u00e2t printr-o conexiune SSL direct\u0103, c\u00e2t \u0219i prin protocolul WebSocket. Pentru aceasta, vom crea o func\u021bie separat\u0103 <i><b>func connectForWsSocks(address string, proxy string) error {\u2026}<\/b><\/i> similar cu <i><b>connectForSocks()<\/b><\/i> \u0219i o vom folosi pentru a lucra cu WebSocket-uri \u00een cazul \u00een care adresa serverului specificat\u0103 la lansarea clientului \u00eencepe cu ws: sau wss: (\u00een cazul Secure WebSocket).<\/p>\n<p>Pentru partea serverului tunelului, vom face de asemenea o func\u021bie separat\u0103 pentru a lucra cu WebSocket-uri. Aceasta va crea o instan\u021b\u0103 a clasei http \u0219i va seta un handler pentru conexiunea http (func\u021bia wsHandler): <\/p>\n<p><img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/ad904b629aa40bf45d42c095d4285658.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIar toat\u0103 logica de procesare a conexiunii (autorizarea clientului prin parol\u0103, stabilirea \u0219i \u00eencheierea sesiunii yamux) o vom plasa \u00een handlerul de conexiune WebSocket:<\/p>\n<p><img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/a624dca4819cee4b9d46f1325aafc544.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCompil\u0103m proiectul, lans\u0103m partea serverului:<\/p>\n<pre><code class=\"go\">.\/rsockstun \u2013listen ws:127.0.0.1:8080 \u2013pass P@ssw0rd<\/code><\/pre>\n<p>\n\u0218i apoi partea clientului:<\/p>\n<pre><code class=\"go\">.\/rsockstun -connect ws:127.0.0.1:8080 \u2013pass P@ssw0rd<\/code><\/pre>\n<p>\n\u0218i verific\u0103m func\u021bionarea pe localhost:<\/p>\n<p><img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/34bb12087eb7dd72cf1f35d7addf2c72.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/83fc82e962961ba8491164d26f27be95.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Trecem la domeniul fronting<\/h3>\n<p>\nCu WebSocket-urile am \u00een\u021beles probabil cum stau lucrurile. Acum s\u0103 trecem la eSNI \u0219i domeniul fronting. A\u0219a cum am men\u021bionat mai devreme, pentru a lucra cu DoH \u0219i eSNI, trebuie s\u0103 lu\u0103m o ramur\u0103 special\u0103 a Go de la compania <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/cloudflare\/tls-tris\">CloudFlare<\/a><\/noindex>. Avem nevoie de o ramur\u0103 cu suport pentru eSNI (pwu\/esni).<\/p>\n<p>O clon\u0103m local sau o desc\u0103rc\u0103m \u0219i dezarhiv\u0103m zip-ul corespunz\u0103tor:<\/p>\n<pre><code class=\"plaintext\">git clone -b pwu\/esni https:\/\/github.com\/cloudflare\/tls-tris.git<\/code><\/pre>\n<p>\nApoi, trebuie s\u0103 copiem directorul GOROOT, s\u0103 \u00eenlocuim fi\u0219ierele corespunz\u0103toare din ramura clonat\u0103 \u0219i s\u0103 \u00eel set\u0103m ca principal. Pentru a scuti dezvoltatorul de aceast\u0103 durere de cap, cei de la CloudFlare au preg\u0103tit un script special \u2013 _dev\/go.sh. Pur \u0219i simplu \u00eel lans\u0103m. Scriptul, \u00eempreun\u0103 cu makefile-ul, va face totul singur. De curiozitate \u2013 pute\u021bi arunca o privire \u00een interiorul makefile-ului pentru detalii.<\/p>\n<p>Dup\u0103 ce scriptul a fost executat, la compilarea proiectului, va trebui s\u0103 specific\u0103m ca GOROOT directorul local preg\u0103tit de script. \u00cen cazul nostru, acest lucru arat\u0103 astfel:<\/p>\n<pre><code class=\"plaintext\">GOROOT=\"\/opt\/tls-tris\/_dev\/GOROOT\/linux_amd64\" go build \u2026.<\/code><\/pre>\n<p>\n\u00cen continuare, trebuie s\u0103 implement\u0103m \u00een tunel func\u021bionalitatea de solicitare \u0219i analizare a cheilor eSNI publice pentru domeniul dorit. \u00cen cazul nostru, acestea vor fi cheile eSNI publice de la serverele front-end CloudFlare. Pentru aceasta, vom crea trei func\u021bii:<\/p>\n<pre><code class=\"plaintext\">func makeDoTQuery(dnsName string) ([]byte, error)\nfunc parseTXTResponse(buf []byte, wantName string) (string, error)\nfunc QueryESNIKeysForHost(hostname string) ([]byte, error)<\/code><\/pre>\n<p>\nNumele func\u021biilor, \u00een principu, vorbesc de la sine. Con\u021binutul \u00eel vom lua din fi\u0219ierul esni_query.go, care face parte din tls-tris. Prima func\u021bie creeaz\u0103 un pachet de re\u021bea cu o solicitare c\u0103tre serverul DNS CloudFlare, folosind protocolul DoH (DNS-over-HTTPS), a doua \u2013 analizeaz\u0103 rezultatele solicit\u0103rii \u0219i ob\u021bine valorile cheilor publice ale domeniului, iar a treia este un container pentru primele dou\u0103.<\/p>\n<p>Apoi, introducem \u00een func\u021bia noastr\u0103, nou creat\u0103, de conectare a websocket-ului <i><b>connectForWsSocks<\/b><\/i> func\u021bionalitatea de solicitare a cheilor eSNI pentru domeniu. Acolo unde func\u021bioneaz\u0103 partea serverului, set\u0103m parametrii TLS \u0219i definim numele fals al \u201edomeniului de acoperire\u201d:<\/p>\n<p><img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/63abc51177058223e0f0941a78d182fa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTrebuie men\u021bionat c\u0103 ini\u021bial, ramura tls-tris nu este destinat\u0103 utiliz\u0103rii domeniului-fronte. Prin urmare, nu se acord\u0103 aten\u021bie numelui fals al serverului (\u00een cadrul pachetului client-hello se transmite un c\u00e2mp serverName gol). Pentru a rezolva acest lucru, va trebui s\u0103 ad\u0103ug\u0103m \u00een structura TlsConfig c\u00e2mpul corespunz\u0103tor FakeServerName. C\u00e2mpul standard ServerName al structurii nu poate fi utilizat, deoarece este utilizat de mecanisme interne tls \u0219i, dac\u0103 va diferi de original, handshake-ul tls se va termina cu o eroare. Descrierea structurii TlsConfig se afl\u0103 \u00een fi\u0219ierul <b>tls\/common.go<\/b> \u2013 acesta este fi\u0219ierul pe care va trebui s\u0103-l corect\u0103m:<\/p>\n<p><img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/04f35bb49a5f6a28625de28b23d686f0.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/0caf5cfccb2ffffeae703ecfe3eb6652.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00cen plus, va trebui s\u0103 facem modific\u0103ri \u00een fi\u0219ierul <b>tls\/handshake_client.go<\/b>, pentru a folosi c\u00e2mpul nostru FakeServerName la formarea m\u00e2nu\u021bei TLS:<\/p>\n<p><img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/ac68f37f426603b2fcec467c6ee886ca.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAsta e tot! Po\u021bi compila proiectul \u0219i verifica func\u021bionarea. Dar \u00eenainte de a \u00eencepe testarea, trebuie s\u0103 configurezi contul CloudFlare. Adic\u0103, cum s\u0103 spun? S\u0103 creezi un cont pe CloudFlare \u0219i s\u0103 asociezi domeniul t\u0103u cu acesta. Toate func\u021biile legate de DoH, WebSocket \u0219i ESNI sunt activate \u00een CloudFlare implicit. Dup\u0103 ce \u00eenregistr\u0103rile DNS s-au actualizat, po\u021bi verifica func\u021bionarea domeniului execut\u00e2nd solicitarea pentru cheile eSNI:<\/p>\n<pre><code class=\"plaintext\">dig +short txt _esni.df13tester.info <\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/09d07d1f49defc3551c3720d9b67569e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDac\u0103 vezi ceva similar pentru domeniul t\u0103u, asta \u00eenseamn\u0103 c\u0103 totul func\u021bioneaz\u0103 \u0219i po\u021bi trece la testare.<\/p>\n<p>Lans\u0103m un VPS Ubuntu, de exemplu, pe DigitalOcean. P.S. \u00cen cazul nostru, adresa IP a VPS-ului, emis\u0103 recent de provider, s-a reg\u0103sit pe listele negre ale RKN. A\u0219a c\u0103 nu te mira dac\u0103 \u021bi se \u00eent\u00e2mpl\u0103 ceva similar. A fost necesar s\u0103 folosim VPN pentru a accesa VPS-ul nostru.<\/p>\n<p>Copiem pe VPS rsockstun compilat (de fapt, acesta este un alt avantaj al Golang-ului - po\u021bi compila proiectul pe sistemul t\u0103u \u0219i s\u0103-l rulezi pe orice Linux, respect\u00e2nd doar arhitectura sistemului) \u0219i lans\u0103m partea serverului:<\/p>\n<p><img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/f86be92203d646832205fb611fe4d056.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nApoi, partea client:<\/p>\n<p><img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/c8852d7431e8bba7eab1494989ceb46d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA\u0219a cum vedem, clientul s-a conectat cu succes la server prin serverul frontend CloudFlare folosind WebSocket. Pentru a verifica c\u0103 tunelul func\u021bioneaz\u0103 ca un adev\u0103rat tunel, po\u021bi face o solicitare curl prin socks5-ul local, deschis pe server:<\/p>\n<p><img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/87b6f42676e5e895b7f7b03da16420bb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAcum s\u0103 vedem ce vede DPI \u00een canalul de comunicare:<\/p>\n<p><img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/d546b676904d5b8ded7e0891ff5a98e6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00cent\u00e2i, tunelul, folosind mecanismul DoH, se adreseaz\u0103 serverului DNS Cloudflare pentru cheile eSNI pentru domeniul de destina\u021bie (pachetele nr. 1-19), iar apoi acceseaz\u0103 serverul frontend \u0219i stabile\u0219te o conexiune TLS, acoperindu-se cu acest domeniu <noindex><a rel=\"nofollow\" href=\"http:\/\/www.google.com\">www.google.com<\/a><\/noindex> (aceasta este valoarea implicit\u0103 c\u00e2nd la lansarea clientului nu este specificat un domeniu fals). Pentru a specifica domeniul t\u0103u fals, este necesar s\u0103 folose\u0219ti parametrul -fronfDomain:<\/p>\n<p><img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/3f55e03eecd7436b1e9c2312d88b46af.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/da5e219fb5a097e6ad6d75844d7a5687.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAcum o alt\u0103 problem\u0103. Implicit, \u00een set\u0103rile contului de pe CloudFlare este activat modul de func\u021bionare Flexible SSL. Aceasta \u00eenseamn\u0103 c\u0103 solicit\u0103rile https c\u0103tre serverele frontend Cloudflare de la clien\u021bi vor fi redirec\u021bionate \u00een form\u0103 necriptat\u0103 (http) c\u0103tre serverul nostru. De aceea am lansat partea serverului tunelului \u00een modul non-ssl (-listen ws:0.0.0.0), nu (-listen wss:0.0.0.0).<\/p>\n<p><img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/17f820b973f8a3f26f78a30c10bdb493.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPentru a trece \u00een modul de criptare complet\u0103, este necesar s\u0103 alegi <b>Full<\/b>, sau <b>Full (strict)<\/b> \u00een cazul \u00een care exist\u0103 un certificat real pe server. Dup\u0103 schimbarea modului, vom putea accepta conexiuni de la CloudFlare prin protocolul https. Nu uita\u021bi s\u0103 genera\u021bi un certificat auto-semnat pentru partea de server a tunelului.<\/p>\n<p><img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/c9a05134c9ba01e6008b4432cf59c74e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUn cititor perspicace ar \u00eentreba: \u201e\u0218i ce se \u00eent\u00e2mpl\u0103 cu clientul pentru Windows? Cu siguran\u021b\u0103, utilizarea principal\u0103 a tunelului este pentru a stabili o conexiune de back cu ma\u0219inile \u0219i serverele corporative, iar acolo, de regul\u0103, exist\u0103 \u00eentotdeauna Windows. Cum pot s\u0103 compilez tunelul pentru Windows, \u0219i \u00eenc\u0103 cu o stiv\u0103 specific\u0103 TLS?\u201d \u0218i acum s\u0103 prezent\u0103m \u00eenc\u0103 o caracteristic\u0103 care arat\u0103 c\u00e2t de convenabil este Go. Compil\u0103m pentru Windows direct din Kali, ad\u0103ug\u00e2nd pur \u0219i simplu parametrul GOOS=windows:<\/p>\n<pre><code class=\"plaintext\">GOARCH=amd64 GOROOT=\"\/opt\/tls-tris\/_dev\/GOROOT\/linux_amd64\" GOOS=windows go build -ldflags=\"-s -w\"<\/code><\/pre>\n<p>\nSau variant\u0103 pe 32 de bi\u021bi:<\/p>\n<pre><code class=\"plaintext\">GOARCH=386 GOROOT=\"\/opt\/tls-tris\/_dev\/GOROOT\/linux_amd64\" GOOS=windows go build -ldflags=\"-s -w\"<\/code><\/pre>\n<p>\nTotul! \u0218i nu mai trebuie s\u0103 v\u0103 face\u021bi griji. Chiar func\u021bioneaz\u0103! <\/p>\n<p><img decoding=\"async\" alt=\"Fronting de domeniu pe baza TLS 1.3. Partea 2\" src=\"\/wp-content\/uploads\/2019\/11\/2c60d41c115b8df32a8b53b06a45e915.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nFlagurile de compilare \u2013w \u0219i \u2013s sunt necesare pentru a elimina gunoiul din fi\u0219ierul executabil, f\u0103c\u00e2ndu-l mai mic cu c\u00e2teva megabytes. \u00cen plus, ulterior poate fi \u00eempachetat cu ajutorul UPX, pentru a reduce \u0219i mai mult dimensiunea.<\/p>\n<h3>\u00cen concluzie<\/h3>\n<p>\n\u00cen articol, prin exemplul tunelului scris \u00een Go, am demonstrat aplicarea noului concept de domeniu-frontal, realizat pe o caracteristic\u0103 destul de interesant\u0103 a protocolului TLS 1.3. \u00cen mod similar, se poate adapta instrumentarul existent scris \u00een Go pentru a func\u021biona prin serverele CloudFlare, de exemplu. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Ne0nd0g\/merlin\">Merlin<\/a><\/noindex> \u2014 un C2 cunoscut, sau s\u0103 for\u021b\u0103m CobaltStrike Beacon s\u0103 utilizeze domeniu-frontal eSNI c\u00e2nd lucreaz\u0103 cu Teamserver prin <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ryhanson\/ExternalC2\">Canal C2 extern<\/a><\/noindex>, realizat \u00een Go, sau pe standardul C++ folosind o versiune patch-uit\u0103 a OpenSSL, despre care am vorbit \u00een partea anterioar\u0103 a articolului. \u00cen general, fantezia nu are limite.<\/p>\n<p>Exemplul cu tunelul \u0219i CloudFlare este prezentat ca o concep\u021bie \u0219i, deocamdat\u0103, este greu de spus despre perspectivele pe termen lung ale acestui tip de domeniu-frontal. \u00cen prezent, suportul eSNI este realizat doar de CloudFlare \u0219i, teoretic, nimic nu \u00eei opre\u0219te s\u0103 dezactiveze acest tip de frontare \u0219i, de exemplu, s\u0103 rup\u0103 conexiunile TLS \u00een cazul necorespunderii SNI \u0219i eSNI. \u00cen general, viitorul va ar\u0103ta. Dar deocamdat\u0103, perspectiva de a opera sub \u201eacoperirea kremlin.ru\u201d pare destul de tentant\u0103. Nu-i a\u0219a?<\/p>\n<p>Codul actualizat al tunelului, precum \u0219i fi\u0219ierele executabile exe compilate sunt disponibile \u00eentr-o ramur\u0103 separat\u0103 a proiectului pe <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mis-team\/rsockstun\">github<\/a><\/noindex>. Pentru toate problemele posibile ale tunelului, este recomandat s\u0103 scrie\u021bi un issue pe pagina proiectului de pe GitHub.<br \/>\n<br \/>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/477696\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u0434\u0430\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 encrypted SNI (eSNI). \u041f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u043b\u043e\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u0442 \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 DPI-\u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 (\u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0431\u0438\u043b\u0430\u0439\u043d\u043e\u0432\u0441\u043a\u043e\u0433\u043e DPI \u0438 \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0420\u041a\u041d \u0440\u0443\u0442\u0440\u0435\u043a\u0435\u0440\u0430), \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u043e\u043c\u0435\u043d-\u0444\u0440\u043e\u043d\u0442\u0438\u043d\u0433\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430. \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0432\u0435\u0449\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u044b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-53317","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u0434\u0430\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 encrypted SNI (eSNI).\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/domen-fronting-na-baze-tls-1-3-chast-2\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0414\u043e\u043c\u0435\u043d-\u0444\u0440\u043e\u043d\u0442\u0438\u043d\u0433 \u043d\u0430 \u0431\u0430\u0437\u0435 TLS 1.3. \u0427\u0430\u0441\u0442\u044c 2 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u0434\u0430\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 encrypted SNI (eSNI).\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/domen-fronting-na-baze-tls-1-3-chast-2\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-11-28T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:01:12+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 Domain Fronting pe baza TLS 1.3. Partea 2 | ProHoster","description":"Introducere \u00cen prima parte a articolului, am oferit o scurt\u0103 descriere a mecanismului encrypted SNI (eSNI).","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/domen-fronting-na-baze-tls-1-3-chast-2","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0414\u043e\u043c\u0435\u043d-\u0444\u0440\u043e\u043d\u0442\u0438\u043d\u0433 \u043d\u0430 \u0431\u0430\u0437\u0435 TLS 1.3. \u0427\u0430\u0441\u0442\u044c 2 | ProHoster","og:description":"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u0434\u0430\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 encrypted SNI (eSNI).","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/domen-fronting-na-baze-tls-1-3-chast-2","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-11-28T21:00:00+00:00","article:modified_time":"2020-02-18T11:01:12+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"53317","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 06:55:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:27:38","updated":"2026-01-24 06:55:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/53317","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=53317"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/53317\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=53317"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=53317"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=53317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}