«Де карта, Біллі? ... Нам потрібна карта! »
Карта мережі - це неодмінний атрибут будь-якого пентеста. Якщо ви проводите внутрішній аудит мережі і замовник надав карту - знайте, вам крупно повезло! А що ж робити, якщо карти немає?
Як би ви вчинили, якби опинилися випадково в темній закритій кімнаті? Звичайно, стали б прислухатися до всіх звуків, які до вас доходять, щоб зрозуміти де ви, і що навколо.
Теж саме повинен зробити пентестер, який отримав фізичний доступ до мережі. Якщо перед вами стоїть завдання залишитися непоміченим і дозволяє час, то потрібно слухати мережу ... годину, два, добу ... просто - слухати. За допомогою пасивних дій виявити вас буде досить складно. Звичайно, отримати повноцінну карту мережі за допомогою пасивного сканування ви не зможете, але дізнатися корисну інформацію в межах сегмента - легко!
Що можна дізнатися, прослуховуючи Ethernet інтерфейс?
Давайте подивимося, які кадри бувають на канальному рівні (2-й рівень моделі OSI):
Для пасивного прослуховування мережі, найпростіший спосіб - взяти Wireshark і зробити вибірку широкомовних кадрів. Але, ми не шукаємо легких шляхів :)) ... давайте напишемо власну утиліту для пасивного виявлення пристроїв в мережі.
Для нетерплячих, відразу викладаю вихідний код fpas.c
Для тих, хто хоче розібратися детальніше, я опишу ключові функції і структуру програми. Тож почнемо …
Структура Ethernet кадру знаходиться в заголовки
Тепер перейдемо на рівень вище і розглянемо структуру ARP-пакета. Складно точно сказати, на якому рівні працює ARP-протокол. Деякі фахівці відносять його до другого рівня, хоча по суті, ARP-пакети инкапсулируются в Ethernet кадри і повинні ставитися до 3-го рівня OSI / ISO. Але, зі стандартами не сперечаються ...
Які пакети нас цікавлять:
Загалом, вважаємо, що:
«Якщо широкомовні кадри хтось посилає, то цей« хтось »присутній в мережі!»
Для анонімного прослуховування необхідно належним чином налаштувати мережевий інтерфейс (відключити ARP-службу і заблокувати весь вихідний трафік).
Щоб зберегти анонімність, ми повинні тільки слухати. Ніякі пакети відправляти не можна!
1. Блокування відповідей на канальному рівні (ARP-служба):
де eth0 - мережевий інтерфейс, який налаштовується для прослуховування
2. Блокування вихідного і транзитного трафіку засобами iptables:
F: Скидання всіх правил (flushing).
X: Видалення ланцюжків правил.
P: Установка політик за замовчуванням для вхідного, вихідного і транзитного трафіку (наприклад DROP, REJECT або ACCEPT).
3. Ініціалізація мережевого інтерфейсу:
Для перехоплення всіх кадрів необхідно перевести мережевий інтерфейс в нерозбірливий режим. Робиться це за допомогою ioctl функції. Функція set_promiscuous_mode зчитує поточну конфігурацію інтерфейсу, заповнює структуру lNetwork_Device і встановлює прапор нерозбірливого режиму IFF_PROMISC (якщо мережеву карту потрібно ініціалізацію), або скидає його (якщо закінчуємо перехоплення пакетів):
Отримання ARP-пакетів відбуватиметься в постійному циклі, виходом з якого буде натискання комбінації CTRL + C. Щоб не нагромаджувати пояснення складної логікою роботи, покажу спрощену схему отримання пакетів (обробка CTRL + C описана нижче):
Зверніть увагу на пошук ARP пакета і його типу.
Аналогічно ситуація і з визначенням типу ARP-пакета. По зсуву [buffer + 20] [buffer + 21] записується тип пакету (запит ARP_REQUEST = 0х0001, або відповідь ARP_REPLAY = 0x0002).
На практиці, в високонавантажених корпоративних мережах інтенсивність ARP-запитів може досягати десятків одиниць в секунду. Причому, велика частина - це повтори. Для усунення черезмерной інтенсивності потоку я додав в утиліту спеціальний ключ -u (unique), який дозволяє відсівати повторні пакети.
Отримання і обробка пакетів відбувається в безперервному режимі. При натисканні комбінації клавіш CTRL + C в основний процес приходить подія SIGINT, яке потрібно обробити. Обробник події (функція break_mode) встановлює прапор terminate_signal в SET_ON. В основному циклі відбувається перевірка цього прапора, і якщо він встановлений - програма завершується.
Збірка програми і тестування
Збережемо вихідний файл в домашню директорію і зробимо компіляцію (вважаємо, що компілятор gcc вже встановлений в системі):
На виході отримаємо виконуваний файл fpas.
Запуск програми виконуємо під рутом, так як для перекладу інтерфейсу в нерозбірливий режим потрібні права суперкористувача. Спочатку, запустимо fpas без параметрів:
Програма видасть довідку:
-i Ім'я інтерфейсу (обов'язковий параметр).
-u Шукати унікальні хости.
-r Показати лічильник ARP-пакетів.
Тепер, давайте послухаємо який-небудь мережевий інтерфейс (не забуваємо при запуску вказати обов'язковий ключ -i з ім'ям інтерфейсу):
Через пару хвилин, ми словами кілька ARP-запитів (в тому числі і повторні). Добре, коли мережа невелика, а якщо у нас високонавантажених корпоративний сегмент, нам допоможе (ключ -u) - пошук унікальних хостів. Додамо також, при запуску програми ключ -r, який буде виводити на екран лічильник ARP-пакетів. Ось, власне, і все. Тепер ми можемо отримати список всіх працюючих хостів в сегменті і побудувати карту мережі.А в наступній статті, я розповім, як здійснити атаку типу ICMP-флуд (природно, handmade :))).