perkenalan
Dina bagian kahiji Kami parantos masihan pedaran ringkes mékanisme SNI (eSNI) énkripsi. Aranjeunna nunjukkeun kumaha, dumasar kana éta, mungkin pikeun ngahindarkeun deteksi ku sistem DPI modéren (ngagunakeun conto Beeline DPI sareng tracker akar RKN anu dilarang), sareng ogé ngajalajah versi anyar domain fronting dumasar kana mékanisme ieu.
Dina bagian kadua tulisan, urang bakal ngaléngkah ka hal-hal anu langkung praktis anu bakal mangpaat pikeun spesialis RedTeam dina padamelan susahna. Tungtungna, tujuan urang henteu kéngingkeun aksés kana sumber anu diblokir (pikeun hal-hal sepele sapertos urang gaduh VPN lami anu saé). Untungna, aya rupa-rupa panyadia VPN, sakumaha aranjeunna nyarios, pikeun unggal rasa, warna sareng anggaran.
Urang bakal coba nerapkeun mékanisme domain-fronting kana parabot RedTeam modern, contona, kayaning Cobalt Strike, Kakaisaran, jeung sajabana, sarta masihan aranjeunna kamampuhan tambahan pikeun meniru sarta ngahindarkeun sistem nyaring eusi modern.
Panungtungan waktu urang nerapkeun mékanisme eSNI kana perpustakaan OpenSSL tur hasil dipaké dina utilitas curl akrab. Tapi, sabab nyebutkeun, anjeun moal wareg ku ngan hiji hayam. Tangtosna, abdi hoyong nerapkeun hal anu sami dina basa tingkat luhur. Tapi, hanjakalna, pilarian gancang sakuliah Internet nguciwakeun urang, sabab rojongan pikeun mékanisme eSNI pinuh dilaksanakeun ngan di GOLANG. Ku kituna, urang teu boga loba pilihan: boh urang nulis dina C murni atawa C ++ ngagunakeun perpustakaan OpenSSL patched, atawa urang ngagunakeun garpu GOLANG misah ti CloudFlare jeung nyoba port alat urang dinya. Sacara prinsip, aya pilihan sejen, leuwih klasik, tapi dina waktos anu sareng waktos-consuming - pikeun nerapkeun rojongan eSNI pikeun Python. Barina ogé, Python ogé ngagunakeun OpenSSL pikeun nanganan HTTPS. Tapi urang bakal ngantunkeun pilihan ieu pikeun pangwangunan ku batur, sareng urang sorangan bakal sugema ku palaksanaan di Golang, khususna saprak kobalt Strike tercinta urang sampurna tiasa damel sareng saluran komunikasi anu diwangun ku alat pihak katilu (saluran C2 éksternal). - urang bakal ngobrol ngeunaan ieu di ahir artikel.
Coba langkung keras...
Salah sahiji alat anu dilaksanakeun dina Go nyaéta pamekaran urang pikeun pivoting kana jaringan - tunneler , nu, ku jalan kitu, ayeuna dideteksi ku parabot ti Microsoft sarta Symantec salaku software jahat pisan aimed di disrupting stabilitas global ...

Éta hadé pikeun ngagunakeun pamekaran saméméhna dina hal ieu ogé. Tapi di dieu timbul masalah leutik. Kanyataanna nyaéta mimitina rsockstun nunjukkeun panggunaan saluran komunikasi SSL sinkron sareng server. Ieu ngandung harti yén sambungan dijieun sakali tur aya pikeun sakabéh durasi operasi torowongan urang. Sareng, anjeun ngartos, protokol HTTPS henteu dimaksudkeun pikeun modeu operasi ieu - éta tiasa dianggo dina modeu pamundut-réspon, dimana unggal pamundut http énggal aya dina sambungan tcp énggal.
The disadvantage utama skéma ieu nu server teu bisa mindahkeun data ka klien nu dugi klien ngirimkeun pamundut http anyar. Tapi, untungna, aya loba pilihan pikeun ngarengsekeun masalah ieu - ngalirkeun data ngaliwatan protokol http (sanggeus kabeh, urang kumaha bae ngatur pikeun lalajo acara TV favorit urang jeung ngadéngékeun musik tina portals ngajalankeun on https, tapi ngirimkeun video jeung audio nanaon sejenna. tinimbang ngalirkeun data). Salah sahiji téknologi pikeun niru operasi sambungan TCP anu lengkep dina protokol HTTP nyaéta téknologi WebSockets, hakekatna nyaéta pikeun ngatur sambungan jaringan anu lengkep antara klien sareng server Wéb.
Kabeneran keur urang (hooray!!!), téhnologi ieu kaasup sacara standar dina sakabéh rencana tarif CloudFlare sarta gawéna hébat dina kombinasi kalayan eSNI. Ieu persis naon anu bakal urang pake pikeun ngajarkeun tunneler urang ngagunakeun domain-fronting tur nyumputkeun tina DPIs modern.
A saeutik ngeunaan WebSockets
Anu mimiti, urang bakal sakeudeung sareng ku kecap-kecap anu sederhana nyarioskeun ngeunaan websockets supados sadayana gaduh ide ngeunaan naon anu bakal urang garap.
Téknologi Websocket ngamungkinkeun anjeun pikeun samentawis ngalih tina sambungan http kana streaming stop kontak jaringan standar tanpa megatkeun sambungan TCP anu geus ditetepkeun. Lamun klien hayang pindah ka websocket a, éta susunan sababaraha headers http dina pamundut http na. Dua header diperlukeun - Sambungan: Ngaronjatkeun и Ningkatkeun: websocket. Anjeunna ogé tiasa sacara paksa nangtukeun versi protokol websocket (Sec-Websockset-Vérsi: 13) jeung hal kawas base64 websocket identifier (Sec-WebSocket-Key: DAGDJSiREI3+KjDfwxm1FA==). Server ngabales anjeunna nganggo kode http 101 Switching Protocols sareng ogé nyetél header Sambungan, Ngaronjatkeun и Sec-WebSocket-Nampa. Prosés switching jelas nunjukkeun dina screenshot handap:

Saatos ieu, pamasangan sambungan WebSocket tiasa dianggap lengkep. Sakur data ti klien sareng server ayeuna bakal disayogikeun sanés nganggo http, tapi nganggo header WebSocket (aranjeunna mimitian ku bait 0x82). Ayeuna server teu kudu ngadagoan pamundut ti klien pikeun mindahkeun data, sabab Sambungan tcp henteu pegat.
Golang boga sababaraha perpustakaan pikeun gawé bareng websockets. Nu pang populerna di antarana nyaéta jeung standar . Urang bakal nganggo anu terakhir, sabab ... éta basajan, leuwih leutik sarta, sabab nyebutkeun, gawéna saeutik gancang.
Dina kode klien rsockstun, urang kedah ngagentos telepon net.dial atanapi tls.dial sareng telepon WebSocket anu saluyu:


Kami hoyong ngajantenkeun klien bagian tina torowongan urang universal sareng tiasa damel duanana ngalangkungan sambungan SSL langsung sareng ngalangkungan protokol WebSockset. Keur kitu urang bakal nyieun hiji fungsi misah func connectForWsSocks(alamat string, proxy string) kasalahan {…} ku analogi jeung connectForSocks() sarta kami bakal make eta pikeun gawé kalawan sockets web lamun alamat server dieusian nalika ngamimitian klien nu dimimitian ku ws: atanapi wss: (dina kasus Secure WebSocket).
Pikeun sisi server torowongan, urang ogé bakal nyieun fungsi misah pikeun gawé bareng sockets web. Éta bakal nyiptakeun conto kelas http sareng nyetél panangan sambungan http (fungsi wsHandler):

Sareng kami bakal nempatkeun sadaya logika pamrosésan sambungan (otorisasi klien nganggo kecap konci, nyetél sareng ngeureunkeun sési yamux) dina panangan sambungan WebSocket:

Kami nyusun proyék sareng ngaluncurkeun bagian server:
./rsockstun –listen ws:127.0.0.1:8080 –pass P@ssw0rdLajeng bagian klien:
./rsockstun -connect ws:127.0.0.1:8080 –pass P@ssw0rdSarta kami pariksa karya dina host lokal:


Hayu urang ngaléngkah ka domain fronting
Urang sigana geus ilahar kaluar websockets. Ayeuna hayu urang ngalih langsung ka eSNI sareng domain fronting. Sakumaha anu disebatkeun sateuacana, pikeun damel sareng DoH sareng eSNI urang kedah nyandak cabang golang khusus ti perusahaan . Urang peryogi cabang kalayan dukungan eSNI (pwu/esni).
Urang clone sacara lokal atanapi unduh sareng uncompress pos anu aya:
git clone -b pwu/esni https://github.com/cloudflare/tls-tris.gitTeras we kedah nyalin diréktori GOROOT, ngagentos file anu saluyu tina cabang anu diklon sareng nyetélna salaku master. Pikeun nyalametkeun pamekar ti nyeri sirah ieu, guys ti CloudFlare geus nyiapkeun naskah husus - _dev/go.sh. Urang ngan ngajalankeun eta. Skrip sareng makefile bakal ngalakukeun sadayana nyalira. Ngan pikeun senang, anjeun tiasa ningali jero makefile pikeun detil.
Saatos ngajalankeun skrip, nalika nyusun proyék, urang kedah netepkeun diréktori lokal anu disiapkeun ku naskah salaku GOROOT. Dina kasus urang, éta kasampak kawas kieu:
GOROOT="/opt/tls-tris/_dev/GOROOT/linux_amd64" go build ….Salajengna, urang kedah nerapkeun dina torowongan pungsionalitas requesting na parsing konci eSNI publik pikeun domain nu dipikahoyong. Dina kasus urang, ieu bakal janten konci eSNI umum tina server frontend CloudFlare. Jang ngalampahkeun ieu, urang bakal nyieun tilu fungsi:
func makeDoTQuery(dnsName string) ([]byte, error)
func parseTXTResponse(buf []byte, wantName string) (string, error)
func QueryESNIKeysForHost(hostname string) ([]byte, error)Ngaran fungsi, prinsipna mah, nyarita keur diri. Kami bakal nyandak eusi tina file esni_query.go, anu mangrupikeun bagian tina tls-tris. Fungsi kahiji nyiptakeun pakét jaringan kalayan pamundut ka server CloudFlare DNS nganggo protokol DoH (DNS-over-HTTPS), anu kadua nga-parses hasil query sareng nampi nilai-nilai konci umum domain, sareng anu katilu nyaéta a wadahna pikeun dua kahiji.
Salajengna, urang tambahkeun sambungan stop kontak wéb kana fungsi anu nembé didamel connectForWsSocks fungsionalitas pikeun ménta konci eSNI pikeun domain. Dimana bagian pangladén beroperasi, urang nyetél parameter TLS, sareng ogé nyetél nami "domain panutup" palsu:

Ieu kudu dicatet yén mimitina, cabang tls-tris teu dirancang pikeun pamakéan fronting domain. Ku alatan éta, éta henteu nengetan nami server palsu (widang serverName kosong dikirim salaku bagian tina pakét klien-halo). Pikeun ngalereskeun ieu, urang kedah nambihan widang FakeServerName anu saluyu kana struktur TlsConfig. Urang teu bisa make widang ServerName baku tina struktur, sabab dipaké ku mékanisme tls internal tur lamun béda ti aslina, sasalaman tls bakal ditungtungan ku kasalahan. Pedaran ngeunaan struktur TlsConfig dikandung dina file tls/common.go - urang kudu ngalereskeun eta:


Salaku tambahan, urang kedah ngarobih file tls/handshake_client.gongagunakeun widang FakeServerName kami nalika ngabentuk sasalaman TLS:

Éta hungkul! Anjeun tiasa nyusun proyék sareng pariksa padamelan. Tapi saencan Anjeun ngajalankeun scan, Anjeun kudu nyetel hiji akun CloudFlare. Nya, kumaha kuring tiasa nyarios nyetél - ngan ukur ngadamel akun dina cloudflare sareng numbu domain anjeun ka éta. Sadaya fitur anu aya hubunganana sareng DoH, WebSocket sareng ESNI kalebet dina CloudFlare sacara standar. Saatos rékaman DNS diropéa, anjeun tiasa pariksa operasi domain ku naroskeun konci eSNI:
dig +short txt _esni.df13tester.info 
Upami anjeun ningali anu sami pikeun domain anjeun, éta hartosna sadayana tiasa dianggo pikeun anjeun sareng anjeun tiasa teras-terasan nguji.
Ngaluncurkeun Ubuntu VPS, contona, dina DigitalOcean. PS: Dina kasus urang, alamat IP VPS anu nembe ditampi ti panyadia urang tungtungna aya dina daptar hideung Roskomnadzor. Janten tong kaget upami aya kajadian anu sami ka anjeun. Abdi kedah nganggo VPN pikeun ngaksés VPS abdi.
Kami nyalin rsockstun anu parantos disusun ka VPS (ieu, ku jalan kitu, mangrupikeun kaéndahan Golang anu sanés - anjeun tiasa nyusun proyék nyalira sareng ngajalankeun éta dina Linux naon waé, ngan ukur ningali kapasitas bit sistem) sareng ngaluncurkeun bagian server:

Lajeng bagian klien:

Sakumaha urang tiasa tingali, klien suksés nyambung ka server ngaliwatan server frontend CloudFlare ngagunakeun websocket a. Pikeun pariksa yen torowongan jalan persis kawas torowongan, anjeun tiasa ngadamel pamundut curl ngaliwatan socks5 lokal, buka dina server:

Ayeuna hayu urang tingali naon anu katingali ku DPI dina saluran komunikasi:

Kahiji, tunneler, ngagunakeun mékanisme DoH, ngahubungan server Cloudflare DNS pikeun konci eSNI pikeun domain tujuan (pakét No. 1-19), lajeng ngahubungan server frontend sarta ngadegkeun sambungan TLS, nyumput tukangeun domain. (ieu mangrupikeun nilai standar nalika henteu aya domain palsu anu dieusian nalika klien ngamimitian). Pikeun nangtukeun domain palsu anjeun, anjeun kedah nganggo parameter -fronfDomain:
![]()

Ayeuna hiji hal deui. Sacara standar, setélan akun CloudFalre disetel ka SSL Fleksibel. Ieu ngandung harti yén HTTPS requests ka Cloudflare frontend server ti klien bakal diteruskeun unencrypted (http) kana server kami. Éta pisan sababna naha urang dibuka bagian server torowongan dina modeu non-ssl (-ngadangukeun ws: 0.0.0.0), sarta henteu ( -ngadangukeun wss: 0.0.0.0).

Pikeun ngalih ka modeu énkripsi pinuh, anjeun kedah milih pinuhatawa pinuh (ketat) lamun aya sertipikat nyata dina server. Saatos gentos mode, urang bakal tiasa nampi sambungan ti CloudFlare nganggo protokol HTTPS. Tong hilap ngahasilkeun sertipikat anu ditandatanganan nyalira pikeun sisi server torowongan.

Nu maca nu panasaran bakal nanya: "Kumaha jeung klien nu di handapeun Windows"Sabab, kagunaan utama tunneler sigana mah pikeun nyieun sambungan back-end ti mesin sareng server perusahaan, sareng biasana éta Windows. Kumaha cara ngompilasi tunneler pikeun Windows, khususna nganggo tumpukan TLS khusus?" Ayeuna urang bakal ngenalkeun fitur sanés anu nunjukkeun kumaha merenahna Golang. Urang ngompilasi pikeun Windows langsung ti Kali ku ngan saukur nambihan parameter GOOS=windows:
GOARCH=amd64 GOROOT="/opt/tls-tris/_dev/GOROOT/linux_amd64" GOOS=windows go build -ldflags="-s -w"Atawa versi 32-bit:
GOARCH=386 GOROOT="/opt/tls-tris/_dev/GOROOT/linux_amd64" GOOS=windows go build -ldflags="-s -w"Sadayana! Jeung euweuh deui hassles diperlukeun. Bener jalanna!

Bandéra kompiler -w sareng -s diperyogikeun pikeun ngahapus sampah anu teu dipikabutuh tina file anu tiasa dieksekusi, ngajantenkeun sababaraha megabyte langkung alit. Salaku tambahan, éta teras tiasa dibungkus nganggo UPX pikeun ngirangan ukuranana.
Gantina kacindekan
Dina artikel, ngagunakeun conto torowongan ditulis dina Golang, urang jelas nunjukkeun pamakéan téknologi domain-fronting anyar, dilaksanakeun dina fitur rada metot tina protokol TLS 1.3. Dina cara anu sami, anjeun tiasa adaptasi alat anu aya dina Golang pikeun dianggo ngaliwatan server CloudFlare, contona - C2 anu kasohor, atanapi maksa CobaltStrike Beacon ngagunakeun domain-fronting eSNI nalika damel sareng Teamserver via , dilaksanakeun di Golang, atawa dina standar C ++ ngagunakeun versi patched of OpenSSL, nu urang ngobrol ngeunaan di bagian panungtungan artikel. Sacara umum, teu aya watesna pikeun imajinasi.
Conto jeung tunneler na CloudFlare dibere dina bentuk konsép sarta masih hese ngomong ngeunaan prospek jangka panjang tipe ieu fronting domain. Ayeuna, ngan CloudFlare anu ngadukung eSNI sareng, dina téori, teu aya anu ngahalangan aranjeunna nganonaktipkeun fronting sapertos kieu sareng, contona, megatkeun sambungan tls upami SNI sareng eSNI henteu cocog. Sacara umum, mangsa nu bakal datang bakal ngabejaan. Tapi pikeun ayeuna, prospek damel di handapeun "panutup kremlin.ru" katingalina rada pikabitaeun. Sanés éta?
Kodeu tunneler anu diropéa, ogé file exe executable anu disusun, aya dina cabang proyék anu misah dina . Éta langkung saé nyerat masalah ngeunaan sadaya masalah tunneler anu mungkin dina halaman proyék dina GitHub.
sumber: www.habr.com
