Sissejuhatus
Esimese osa jooksul andisime ĂŒlevaate encrypted SNI (eSNI) mehhanismist. NĂ€itasime, kuidas selle pĂ”hjal on vĂ”imalik vĂ€ltida tĂ€napĂ€evaste DPI-sĂŒsteemide tuvastamist (nĂ€iteks Beeline'i DPI ja keelatud RKN ruTracker), samuti uurisime uut domeeni silumist selle mehhanismi pĂ”hjal.
Teise osa jooksul liikudes keskendume praktilisematele kĂŒlgedele, mis on kasulikud RedTeam spetsialistidele nende raske töö juures. LĂ”ppkokkuvĂ”ttes on meie eesmĂ€rk mitte ligipÀÀs blokeeritud ressurssidele (selle jaoks on meil alati olemas vana hea VPN). Hea on, et VPN-teenuse pakkujaid on tohutult, nagu öeldakse, igaks maitseks, vĂ€rviks ja eelarveks.
PĂŒĂŒame rakendada domeeni silumise mehhanismi tĂ€napĂ€evaste RedTeam tööriistadega, nĂ€iteks Cobalt Strike'i, Empire'i jne, ja anda neile tĂ€iendavaid vĂ”imalusi varjatuks jÀÀmiseks ja tĂ€napĂ€evaste sisu filtreerimise sĂŒsteemide vĂ€ltimiseks.
Eelmisel korral integreerisime eSNI mehhanismi OpenSSL raamatukogusse ja kasutasime seda tuttavas utiliidis curl. Kuid ĂŒhe curl'iga, nagu öeldakse, nĂ€lga ei jÀÀ. Loomulikult tahaksime sarnast lahendust ka kĂ”rgema taseme keeltes. Kahjuks, kiire otsing internetis pettis meid, kuna eSNI mehhanismi tĂ€ieĂ”iguslik tugi on teostatud ainult GOLANGis. Seega ei ole meie valik eriti lai: kas kirjutame puhtas C's vĂ”i C++-s muudetud OpenSSL raamatukoguga vĂ”i kasutame CloudFlare'i eraldiseisvat GOLANGi forki ja proovime oma tööriistu sinna portida. Tegelikult on veel ĂŒks variant, klassikalisem, kuid samas töömahukas â rakendada eSNI tuge Pythonis. LĂ”ppude lĂ”puks kasutab Python samuti OpenSSL-i https-iga töötamiseks. Kuid selle variandi jĂ€tame kellegi teise arendamiseks ja me jÀÀme rahule GOLANGi lahendusega, eriti kuna meie lemmik Cobalt Strike oskab suurepĂ€raselt töötada kolmandate osapoolte vahenditega ĂŒles ehitatud sidekanaliga (External C2 channel) â sellest rÀÀgime artikli lĂ”pus.
Proovige rohkemâŠ
Ăks meie Go keeles teostatud tööriistu â meie arendus sisemistele tunneli ĂŒhendustele â tunneli lahendus , mis, muide, tuvastatakse tĂ€na Microsofti ja Symanteci tööriistadega vĂ€ga kahjuliku tarkvarana, mille eesmĂ€rk on globaalse stabiliteedi hĂ€irimine âŠ

Oleks tore kasutada eelnevat arendust ka antud juhul. Kuid siin tekib vĂ€ike probleem. Asi on selles, et algselt eeldab rsockstun serveriga suhtlemiseks sĂŒnkroneeritud SSL-kanali kasutamist. See tĂ€hendab, et ĂŒhendus luuakse ainult ĂŒks kord ja see pĂŒsib tunneli töötamise ajal. Nagu aru saate, ei ole http protokoll selliseks tööreĆŸiimiks just kĂ”ige sobivam â see töötab pĂ€ringu-vastuse reĆŸiimis, kus iga uus http-pĂ€ring eksisteerib uue tcp-ĂŒhenduse raames.
Peamine puudus sellises skeemis on see, et server ei saa andmeid kliendile edastada seni, kuni klient ei saada uut HTTP-pĂ€ringut. Ănneks on selle probleemi lahendamiseks palju vĂ”imalusi â andmete voogedastus HTTP-protokollis (lĂ”ppude lĂ”puks suudame ikkagi vaadata oma lemmiksarju ja kuulata muusikat HTTPS-platvormidelt, ja video ning audio edastamine on mitte midagi muud kui andmete voogedastus). Ăks tehnoloogia tĂ€ieĂ”igusliku TCP-ĂŒhenduse emuleerimise jaoks HTTP-protokolli peal on veebisoketid (WebSockets), mille pĂ”hijĂ”ud seisneb tĂ€ieĂ”igusliku vĂ”rguĂŒhenduse korraldamises kliendi ja veebiserveri vahel.
Meie Ă”nneks (hĂŒĂŒdke rÔÔmust!!!) on see tehnoloogia vaikimisi kĂ”ikides CloudFlare'i hinnaklassides sisse lĂŒlitatud ja töötab hĂ€sti eSNI-ga. Just seda me kasutame, et Ă”petada meie tunnelit kasutama domeeni esitlemist ja varjama end kaasaegsete DPI-de eest.
Veebisoketidest natuke
Esiteks rÀÀgime lĂŒhidalt ja lihtsate sĂ”nadega veebisocketitest, et kĂ”ik saaksid aimu, millega me tegeleme.
Veebipoodide tehnoloogia vĂ”imaldab ajutiselt vahetada http-ĂŒhendust tavapĂ€rase andmevoo edastamise vahel vĂ”rgu soketi kaudu, katkestamata samal ajal kehtivat tcp-ĂŒhendust. Kui klient soovib vahetada veebipoodi, saadab ta oma http-pĂ€ringus mitmeid http-pealkirju. Kaks kohustuslikku pealkirja on Connection: Upgrade ja Upgrade: websocket. Samuti saab ta sundida veebipoodide protokolli versiooni (Sec-WebSocket-Version: 13) ja midagi nagu base64 identifikaator veebipoodi (Sec-WebSocket-Key: DAGDJSiREI3+KjDfwxm1FA==). Server vastab http-koodiga 101 Switching Protocols ja seadistab samuti pealkirjad Connection, Upgrade ja Sec-WebSocket-Accept. Protsessi vahetus on selgelt nĂ€idatud alloleval ekraanipildil:

PĂ€rast seda vĂ”ib veebipoodide ĂŒhenduse loomist pidada lĂ”petatuks. KĂ”ik andmed nii kliendilt kui serverilt varustatakse nĂŒĂŒd mitte http, vaid WebSocket pealkirjadega (need algavad baitiga 0x82). NĂŒĂŒd ei pea server ootama kliendi pĂ€ringut andmete edastamiseks, kuna tcp-ĂŒhendus ei purune.
Go keeles veebipoodide kÀsitlemiseks on mitmeid raamatukogusid. Populaarseimate hulka kuuluvad ja standardne . Kasutame viimasena, kuna see on lihtsam, kompaktsem ja peab olema veidi kiirem.
Kliendikoodis rsockstun peame asendama net.dial vÔi tls.dial vastavate WebSocketi kÔnedega:


Soovime muuta meie tunnelikliendi osa universaalseks, et see töötaks nii otse sslĂŒhenduse kui ka WebSockset protokolli kaudu. Selleks loome eraldi funktsiooni. func connectForWsSocks(address string, proxy string) error {âŠ} sarnasel pĂ”hjusel connectForSocks() ja kasutame seda WebSocketide jaoks juhul, kui serveri aadress, mis on mÀÀratud kliendi kĂ€ivitamisel, algab ws: vĂ”i wss: (Secure WebSocketi puhul).
Tunneliserveri poole jaoks loome samuti WebSocketide jaoks eraldi funktsiooni. Seal luuakse http klassi eksemplar ja mÀÀratakse httpĂŒhenduse handler (funktsioon wsHandler):

Kogu ĂŒhenduse töötlemise loogika (kliendi autoriseerimine parooli jĂ€rgi, yamux sessiooni loomine ja lĂ”petamine) paigutatakse WebSocketi ĂŒhenduse handlerisse:

Kompileerime projekti, kÀivitame serveri poole:
./rsockstun âlisten ws:127.0.0.1:8080 âpass P@ssw0rdJa seejĂ€rel kliendi osa:
./rsockstun -connect ws:127.0.0.1:8080 âpass P@ssw0rdJa kontrollime tööd kohalikul hostil:


Liigutame edasi domeeni esiplaanile
Tundub, et me oleme veebikĂŒsimustega juba hakkama saanud. NĂŒĂŒd liigume otse eSNI ja domeeni esiplaanile. Nagu varem mainitud, vajame töötamiseks DoH ja eSNI jaoks spetsiaalset Golangi haru ettevĂ”ttelt . Me vajame haru, mis toetab eSNI (pwu/esni).
Kloonime selle endale kohalikult vÔi laadime alla ja vÀljastame sobiva zipi:
git clone -b pwu/esni https://github.com/cloudflare/tls-tris.gitSeejĂ€rel peame kopeerima GOROOT katalooge, asendama kloonitud harust vastavad failid ja seadistama selle pĂ”hikataloogiks. Arendajate peavalude vĂ€hendamiseks on CloudFlare'i meeskond valmistanud spetsiaalse skripti â _dev/go.sh. Lihtsalt kĂ€ivitage see. Skript koos makefile'iga teeb kĂ”ik ise. Huvi korral â vĂ”ite teha pilgu makefile'i detailide jaoks.
PÀrast skripti töötamist, projekti kompileerimisel, peame mÀÀrama GOROOT-ina skripti ettevalmistatud kohalikku katalooge. Meie puhul nÀeb see vÀlja jÀrgmine:
GOROOT="/opt/tls-tris/_dev/GOROOT/linux_amd64" go build âŠ.SeejĂ€rel peame tunnelis rakendama funktsionaalsuse eSNI vĂ”tmete pĂ€rimiseks ja analĂŒĂŒsimiseks soovitud domeenile. Meie puhul on need CloudFlare'i esiplaaniserverite avalikud eSNI vĂ”tmed. Selle saavutamiseks loome kolm funktsiooni:
func makeDoTQuery(dnsName string) ([]byte, error)
func parseTXTResponse(buf []byte, wantName string) (string, error)
func QueryESNIKeysForHost(hostname string) ([]byte, error)Funktsioonide nimed rÀÀgivad pĂ”himĂ”tteliselt enda eest. Sisu vĂ”ime vĂ”tta failist esni_query.go, mis kuulub tls-tris'i koosseisu. Esimene funktsioon loob vĂ”rgu paketi pĂ€ringuks CloudFlare'i DNS-serverile kasutades protokolli DoH (DNS-over-HTTPS), teine - analĂŒĂŒsib pĂ€ringu tulemusi ja saab domeeni avalikud vĂ”tme vÀÀrtused, kolmas on konteiner esimestele kahele.
SeejĂ€rel toome meie, Ă€sja loodud, veebisoketi ĂŒhenduse funktsiooni connectForWsSocks eSNI vĂ”tmete pĂ€rimise funktsionaalsuse domeeni jaoks. Seal, kus serveripool töötab, seadistame TLS parameetrid ja mÀÀrame vale «maskendatud domeeni» nime:

Siin on oluline mĂ€rkida, et algselt ei olnud tls-tris haru mĂ”eldud domeeni esitlemise jaoks. SeetĂ”ttu ei pöörata tĂ€helepanu vale serveri nimele (client-hello paketi raames edastatakse tĂŒhi serverName vĂ€li). Selle parandamiseks peame lisama TlsConfig struktuuri vastava vale serveri nime vĂ€lja. Me ei saa kasutada struktuuri standardset ServerName vĂ€lja, kuna seda kasutavad sisemised tls mehhanismid ja kui see erineb algsest, siis lĂ”ppeb tls-kĂ€epigistus veaga. TlsConfig struktuuri kirjeldus on failis tls/common.go â seda peamegi parandama:


Lisaks peame tegema muudatusi failis tls/handshake_client.go, et kasutada meie vale serveri nime vÀlja TLS kÀepigistuse vormimisel:

Selleks on kĂ”ik! Projekti saab kompileerida ja tööle testida. Kuid enne kontrollimise kĂ€ivitamist tuleb seadistada CloudFlare'i konto. Kuidas seda öelda, seadistada â lihtsalt luua CloudFlare'is konto ja siduda oma domeen sellega. KĂ”ik DoH, WebSocket ja ESNI seonduvad funktsioonid on CloudFlare'is vaikimisi lubatud. PĂ€rast DNS-kirjete vĂ€rskendamist on vĂ”imalik domeeni tööd kontrollida, saates eSNI vĂ”tmete pĂ€ringu:
dig +short txt _esni.df13tester.info 
Kui teie domeeni jaoks ilmub midagi sarnast â siis kĂ”ik töötab ja saate jĂ€tkata testimisega.
KĂ€ivitame Ubuntu VPS, nĂ€iteks DigitalOceanis. P.S. Meie puhul osutus lihtsalt vĂ€lja antud VPS-i IP-aadress RKNi mustadesse nimekirjadele kuuluvaks. Seega Ă€rge ĂŒllatuge, kui juhtub midagi sarnast. Pidi kasutama VPN-i, et oma VPS-ile juurde pÀÀseda.
Kopeerime VPS-ile juba kompileeritud rsockstun (see on muide veel ĂŒks Go-eeliste hulk â vĂ”ite projekti enda juures kompileerida ja kĂ€ivitada igal Linuxil, jĂ€rgides ainult sĂŒsteemi arhitektuuri) ja kĂ€ivitame serveri osa:

SeejÀrel kÀivitame kliendi osa:

Kuidas me nĂ€eme, on klient edukalt ĂŒhendatud serveriga CloudFlare'i eesserveri kaudu veebisoketi kasutamisega. Tunneli korrektse toimimise kontrollimiseks saab teha cURL-pĂ€ringu kohaliku SOCKS5 kaudu, mis on serveris avatud:

NĂŒĂŒd vaatame, mida DPI nĂ€eb sidekanalis:

Esialgu pöördub tunneliteenuse osutaja DoH mehhanismi kaudu CloudFlare'i DNS-serveri poole, et saada eSNI-vĂ”tmed sihtdomeeni jaoks (paketid nr 1-19), ja seejĂ€rel pöördub eesserveri poole ning loob TLS-ĂŒhenduse, varjates end samas domeeni taha. (see on vaikimisi vÀÀrtus, kui kliendi kĂ€ivitamisel pole vale domeeni mÀÀratud). Oma vale domeeni mÀÀramiseks tuleb kasutada parameetrit -fronfDomain:
![]()

NĂŒĂŒd veel ĂŒks punkt. Vaikimisi on CloudFlare'i konto seadetes seadistatud Flexible SSL tööreĆŸiim. See tĂ€hendab, et HTTPS-pĂ€ringud CloudFlare'i eesserveritele klientidelt suunatakse meie serverisse krĂŒpteerimata (HTTP) kujul. Just seetĂ”ttu kĂ€ivitasime tunneldaja serveri osa non-ssl reĆŸiimis (-listen ws:0.0.0.0), mitte (-listen wss:0.0.0.0).

TĂ€ieliku krĂŒpteerimise reĆŸiimi ĂŒlemineku jaoks tuleb valida TĂ€ielik, vĂ”i TĂ€ielik (range) olemasoleva sertifikaadi olemasolu korral serveris. ReĆŸiimi vahetamise jĂ€rel saame vastu vĂ”tta ĂŒhendusi CloudFlare'ilt https protokolli kaudu. Ăra unusta genereerida iseallkirjastatud sertifikaati tunneliteenuse serveripoolseks osaks.

KĂŒsimus, mis vĂ”iks huvi pakkuda: "Kuidas on lood Windowsi kliendiga? TĂ”enĂ€oliselt on tunneliteenuse peamine kasutusala tagasijĂ”udmine ettevĂ”tte masinatelt ja serveritelt, kus tavaliselt on alati Windows. Kuidas ma saan tunnelit Windowsi jaoks kompileerida, ja veel spetsiifilise TLS-i virna kasutades?" NĂŒĂŒd tutvustame veel ĂŒhte funktsiooni, mis nĂ€itab, kui mugav Go on. Kompileerime Windowsi jaoks otse Kali-st, lisades lihtsalt parameetri GOOS=windows:
GOARCH=amd64 GOROOT="/opt/tls-tris/_dev/GOROOT/linux_amd64" GOOS=windows go build -ldflags="-s -w"VÔi 32-bitine variant:
GOARCH=386 GOROOT="/opt/tls-tris/_dev/GOROOT/linux_amd64" GOOS=windows go build -ldflags="-s -w"KÔik! Ja rohkem muretseda ei ole vaja. See tÔesti töötab!

Kompilaatori lipud âw ja âs on vajalikud selleks, et eemaldada tĂ€iendav prĂŒgi tĂ€idetavast failist, muutes selle paar megabaiti vĂ€iksemaks. Lisaks saab selle hiljem pakendada UPX-i abil, et veelgi vĂ€hendada faili suurust.
KokkuvÔtte asemel
Artiklis nĂ€itasime, kasutades golangis kirjutatud tunnelit, uue domeenifrontimise tehnoloogia rakendamist, mis pĂ”hineb ĂŒsna huvitaval TLS 1.3 protokolli omadusel. Samamoodi saab olemasolevat golangis kirjutatud tööriista kohandada töötama CloudFlare'i serverite kaudu, nĂ€iteks. â tuntud C2 vĂ”i sundida CobaltStrike Beaconit kasutama eSNI domeenifrontimist Teamserveriga suhtlemisel. , mis on rakendatud golangis vĂ”i standardses C++-s kasutades propatchitud versiooni OpenSSL-ist, millest rÀÀkisime artikli eelmisel osal. ĂhesĂ”naga, fantaasia on piiramatu.
Tunnelija ja CloudFlare'i nĂ€ide on esitatud kontseptsioonina ja praegu on keeruline rÀÀkida sellise domeenifrontimise kaugematest perspektiividest. Praegu on eSNI tugi rakendatud ainult CloudFlare'is ja teoreetiliselt ei takista miski neil taolist frontimist vĂ€lja lĂŒlitada ja nĂ€iteks katkestada TLS-ĂŒhendusi, kui SNI ja eSNI ei ĂŒhti. ĂhesĂ”naga, tulevik nĂ€itab. Kuid praegu tundub perspektiiv töötada "kremlin.ru" varjus ĂŒsna ahvatlev. Kas pole?
Uuendatud tunneli kood ja kompileeritud tÀitev exe-failid on paigutatud projekti eraldi haru alla . KÔigi tunneli vÔimalike probleemide kohta on parem kirjutada probleemid projektilehe GitHubis.
Allikas: habr.com
