{"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\/nl\/blog\/administrirovanie\/domen-fronting-na-baze-tls-1-3-chast-2","title":{"rendered":"Domein-fronting op basis van TLS 1.3. Deel 2","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h3>Inleiding<\/h3>\n<p>\nIn het eerste gedeelte <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/475372\/\">artikel<\/a><\/noindex> hebben we een kort overzicht gegeven van het mechanisme van encrypted SNI (eSNI). We hebben laten zien hoe je hiermee kunt ontsnappen aan detectie door moderne DPI-systemen (met als voorbeeld de DPI van Beeline en de verboden RK\u041d tracker), en hebben een nieuwe variant van domain fronting op basis van dit mechanisme onderzocht.<\/p>\n<p>In het tweede deel van het artikel gaan we over naar praktischer zaken die nuttig zullen zijn voor RedTeam-specialisten in hun uitdagende werk. Uiteindelijk is ons doel niet om toegang te krijgen tot geblokkeerde bronnen (voor zulke alledaagse dingen hebben we de oude vertrouwde VPN). Gelukkig zijn er talloze VPN-providers, voor elk wat wils, in elke kleur en voor elk budget.<\/p>\n<p>We zullen proberen om het mechanisme van domain fronting toe te passen op moderne tools van RedTeam, zoals Cobalt Strike, Empire, enzovoorts, en ze extra mogelijkheden te geven voor mimiek en het ontwijken van moderne contentfilteringssystemen.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nBij de laatste keer hebben we het mechanisme eSNI in de OpenSSL-bibliotheek ge\u00efmplementeerd en hebben we het met succes gebruikt in de iedereen bekende tool curl. Maar met alleen curl, zoals het gezegde luidt, kun je je niet vullen. Natuurlijk willen we iets dergelijks implementeren in hogere programmeertalen. Helaas teleurstelt een oppervlakkige zoektocht op internet, omdat de ondersteuning voor eSNI volledig is gerealiseerd alleen in GOLANG. Hierdoor is onze keuze niet echt groot: ofwel schrijven we in puur C of C++ met behulp van een gepatchte OpenSSL-bibliotheek, of we gebruiken een aparte fork van GOLANG van CloudFlare en proberen we onze toolset daarheen te porteren. In principe is er nog een meer klassieke, maar tegelijkertijd arbeidsintensieve optie: de ondersteuning van eSNI voor Python implementeren. Uiteindelijk gebruikt Python ook OpenSSL voor https-werk. Maar deze optie laten we aan iemand anders over om te ontwikkelen, terwijl wij tevreden zullen zijn met de implementatie in Golang, vooral aangezien onze geliefde Cobalt Strike uitstekend kan werken met communicatiekanalen die door externe middelen zijn gebouwd (External C2 channel) \u2013 daarover zullen we aan het einde van het artikel vertellen.<\/p>\n<h3>Try Harder\u2026<\/h3>\n<p>\nEen van de op Go ge\u00efmplementeerde tools \u2013 onze ontwikkeling voor het pivoteren binnen netwerken \u2013 tunneler <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mis-team\/rsockstun\">rsockstun<\/a><\/noindex>, die tegenwoordig overigens door de bedrijven Microsoft en Symantec wordt gedetecteerd als zeer schadelijke software, gericht op het verstoren van de wereldwijde stabiliteit\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/13d2635b92051416b2f33415783a2837.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHet zou geweldig zijn om de eerdere ontwikkeling ook in dit geval te gebruiken. Maar er is een klein probleem. Het punt is dat rsockstun oorspronkelijk het gebruik van een synchronisch SSL-kanaal voor communicatie met de server veronderstelt. Dit betekent dat de verbinding \u00e9\u00e9n keer wordt opgezet en gedurende de hele werking van de tunnel blijft bestaan. Zoals je begrijpt, is het https-protocol hier echter niet echt voor bedoeld - het werkt in een verzoek-antwoord modus, waar elke nieuwe http-verzoek binnen een nieuwe tcp-verbinding valt.<\/p>\n<p>Het belangrijkste nadeel van deze opzet is dat de server geen gegevens naar de client kan verzenden totdat de client een nieuw http-verzoek doet. Maar gelukkig zijn er veel oplossingen voor dit probleem - het streamen van gegevens via het http-protocol (uiteindelijk weten we immers onze favoriete series te kijken en muziek te luisteren van platforms die op https draaien, en de overdracht van video en audio is niets meer dan datastreaming). Een van de technologie\u00ebn om een volledige tcp-verbinding over het http-protocol te emuleren is de technologie van websockets (WebSockets), die als doel heeft een volledige netverbinding tussen de client en de webserver te organiseren.<\/p>\n<p>Gelukkig (hoera!!!), is deze technologie standaard ingeschakeld in alle CloudFlare-abonnementen en werkt ze uitstekend samen met eSNI. Dat is precies wat we gaan gebruiken om onze tunneltool te leren het domain fronting te gebruiken en zich te verbergen voor moderne DPI. <\/p>\n<h3>Even iets over WebSockets<\/h3>\n<p>\nAllereerst zullen we kort en eenvoudig uitleggen wat websockets zijn, zodat iedereen een idee heeft van waar we mee werken. <\/p>\n<p>De technologie van websockets maakt het mogelijk om tijdelijk over te schakelen van een http-verbinding naar standaard datastreaming via een netwerk-socket, zonder de opgezet tcp-verbinding te verbreken. Wanneer een client wil overschakelen naar een websocket, plaatst hij een aantal http-headers in zijn http-verzoek. Twee verplichte headers zijn: <i><b>Connection: Upgrade<\/b><\/i> en <i><b>Upgrade: websocket<\/b><\/i>. Ook kan hij de versie van het websocket-protocol verplicht specificeren (<i><b>Sec-Websocket-Version: 13<\/b><\/i>) en iets dat lijkt op een base64 identificatie voor de websockets (<i><b>Sec-WebSocket-Key: DAGDJSiREI3+KjDfwxm1FA==<\/b><\/i>). De server antwoordt met http-code 101 Switching Protocols en stelt ook de headers in <i><b>Connection, Upgrade<\/b><\/i> en <i><b>Sec-WebSocket-Accept<\/b><\/i>. Het proces van overschakeling wordt visueel weergegeven in de onderstaande afbeelding:<\/p>\n<p><img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/1ee9af28074e5e190daea9b4b4a4a524.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa deze stap kan de opzet van de WebSocket-verbinding als voltooid worden beschouwd. Gegevens van zowel de client als de server zullen nu worden voorzien van WebSocket-headers (deze beginnen met byte 0x82). De server hoeft nu niet meer te wachten op een verzoek van de client om gegevens te verzenden, aangezien de tcp-verbinding niet wordt verbroken.<\/p>\n<p>In Go zijn er verschillende bibliotheken voor het werken met websockets. De meest populaire zijn <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/gorilla\/websocket\">Gorilla WebSocket<\/a><\/noindex> en de standaard <noindex><a rel=\"nofollow\" href=\"https:\/\/godoc.org\/golang.org\/x\/net\/websocket\">WebSocket<\/a><\/noindex>. We zullen de laatste gebruiken, omdat deze eenvoudiger, kleiner is en, zoals men zegt, iets sneller werkt.<\/p>\n<p>In de clientcode van rsockstun moeten we calls naar net.dial of tls.dial vervangen door de overeenkomstige WebSocket-calls:<\/p>\n<p><img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/e7ffc8aadeed32b8c456ef03cff4cdf8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/035b3190717482f6aaac22b06cd25bc9.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWe willen de clientzijde van onze tunneler universeel maken en in staat stellen te werken via zowel een directe ssl-verbinding als via het WebSocket-protocol. Hiervoor cre\u00ebren we een aparte functie <i><b>func connectForWsSocks(address string, proxy string) error {\u2026}<\/b><\/i> in navolging van <i><b>connectForSocks()<\/b><\/i> en we zullen deze gebruiken voor het werken met websockets in het geval dat het serveradres dat bij het starten van de client is opgegeven, begint met ws: of wss: (in het geval van Secure WebSocket).<\/p>\n<p>Voor de serverzijde van de tunneler zullen we ook een aparte functie maken voor het werken met websockets. Hier wordt een instantie van de http-klasse aangemaakt en wordt een http-verbinding handler ingesteld (functie wsHandler): <\/p>\n<p><img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/ad904b629aa40bf45d42c095d4285658.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn de hele logica voor het afhandelen van de verbinding (authenticatie van de client via wachtwoord, opzetten en be\u00ebindigen van de yamux-sessie) plaatsen we in de WebSocket-verbindingshandler:<\/p>\n<p><img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/a624dca4819cee4b9d46f1325aafc544.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWe compileren het project en starten de serverzijde:<\/p>\n<pre><code class=\"go\">.\/rsockstun \u2013listen ws:127.0.0.1:8080 \u2013pass P@ssw0rd<\/code><\/pre>\n<p>\nEn daarna de clientzijde:<\/p>\n<pre><code class=\"go\">.\/rsockstun -connect ws:127.0.0.1:8080 \u2013pass P@ssw0rd<\/code><\/pre>\n<p>\nEn we testen de werking op de lokale host:<\/p>\n<p><img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/34bb12087eb7dd72cf1f35d7addf2c72.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/83fc82e962961ba8491164d26f27be95.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Laten we nu doorgaan naar domein-fronting<\/h3>\n<p>\nWe lijken de websockets wel te begrijpen. Laten we nu de sprong maken naar eSNI en domein-fronting. Zoals eerder vermeld, moeten we een speciale Go-tak nemen van het bedrijf <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/cloudflare\/tls-tris\">CloudFlare<\/a><\/noindex>. We hebben de tak nodig met ondersteuning voor eSNI (pwu\/esni).<\/p>\n<p>We klonen deze lokaal of downloaden en unzippen het bijbehorende zip-bestand:<\/p>\n<pre><code class=\"plaintext\">git clone -b pwu\/esni https:\/\/github.com\/cloudflare\/tls-tris.git<\/code><\/pre>\n<p>\nDaarna moeten we de GOROOT-map kopi\u00ebren, de bijbehorende bestanden uit de gekloonde tak vervangen en deze als de hoofdinstallatie instellen. Om de ontwikkelaar van deze hoofdpijn te verlossen, hebben de jongens van CloudFlare een speciaal script gemaakt \u2013 _dev\/go.sh. Gewoon uitvoeren. Het script samen met de makefile doet alles zelf. Voor de interesse, je kunt een kijkje binnenin de makefile nemen voor meer details.<\/p>\n<p>Na het uitvoeren van het script, moeten we bij het compileren van het project de lokale map die door het script is voorbereid opgeven als GOROOT. In ons geval ziet het er als volgt uit:<\/p>\n<pre><code class=\"plaintext\">GOROOT=\"\/opt\/tls-tris\/_dev\/GOROOT\/linux_amd64\" go build \u2026.<\/code><\/pre>\n<p>\nVervolgens moeten we de functionaliteit voor het opvragen en parseren van openbare eSNI-sleutels voor het gewenste domein in de tunnel implementeren. In ons geval zijn dit de openbare eSNI-sleutels van de frontend-servers van CloudFlare. Hiervoor zullen we drie functies maken:<\/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>\nDe functienamen spreken in principe voor zich. De inhoud zullen we halen uit het bestand esni_query.go, dat deel uitmaakt van tls-tris. De eerste functie cre\u00ebert een netwerkpakket met een verzoek naar de DNS-server van CloudFlare, waarbij gebruik wordt gemaakt van het DoH-protocol (DNS-over-HTTPS), de tweede parseert de resultaten van de aanvraag en verkrijgt de waarden van de openbare sleutels van het domein, en de derde fungeert als container voor de eerste twee.<\/p>\n<p>Vervolgens voegen we onze net nieuw gemaakte functie voor het verbinden van de web socket toe. <i><b>connectForWsSocks<\/b><\/i> de functionaliteit voor het opvragen van eSNI-sleutels voor het domein. Waar de serverzijde functioneert, stellen we de TLS-parameters in en geven we de naam van het nep \u2018afschermdomein\u2019 op:<\/p>\n<p><img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/63abc51177058223e0f0941a78d182fa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHier moet worden opgemerkt dat de tls-tris-tak in eerste instantie niet is ontworpen voor domein-frontring. Daarom is er geen aandacht besteed aan de nepservernaam (in het client-hello-pakket wordt een leeg veld serverName verzonden). Om dit te corrigeren, moeten we het overeenkomstige veld FakeServerName toevoegen aan de TlsConfig-structuur. Het standaardveld ServerName van de structuur kunnen we niet gebruiken, omdat interne mechanismen van TLS het gebruiken en als dit verschilt van de oorspronkelijke waarde, wordt de TLS-handshake be\u00ebindigd met een fout. De beschrijving van de TlsConfig-structuur staat in het bestand <b>tls\/common.go<\/b> \u2013 dat moeten we aanpassen:<\/p>\n<p><img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/04f35bb49a5f6a28625de28b23d686f0.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/0caf5cfccb2ffffeae703ecfe3eb6652.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nBovendien moeten we wijzigingen aanbrengen in het bestand <b>tls\/handshake_client.go<\/b>, om onze FakeServerName-parameter te gebruiken bij het opstellen van de TLS-handshake:<\/p>\n<p><img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/ac68f37f426603b2fcec467c6ee886ca.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDat is alles! Je kunt het project nu compileren en de werking controleren. Maar voordat je de controle uitvoert, moet je een CloudFlare-account instellen. Of beter gezegd, gewoon een account aanmaken op CloudFlare en je domein eraan koppelen. Alle functies met betrekking tot DoH, WebSocket en ESNI zijn standaard ingeschakeld in CloudFlare. Zodra de DNS-records zijn bijgewerkt, kun je de werking van het domein controleren door de eSNI-sleutels op te vragen:<\/p>\n<pre><code class=\"plaintext\">dig +short txt _esni.df13tester.info <\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/09d07d1f49defc3551c3720d9b67569e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAls je iets vergelijkbaars voor jouw domein ziet, dan werkt alles en kun je doorgaan met testen.<\/p>\n<p>Laten we een Ubuntu VPS opzetten, bijvoorbeeld bij DigitalOcean. P.S. In ons geval bleek het net uitgegeven IP-adres van de provider op de zwarte lijsten van de RKN te staan. Verwacht dus niet dat je daar niet mee te maken krijgt. We moesten een VPN gebruiken om toegang te krijgen tot onze VPS.<\/p>\n<p>We kopi\u00ebren de al gecompileerde rsockstun naar de VPS (overigens, nog een voordeel van Golang \u2013 je kunt een project op je eigen systeem compileren en het op elke Linux-server draaien, zolang je maar de juiste architectuur aanhoudt) en starten het servergedeelte:<\/p>\n<p><img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/f86be92203d646832205fb611fe4d056.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn vervolgens het clientgedeelte:<\/p>\n<p><img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/c8852d7431e8bba7eab1494989ceb46d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZoals we zien, heeft de client succesvol verbinding gemaakt met de server via de frontend-server van CloudFlare met gebruik van een websoket. Om te controleren of de tunnel precies werkt als een tunnel, kunnen we een curl-aanroep doen via de lokale socks5 die op de server is geopend:<\/p>\n<p><img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/87b6f42676e5e895b7f7b03da16420bb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLaten we nu kijken wat DPI ziet in de verbinding:<\/p>\n<p><img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/d546b676904d5b8ded7e0891ff5a98e6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEerst vraagt de tunneler, gebruikmakend van het DoH-mechanisme, de DNS-server van Cloudflare om eSNI-sleutels voor het bestemmingsdomein (pakketten #1-19), en daarna neemt hij contact op met de frontend-server en stelt een TLS-verbinding in, waarbij hij zich verschuilt achter het domein <noindex><a rel=\"nofollow\" href=\"http:\/\/www.google.com\">www.google.com<\/a><\/noindex> (dit is de standaardwaarde wanneer er geen nepdomein is opgegeven bij het starten van de client). Om je eigen nepdomein op te geven, moet je de parameter -frontDomain gebruiken:<\/p>\n<p><img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/3f55e03eecd7436b1e9c2312d88b46af.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/da5e219fb5a097e6ad6d75844d7a5687.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNu nog een punt. Standaard is de werkwijze van het CloudFlare-account ingesteld op Flexible SSL. Dit betekent dat https-verzoeken van clients naar de frontend-servers van CloudFlare onbeveiligd (http) naar onze server worden doorgestuurd. Om deze reden hebben we de serverkant van de tunneler in non-ssl-modus ( -listen ws:0.0.0.0) draaien, in plaats van ( -listen wss:0.0.0.0).<\/p>\n<p><img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/17f820b973f8a3f26f78a30c10bdb493.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOm over te schakelen naar volledige versleuteling, moet je kiezen voor <b>Volledig<\/b>, of <b>Volledig (strikt)<\/b> in het geval van een geldig certificaat op de server. Na het overschakelen van de modus kunnen we verbindingen van CloudFlare via het https-protocol accepteren. Vergeet niet om een self-signed certificaat voor het netwerkdeel van de tunnel te genereren.<\/p>\n<p><img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/c9a05134c9ba01e6008b4432cf59c74e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEen oplettende lezer vraagt: \"En hoe zit het met de client onder Windows? Want waarschijnlijk is de belangrijkste toepassing van de tunnel het opzetten van een backconnect met bedrijfscomputers en servers, en daar draait meestal altijd Windows. Hoe compileer ik de tunnel onder Windows, en dan ook nog met een specifieke TLS-stack?\" Laten we nu een andere functie verkennen die laat zien hoe handig Go is. We compileren onder Windows rechtstreeks vanuit Kali door gewoon de parameter GOOS=windows toe te voegen:<\/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>\nOf de 32-bits versie:<\/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>\nKlaar! En geen verdere complicaties nodig. Dit werkt echt! <\/p>\n<p><img decoding=\"async\" alt=\"Domein-fronting op basis van TLS 1.3. Deel 2\" src=\"\/wp-content\/uploads\/2019\/11\/2c60d41c115b8df32a8b53b06a45e915.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDe compiler-flags -w en -s zijn nodig om extra rommel uit het uitvoerbare bestand te verwijderen, waardoor het een paar megabytes kleiner wordt. Bovendien kan het daarna worden verpakt met behulp van UPX om de grootte nog verder te verminderen.<\/p>\n<h3>Ter afsluiting<\/h3>\n<p>\nIn het artikel hebben we, aan de hand van het in Go geschreven tunnel, een demonstratie gegeven van de toepassing van de nieuwe domein-fronting-technologie, gerealiseerd met een vrij interessante eigenschap van het TLS 1.3-protocol. Op een vergelijkbare manier kan bestaande tooling geschreven in Go worden aangepast voor gebruik via CloudFlare-servers, bijvoorbeeld <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Ne0nd0g\/merlin\">Merlin<\/a><\/noindex> \u2014 een bekende C2, of dwingen CobaltStrike Beacon om eSNI domein-fronting te gebruiken bij de communicatie met de Teamserver via <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ryhanson\/ExternalC2\">External C2 Channel<\/a><\/noindex>, gerealiseerd in Go, of in standaard C++ met behulp van een gepatchte versie van OpenSSL, waar we in het vorige deel van het artikel over hebben gesproken. Kortom, de mogelijkheden zijn eindeloos.<\/p>\n<p>Het voorbeeld met de tunnel en CloudFlare wordt gepresenteerd als een concept en het is voorlopig moeilijk om te zeggen wat de verdere perspectieven van dit soort domein-fronting zijn. Momenteel is de ondersteuning voor eSNI alleen gerealiseerd bij CloudFlare en, in theorie, kan niets hen tegenhouden om dit soort fronting uit te schakelen en bijvoorbeeld TLS-verbindingen te verbreken bij een mismatch tussen SNI en eSNI. Kortom, de toekomst zal het leren. Maar voorlopig lijkt de mogelijkheid om onder \"dekmantel van kremlin.ru\" te werken behoorlijk verleidelijk. Of niet?<\/p>\n<p>De bijgewerkte tunnelcode en gecompileerde uitvoerbare exe-bestanden zijn geplaatst in een aparte tak van het project op <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mis-team\/rsockstun\">github<\/a><\/noindex>. Voor alle mogelijke problemen met de tunnel kunt u het beste een issue schrijven op de projectpagina op GitHub.<br \/>\n<br \/>Bron: <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\/nl\/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=\"nl_NL\" \/>\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\/nl\/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\udd47Domein-framing op basis van TLS 1.3. Deel 2 | ProHoster","description":"Inleiding In het eerste deel van dit artikel hebben we een beknopte beschrijving gegeven van het mechanisme van encrypted SNI (eSNI).","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/domen-fronting-na-baze-tls-1-3-chast-2","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/53317","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=53317"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/53317\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=53317"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=53317"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=53317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}