{"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\/da\/blog\/administrirovanie\/domen-fronting-na-baze-tls-1-3-chast-2","title":{"rendered":"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h3>Introduktion<\/h3>\n<p>\nI den f\u00f8rste del <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/475372\/\">artikler<\/a><\/noindex> gav vi en kort beskrivelse af mekanismen encrypted SNI (eSNI). Vi viste, hvordan man kan undg\u00e5 detektion af moderne DPI-systemer (ved hj\u00e6lp af Beeline's DPI og det forbudte RKN ruTracker), samt unders\u00f8gte en ny variant af dom\u00e6ne-fronting baseret p\u00e5 denne mekanisme.<\/p>\n<p>I den anden del af artiklen vil vi g\u00e5 videre til mere praktiske emner, der vil v\u00e6re nyttige for RedTeam-specialister i deres vanskelige arbejde. I sidste ende er vores m\u00e5l ikke at f\u00e5 adgang til blokkerede ressourcer (til s\u00e5danne banale ting har vi den gamle gode VPN). Heldigvis findes der mange VPN-udbydere, som man siger, til enhver smag, farve og budget.<\/p>\n<p>Vi vil fors\u00f8ge at anvende dom\u00e6ne-fronting-mekanismen til moderne RedTeam-v\u00e6rkt\u00f8jer, s\u00e5som Cobalt Strike, Empire osv., og give dem yderligere muligheder for at efterligne og undg\u00e5 moderne indholdsfileringssystemer.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nSidste gang implementerede vi eSNI-mekanismen i OpenSSL-biblioteket og brugte den med succes i det velkendte v\u00e6rkt\u00f8j curl. Men man kan ikke leve af curl alene, som man siger. Selvf\u00f8lgelig \u00f8nsker man at realisere noget lignende i h\u00f8j-niveau programmeringssprog. Desv\u00e6rre skuffer en hurtig s\u00f8gning p\u00e5 nettet os, da eSNI-mekanismen kun er fuldt ud implementeret i GOLANG. S\u00e5 vores valg er ikke s\u00e6rlig stort: enten skriver vi i rent C eller C++ ved hj\u00e6lp af den patchede OpenSSL-bibliotek, eller vi bruger en separat fork af GOLANG fra CloudFlare og fors\u00f8ger at portere vores v\u00e6rkt\u00f8jer dertil. Principielt er der ogs\u00e5 en anden, mere klassisk, men samtidig ressourcekr\u00e6vende mulighed - at implementere eSNI-support for Python. I sidste ende bruger Python ogs\u00e5 OpenSSL til at arbejde med https. Men denne mulighed vil vi lade nogen andre udvikle, og selv vil vi n\u00f8jes med implementeringen i golang, is\u00e6r fordi vores elskede Cobalt Strike kan arbejde med forbindelseskaneler, der er oprettet af tredjeparts v\u00e6rkt\u00f8jer (External C2 channel) \u2013 dette vil vi forklare i slutningen af artiklen.<\/p>\n<h3>Pr\u00f8v h\u00e5rdere\u2026<\/h3>\n<p>\nEt af de implementerede v\u00e6rkt\u00f8jer i Go \u2013 vores udvikling til pivoting ind i netv\u00e6rket \u2013 tunneler <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mis-team\/rsockstun\">rsockstun<\/a><\/noindex>, som for \u00f8vrigt nu bliver registreret af virksomhederne Microsoft og Symantec som meget skadelig software, der er rettet mod at underst\u00f8tte global ustabilitet\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/13d2635b92051416b2f33415783a2837.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet ville v\u00e6re fantastisk at anvende den tidligere udvikling i denne situation. Men her opst\u00e5r der et lille problem. Det viser sig, at rsockstun oprindeligt foruds\u00e6tter brugen af en synkron SSL-forbindelse til serveren. Det betyder, at forbindelsen oprettes \u00e9n gang og eksisterer hele tiden, mens tunnelen er aktiv. Som du forst\u00e5r, er HTTPS-protokollen ikke rigtig designet til denne driftsform \u2013 den fungerer i en anmodnings-respons-tilstand, hvor hver ny HTTP-anmodning eksisterer inden for en ny TCP-forbindelse.<\/p>\n<p>Den prim\u00e6re ulempe ved en s\u00e5dan ordning er, at serveren ikke kan sende data til klienten, f\u00f8r klienten sender en ny HTTP-anmodning. Men heldigvis findes der mange l\u00f8sninger p\u00e5 dette problem \u2013 streaming af data gennem HTTP-protokollen (for vi form\u00e5r jo at se vores yndlingsserier og lytte til musik fra portaler, der k\u00f8rer p\u00e5 HTTPS, og overf\u00f8rsel af video og lyd er i bund og grund blot streaming af data). En af teknologierne til at emulere en fuldt udbygget TCP-forbindelse p\u00e5 toppen af HTTP-protokollen er WebSockets, hvis hovedid\u00e9 er at oprette et realtidsforbindelse mellem klienten og webserveren.<\/p>\n<p>Til vores held (hurra-hurra!!!) er denne teknologi aktiveret som standard i alle CloudFlare-abonnementer og fungerer perfekt sammen med eSNI. Det er netop denne, vi vil bruge til at l\u00e6re vores tunneler at anvende domain fronting og skjule sig for moderne DPI. <\/p>\n<h3>Lidt om WebSockets<\/h3>\n<p>\nF\u00f8rst og fremmest vil vi kort og enkelt forklare, hvad web-sockets er, s\u00e5 alle har en id\u00e9 om, hvad vi arbejder med. <\/p>\n<p>WebSocket-teknologien g\u00f8r det muligt midlertidigt at skifte fra en HTTP-forbindelse til standard streaming via et netv\u00e6rkssocket uden at afbryde den etablerede TCP-forbindelse. N\u00e5r klienten \u00f8nsker at skifte til WebSocket, angiver den i sin HTTP-anmodning flere HTTP-headere. To obligatoriske headere er <i><b>Connection: Upgrade<\/b><\/i> og <i><b>Upgrade: websocket<\/b><\/i>. Desuden kan den tvinge versionen af WebSocket-protokollen (<i><b>Sec-WebSocket-Version: 13<\/b><\/i>) og noget som en base64 identifikator for webSocket (<i><b>Sec-WebSocket-Key: DAGDJSiREI3+KjDfwxm1FA==<\/b><\/i>). Serveren svarer med http-koden 101 Switching Protocols og s\u00e6tter desuden overskrifterne <i><b>Connection, Upgrade<\/b><\/i> og <i><b>Sec-WebSocket-Accept<\/b><\/i>. Overgangen er vist i billedet nedenfor:<\/p>\n<p><img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/1ee9af28074e5e190daea9b4b4a4a524.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEfter dette kan WebSocket-forbindelsen betragtes som afsluttet. Fremover vil al data, b\u00e5de fra klienten og serveren, blive forsynet med WebSocket-overskrifter (de starter med byte 0x82). Serveren beh\u00f8ver ikke l\u00e6ngere vente p\u00e5 en anmodning fra klienten for at sende data, da tcp-forbindelsen ikke brydes.<\/p>\n<p>I Go findes der flere biblioteker til arbejde med webSockets. De mest popul\u00e6re er <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/gorilla\/websocket\">Gorilla WebSocket<\/a><\/noindex> og den standard <noindex><a rel=\"nofollow\" href=\"https:\/\/godoc.org\/golang.org\/x\/net\/websocket\">WebSocket<\/a><\/noindex>. Vi vil bruge sidstn\u00e6vnte, da den er enklere, mindre og fungerer, som det siges, lidt hurtigere.<\/p>\n<p>I rsockstun-klientkoden skal vi erstatte kald til net.dial eller tls.dial med de tilsvarende WebSocket-kald:<\/p>\n<p><img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/e7ffc8aadeed32b8c456ef03cff4cdf8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/035b3190717482f6aaac22b06cd25bc9.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi \u00f8nsker at g\u00f8re klientdelen af vores tunnel universel og i stand til at fungere b\u00e5de gennem direkte ssl-forbindelse og gennem WebSocket-protokollen. For dette form\u00e5l opretter vi en separat funktion <i><b>func connectForWsSocks(address string, proxy string) error {\u2026}<\/b><\/i> analogous to <i><b>connectForSocks()<\/b><\/i> og vi vil bruge den til at arbejde med webSockets, hvis serverens adresse, angivet ved klientens start, starter med ws: eller wss: (i tilf\u00e6lde af Secure WebSocket).<\/p>\n<p>For serverdelen af tunnelen vil vi ogs\u00e5 lave en separat funktion til at arbejde med webSockets. Her vil der blive oprettet et http-klasse eksempel og angivet en http-forbindelse behandler (funktionen wsHandler): <\/p>\n<p><img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/ad904b629aa40bf45d42c095d4285658.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOg al logik til h\u00e5ndtering af forbindelsen (godkendelse af klienten via adgangskode, oprettelse og afslutning af yamux-sessionen) vil vi placere i WebSocket-forbindelsesbehandleren:<\/p>\n<p><img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/a624dca4819cee4b9d46f1325aafc544.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi kompilere projektet, starter serverdelen:<\/p>\n<pre><code class=\"go\">.\\\/rsockstun \u2013listen ws:127.0.0.1:8080 \u2013pass P@ssw0rd<\/code><\/pre>\n<p>\nOg derefter klientdelen:<\/p>\n<pre><code class=\"go\">.\\\/rsockstun -connect ws:127.0.0.1:8080 \u2013pass P@ssw0rd<\/code><\/pre>\n<p>\nOg vi tester det p\u00e5 localhost:<\/p>\n<p><img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/34bb12087eb7dd72cf1f35d7addf2c72.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/83fc82e962961ba8491164d26f27be95.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Lad os g\u00e5 videre til dom\u00e6ne-fremf\u00f8ring<\/h3>\n<p>\nVi har tilsyneladende forst\u00e5et webSockets. Lad os nu g\u00e5 videre til eSNI og dom\u00e6ne-fremf\u00f8ring. Som tidligere n\u00e6vnt, for at arbejde med DoH og eSNI, skal vi tage en speciel Go-gren fra virksomheden <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/cloudflare\/tls-tris\">CloudFlare<\/a><\/noindex>. Vi har brug for en gren med st\u00f8tte for eSNI (pwu\/esni).<\/p>\n<p>Klon den lokalt eller download og udpakk den relevante zip:<\/p>\n<pre><code class=\"plaintext\">git clone -b pwu\/esni https:\/\/github.com\/cloudflare\/tls-tris.git<\/code><\/pre>\n<p>\nDerefter skal vi kopiere GOROOT-katalogen, erstatte de relevante filer fra den klonede gren og installere den som prim\u00e6r. For at befri udvikleren for dette hovedbrud har folkene fra CloudFlare forberedt et specielt script \u2013 _dev\/go.sh. Vi k\u00f8rer det simpelthen. Scriptet sammen med makefile vil klare det hele. For nysgerrighedens skyld \u2014 du kan kigge ind i makefile for detaljer.<\/p>\n<p>Efter scriptet er k\u00f8rt, skal vi angive den lokale mappe, som scriptet forberedte, som GOROOT, n\u00e5r vi kompilere projektet. I vores tilf\u00e6lde ser det s\u00e5ledes ud:<\/p>\n<pre><code class=\"plaintext\">GOROOT=\"\/opt\/tls-tris\/_dev\/GOROOT\/linux_amd64\" go build \u2026.<\/code><\/pre>\n<p>\nDern\u00e6st skal vi implementere funktionen i tunnelen til at anmode om og parset eSNI-n\u00f8gler for det \u00f8nskede dom\u00e6ne. I vores tilf\u00e6lde vil det v\u00e6re de offentlige eSNI-n\u00f8gler fra CloudFlare frontend-servere. For dette vil vi oprette tre funktioner:<\/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>\nFunktionsnavnene taler i princippet for sig selv. Indholdet vil vi tage fra filen esni_query.go, som er en del af tls-tris. Den f\u00f8rste funktion opretter en netv\u00e6rkspakke med en anmodning til CloudFlare DNS-serveren, ved at bruge DoH-protokollen (DNS-over-HTTPS), den anden parser anmodningens resultater og henter v\u00e6rdierne for de offentlige dom\u00e6nen\u00f8gler, mens den tredje fungerer som en container for de to f\u00f8rste.<\/p>\n<p>Derefter tilf\u00f8jer vi i vores nyoprettede funktion til at oprette en websockets-forbindelse <i><b>connectForWsSocks<\/b><\/i> funktionen til at anmode om eSNI-n\u00f8gler for dom\u00e6net. Hvor serverdelen fungerer, indstiller vi TLS-parametrene samt angiver navnet p\u00e5 en falsk \"d\u00e6kke-dom\u00e6ne\":<\/p>\n<p><img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/63abc51177058223e0f0941a78d182fa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet skal bem\u00e6rkes, at tls-tris-grenen ikke oprindeligt er designet til at anvende dom\u00e6ne-frontering. Derfor er der ikke taget h\u00f8jde for det falske servernavn (i client-hello-pakken bliver serverName-feltet sendt som tomt). For at rette dette, skal vi tilf\u00f8je det relevante felt FakeServerName til TlsConfig-strukturen. Det standard ServerName-felt i strukturen kan vi ikke bruge, da det anvendes af interne tls-mekanismer, og hvis det adskiller sig fra det oprindelige, vil tls-handshake mislykkes med en fejl. Beskrivelsen af TlsConfig-strukturen findes i filen <b>tls\/common.go<\/b> \u2013 som vi ogs\u00e5 skal \u00e6ndre:<\/p>\n<p><img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/04f35bb49a5f6a28625de28b23d686f0.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/0caf5cfccb2ffffeae703ecfe3eb6652.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDerudover skal vi \u00e6ndre filen <b>tls\/handshake_client.go<\/b>, for at bruge vores felt FakeServerName ved dannelsen af TLS handshake:<\/p>\n<p><img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/ac68f37f426603b2fcec467c6ee886ca.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet var det! Nu kan du kompilere projektet og tjekke funktionaliteten. Men f\u00f8r du starter kontrollen, skal du konfigurere din CloudFlare-konto. Tja, hvordan skal jeg sige det, konfigurere - bare oprette en konto p\u00e5 CloudFlare og knytte dit dom\u00e6ne til det. Alle funktioner relateret til DoH, WebSocket og ESNI er som standard aktiveret i CloudFlare. N\u00e5r DNS-posterne er opdateret, kan du kontrollere dom\u00e6nets funktionalitet ved at udf\u00f8re en anmodning om eSNI-n\u00f8gler:<\/p>\n<pre><code class=\"plaintext\">dig +short txt _esni.df13tester.info <\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/09d07d1f49defc3551c3720d9b67569e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHvis du ser noget lignende for dit dom\u00e6ne, betyder det, at alt fungerer, og du kan g\u00e5 videre til testning.<\/p>\n<p>Vi starter en Ubuntu VPS, for eksempel p\u00e5 DigitalOcean. P.S. I vores tilf\u00e6lde var den lige tildelte IP-adresse fra udbyderen sortlistet af RKN. S\u00e5 v\u00e6r ikke overrasket, hvis du oplever noget lignende. Vi m\u00e5tte bruge en VPN for at f\u00e5 adgang til vores VPS.<\/p>\n<p>Vi kopierer den allerede kompilerede rsockstun til VPS (i \u00f8vrigt en anden fordel ved Go - du kan kompilere projektet p\u00e5 din egen maskine og k\u00f8re det p\u00e5 enhver Linux, s\u00e5 l\u00e6nge du overholder systemets arkitektur) og starter serverdelen:<\/p>\n<p><img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/f86be92203d646832205fb611fe4d056.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOg derefter klientdelen:<\/p>\n<p><img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/c8852d7431e8bba7eab1494989ceb46d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSom vi kan se, har klienten oprettet forbindelse til serveren gennem CloudFlare front-end serveren ved hj\u00e6lp af websockets. For at kontrollere, at tunnelen fungerer som en tunnel, kan du lave en curl-anmodning gennem den lokale socks5, der er \u00e5bnet p\u00e5 serveren:<\/p>\n<p><img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/87b6f42676e5e895b7f7b03da16420bb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLad os nu se, hvad DPI ser i kommunikationskanalen:<\/p>\n<p><img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/d546b676904d5b8ded7e0891ff5a98e6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nF\u00f8rst anmoder tunneleringsv\u00e6rkt\u00f8jet ved hj\u00e6lp af DoH-mekanismen DNS-serveren Cloudflare om eSNI-n\u00f8gler for m\u00e5ldom\u00e6net (pakker #1-19), og derefter anmoder det om front-end serveren og opretter en TLS-forbindelse, skjult bag dom\u00e6net <noindex><a rel=\"nofollow\" href=\"http:\/\/www.google.com\">www.google.com<\/a><\/noindex> (dette er standardv\u00e6rdien, n\u00e5r der ikke er angivet et falsk dom\u00e6ne ved klientens opstart). For at angive dit eget falske dom\u00e6ne skal du bruge parameteren -fronfDomain:<\/p>\n<p><img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/3f55e03eecd7436b1e9c2312d88b46af.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/da5e219fb5a097e6ad6d75844d7a5687.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDer er ogs\u00e5 et sidste punkt. Som standard er indstillingen for kontoen p\u00e5 CloudFlare indstillet til Flexible SSL. Det betyder, at https-anmodninger til Cloudflares front-end servere fra klienter vil blive omdirigeret til vores server i ukrypteret (http) format. Derfor startede vi den serverdel af tunnelen i non-ssl-tilstand (-listen ws:0.0.0.0), i stedet for (-listen wss:0.0.0.0).<\/p>\n<p><img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/17f820b973f8a3f26f78a30c10bdb493.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nFor at skifte til fuld krypteringstilstand skal du v\u00e6lge <b>Full<\/b>, eller <b>Full (strict)<\/b> hvis der er et gyldigt certifikat p\u00e5 serveren. Efter at have skiftet tilstand vil vi kunne modtage forbindelser fra CloudFlare via https-protokollen. Glem ikke at generere et self-signed certifikat til serverdelen af tunnelen.<\/p>\n<p><img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/c9a05134c9ba01e6008b4432cf59c74e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDen nysgerrige l\u00e6ser vil sp\u00f8rge: \u00abHvad med klienten til Windows? Det prim\u00e6re brug af tunnelen er sikkert at etablere back-connect med virksomhedsmaskiner og servere, som normalt k\u00f8rer Windows. Hvordan kan jeg kompilere tunnelen til Windows og samtidig bruge en specifik TLS-stak?\u00bb Lad os nu pr\u00e6sentere endnu et trick, der viser, hvor praktisk Go er. Vi kompilere til Windows direkte fra Kali ved blot at tilf\u00f8je parameteret 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>\nEller 32-bit versionen:<\/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>\nDet er det! Og s\u00e5 er der ingen flere problemer. Det fungerer virkelig! <\/p>\n<p><img decoding=\"async\" alt=\"Dom\u00e6ne-forfrontning baseret p\u00e5 TLS 1.3. Del 2\" src=\"\/wp-content\/uploads\/2019\/11\/2c60d41c115b8df32a8b53b06a45e915.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKompilationsflaggene -w og -s er n\u00f8dvendige for at fjerne un\u00f8dvendigt affald fra den eksekverbare fil, hvilket g\u00f8r den et par megabyte mindre. Yderligere kan den pakkes med UPX for at reducere st\u00f8rrelsen yderligere.<\/p>\n<h3>Afslutning<\/h3>\n<p>\nI artiklen har vi med eksemplet p\u00e5 tunnelen skrevet i Go tydeligt vist anvendelsen af den nye teknologi domain-fronting, realiseret gennem en temmelig interessant egenskab ved TLS 1.3-protokollen. P\u00e5 samme m\u00e5de kan det eksisterende v\u00e6rkt\u00f8jss\u00e6t skrevet i Go tilpasses til at arbejde gennem CloudFlare-servere, for eksempel <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Ne0nd0g\/merlin\">Merlin<\/a><\/noindex> \u2014 en velkendt C2, eller f\u00e5 CobaltStrike Beacon til at bruge eSNI domain-fronting ved at arbejde med Teamserver via <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ryhanson\/ExternalC2\">External C2 Channel<\/a><\/noindex>, realiseret i Go, eller p\u00e5 standard C++ ved hj\u00e6lp af den patch-version af OpenSSL, som vi har beskrevet i den forrige del af artiklen. I det hele taget er der ikke nogen gr\u00e6nser for fantasien.<\/p>\n<p>Eksemplet med tunnelen og CloudFlare pr\u00e6senteres i form af et koncept, og det er stadig sv\u00e6rt at sige noget om de langtidsudsigter for denne form for domain-fronting. P\u00e5 nuv\u00e6rende tidspunkt er eSNI-underst\u00f8ttelse kun implementeret af CloudFlare, og teoretisk set er der intet, der forhindrer dem i at deaktivere denne form for fronting og for eksempel bryde tls-forbindelser, n\u00e5r SNI og eSNI ikke stemmer overens. I det hele taget vil fremtiden vise det. Men indtil videre ser perspektivet for at arbejde under \u201cd\u00e6kket af kremlin.ru\u201d ret tiltalende ud. Er det ikke?<\/p>\n<p>Den opdaterede tunnelkodes samt de kompilerede eksekverbare exe-filer er placeret i en separat gren af projektet p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mis-team\/rsockstun\">github<\/a><\/noindex>. For alle mulige problemer med tunnelen anbefales det bedst at oprette en issue p\u00e5 projektets side p\u00e5 GitHub.<br \/>\n<br \/>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/domen-fronting-na-baze-tls-1-3-chast-2\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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\udd47Dom\u00e6ne-fronting baseret p\u00e5 TLS 1.3. Del 2 | ProHoster","description":"Introduktion I f\u00f8rste del af artiklen gav vi en kort beskrivelse af mekanismen encrypted SNI (eSNI).","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/domen-fronting-na-baze-tls-1-3-chast-2","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/53317","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=53317"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/53317\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=53317"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=53317"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=53317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}