Sissejuhatus
Esimese osa me andsime lĂŒhikese ĂŒlevaate encrypted SNI (eSNI) mehhanismist. NĂ€itasime, kuidas selle alusel saab kĂ”rvale hiilida kaasaegsetest DPI-sĂŒsteemidest (nĂ€iteks Beeline'i DPI ja keelatud RKN ruTracker), samuti uurisime uut domeeni esitlemise varianti selle mehhanismi pĂ”hjal.
Teises artikli osas keskendume praktilisematele aspektidele, mis on kasulikud RedTeam spetsialistidele nende raskes töös. LĂ”ppude lĂ”puks on meie eesmĂ€rk mitte juurdepÀÀs blokeeritud ressurssidele (selliste igapĂ€evaste asjade jaoks on meil vana hea VPN). Ănneks on VPN-teenuse pakkujaid palju, nagu öeldakse, igale maitsele, vĂ€rvile ja eelarvele.
PĂŒĂŒame rakendada domeeni esitlemise mehhanismi kaasaegsetes RedTeam tööriistades, nagu Cobalt Strike, Empire jne, ja anda neile tĂ€iendavaid vĂ”imalusi peegeldumiseks ja kaasaegsetest sisu filtrisĂŒsteemidest kĂ”rvale hiilimiseks.
Eelmine kord integreerisime eSNI mehhanismi OpenSSL raamatukokku ja kasutasime seda tuntud utiliidis curl. Kuid ĂŒhe curl'iga, nagu öeldakse, nĂ€lga ei jÀÀ. Loomulikult soovime midagi sarnast teostada kĂ”rgema taseme keeltes. Kahjuks aga ei paku kiire otsing internetis meid suurt rahuldust, kuna eSNI mehhanismi tugi on tĂ€ielikult rakendatud ainult GOLANGis. Nii et valik on meil ĂŒsna piiratud: kas kirjutame puhtas C vĂ”i C++ kasutades muudetud OpenSSL raamatukogu vĂ”i kasutame CloudFlare'i eraldi GOLANGi haru ja proovime oma tööriistu sinna portida. Siiski on veel ĂŒks variant, klassikalisem, kuid samas töömahukam â rakendada eSNI toetus Pythonis. LĂ”ppude lĂ”puks kasutab Python samuti OpenSSL-i HTTPS-iga töötamiseks. Kuid selle variandi jĂ€tame kellegi teise arendamiseks, samas kui meie oleme rahul GOLANGis rakendusega, eriti kuna meie lemmik Cobalt Strike oskab suurepĂ€raselt töötada vĂ€liste ĂŒhenduskanalitega (External C2 channel) â sellest rÀÀgime artikli lĂ”pus.
Proovi rohkemâŠ
Ăks Go-s rakendatud tööriistu â meie areng sisesesse vĂ”rku pöördumiseks â tunnel , mis btw, tuvastatakse nĂŒĂŒd Microsofti ja Symanteci lahenduste poolt vĂ€ga kahjulikuna tarkvarana, mis on suunatud globaalsete probleemide loomisele...

Oleks tore kasutada ka eelmist arendust. Kuid siin tekib vĂ€ike probleem. Asi on selles, et rsockstun algselt eeldab serveriga sĂŒnkroonse SSL-ĂŒhenduse kasutamist. See tĂ€hendab, et ĂŒhendus luuakse ĂŒhe korra ja pĂŒsib kogu tuunelija tööaja. Ja nagu arusaadav, http protokoll ei ole just selliseks tööreĆŸiimiks kohandatud â see töötab pĂ€ring-vastus reĆŸiimis, kus iga uus http-pĂ€ring toimub uue tcp-ĂŒhenduse raames.
Selle sĂŒsteemi peamine puudus on see, et server ei saa andmeid kliendile edastada, kuni klient ei saadeta uut http-pĂ€ringut. Kuid Ă”nneks on olemas palju variante selle probleemi lahendamiseks â andmete voogedastamiseks http protokolli kaudu (kui nii vĂ”ib öelda, et me suudame vaadata oma lemmikseriaale ja kuulata muusikat portaalides, mis töötavad https-il, ja video ning audio edastamine on mitte midagi muud kui andmete voogedastus). Ăks tehnoloogiatest, mis simuleerib tĂ€isfunktsionaalset tcp-ĂŒhendust http protokolli peal, on veebisoketitehnoloogia (WebSockets), mille peamine pĂ”himĂ”te on korraldada tĂ€isfunktsionaalne vĂ”rguĂŒhendus kliendi ja veebiserveri vahel.
Meie Ă”nneks (hura-hura!!!) on see tehnoloogia vaikimisi sisse lĂŒlitatud kĂ”igis CloudFlareâi hinnaplaanides ja töötab suurepĂ€raselt koos eSNI-iga. Just seda me kasutame, et Ă”petada meie tuunelijat kasutama domeeni ĂŒmbersuunamist ja kaasaegsete DPI-de eest varjumist.
Veebisocketitest natuke
Esiteks rÀÀgime lihtsalt ja lĂŒhidalt veebisocketitest, et kĂ”igil oleks aimu, millega me töötame.
Veebisocketite tehnoloogia vĂ”imaldab ajutiselt vahetada http-ĂŒhenduse standardse andmevoo edastamise vastu vĂ”rgusoketi kaudu, katkemata samal ajal olemasolevat tcp-ĂŒhendust. Kui klient soovib vahetada veebisoketile, saadab ta oma http-pĂ€ringus mitmeid http-pealkirju. Kaks kohustuslikku pealkirja on Connection: Upgrade ja Upgrade: websocket. Samuti vĂ”ib ta sundida veebisocketi protokolli versiooni (Sec-Websocket-Version: 13) ja midagi sarnast base64 veebisoka ID-d (Sec-WebSocket-Key: DAGDJSiREI3+KjDfwxm1FA==). Server vastab sellele HTTP-koodiga 101 Switching Protocols ja seadistab ka pealkirjad Connection, Upgrade ja Sec-WebSocket-Accept. Ălemineku protsess on visuaalselt demonstreeritud alloleval ekraanipildil:

PĂ€rast seda vĂ”ib WebSocketi ĂŒhenduse loomist pidada lĂ”petatuks. KĂ”ik andmed, nii kliendilt kui serverilt, saadetakse nĂŒĂŒd mitte HTTP, vaid WebSocketi pealkirjadega (need algavad baitidega 0x82). NĂŒĂŒd ei pea server enam ootama kliendi pĂ€ringut andmete edastamiseks, kuna TCP-ĂŒhendus ei katkesta.
Golangis on veebisoka tööks mitmeid raamatukogusid. Neist kÔige populaarsemad on ja standardne . Kasutame viimasest, kuna see on lihtsam, vÀiksem ja nagu öeldakse, veidi kiirem.
Kliendi rsockstuni koodis peame asendama net.dial vÔi tls.dial kutsed vastavate WebSocketi kutsudega:


Soovime, et meie tunneli kliendi osa oleks universaalne ja suudaks töötada nii otse SSL-ĂŒhenduse kui ka WebSocketi protokolli kaudu. Selleks loome eraldi funktsiooni func connectForWsSocks(address string, proxy string) error {âŠ} analoogiliselt connectForSocks() ja kasutame seda veebisoketide tööks, juhul kui serveri aadress, mis on mÀÀratud kliendi kĂ€ivitamisel, algab ws: vĂ”i wss: (Secure WebSocketi puhul).
Tunneli serveripoolseks osaks loome samuti eraldi funktsiooni veebisoketide tööks. Seal luuakse HTTP klassi eksemplar ja mÀÀratakse HTTP-ĂŒhenduse töötleja (funktsioon wsHandler):

Ja terve ĂŒhenduse kĂ€sitlemise loogika (kliendi autoriseerimine parooli alusel, yamux sessiooni loomine ja lĂ”petamine) paigutame WebSocketi ĂŒhenduse töötlejasse:

Kompileerime projekti, kÀivitame serveripoolse osa:
.\/rsockstun âlisten ws:127.0.0.1:8080 âpass P@ssw0rdJa seejĂ€rel kliendipoolse osa:
.\/rsockstun -connect ws:127.0.0.1:8080 âpass P@ssw0rdJa kontrollime tööd kohalikus hostis:


JĂ€tkame domeeni edastamisega
WebSocketidega leiame end olevat sisenenud. NĂŒĂŒd liikume otse eSNI ja domeeni edastamise juurde. Nagu juba eelnevalt mainitud, vajame DoH ja eSNI töötamiseks spetsiaalset golangi haru ettevĂ”ttelt . Me vajame haru, kus on eSNI tugi (pwu/esni).
Kloonime selle endale kohalikult vÔi laadime ja puhastame vastava zip-faili:
git clone -b pwu/esni https://github.com/cloudflare/tls-tris.gitSeejĂ€rel peame kopeerima GOROOT katalooge, asendama vastavad failid kloonitud harust ja seadma selle peamiseks. Et arendajaid sellest peavalust vabastada, on CloudFlare'i tiim valmistanud ette spetsiaalse skripti â _dev/go.sh. Lihtsalt kĂ€ivitage see. Skript koos makefile'iga teevad kĂ”ik ise. Huvi pĂ€rast â vĂ”ite sisse piiluda makefile'i, et nĂ€ha detaile.
PÀrast skripti töötamist, projekti kompileerimise ajal, peame GOROOT-ina mÀÀrama kohaliku katalooge, mille skript ette valmistas. Meie puhul nÀeb see vÀlja nii:
GOROOT="/opt/tls-tris/_dev/GOROOT/linux_amd64" go build âŠ.Edasi peame rakendama tunneli funktsiooni, mis pĂ€rib ja parsib avalikke eSNI vĂ”tmeid soovitud domeeni jaoks. Meie puhul on need avalikud eSNI vĂ”tmed CloudFlare'i esiosa serveritest. Selleks 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 enda eest. TĂ€itmise vĂ”tame failist esni_query.go, mis kuulub tls-tris'i koosseisu. Esimene funktsioon loob vĂ”rgu paketi CloudFlare'i DNS-serverile pĂ€ringu tegemiseks, kasutades DoH (DNS-over-HTTPS) protokolli, teine â parsib pĂ€ringu tulemused ja saab domeeni avalikku vĂ”tme vÀÀrtused, kolmas aga toimib konteinerina kahe esimese jaoks.
SeejĂ€rel lisame meie uude funktsiooni veebisoketi ĂŒhenduse: connectForWsSocks eSNI vĂ”tmete pĂ€rimise funktsionaalsuse domeeni jaoks. Kohas, kus serveri osa töötab, seadistame TLS parameetrid ja mÀÀrame vale "katte" domeeni nime:

Siinkohal tuleb mĂ€rkida, et algselt ei olnud tls-tris haru mĂ”eldud domeenifrondimise kasutamiseks. SeetĂ”ttu ei ole seal tĂ€helepanu pööratud vale serveri nimele (client-hello paketi koostises edastatakse tĂŒhi serverName vĂ€li). Selle parandamiseks peame lisama TlsConfig struktuuri vastava vale serveri nime vĂ€li. Stdnt samm ServerName struktuuri ei saa kasutada, kuna seda kasutavad tls-i sisemised mehhanismid ja kui see erineb algsest, lĂ”ppeb tls-kĂ€epigistus veaga. Struktuuri TlsConfig kirjeldus on failis tls/common.go â seda peame me parandama:


Lisaks peame tegema muudatusi failis tls/handshake_client.go, et kasutada meie vÀlja FakeServerName TLS-kÀeulatuse koostamiseks:

See on kÔik! Projekti saab kompileerida ja töö kontrollida. Kuid enne kontrollimist tuleb seadistada CloudFlare'i konto. Noh, kuidas öelda, seadistada - lihtsalt loo konto CloudFlare'is ja seo oma domeen sellega. KÔik DoH, WebSocket ja ESNI funktsioonid on automaatselt CloudFlare'is lubatud. PÀrast DNS-i rekordite uuendamist saab domeeni toimimist kontrollida, saates eSNI vÔtmete pÀringu:
dig +short txt _esni.df13tester.info 
Kui nÀete sarnast teavet oma domeeni puhul, siis tÀhendab see, et kÔik töötab ja vÔib liikuda testimise juurde.
KÀivitame Ubuntu VPS-i, nÀiteks DigitalOceanil. P.S. Meie puhul osutus just antud teenusepakkuja IP-aadress VPS-i osas RKN-i mustadesse nimekirjadesse. Seega Àrge imestage, kui teil juhtub midagi sarnast. pidime kasutama VPN-i, et pÀÀseda oma VPS-ile.
Kopeerime VPS-ile juba kompileeritud rsockstun'i (kui veel ĂŒks golangi pluss â saate oma projektid kompileerida ja kĂ€ivitada mis tahes Linuxis, jĂ€rgides ainult sĂŒsteemi arhitektuuri) ja kĂ€ivitame serveri osa:

Siis kÀivitame kliendi osa:

Nagu nĂ€eme, ĂŒhendas klient CloudFlare'i frontend-serveri kaudu serveriga veebisoketi kasutades edukalt. Tunneli tĂ”hususe kontrollimiseks saab teha curl-pĂ€ringu lĂ€bi kohaliku socks5, mis on serveris avatud:

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

Esiteks pöördub tunneli loomise mehhanism DoH kaudu CloudFlare'i DNS-serveri poole sihtdomeeni eSNI vĂ”tmete saamiseks (paketid nr 1-19), seejĂ€rel pöördub frontend-serveri poole ja loob TLS-ĂŒhenduse, peites end samas domeeni taha (see on vaikevÀÀrtus, kui kliendi kĂ€ivitamisel ei ole mÀÀratud vale domeeni). Oma vale domeeni mÀÀramiseks peate kasutama parameetrit -fronfDomain:
![]()

NĂŒĂŒd on veel ĂŒks punkt. VaikevÀÀrtuste kohaselt on CloudFlare'i konto seadetes Flexibel SSL-reĆŸiim. See tĂ€hendab, et https-pĂ€ringud CloudFlare'i frontend-serveritele klientidelt suunatakse meie serverisse mittekrĂŒpteeritud (http) kujul. Just selle pĂ€rast kĂ€ivitasime tunneliserveri mittesertifitseeritud reĆŸiimis (-listen ws:0.0.0.0), mitte (-listen wss:0.0.0.0).

Kuna tĂ€ishÀÀlestamise reĆŸiimi ĂŒleminekuks tuleb valida TĂ€ielik, vĂ”i Full (strict) kui serveril on olemas kehtiv sertifikaat. ReĆŸiimi muutmisel suudame vastu vĂ”tta ĂŒhenduseid CloudFlare'iga https protokolli kaudu. Ărge unustage genereerida self-signed sertifikaati tunneli serveri osale.

Ăks peeneid lugejaid kĂŒsib: âAga kuidas on Windows klientidega? Kindlasti on peamine tunnelite kasutus tagakonnekti loomine ettevĂ”tte arvutitega ja serveritega, kus on tavaliselt alati Windows. Kuidas ma pean tunneli kokkupanema Windowsi jaoks, veel spetsiifilise TLS-tekiga?â NĂŒĂŒd kujutame ette veel ĂŒhte funktsiooni, mis nĂ€itab, kui mugav on Go. Kompileerige Windowsi jaoks otse Kali's, 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"See ongi kÔik! Ja rohkem pole mingeid jamasid vaja. See tÔesti töötab!

Kompilaatori lipud âw ja âs on vajalikud, et eemaldada liigsed killud tĂ€idesaatvast failist, vĂ€hendades selle suurust paar megabaiti. Lisaks saab seda hiljem UPX abil pakendada, et veelgi suurust vĂ€hendada.
LÔpetuseks
Artiklis nĂ€itasime golangis kirjutatud tunneli nĂ€itel uue domeeni fronting tehnoloogia rakendust, mis pĂ”hineb ĂŒsna huvitaval TLS 1.3 protokolli omadusel. Sarnasel viisil saab olemasolevat golangis kirjutatud tööriistakomplekti kohandada CloudFlare'i serverite kasutamiseks, nĂ€iteks â tuntud C2 vĂ”i sundida CobaltStrike Beaconit kasutama eSNI domeeni frontingut, töötades Teamserveriga kaudu , mis on rakendatud golangis, vĂ”i standardses C++-s, kasutades patĆĄitud versiooni OpenSSL-ist, millest rÀÀkisime artikli eelmine osa. ĂhesĂ”naga, fantaasiale ei ole piire.
Tunneli ja CloudFlare'i nĂ€ide on esitatud kontseptsioonina ja hetkel on keeruline öelda, millised kaugemad perspektiivid sellisel domeeni frontingul on. Praegu on eSNI tugi rakendatud ainult CloudFlare'is ja teoreetiliselt ei takista miski neid seda frontingut vĂ€lja lĂŒlitamast ja nĂ€iteks katkestamast tls-ĂŒhendusi, kui SNI ja eSNI ei kattu. ĂhesĂ”naga, tulevik nĂ€itab. Kuid praegu tundub perspektiiv töötada "kremlin.ru varjus" ĂŒsna ahvatlev. Kas pole?
Uuendatud tunnelikoodi ja kompileeritud executables (exe-failid) on paigutatud projekti eraldi harusse . KÔik tunneliga seotud probleemid on parem vÀlja tuua projekti GitHubi lehe issue'ides.
Allikas: habr.com
