{"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\/fr\/blog\/administrirovanie\/domen-fronting-na-baze-tls-1-3-chast-2","title":{"rendered":"Domain Fronting sur la base de TLS 1.3. Partie 2","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h3>Introduction<\/h3>\n<p>\nDans la premi\u00e8re partie <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/475372\/\">article<\/a><\/noindex> nous avons donn\u00e9 une br\u00e8ve description du m\u00e9canisme de SNI chiffr\u00e9 (eSNI). Nous avons montr\u00e9 comment il est possible d'\u00e9chapper \u00e0 la d\u00e9tection par des syst\u00e8mes DPI modernes (\u00e0 l'aide de l'exemple du DPI de Beeline et du tracker interdit par le RKN), et avons \u00e9galement explor\u00e9 une nouvelle variante de domain fronting bas\u00e9e sur ce m\u00e9canisme.<\/p>\n<p>Dans la deuxi\u00e8me partie de l'article, nous passerons \u00e0 des aspects plus pratiques qui seront utiles aux sp\u00e9cialistes de RedTeam dans leur travail difficile. Apr\u00e8s tout, notre objectif n'est pas d'acc\u00e9der \u00e0 des ressources bloqu\u00e9es (pour de telles choses banales, nous avons le vieux bon VPN). Heureusement, il existe de nombreux fournisseurs de VPN, comme on dit, pour tous les go\u00fbts, couleurs et budgets.<\/p>\n<p>Nous essaierons d'appliquer le m\u00e9canisme de domain fronting \u00e0 des outils modernes de RedTeam, tels que Cobalt Strike, Empire, etc., pour leur donner des capacit\u00e9s suppl\u00e9mentaires en mati\u00e8re de mim\u00e9tisme et d'\u00e9vasion des syst\u00e8mes de filtrage de contenu modernes.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nLa derni\u00e8re fois, nous avons int\u00e9gr\u00e9 le m\u00e9canisme eSNI dans la biblioth\u00e8que OpenSSL et l'avons utilis\u00e9 avec succ\u00e8s dans l'outil bien connu curl. Mais le simple curl, comme on dit, ne suffit pas. Bien s\u00fbr, nous aimerions r\u00e9aliser quelque chose de similaire dans des langages de haut niveau. Cependant, une recherche rapide sur le web nous d\u00e9\u00e7oit, car le support du m\u00e9canisme eSNI est pleinement r\u00e9alis\u00e9 uniquement dans GOLANG. Ainsi, nous n'avons pas beaucoup de choix : soit nous \u00e9crivons en pur C ou C++ en utilisant une biblioth\u00e8que OpenSSL patch\u00e9e, soit nous utilisons un fork s\u00e9par\u00e9 de GOLANG par CloudFlare et essayons de porter nos outils l\u00e0-bas. En principe, il y a une autre option, plus classique, mais en m\u00eame temps laborieuse - mettre en \u0153uvre le support de l'eSNI pour Python. Apr\u00e8s tout, Python utilise \u00e9galement OpenSSL pour fonctionner avec https. Mais nous laisserons cette option \u00e0 un autre d\u00e9veloppeur, et nous nous contenterons de la mise en \u0153uvre en golang, d'autant plus que notre cher Cobalt Strike sait parfaitement travailler avec un canal de communication construit par des moyens tiers (External C2 channel) - nous en parlerons \u00e0 la fin de l'article.<\/p>\n<h3>Try Harder\u2026<\/h3>\n<p>\nUn des outils r\u00e9alis\u00e9s en Go - notre d\u00e9veloppement pour le pivotement \u00e0 l'int\u00e9rieur du r\u00e9seau - un tunnel <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mis-team\/rsockstun\">rsockstun<\/a><\/noindex>, qui, soit dit en passant, est actuellement d\u00e9tect\u00e9 par les outils de Microsoft et Symantec comme un logiciel malveillant tr\u00e8s dangereux, visant \u00e0 perturber la stabilit\u00e9 mondiale\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/13d2635b92051416b2f33415783a2837.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIl serait formidable d'utiliser le d\u00e9veloppement pr\u00e9c\u00e9dent dans ce cas. Mais ici, une petite probl\u00e8me se pose. En effet, rsockstun suppose \u00e0 l'origine l'utilisation d'un canal SSL synchrone de communication avec le serveur. Cela signifie que la connexion est \u00e9tablie une fois et existe pendant toute la dur\u00e9e de fonctionnement du tunnel. Comme vous le comprenez, le protocole https n'est pas vraiment con\u00e7u pour ce mode de fonctionnement \u2013 il fonctionne en mode requ\u00eate-r\u00e9ponse, o\u00f9 chaque nouvelle requ\u00eate http existe dans le cadre d'une nouvelle connexion tcp.<\/p>\n<p>Le principal inconv\u00e9nient de ce sch\u00e9ma est que le serveur ne peut pas transmettre de donn\u00e9es au client tant que le client n'envoie pas une nouvelle requ\u00eate http. Mais heureusement, il existe de nombreuses solutions \u00e0 ce probl\u00e8me \u2013 la transmission en continu de donn\u00e9es via le protocole http (apr\u00e8s tout, nous parvenons \u00e0 regarder nos s\u00e9ries pr\u00e9f\u00e9r\u00e9es et \u00e0 \u00e9couter de la musique sur des portails fonctionnant sous https, et la transmission vid\u00e9o et audio n'est rien d'autre qu'une transmission de donn\u00e9es en continu). L'une des technologies permettant d'\u00e9muler le fonctionnement d'une connexion tcp compl\u00e8te au-dessus du protocole http est la technologie des web-sockets (WebSockets), dont l'essence r\u00e9side dans l'\u00e9tablissement d'une connexion r\u00e9seau compl\u00e8te entre le client et le serveur web.<\/p>\n<p>Par chance (hourra!!!), cette technologie est activ\u00e9e par d\u00e9faut dans tous les plans tarifaires de CloudFlare et fonctionne tr\u00e8s bien en combinaison avec eSNI. C'est pr\u00e9cis\u00e9ment celle-ci que nous allons utiliser pour enseigner \u00e0 notre tunnelier comment utiliser le domain fronting et se cacher des DPI modernes. <\/p>\n<h3>Quelques mots sur les WebSockets<\/h3>\n<p>\nTout d'abord, nous allons bri\u00e8vement et simplement expliquer ce qu'est un web-socket, afin que tout le monde ait une id\u00e9e de ce avec quoi nous allons travailler. <\/p>\n<p>La technologie des web-sockets permet de basculer temporairement d'une connexion http \u00e0 une transmission de donn\u00e9es standard via un socket r\u00e9seau, sans rompre la connexion tcp \u00e9tablie. Lorsque le client souhaite passer au web-socket, il d\u00e9finit plusieurs en-t\u00eates http dans sa requ\u00eate http. Deux en-t\u00eates obligatoires sont <i><b>Connection: Upgrade<\/b><\/i> et <i><b>Upgrade: websocket<\/b><\/i>. Il peut \u00e9galement sp\u00e9cifier de mani\u00e8re forc\u00e9e la version du protocole websocket (<i><b>Sec-Websockset-Version: 13<\/b><\/i>) et quelque chose comme un identifiant base64 de WebSocket (<i><b>Sec-WebSocket-Key: DAGDJSiREI3+KjDfwxm1FA==<\/b><\/i>). Le serveur r\u00e9pond par le code HTTP 101 Switching Protocols et en \u00e9tablissant \u00e9galement les en-t\u00eates <i><b>Connection, Upgrade<\/b><\/i> et <i><b>Sec-WebSocket-Accept<\/b><\/i>. Le processus de commutation est illustr\u00e9 sur l'image ci-dessous :<\/p>\n<p><img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/1ee9af28074e5e190daea9b4b4a4a524.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nApr\u00e8s cela, l'\u00e9tablissement de la connexion WebSocket peut \u00eatre consid\u00e9r\u00e9 comme termin\u00e9. Toutes les donn\u00e9es, qu'elles proviennent du client ou du serveur, seront d\u00e9sormais accompagn\u00e9es non pas d'en-t\u00eates HTTP, mais d'en-t\u00eates WebSocket (commen\u00e7ant par le byte 0x82). Le serveur n'a plus besoin d'attendre une demande du client pour transmettre des donn\u00e9es, car la connexion TCP ne se coupe pas.<\/p>\n<p>En Go, il existe plusieurs biblioth\u00e8ques pour travailler avec les WebSockets. Les plus populaires sont <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/gorilla\/websocket\">Gorilla WebSocket<\/a><\/noindex> et la standard <noindex><a rel=\"nofollow\" href=\"https:\/\/godoc.org\/golang.org\/x\/net\/websocket\">WebSocket<\/a><\/noindex>. Nous utiliserons la derni\u00e8re, car elle est plus simple, plus l\u00e9g\u00e8re et, dit-on, un peu plus rapide.<\/p>\n<p>Dans le code du client rsockstun, nous devons remplacer les appels \u00e0 net.dial ou tls.dial par les appels WebSocket correspondants :<\/p>\n<p><img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/e7ffc8aadeed32b8c456ef03cff4cdf8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/035b3190717482f6aaac22b06cd25bc9.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous voulons rendre la partie client de notre tunnel universelle et capable de fonctionner aussi bien via une connexion SSL directe que via le protocole WebSocket. Pour cela, nous cr\u00e9erons une fonction distincte <i><b>func connectForWsSocks(address string, proxy string) error {\u2026}<\/b><\/i> par analogie avec <i><b>connectForSocks()<\/b><\/i> et nous l'utiliserons pour travailler avec les WebSockets si l'adresse du serveur sp\u00e9cifi\u00e9e au lancement du client commence par ws: ou wss: (dans le cas de WebSocket s\u00e9curis\u00e9).<\/p>\n<p>Pour la partie serveur du tunnel, nous ferons \u00e9galement une fonction distincte pour travailler avec les WebSockets. Dans celle-ci, une instance de la classe http sera cr\u00e9\u00e9e et un gestionnaire de connexion http sera d\u00e9fini (la fonction wsHandler) : <\/p>\n<p><img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/ad904b629aa40bf45d42c095d4285658.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEt toute la logique de traitement de la connexion (authentification du client par mot de passe, \u00e9tablissement et terminaison de la session yamux) sera plac\u00e9e dans le gestionnaire de la connexion WebSocket :<\/p>\n<p><img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/a624dca4819cee4b9d46f1325aafc544.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous compilons le projet, d\u00e9marrons la partie serveur :<\/p>\n<pre><code class=\"go\">.\\\/rsockstun \u2013listen ws:127.0.0.1:8080 \u2013pass P@ssw0rd<\/code><\/pre>\n<p>\nEt ensuite la partie client :<\/p>\n<pre><code class=\"go\">.\\\/rsockstun -connect ws:127.0.0.1:8080 \u2013pass P@ssw0rd<\/code><\/pre>\n<p>\nEt nous v\u00e9rifions le fonctionnement sur l'h\u00f4te local :<\/p>\n<p><img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/34bb12087eb7dd72cf1f35d7addf2c72.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/83fc82e962961ba8491164d26f27be95.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Passons au domaine fronting<\/h3>\n<p>\nNous semblons avoir compris les WebSockets. Maintenant, passons directement \u00e0 eSNI et au domaine fronting. Comme mentionn\u00e9 pr\u00e9c\u00e9demment, pour travailler avec DoH et eSNI, nous devons prendre une branche sp\u00e9ciale de Go de la soci\u00e9t\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/cloudflare\/tls-tris\">CloudFlare<\/a><\/noindex>. Nous avons besoin d'une branche avec le support eSNI (pwu\/esni).<\/p>\n<p>Clonez-la localement ou t\u00e9l\u00e9chargez et d\u00e9zippez le zip correspondant :<\/p>\n<pre><code class=\"plaintext\">git clone -b pwu\/esni https:\/\/github.com\/cloudflare\/tls-tris.git<\/code><\/pre>\n<p>\nEnsuite, nous devons copier le r\u00e9pertoire GOROOT, remplacer les fichiers appropri\u00e9s de la branche clon\u00e9e et le d\u00e9finir comme principal. Pour soulager les d\u00e9veloppeurs de cette t\u00e2che p\u00e9nible, les gars de CloudFlare ont pr\u00e9par\u00e9 un script sp\u00e9cial \u2013 _dev\/go.sh. Il suffit de l'ex\u00e9cuter. Le script fera tout seul avec le makefile. Par curiosit\u00e9, vous pouvez jeter un \u0153il \u00e0 l'int\u00e9rieur du makefile pour plus de d\u00e9tails.<\/p>\n<p>Apr\u00e8s l'ex\u00e9cution du script, lors de la compilation du projet, nous devrons indiquer comme GOROOT le r\u00e9pertoire local pr\u00e9par\u00e9 par le script. Dans notre cas, cela ressemble \u00e0 :<\/p>\n<pre><code class=\"plaintext\">GOROOT=\"\/opt\/tls-tris\/_dev\/GOROOT\/linux_amd64\" go build \u2026.<\/code><\/pre>\n<p>\nEnsuite, nous devons impl\u00e9menter dans le tunnel la fonctionnalit\u00e9 de requ\u00eate et de parsing des cl\u00e9s eSNI publiques pour le domaine souhait\u00e9. Dans notre cas, ce seront les cl\u00e9s eSNI publiques des serveurs frontaux CloudFlare. Pour cela, nous allons cr\u00e9er trois fonctions :<\/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>\nLes noms des fonctions parlent d'eux-m\u00eames. Nous allons remplir cela \u00e0 partir du fichier esni_query.go, qui fait partie de tls-tris. La premi\u00e8re fonction cr\u00e9e un paquet r\u00e9seau avec une requ\u00eate vers le serveur DNS de CloudFlare, en utilisant le protocole DoH (DNS-over-HTTPS), la seconde analyse les r\u00e9sultats de la requ\u00eate et obtient les valeurs des cl\u00e9s publiques du domaine, et la troisi\u00e8me est un conteneur pour les deux premi\u00e8res.<\/p>\n<p>Ensuite, nous int\u00e9grons dans notre fonction nouvellement cr\u00e9\u00e9e pour la connexion WebSocket <i><b>connectForWsSocks<\/b><\/i> la fonctionnalit\u00e9 de requ\u00eate des cl\u00e9s eSNI pour le domaine. L\u00e0 o\u00f9 fonctionne la partie serveur, nous d\u00e9finissons les param\u00e8tres TLS et sp\u00e9cifions le nom du \u00ab domaine de couverture \u00bb fictif :<\/p>\n<p><img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/63abc51177058223e0f0941a78d182fa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIl convient de noter que, \u00e0 l'origine, la branche tls-tris n'est pas con\u00e7ue pour l'utilisation de domain fronting. Par cons\u00e9quent, aucune attention n'est accord\u00e9e au nom de serveur fictif (un champ vide serverName est transmis dans le paquet client-hello). Pour corriger cela, nous devrons ajouter dans la structure TlsConfig le champ correspondant FakeServerName. Nous ne pouvons pas utiliser le champ standard ServerName de la structure, car il est utilis\u00e9 par les m\u00e9canismes internes de tls et s'il diff\u00e8re de l'original, le tls-handshake \u00e9chouera avec une erreur. La description de la structure TlsConfig se trouve dans le fichier <b>tls\/common.go<\/b> \u2013 et nous devrons le corriger :<\/p>\n<p><img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/04f35bb49a5f6a28625de28b23d686f0.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/0caf5cfccb2ffffeae703ecfe3eb6652.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDe plus, nous devrons apporter des modifications au fichier <b>tls\/handshake_client.go<\/b>, pour utiliser notre champ FakeServerName lors de la formation du handshake TLS :<\/p>\n<p><img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/ac68f37f426603b2fcec467c6ee886ca.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nC'est tout ! Vous pouvez compiler le projet et v\u00e9rifier son fonctionnement. Mais avant de lancer le test, il est n\u00e9cessaire de configurer le compte CloudFlare. Comment dire, configurer \u2013 il suffit de cr\u00e9er un compte sur CloudFlare et de lier votre domaine \u00e0 celui-ci. Toutes les fonctionnalit\u00e9s li\u00e9es \u00e0 DoH, WebSocket et ESNI sont activ\u00e9es par d\u00e9faut dans CloudFlare. Apr\u00e8s que les enregistrements DNS aient \u00e9t\u00e9 mis \u00e0 jour, vous pouvez v\u00e9rifier le fonctionnement du domaine en ex\u00e9cutant une requ\u00eate pour les cl\u00e9s eSNI :<\/p>\n<pre><code class=\"plaintext\">dig +short txt _esni.df13tester.info <\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/09d07d1f49defc3551c3720d9b67569e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSi vous voyez quelque chose de similaire pour votre domaine, cela signifie que tout fonctionne et que vous pouvez passer aux tests.<\/p>\n<p>D\u00e9marrons un VPS Ubuntu, par exemple, sur DigitalOcean. P.S. Dans notre cas, l'adresse IP fournie par le fournisseur s'est retrouv\u00e9e sur des listes noires RKN. Donc, ne soyez pas surpris si vous vivez quelque chose de similaire. J'ai d\u00fb utiliser un VPN pour acc\u00e9der \u00e0 mon VPS.<\/p>\n<p>Nous copions rsockstun d\u00e9j\u00e0 compil\u00e9 sur le VPS (c'est d'ailleurs un autre atout de Golang \u2013 vous pouvez compiler le projet chez vous et le lancer sur n'importe quel Linux, en respectant simplement l'architecture du syst\u00e8me) et d\u00e9marrons la partie serveur :<\/p>\n<p><img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/f86be92203d646832205fb611fe4d056.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEt ensuite, la partie client :<\/p>\n<p><img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/c8852d7431e8bba7eab1494989ceb46d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nComme nous le voyons, le client s'est connect\u00e9 avec succ\u00e8s au serveur via le serveur frontal CloudFlare en utilisant WebSocket. Pour v\u00e9rifier que le tunnel fonctionne vraiment comme un tunnel, vous pouvez faire une requ\u00eate curl \u00e0 travers le proxy socks5 local ouvert sur le serveur :<\/p>\n<p><img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/87b6f42676e5e895b7f7b03da16420bb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVoyons maintenant ce que DPI voit dans le canal de communication :<\/p>\n<p><img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/d546b676904d5b8ded7e0891ff5a98e6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nD'abord, le tunnelier, en utilisant le m\u00e9canisme DoH, se connecte au serveur DNS de Cloudflare pour obtenir les cl\u00e9s eSNI pour le domaine cible (paquets n\u00b01-19), puis il se connecte au serveur frontal et \u00e9tablit une connexion TLS, se cachant ainsi derri\u00e8re le domaine <noindex><a rel=\"nofollow\" href=\"http:\/\/www.google.com\">www.google.com<\/a><\/noindex> (c'est la valeur par d\u00e9faut lorsque le domaine factice n'est pas sp\u00e9cifi\u00e9 lors du lancement du client). Pour indiquer votre propre domaine factice, vous devez utiliser le param\u00e8tre -frontDomain :<\/p>\n<p><img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/3f55e03eecd7436b1e9c2312d88b46af.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/da5e219fb5a097e6ad6d75844d7a5687.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMaintenant, un autre point. Par d\u00e9faut, les param\u00e8tres du compte sur CloudFlare sont r\u00e9gl\u00e9s sur le mode SSL Flexible. Cela signifie que les requ\u00eates https aux serveurs frontaux Cloudflare des clients seront redirig\u00e9es vers notre serveur sous forme non chiffr\u00e9e (http). C'est pourquoi nous avons d\u00e9marr\u00e9 la partie serveur du tunnel en mode non-ssl ( -listen ws:0.0.0.0), et non ( -listen wss:0.0.0.0).<\/p>\n<p><img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/17f820b973f8a3f26f78a30c10bdb493.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPour passer en mode de chiffrement complet, vous devez choisir <b>Complet<\/b>, ou <b>Complet (strict)<\/b> en cas de pr\u00e9sence d'un certificat valide sur le serveur. Apr\u00e8s le changement de mode, nous pourrons accepter des connexions de CloudFlare via le protocole https. N'oubliez pas de g\u00e9n\u00e9rer un certificat auto-sign\u00e9 pour la partie serveur du tunnel.<\/p>\n<p><img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/c9a05134c9ba01e6008b4432cf59c74e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUn lecteur curieux demandera : \u00ab Et pour le client sous Windows ? Apr\u00e8s tout, l'utilisation principale du tunnel est de mettre en place un back-connect avec des machines et serveurs d'entreprise, o\u00f9 il y a g\u00e9n\u00e9ralement du Windows. Comment puis-je compiler le tunnel pour Windows, avec une pile TLS sp\u00e9cifique ? \u00bb Maintenant, imaginons une autre caract\u00e9ristique qui montre \u00e0 quel point Golang est pratique. Nous allons compiler pour Windows directement depuis Kali, simplement en ajoutant le param\u00e8tre 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>\nOu la version 32 bits :<\/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>\nC'est tout ! Et plus aucun tracas n'est n\u00e9cessaire. Cela fonctionne r\u00e9ellement ! <\/p>\n<p><img decoding=\"async\" alt=\"Domain Fronting sur la base de TLS 1.3. Partie 2\" src=\"\/wp-content\/uploads\/2019\/11\/2c60d41c115b8df32a8b53b06a45e915.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLes flags de compilation \u2013w et \u2013s sont n\u00e9cessaires pour enlever les donn\u00e9es inutiles du fichier ex\u00e9cutable, le rendant plus l\u00e9ger de quelques m\u00e9gaoctets. De plus, il peut \u00eatre empaquet\u00e9 avec UPX, pour r\u00e9duire encore davantage sa taille.<\/p>\n<h3>En conclusion<\/h3>\n<p>\nDans cet article, nous avons illustr\u00e9, \u00e0 travers un exemple de tunnel \u00e9crit en Golang, l'application d'une nouvelle technologie de fronting de domaine, r\u00e9alis\u00e9e sur une caract\u00e9ristique assez int\u00e9ressante du protocole TLS 1.3. De mani\u00e8re similaire, il est possible d'adapter des outils existants \u00e9crits en Golang pour fonctionner via les serveurs CloudFlare, par exemple <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Ne0nd0g\/merlin\">Merlin<\/a><\/noindex> \u2014 un C2 bien connu, ou de forcer CobaltStrike Beacon \u00e0 utiliser le fronting de domaine eSNI lors de l'interaction avec le Teamserver via <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ryhanson\/ExternalC2\">External C2 Channel<\/a><\/noindex>, r\u00e9alis\u00e9 en Golang, ou sur une version standard en C++ en utilisant une version patch\u00e9e d'OpenSSL, dont nous avons parl\u00e9 dans la premi\u00e8re partie de l'article. En g\u00e9n\u00e9ral, l'imagination n'a pas de limites.<\/p>\n<p>L'exemple du tunnel et de CloudFlare est pr\u00e9sent\u00e9 sous forme de concept et il est encore difficile de dire quelles seront les perspectives futures de ce type de fronting de domaine. Actuellement, le support de l'eSNI n'est activ\u00e9 que sur CloudFlare et, a priori, rien ne les emp\u00eache de d\u00e9sactiver ce type de fronting et, par exemple, de rompre les connexions tls en cas de non-correspondance entre SNI et eSNI. En r\u00e9sum\u00e9, l'avenir le dira. Mais pour l'instant, la perspective de travailler sous \"couvercle kremlin.ru\" semble plut\u00f4t s\u00e9duisante. N'est-ce pas ?<\/p>\n<p>Le code mis \u00e0 jour du tunnel ainsi que les fichiers ex\u00e9cutables exe compil\u00e9s sont plac\u00e9s dans une branche distincte du projet sur <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mis-team\/rsockstun\">github<\/a><\/noindex>. Pour toute probl\u00e8me potentiel li\u00e9 au tunnel, il est pr\u00e9f\u00e9rable de soumettre un probl\u00e8me sur la page du projet sur GitHub.<br \/>\n<br \/>Source : <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 - 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\/fr\/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\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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 Fronting de domaine bas\u00e9 sur TLS 1.3. Partie 2 | ProHoster","description":"Introduction Dans la premi\u00e8re partie de l'article, nous avons bri\u00e8vement d\u00e9crit le m\u00e9canisme de l'eSNI (SNI encrypt\u00e9).","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/domen-fronting-na-baze-tls-1-3-chast-2","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/53317","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=53317"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/53317\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=53317"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=53317"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=53317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}