Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

Sissejuhatus

Esimese osa artikleid 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 rsockstun, mis btw, tuvastatakse nĂŒĂŒd Microsofti ja Symanteci lahenduste poolt vĂ€ga kahjulikuna tarkvarana, mis on suunatud globaalsete probleemide loomisele...

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

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:

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

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 Gorilla WebSocket ja standardne WebSocket. 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:

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

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):

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

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

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

Kompileerime projekti, kÀivitame serveripoolse osa:

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

Ja seejÀrel kliendipoolse osa:

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

Ja kontrollime tööd kohalikus hostis:

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

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 CloudFlare. 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.git

SeejĂ€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:

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

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:

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

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

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

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 

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

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:

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

Siis kÀivitame kliendi osa:

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

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:

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

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

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

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 www.google.com (see on vaikevÀÀrtus, kui kliendi kĂ€ivitamisel ei ole mÀÀratud vale domeeni). Oma vale domeeni mÀÀramiseks peate kasutama parameetrit -fronfDomain:

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

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).

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

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.

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

Ü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!

Domeenifrontimine TLS 1.3 pÔhjal. Osa 2

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 Merlin — tuntud C2 vĂ”i sundida CobaltStrike Beaconit kasutama eSNI domeeni frontingut, töötades Teamserveriga kaudu External C2 Channel, 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 github. KÔik tunneliga seotud probleemid on parem vÀlja tuua projekti GitHubi lehe issue'ides.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster