История за изследване и развитие в 3 части. Част 1 — изследователска.
Има много букви — но ползата е още повече.
Формулиране на задачата
По време на провеждането на пентестове и RedTeam кампании не винаги е възможно да се използват стандартните средства на Клиентите, като VPN, RDP, Citrix и т.н. като средства за достъп до вътрешната мрежа. Някои стандартни VPN работят с MFA и като втори фактор изискват хардуерен токен, другаде те се наблюдават строго и нашият вход през VPN веднага става видим, както се казва — с всички произтичащи от това последствия, а на места просто няма такива средства.
В такива случаи постоянно се налага да правим т.н. „обратни тунели“ — връзки от вътрешната мрежа към външен ресурс или контролирана от нас сървър. Вътре в този тунел можем да работим с вътрешните ресурси на Клиентите.
Съществуват няколко разновидности на такива обратни тунели. Най-известният от тях, разбира се, е Meterpreter. SSH тунелите с обратен пробив на портове също са много търсени в хакерските среди. Съществуват много средства за извършване на обратни тунели и много от тях са добре изучени и описани.
Разбира се, разработчиците на защитни решения също не остават настрана и активно откриват подобни действия.
Например, сесиите на MSF успешно се откриват от съвременни IPS системи от Cisco или Positive Tech, а обратният SSH тунел може да бъде открит от почти всяка нормална защитна стена.
Следователно, за да останем незабелязани в качествена RedTeam кампания — трябва да изградим обратен тунел с нестандартни средства и да се адаптираме максимално близо до реалния режим на работа на мрежата.
Нека опитаме да намерим или да изобретим нещо подобно.
Преди да изобретим нещо, трябва да разберем какъв резултат искаме да постигнем, какви функции трябва да изпълнява нашето решение. Какви ще бъдат изискванията към тунела, за да можем да работим в режим на максимална скритост?
Ясно е, че за всеки случай тези изисквания могат да се различават значително, но от опит можем да откроим основните:
- работа на ОС Windows 7-10. Тъй като в повечето корпоративни мрежи се използва именно Windows;
- Клиент се свързва със сървъра чрез SSL, за да предотврати подслушване чрез средства за IPS;
- При свързване клиентът трябва да поддържа работа през прокси-сървър с авторизация, тъй като в много компании изходът в интернет става чрез прокси. Всъщност клиентската машина може и да не знае за това, а проксито да се използва в транспарентен режим. Но такъв функционал трябва да бъде заложен;
- Клиентската част трябва да бъде лаконична и портативна;
Разбира се, че за работа вътре в мрежата на клиента, на клиентската машина може да бъде инсталиран OpenVPN и да бъде изградена пълноценна тунелна връзка до собствения сървър (добре е, че клиентите на OpenVPN могат да работят чрез прокси). Но, от една страна, това не винаги ще е възможно, тъй като може да не сме локални администратори там, а от друга страна, това ще генерира толкова много шум, че приличен SIEM или HIPS веднага ще ни „докладва накъде трябва“. В идеалния случай нашият клиент трябва да бъде така наречената inline команда, както е реализирано в много bash shell-ове, и да се стартира чрез командния ред, например, при изпълнение на команди от word макрос. - Тунелът ни трябва да бъде многопоточен и да поддържа множество връзки едновременно;
- Връзката клиент-сървър трябва да има някаква авторизация, така че тунелът да се установява само за нашия клиент, а не за всички, които идват на нашия сървър на указаното адрес и порт. В идеалния случай за "външни потребители" трябва да се отваря лендинг страница с котенца или професионална тема, свързана с изходния домейн.
Например, ако клиентът е медицинска организация, то за администратора по информационната безопасност, който реши да провери ресурса, към който е имал достъп служителят на клиниката, трябва да се отвори страница с фармацевтични стоки, Уикипедия с описание на диагнозата или блог на доктор Комаровски и т.н.
Анализ на съществуващите инструменти
Преди да изобретим колелото, е необходимо да направим анализ на съществуващите колела и да разберем дали наистина ни е нужно и вероятно не само ние сме се замислили за необходимостта от такова функционално колело.
Търсене в Интернет (изглежда, гуглим нормално), както и търсене в GitHub по ключови думи «reverse socks», не даде много резултати. Основно всичко се свежда до изграждане на SSH тунели с обратен пренос на портове и всичко, свързано с това. Освен SSH тунелите, могат да се откроят няколко решения:
Стара реализация на обратен тунел от екипа на Лаборатория Касперски. По името е ясно за какво е предназначен този скрипт. Реализиран е на Python 2.7, тунелът работи в режим cleartext (както е модерно да се казва сега — поздрави на РКН).
Още една реализация на Python, също в cleartext, но с повече възможности. Написан е като модул и има API за интеграция на решението в собствени проекти.
Първата връзка — оригиналната версия на реализация на реверс сокс на голанго (не се поддържа от разработчика).
Втората връзка — вече наша доработка с допълнителни функции, също на голанго. В нашата версия реализирахме SSL, работа през прокси с NTLM авторизация, авторизация на клиента, целева страница при неверна парола (по-точно — пренасочване към целева страница), многопоточен режим (т.е. с тунела могат да работят няколко души едновременно), система за пинг на клиента относно това — жив ли е или не.
Реализация на обратния сокс от нашите «китайски приятели» на Python. Там също за мързеливите и „безсмъртните“ се намира готов бинарен файл (exe), събрано от китайците и готово за използване. Тук единствено китайският бог знае какво още може да има в този бинарен файл извън основната функционалност, така че го използвайте на свой риск.
Доста интересен проект на C++ за реализация на обратен сокс и не само. Освен обратния тунел, той може да прави пренос на портове, създаване на команден шел и т.н.
MSF meterpreter
Тук, както се казва, без коментари. Всички малко по-образовани хакери отлично познават този инструмент и разбират колко е лесно да бъде открит от средства за защита.
Всички по-гореописани инструменти работят на сходна технология: на машина в мрежата стартира предварително подготвен изпълним бинарен модул, който установява връзка с външен сървър. На сървъра стартира SOCKS4/5 сървър, който приема връзки и ги предава на клиента.
Недостатък на всички изброени инструменти е, че или на клиентската машина е необходим инсталиран Python или Golang (колко често срещате инсталиран Python на машините, например, на директора на компанията или офисните работници?), или на тази машина е необходимо да се пренесе предварително събран бинарен файл (всъщност python и скрипт в едно). А свалянето на exe файл и последващото му изпълнение е доста явен сигнал за локалния антивирус или HIPS.
В крайна сметка, извода е ясен — нуждаем се от решение на PowerShell. Сега невярващите ще ни замерят с домати — че PowerShell е вече изтъркан, че се мониторира, блокира и т.н. Всъщност — това не е така навсякъде. Отговорно заявяваме. Между другото, съществуват много начини да се заобиколят блокировките (тук отново модната фраза за благодарност на РКН 🙂 ), от просто преименуване на powershell.exe -> cmdd.exe и завършвайки с powerdll и т.н.
Започваме да изобретяваме
Разбира се, първо ще потърсим в Google и… няма да намерим абсолютно нищо по темата (ако някой е намерил — пускайте линкове в коментарите). Има само Socks5 на PowerShell, но това е обикновен "директен" socks, който има редица недостатъци (за тях ще говорим по-късно). Може да се превърне в обратен с лека ръка, но това ще бъде само еднопоточен sock, което не е съвсем това, от което се нуждаем.
И така, не намерихме нищо готово, затова ще трябва да изобретим своя велосипед. За основа на нашия велосипед ще вземем обратен socks на Golang, а клиента към него ще реализираме на PowerShell.
RSocksTun
И така, как работи rsockstun?
В основата на работата на RsocksTun (по-нататък — rs) лежат два софтуерни компонента — Yamux и Socks5 сървър. Socks5 сървърът е обикновен локален socks5, той се стартира на клиента. А мултиплексването на връзките към него (помните ли за многопоточността?) се осигурява чрез yamux (). Такава схема позволява стартиране на няколко клиентски socks5 сървъра и разпределяне на външни връзки към тях, прокарвайки ги през едно единствено TCP-съединение (почти като в meterpreter) от клиента към сървъра, реализирайки по този начин многопоточен режим, без който просто не можем да работим пълноценно във вътрешната мрежа.
Същността на работата на yamux е в това, че въвежда допълнителен мрежов слой стрийм, реализирайки го под формата на 12-байтов заглавие за всеки пакет. (Тук умишлено използваме термина «стрийм», а не поток, за да не объркваме читателя с програмния поток «thread» — това понятие ще използваме също в тази статия). Вътре в заглавието на yamux се съдържат номер на стрийм, флагове за стартиране/завършване на стрийма, количество предавани байтове, размер на предавателния прозорец.

Освен за стартиране/завършване на стрийм, в yamux е реализиран механизъм за keepalive, позволяващ проследяване на работоспособността на установения комуникационен канал. Работата на механизма за keepalive съобщения се настройва при създаването на Yamux сесия. Всъщност, от настройките там има само два параметъра: enable/disable и периодичност на изпращане на пакетите в секунди. Keepalive съобщенията могат да изпращат както yamux сървърът, така и yamux клиентът. При получаване на keepalive съобщение, отдалечената страна е длъжна да отговори с изпращане на точно такъв идентификатор на съобщението (по същество — число), който е приела. Общо взето, keepalive — това е същият пинг, само че за yamux.
Подробно цялата техника на работа на мултиплексора: типове пакети, флагове за установяване и приключване на връзки и механизмите за предаване на данни са описани в к yamux.
Заключение на първа част
И така, в първата част на статията се запознахме с някои инструменти за организиране на обратни тунели, разгледахме техните предимства и недостатъци, изучихме механизма на работа на Yamux мултиплексора и описахме основните изисквания към новосъздавания powershell модул. В следващата част ще се занимаваме с разработката на самия модул, практически от нулата. Продължението следва. Не се изключвайте 🙂
Източник: habr.com
