Увод
У првом делу Дали смо кратак опис механизма шифрованог СНИ (еСНИ). Они су показали како је на основу тога могуће избећи детекцију савремених ДПИ система (на примеру Беелине ДПИ и забрањеног РКН роот трацкера), а такође су истражили нову верзију фронтинга домена засновану на овом механизму.
У другом делу чланка прећи ћемо на практичније ствари које ће бити корисне РедТеам стручњацима у њиховом тешком раду. На крају, наш циљ није да добијемо приступ блокираним ресурсима (за такве тривијалне ствари имамо стари добри ВПН). На срећу, постоји велики избор ВПН провајдера, како кажу, за сваки укус, боју и буџет.
Покушаћемо да применимо механизам за уређивање домена на модерне РедТеам алате, на пример, као што су Цобалт Стрике, Емпире, итд., и да им дамо додатне могућности да опонашају и избегавају модерне системе за филтрирање садржаја.
Прошли пут смо имплементирали еСНИ механизам у ОпенССЛ библиотеку и успешно га користили у познатом услужном програму цурл. Али, како кажу, нећете се задовољити само једним пилетином. Наравно, волео бих да имплементирам нешто слично у језицима високог нивоа. Али, нажалост, брзо претраживање по Интернету нас разочарава, јер је подршка за еСНИ механизам у потпуности имплементирана само у ГОЛАНГ-у. Дакле, немамо много избора: или пишемо на чистом Ц или Ц++ користећи закрпљену ОпенССЛ библиотеку, или користимо одвојену ГОЛАНГ виљушку од ЦлоудФларе-а и покушавамо да пренесемо наше алате тамо. У принципу, постоји још једна опција, класичнија, али у исто време дуготрајна - имплементација еСНИ подршке за Питхон. На крају крајева, Питхон такође користи ОпенССЛ за руковање хттпс. Али оставићемо ову опцију за развој од стране неког другог, а сами ћемо бити задовољни имплементацијом у Голангу, посебно зато што је наш вољени Цобалт Стрике савршено у стању да ради са комуникационим каналом изграђеним од стране алата треће стране (екстерни Ц2 канал) - о томе ћемо причати на крају чланка.
Потруди...
Један од алата имплементираних у Го је наш развој за окретање у мрежу - тунел , који, иначе, сада алати Мицрософта и Симантеца детектују као веома малициозан софтвер који има за циљ да наруши глобалну стабилност...

Било би сјајно користити претходни развој иу овом случају. Али овде се јавља мали проблем. Чињеница је да у почетку рсоцкстун подразумева коришћење синхроног ССЛ комуникационог канала са сервером. То значи да се веза успоставља једном и да постоји за све време рада тунела. И, као што разумете, хттпс протокол није намењен за овај начин рада - он ради у режиму захтев-одговор, где сваки нови хттп захтев постоји у оквиру нове ТЦП везе.
Главни недостатак ове шеме је што сервер не може да пренесе податке клијенту док клијент не пошаље нови хттп захтев. Али, срећом, постоји много опција за решавање овог проблема - стримовање података путем хттп протокола (уосталом, некако успевамо да гледамо омиљене ТВ емисије и слушамо музику са портала који раде на хттпс, али пренос видеа и звука није ништа друго него стримовање података). Једна од технологија за емулацију рада пуноправне ТЦП везе преко ХТТП протокола је технологија ВебСоцкетс, чија је главна суштина организовање пуноправне мрежне везе између клијента и веб сервера.
На нашу срећу (ура!!!), ова технологија је подразумевано укључена у све ЦлоудФларе тарифне планове и одлично функционише у комбинацији са еСНИ. То је управо оно што ћемо користити да научимо наш тунелер да користи фронтинг домена и да се сакрије од модерних ДПИ-ја.
Мало о ВебСоцкетс
Пре свега, кратко и једноставним речима ћемо говорити о вебсокетима, тако да сви имају представу о томе са чиме ћемо радити.
Вебсоцкет технологија вам омогућава да привремено пређете са хттп конекције на стандардну мрежну утичницу за стриминг без прекидања успостављене ТЦП везе. Када клијент жели да се пребаци на вебсоцкет, поставља неколико хттп заглавља у свом хттп захтеву. Два потребна заглавља - Веза: Надоградња и Надоградња: вебсоцкет. Он такође може насилно да одреди верзију вебсоцкет протокола (Сец-Вебсоцксет-Верзија: 13) и нешто као басе64 вебсоцкет идентификатор (Сец-ВебСоцкет-Кеи: ДАГДЈСиРЕИ3+КјДфвкм1ФА==). Сервер му одговара са хттп кодом 101 Свитцхинг Протоцолс и такође поставља заглавља Веза, надоградња и Сец-ВебСоцкет-Аццепт. Процес пребацивања је јасно приказан на слици испод:

Након овога, инсталација ВебСоцкет везе се може сматрати завршеном. Сви подаци и са клијента и са сервера сада неће бити испоручени са хттп, већ са ВебСоцкет заглављима (они почињу са бајтом 0к82). Сада сервер не треба да чека захтев клијента за пренос података, јер Тцп веза није прекинута.
Голанг има неколико библиотека за рад са вебсоцкетс. Најпопуларнији од њих су и стандардне . Користићемо ово друго, јер... једноставнији је, мањи и, како кажу, ради мало брже.
У коду клијента рсоцкстун, морамо да заменимо позиве нет.диал или тлс.диал одговарајућим ВебСоцкет позивима:


Желимо да клијент део нашег тунела буде универзалан и да може да ради и преко директне ССЛ везе и преко ВебСоцксет протокола. За ово ћемо креирати посебну функцију фунц цоннецтФорВсСоцкс(адресни низ, прокси стринг) грешка {…} по аналогији са цоннецтФорСоцкс() и користићемо га за рад са веб утичницама ако адреса сервера наведена при покретању клијента почиње са вс: или всс: (у случају Сецуре ВебСоцкет).
За серверску страну тунела направићемо и посебну функцију за рад са веб утичницама. Креираће инстанцу хттп класе и подесити руковалац хттп везе (всХандлер функција):

И ставићемо сву логику обраде везе (ауторизација клијента помоћу лозинке, подешавање и завршетак иамук сесије) у ВебСоцкет обрађивач везе:

Састављамо пројекат и покрећемо серверски део:
./rsockstun –listen ws:127.0.0.1:8080 –pass P@ssw0rdА онда клијентски део:
./rsockstun -connect ws:127.0.0.1:8080 –pass P@ssw0rdИ проверавамо рад на локалном домаћину:


Пређимо на фронтинг домена
Чини се да смо схватили вебсоцкете. Сада пређимо директно на еСНИ и фронтинг домена. Као што је раније поменуто, да бисмо радили са ДоХ и еСНИ, потребно је да узмемо посебну филијалу голанга од компаније . Потребна нам је филијала са подршком за еСНИ (пву/есни).
Клонирамо га локално или преузимамо и декомпримујемо одговарајући зип:
git clone -b pwu/esni https://github.com/cloudflare/tls-tris.gitЗатим треба да копирамо ГОРООТ директоријум, заменимо одговарајуће датотеке из клониране гране и поставимо га као мастер. Да би спасили програмера од ове главобоље, момци из ЦлоудФларе-а су припремили посебну скрипту - _дев/го.сх. Само га лансирамо. Скрипта заједно са макефилеом све ће урадити сама. Само из забаве, можете погледати у макефиле за детаље.
Након покретања скрипте, приликом компајлирања пројекта, мораћемо да наведемо локални директоријум који је скрипта припремила као ГОРООТ. У нашем случају то изгледа овако:
GOROOT="/opt/tls-tris/_dev/GOROOT/linux_amd64" go build ….Затим треба да имплементирамо у тунел функционалност захтевања и рашчлањивања јавних еСНИ кључева за жељени домен. У нашем случају, то ће бити јавни еСНИ кључеви са ЦлоудФларе фронтенд сервера. Да бисмо то урадили, креираћемо три функције:
func makeDoTQuery(dnsName string) ([]byte, error)
func parseTXTResponse(buf []byte, wantName string) (string, error)
func QueryESNIKeysForHost(hostname string) ([]byte, error)Називи функција, у принципу, говоре сами за себе. Преузећемо садржај из датотеке есни_куери.го, која је део тлс-трис-а. Прва функција креира мрежни пакет са захтевом ЦлоудФларе ДНС серверу користећи ДоХ (ДНС-овер-ХТТПС) протокол, друга анализира резултате упита и добија вредности јавних кључева домена, а трећа је контејнер за прва два.
Затим додајемо везу са веб утичницом нашој новокреираној функцији цоннецтФорВсСоцкс функционалност за тражење еСНИ кључева за домен. Тамо где серверски део ради, постављамо ТЛС параметре, а такође постављамо и назив лажног „домена насловнице“:

Овде треба напоменути да у почетку грана тлс-трис није била дизајнирана за коришћење фронтинга домена. Због тога не обраћа пажњу на лажно име сервера (празно поље серверНаме се шаље као део клијент-хелло пакета). Да бисмо ово поправили, мораћемо да додамо одговарајуће поље ФакеСерверНаме у структуру ТлсЦонфиг. Не можемо користити стандардно поље СерверНаме структуре, јер користе га интерни тлс механизми и ако се разликује од оригиналног, тлс руковање ће се завршити грешком. Опис структуре ТлсЦонфиг се налази у датотеци тлс/цоммон.го - морамо то поправити:


Поред тога, мораћемо да извршимо измене у датотеци тлс/хандсхаке_цлиент.года користите наше поље ФакеСерверНаме када формирате ТЛС руковање:

То је све! Можете саставити пројекат и проверити рад. Али пре него што покренете скенирање, морате да подесите ЦлоудФларе налог. Па, како да кажем подеси - само креирај налог на цлоудфларе-у и повежи свој домен са њим. Све функције које се односе на ДоХ, ВебСоцкет и ЕСНИ су подразумевано укључене у ЦлоудФларе. Након што се ДНС записи ажурирају, можете проверити рад домена тако што ћете поставити упит за еСНИ кључеве:
dig +short txt _esni.df13tester.info 
Ако видите нешто слично за свој домен, то значи да све ради за вас и можете да пређете на тестирање.
Лансирање Ubuntu На пример, VPS на DigitalOcean-у. П.С. У нашем случају, VPS IP адреса коју смо управо добили од нашег провајдера завршила је на црној листи Роскомнадзора. Зато се немојте изненадити ако вам се нешто слично деси. Морао сам да користим VPN да бих приступио свом VPS-у.
Копирамо већ компајлирани рсоцкстун на ВПС (ово је, иначе, још једна лепота Голанга - можете сами да компајлирате пројекат и покренете га на било ком Линуку, посматрајући само битни капацитет система) и покренемо серверски део:

А онда клијентски део:

Као што видимо, клијент се успешно повезао са сервером преко ЦлоудФларе фронтенд сервера користећи вебсоцкет. Да бисте проверили да ли тунел ради баш као тунел, можете да направите захтев за цурл преко локалних соцкс5, отворених на серверу:

Сада да видимо шта ДПИ види у комуникацијском каналу:

Прво, тунелер, користећи ДоХ механизам, контактира Цлоудфларе ДНС сервер за еСНИ кључеве за одредишни домен (пакети бр. 1-19), а затим контактира фронтенд сервер и успоставља ТЛС везу, скривајући се иза домена (ово је подразумевана вредност када није наведен лажни домен када се клијент покрене). Да бисте навели свој лажни домен, морате користити параметар -фронфДомаин:
![]()

Сад још нешто. Подразумевано, подешавања ЦлоудФалре налога су подешена на Флексибилни ССЛ. То значи да ће хттпс захтеви клијената Цлоудфларе фронтенд серверима бити прослеђени нешифровани (хттп) на наш сервер. Зато смо серверски део тунела покренули у не-ссл режиму ( -листен вс:0.0.0.0), а не ( -листен всс:0.0.0.0).

Да бисте прешли на режим потпуног шифровања, морате да изаберете ПунИли пуна (строга) ако на серверу постоји прави сертификат. Након промене режима, моћи ћемо да прихватимо везе са ЦлоудФларе-а користећи хттпс протокол. Не заборавите да генеришете самопотписани сертификат за серверску страну тунела.

Радознали читалац ће питати: „Шта је са клијентом испод Windows„На крају крајева, главна употреба тунелера је вероватно успостављање бекенд везе са корпоративних машина и сервера, а то су обично увек Windows. Како да компајлирам тунелер за Windows, посебно са специфичним TLS стеком?“ Сада ћемо представити још једну функцију која показује колико је Golang практичан. Компајлирамо за Windows директно из Kali-ја једноставним додавањем параметра GOOS=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"Све! И више нису потребне муке. Стварно функционише!

Ознаке компајлера –в и –с су потребне да би се уклонило непотребно смеће из извршне датотеке, чинећи је неколико мегабајта мањом. Поред тога, може се паковати помоћу УПКС-а да би се додатно смањила величина.
Уместо закључка
У чланку смо, користећи пример тунела написаног на Голангу, јасно демонстрирали употребу нове технологије фронтинг домена, имплементиране на прилично занимљивој особини ТЛС 1.3 протокола. На сличан начин можете прилагодити постојеће алате написане на Голангу за рад преко ЦлоудФларе сервера, на пример - познати Ц2, или присилите ЦобалтСтрике Беацон да користи еСНИ домен-фронтинг када ради са Теамсервер-ом преко , имплементиран у Голанг, или у стандардном Ц++ користећи закрпљену верзију ОпенССЛ-а, о чему смо говорили у последњем делу чланка. Генерално, нема граница за машту.
Пример са тунелом и ЦлоудФларе-ом је представљен у форми концепта и још увек је тешко рећи о дугорочним перспективама овог типа фронтинга домена. Тренутно само ЦлоудФларе подржава еСНИ и, у теорији, ништа их не спречава да онемогуће ову врсту фронтинга и, на пример, прекину тлс везе ако се СНИ и еСНИ не поклапају. Генерално, будућност ће показати. Али за сада, изгледи за рад под „насловом кремлин.ру“ изгледају прилично примамљиви. Зар не?
Ажурирани код тунелера, као и компајлиране извршне еке датотеке, налазе се у посебној грани пројекта на . Боље је написати питање о свим могућим проблемима тунела на страници пројекта на ГитХуб-у.
Извор: ввв.хабр.цом
