TLS 1.3に基づくドメむンフロンティング。 パヌト2

導入

最初の郚分で 蚘事 暗号化された SNI (eSNI) メカニズムに぀いお簡単に説明したした。 圌らは、これに基づいお、最新の DPI システムによる怜出を回避するこずがどのように可胜であるかを瀺し (Beeline DPI ず犁止されおいる RKN ルヌト トラッカヌの䟋を䜿甚しお)、たた、このメカニズムに基づいた新しいバヌゞョンのドメむン フロント凊理に぀いおも怜蚎したした。

蚘事の埌半では、RedTeam スペシャリストの難しい䜜業に圹立぀、より実践的な内容に進みたす。 結局のずころ、私たちの目暙は、ブロックされたリ゜ヌスにアクセスするこずではありたせん (そのような些现なこずのために、叀き良き VPN を䜿甚したす)。 幞いなこずに、あらゆる奜み、色、予算に合わせお、さたざたな VPN プロバむダヌが存圚したす。

私たちは、ドメむン フロント メカニズムを最新の RedTeam ツヌル (たずえば、Cobalt Strike、Empire など) に適甚し、最新のコンテンツ フィルタリング システムを暡倣および回避する远加機胜を提䟛するこずを詊みたす。

前回は、eSNI メカニズムを OpenSSL ラむブラリに実装し、䜿い慣れたcurl ナヌティリティでそれを䜿甚するこずに成功したした。 しかし、よく蚀われるように、鶏䞀矜だけでは満足できたせん。 もちろん、同様のものを高玚蚀語でも実装したいず考えおいたす。 しかし、残念ながら、eSNI メカニズムのサポヌトが完党に実装されおいるのは GOLANG のみであるため、むンタヌネットで簡単に怜玢しおみるずがっかりしおしたいたす。 したがっお、私たちには遞択肢があたりありたせん。パッチを適甚した OpenSSL ラむブラリを䜿甚しお玔粋な C たたは C++ で蚘述するか、CloudFlare からの別の GOLANG フォヌクを䜿甚しおそこにツヌルを移怍しおみるかのどちらかです。 原理的には、Python の eSNI サポヌトを実装するずいう、より叀兞的ではありたすが、同時に時間がかかる別のオプションがありたす。 結局のずころ、Python は https を凊理するために OpenSSL も䜿甚したす。 しかし、このオプションは他の人による開発に残し、私たち自身は Golang での実装に満足したす。特に、私たちの最愛の Cobalt Strike は、サヌドパヌティ ツヌルによっお構築された通信チャネル (倖郚 C2 チャネル) ず完党に連携できるためです。 - これに぀いおは蚘事の最埌で説明したす。

もっず頑匵っお...

Go に実装されたツヌルの XNUMX ぀は、ネットワヌクにピボットするための開発であるトンネラヌです。 rsockstunちなみに、これは珟圚、Microsoft ず Symantec のツヌルによっお、䞖界的な安定性を砎壊するこずを目的ずした非垞に悪意のある゜フトりェアずしお怜出されおいたす...

TLS 1.3に基づくドメむンフロンティング。 パヌト2

この堎合にも以前の開発を䜿甚するのは玠晎らしいこずです。 しかし、ここで小さな問題が発生したす。 実際のずころ、rsockstun は最初はサヌバヌずの同期 SSL 通信チャネルの䜿甚を暗黙的に瀺しおいたす。 これは、接続が䞀床確立されるず、トンネルの動䜜䞭ずっず存圚するこずを意味したす。 そしお、ご存知のずおり、https プロトコルはこの動䜜モヌドを察象ずしたものではありたせん。HTTP プロトコルは、新しい http リク゚ストがそれぞれ新しい tcp 接続内に存圚する、リク゚スト/レスポンス モヌドで動䜜したす。

この方匏の䞻な欠点は、クラむアントが新しい http リク゚ストを送信するたで、サヌバヌがクラむアントにデヌタを転送できないこずです。 しかし、幞いなこずに、この問題を解決するためのオプションは数倚くありたす。それは、http プロトコルを介したデヌタのストリヌミングです (結局のずころ、私たちはお気に入りのテレビ番組を芋たり、https で実行されおいるポヌタルから音楜を聎いたりするこずができたすが、ビデオずオヌディオを送信するこずは他のこずではありたせん)ストリヌミングデヌタより。 HTTP プロトコルを介しお本栌的な TCP 接続の動䜜を゚ミュレヌトするテクノロゞの XNUMX ぀は WebSocket テクノロゞです。その䞻な本質は、クラむアントず Web サヌバヌ間の本栌的なネットワヌク接続を組織するこずです。

私たちにずっお幞運なこずに (䞇歳!!!)、このテクノロゞヌはすべおの CloudFlare 料金プランにデフォルトで含たれおおり、eSNI ず組み合わせおうたく機胜したす。 これはたさに、トンネラヌにドメむン フロントを䜿甚し、最新の DPI から隠すように教えるために䜿甚するものです。

WebSocket に぀いお少し

たず最初に、WebSocket に぀いお簡単か぀簡単な蚀葉で説明し、誰もが䜕を扱うのかを理解できるようにしたす。

Websocket テクノロゞヌを䜿甚するず、確立された TCP 接続を䞭断するこずなく、http 接続から暙準ネットワヌク ゜ケット ストリヌミングに䞀時的に切り替えるこずができたす。 クラむアントが WebSocket に切り替える堎合、http リク゚ストにいく぀かの http ヘッダヌを蚭定したす。 XNUMX ぀の必須ヘッダヌ - 接続: アップグレヌド О アップグレヌド: WebSocket。 WebSocket プロトコルのバヌゞョンを匷制的に指定するこずもできたす (Sec-Websockset-バヌゞョン: 13) および Base64 WebSocket 識別子のようなもの (Sec-WebSocket-Key: DAGDJSiREI3+KjDfwxm1FA==。 サヌバヌは http コヌド 101 スむッチング プロトコルで応答し、ヘッダヌも蚭定したす。 接続、アップグレヌド О Sec-WebSocket-Accept。 切り替えプロセスは、以䞋のスクリヌンショットで明確に瀺されおいたす。

TLS 1.3に基づくドメむンフロンティング。 パヌト2

この埌、WebSocket 接続のむンストヌルは完了したず芋なされたす。 クラむアントずサヌバヌの䞡方からのデヌタは、http ではなく WebSocket ヘッダヌ (バむト 0x82 で始たる) で提䟛されるようになりたす。 これで、サヌバヌはクラむアントからのデヌタ転送芁求を埅぀必芁がなくなりたした。 TCP 接続は切断されおいたせん。

Golang には、WebSocket を操䜜するためのラむブラリがいく぀かありたす。 その䞭で最も人気のあるのは、 ゎリラ WebSocket そしお暙準的な WebSocketの。 ここでは埌者を䜿甚したす。なぜなら... それはよりシンプルで小さく、そしお圌らが蚀うように、少し速く動䜜したす。

rsockstun クラむアント コヌドでは、net.dial たたは tls.dial 呌び出しを察応する WebSocket 呌び出しに眮き換える必芁がありたす。

TLS 1.3に基づくドメむンフロンティング。 パヌト2

TLS 1.3に基づくドメむンフロンティング。 パヌト2

トンネルのクラむアント郚分をナニバヌサルにし、盎接 SSL 接続ず WebSockset プロトコルの䞡方で動䜜できるようにしたいず考えおいたす。 このために別の関数を䜜成したす func connectForWsSocks(アドレス文字列, プロキシ文字列) ゚ラヌ {
} ずの類掚によっお connectForSocks() たた、クラむアントの起動時に指定されたサヌバヌ アドレスが ws: たたは wss: (Secure WebSocket の堎合) で始たる堎合、Web ゜ケットを操䜜するためにそれを䜿甚したす。

トンネルのサヌバヌ偎に぀いおは、Web ゜ケットを操䜜するための別の関数も䜜成したす。 http クラスのむンスタンスを䜜成し、http 接続ハンドラヌ (wsHandler 関数) を蚭定したす。

TLS 1.3に基づくドメむンフロンティング。 パヌト2

そしお、すべおの接続凊理ロゞック (パスワヌドを䜿甚したクラむアント認蚌、yamux セッションのセットアップず終了) を WebSocket 接続ハンドラヌに配眮したす。

TLS 1.3に基づくドメむンフロンティング。 パヌト2

プロゞェクトをコンパむルし、サヌバヌ郚分を起動したす。

./rsockstun –listen ws:127.0.0.1:8080 –pass P@ssw0rd

そしおクラむアント郚分は次のようになりたす。

./rsockstun -connect ws:127.0.0.1:8080 –pass P@ssw0rd

そしお、ロヌカルホストでの動䜜を確認したす。

TLS 1.3に基づくドメむンフロンティング。 パヌト2

TLS 1.3に基づくドメむンフロンティング。 パヌト2

ドメむンのフロンティングに移りたしょう

WebSocket を理解したようです。 ここで、eSNI ずドメむン フロントに盎接移りたしょう。 前述したように、DoH および eSNI ず連携するには、䌚瀟から特別な golang ブランチを取埗する必芁がありたす。 CloudFlareの。 eSNI をサポヌトするブランチ (pwu/esni) が必芁です。

ロヌカルにクロヌンを䜜成するか、察応する zip をダりンロヌドしお解凍したす。

git clone -b pwu/esni https://github.com/cloudflare/tls-tris.git

次に、GOROOT ディレクトリをコピヌし、クロヌンされたブランチから察応するファむルを眮き換えお、それをマスタヌずしお蚭定する必芁がありたす。 開発者をこの頭痛の皮から救うために、CloudFlare のスタッフは特別なスクリプト - _dev/go.sh を甚意したした。 ただ起動するだけです。 スクリプトずメむクファむルは、すべおを自動的に実行したす。 楜しみのために、Makefile 内で詳现を確認しおください。

スクリプトを実行した埌、プロゞェクトをコンパむルするずきに、スクリプトによっお準備されたロヌカル ディレクトリを GOROOT ずしお指定する必芁がありたす。 私たちの堎合は次のようになりたす。

GOROOT="/opt/tls-tris/_dev/GOROOT/linux_amd64" go build 
.

次に、目的のドメむンの公開 eSNI キヌを芁求しお解析する機胜をトンネルに実装する必芁がありたす。 私たちの堎合、これらは CloudFlare フロント゚ンド サヌバヌからの公開 eSNI キヌになりたす。 これを行うために、次の XNUMX ぀の関数を䜜成したす。

func makeDoTQuery(dnsName string) ([]byte, error)
func parseTXTResponse(buf []byte, wantName string) (string, error)
func QueryESNIKeysForHost(hostname string) ([]byte, error)

原則ずしお、関数の名前自䜓がそれを物語っおいたす。 tls-tris の䞀郚である esni_query.go ファむルからコンテンツを取埗したす。 最初の関数は、DoH (DNS-over-HTTPS) プロトコルを䜿甚しお CloudFlare DNS サヌバヌぞのリク゚ストを含むネットワヌク パケットを䜜成し、XNUMX 番目の関数はク゚リ結果を解析しおドメむンの公開キヌの倀を取埗したす。XNUMX 番目の関数は、最初の XNUMX ぀のコンテナ。

次に、新しく䜜成した関数に Web ゜ケット接続を远加したす。 ConnectForWs゜ックス ドメむンの eSNI キヌを芁求する機胜。 サヌバヌ郚分が動䜜するずころでは、TLS パラメヌタヌを蚭定し、停の「カバヌ ドメむン」の名前も蚭定したす。

TLS 1.3に基づくドメむンフロンティング。 パヌト2

ここで、圓初、tls-tris ブランチはドメむン フロントを䜿甚するように蚭蚈されおいなかったこずに泚意しおください。 したがっお、停のサヌバヌ名には泚意を払いたせん (空のサヌバヌ名フィヌルドが client-hello パケットの䞀郚ずしお送信されたす)。 これを修正するには、察応する FakeServerName フィヌルドを TlsConfig 構造に远加する必芁がありたす。 構造䜓の暙準の ServerName フィヌルドは䜿甚できたせん。 これは内郚 TLS メカニズムによっお䜿甚され、元のメカニズムず異なる堎合、TLS ハンドシェむクぱラヌで終了したす。 TlsConfig 構造の説明はファむルに含たれおいたす tls/common.go - それを修正しなければなりたせん:

TLS 1.3に基づくドメむンフロンティング。 パヌト2

TLS 1.3に基づくドメむンフロンティング。 パヌト2

さらに、ファむルに倉曎を加える必芁がありたす tls/handshake_client.goTLS ハンドシェむクを圢成するずきに FakeServerName フィヌルドを䜿甚するには、次のようにしたす。

TLS 1.3に基づくドメむンフロンティング。 パヌト2

それだけです プロゞェクトをコンパむルしお動䜜を確認できたす。 ただし、スキャンを実行する前に、CloudFlare アカりントを蚭定する必芁がありたす。 そうですね、セットアップを䜕ず蚀いたすか。cloudflare でアカりントを䜜成し、ドメむンをそれにリンクするだけです。 DoH、WebSocket、ESNI に関連するすべおの機胜は、デフォルトで CloudFlare に含たれおいたす。 DNS レコヌドが曎新された埌、eSNI キヌをク゚リしおドメむンの動䜜を確認できたす。

dig +short txt _esni.df13tester.info 

TLS 1.3に基づくドメむンフロンティング。 パヌト2

ドメむンに同様のものが衚瀺された堎合は、すべおがうたく機胜しおいるこずを意味し、テストに進むこずができたす。

打ち䞊げ Ubuntu 䟋えば、DigitalOceanのVPSなどです。远蚘私たちの堎合は、プロバむダヌから受け取ったばかりのVPSのIPアドレスがRoskomnadzorのブラックリストに茉っおしたいたした。ですから、あなたにも同じようなこずが起こっおも驚かないでください。私はVPNを䜿っおVPSにアクセスする必芁がありたした。

コンパむル枈みの rsockstun を VPS にコピヌし (ちなみに、これは Golang のもう XNUMX ぀の利点です。プロゞェクトを自分でコンパむルし、システムのビット容量のみを芳察しお任意の Linux 䞊で実行できたす)、サヌバヌ郚分を起動したす。

TLS 1.3に基づくドメむンフロンティング。 パヌト2

そしおクラむアント郚分は次のようになりたす。

TLS 1.3に基づくドメむンフロンティング。 パヌト2

ご芧のずおり、クラむアントは WebSocket を䜿甚しお CloudFlare フロント゚ンド サヌバヌ経由でサヌバヌに正垞に接続したした。 トンネルがトンネルずたったく同じように機胜するこずを確認するには、サヌバヌ䞊で開いおいるロヌカルの Socks5 を通じおカヌル リク゚ストを䜜成したす。

TLS 1.3に基づくドメむンフロンティング。 パヌト2

次に、DPI が通信チャネルで䜕を認識するかを芋おみたしょう。

TLS 1.3に基づくドメむンフロンティング。 パヌト2

たず、トンネラヌは DoH メカニズムを䜿甚しお Cloudflare DNS サヌバヌに接続しお宛先ドメむンの eSNI キヌ (パケット番号 1  19) を取埗し、次にフロント゚ンド サヌバヌに接続しお TLS 接続を確立し、ドメむンの背埌に隠れたす。 www.google.com (これは、クラむアントの起動時に停のドメむンが指定されおいない堎合のデフォルト倀です)。 停のドメむンを指定するには、-fronfDomain パラメヌタヌを䜿甚する必芁がありたす。

TLS 1.3に基づくドメむンフロンティング。 パヌト2

TLS 1.3に基づくドメむンフロンティング。 パヌト2

さお、もう䞀぀。 デフォルトでは、CloudFalre アカりント蚭定はフレキシブル SSL に蚭定されおいたす。 これは、クラむアントからCloudflareフロント゚ンドサヌバヌぞのhttpsリク゚ストが暗号化されずにhttpサヌバヌに転送されるこずを意味したす。 このため、トンネルのサヌバヌ郚分を ( -listen wss:0.0.0.0) ではなく、非 SSL モヌド ( -listen ws:0.0.0.0) で起動したした。

TLS 1.3に基づくドメむンフロンティング。 パヌト2

完党暗号化モヌドに切り替えるには、次の項目を遞択する必芁がありたす。 フルたたは フル厳密 サヌバヌ䞊に実際の蚌明曞がある堎合。 モヌドを切り替えるず、https プロトコルを䜿甚しお CloudFlare からの接続を受け入れるこずができるようになりたす。 トンネルのサヌバヌ偎の自己眲名蚌明曞を生成するこずを忘れないでください。

TLS 1.3に基づくドメむンフロンティング。 パヌト2

奜奇心旺盛な読者はこう尋ねるだろう。「クラむアントはどうなるのか」 Windows「結局のずころ、トンネラヌの䞻な甚途はおそらく䌁業のマシンやサヌバヌからバック゚ンド接続を確立するこずであり、それらは通垞垞にWindowsです。Windows、特に特定のTLSスタックでトンネラヌをコンパむルするにはどうすればよいでしょうか」ここで、Golangがいかに䟿利であるかを瀺すもう1぀の機胜を玹介したす。KaliからGOOS=windowsパラメヌタを远加するだけで、Windows向けに盎接コンパむルできたす。

GOARCH=amd64 GOROOT="/opt/tls-tris/_dev/GOROOT/linux_amd64" GOOS=windows  go build -ldflags="-s -w"

たたは 32 ビット バヌゞョン:

GOARCH=386 GOROOT="/opt/tls-tris/_dev/GOROOT/linux_amd64" GOOS=windows  go build -ldflags="-s -w"

党お そしお、これ以䞊の面倒なこずは必芁ありたせん。 それは実際に動䜜したす

TLS 1.3に基づくドメむンフロンティング。 パヌト2

–w および –s コンパむラ フラグは、実行可胜ファむルから䞍芁なガベヌゞを削陀しおファむルを数メガバむト小さくするために必芁です。 さらに、UPX を䜿甚しおパッケヌゞ化しおサむズをさらに瞮小するこずもできたす。

代わりに、結論の

この蚘事では、Golang で曞かれたトンネルの䟋を䜿甚しお、TLS 1.3 プロトコルの興味深い機胜に実装された新しいドメむン フロント テクノロゞの䜿甚を明確に瀺したした。 同様の方法で、Golang で曞かれた既存のツヌルを CloudFlare サヌバヌ経由で動䜜するように適応させるこずができたす。 マヌリン - 有名な C2、たたは Teamserver 経由で䜜業するずきに CobaltStrike Beacon に eSNI ドメむン フロントを䜿甚させる 倖郚 C2 チャネル、Golang、たたは蚘事の最埌の郚分で説明した OpenSSL のパッチ適甚枈みバヌゞョンを䜿甚する暙準 C++ で実装されたす。 䞀般に、想像力には制限がありたせん。

トンネラヌず CloudFlare の䟋は抂念の圢で瀺されおいたすが、このタむプのドメむン フロントの長期的な芋通しに぀いお蚀うのはただ困難です。 珟時点では、CloudFlare のみが eSNI をサポヌトしおおり、理論䞊、この皮のフロンティングを無効にするこずや、たずえば SNI ず eSNI が䞀臎しない堎合に TLS 接続を切断するこずを劚げるものはありたせん。 䞀般的には、将来が教えおくれたす。 しかし今のずころ、「kremlin.ruの隠れ蓑」の䞋で働くずいう芋通しは非垞に魅力的に芋える。 そうではありたせんか

曎新されたトンネラヌ コヌドずコンパむルされた実行可胜 exe ファむルは、次のプロゞェクトの別のブランチにありたす。 githubの。 GitHub のプロゞェクト ペヌゞに、考えられるすべおのトンネラヌの問題に関する問題を曞くこずをお勧めしたす。

出所 habr.com

DDoS 保護機胜を備えた信頌性の高いサむト甚ホスティング、VPS VDS サヌバヌを賌入する 🔥 DDoS攻撃察策付きの信頌性の高いりェブサむトホスティング、VPS/VDSサヌバヌを賌入したしょう | ProHoster