Пентест. Думаємо як зловмисник. Частина 2: загрози всередині

8 травня 2023 1 хвилина Автор: Cyber Witcher

Пентест: що ховається під білим капюшоном?

У першій статті ми поговорили про те, як може діяти Зовнішній порушник під час проведення пентесту, якими методами він може збирати і використовувати інформацію для подальшого проникнення. Як уже згадувалося раніше, під час тестування на проникнення зазвичай використовують кілька методів. У попередній статті розглядалися дії Зовнішнього порушника, тобто користувача, який не має жодних прав доступу до ресурсів організації (принаймні легальних) і перебуває за межами контрольованої території. Але під час пентесту також завжди розглядають моделі порушників, які мають доступ і на територію організації, і до корпоративних ресурсів. Це моделі порушника Гість і Внутрішній порушник. Модель Гість передбачає, що пентестеру надають доступ до офісу організації та можливість підключення до корпоративної мережі, тобто розетку Ethernet.

У разі Внутрішнього порушника пентестеру надається не тільки мережева розетка, а й обліковий запис доменного користувача з типовим набором прав доступу. Почнемо з розгляду моделі порушника Гість, оскільки тут у пентестера, за визначенням, менше можливостей, як порівняти з Внутрішнім порушником. Відразу обмовимося, що “за умовами навчань” наданий мережевий порт не повинен бути відключений, хоча “шкідливий” пентестер потім обов’язково напише у своєму звіті рекомендації щодо примусового відключення портів, які не використовуються, на комутаторі. Однак, Внутрішній порушник теж може використовувати ці методи роботи з трафіком і, можливо, він доб’ється навіть більшого успіху, оскільки йому, найімовірніше, буде доступно більше мережевих сегментів. Він же все-таки легальний користувач.

Сканування

Насамперед пентестеру необхідно вивчити мережу досліджуваної організації. Для цього можна скористатися такими інструментами зі складу Kali Linux як Nmap та Masscan. Ось так виглядає звіт про сканування мережі за допомогою Nmap:

Далі вже можна намагатися стукати на відкриті порти і з’ясовувати, що за ними стоїть. Однак, той самий Nmap можна використовувати і як сканер вразливостей. Звичайно, до громіздких Nessus/MaxPatrol йому далеко, але виявити такі “чудові” вразливості, як EternalBlue, йому цілком під силу. Для цього можна скористатися одним зі скриптів для Nmap. Проскануємо підмережу:

Після кількох невдалих спроб постукати у відкриті порти, сканер виявив MS17-010 – “старий добрий” EternalBlue.

На просторах мережі можна знайти безліч прикладів експлуатації цієї вразливості, наприклад за допомогою Metasploit, тож ми не будемо далі розглядати цей вектор і перейдемо до теми аналізу трафіку.

Розчехляємо сніффер

Отже, як наш інструментарій незмінно виступатиме Kali Linux. Для початку можна спробувати послухати який трафік ходить мережею. Для цього скористаємося класичним інструментом Wireshark. Звісно, спочатку нам необхідно перевести мережевий інтерфейс у змішаний режим за допомогою простих команд:

Я не буду детально розглядати роботу з Wireshark, оскільки на цю тему написано достатньо статей, зокрема й на Хабрі. Коротко подивимося, що з себе представляє інтерфейс цього сніффера. Під час завантаження програми нам пропонується вибрати, який інтерфейс системи слухати.

Далі натискаємо Start. У рядку введення можна вказати трафік для якого протоколу відображати. В основному полі відображаються перехоплювані пакети в реальному часі. Внизу для обраного пакета відображається його вміст на всіх рівнях ієрархічної моделі, починаючи з канального.

Нас цікавить HTTP-трафік, тому внизу обрано відповідний пакет і можемо бачити його вміст.

Але повернемося до пентесту. За старих часів, коли просторами Інтернет ходив незашифрований трафік, за допомогою сніффера можна було дізнатися багато чого цікавого. Але зараз у глобальній мережі все складніше знайти сайт, який не використовує SSL шифрування. Звичайно, такі ресурси ще існують, але, найімовірніше, це або ресурси вже неіснуючих організацій, чия оренда DNS імені ще не закінчилася, або плоскі сайти візитки, де шифрувати особливо нічого. Інша справа локальні веб ресурси всередині мережі організації

Як прибили, так і тримається

Погано написаний сайт в Інтернеті довго не проживе. Його обов’язково поламають, не заради грошей так заради інтересу, отримання практики, хуліганства тощо. Власне деякі методи пошуку вразливостей у веб ми розглянули в минулій статті. Але всередині мережі організацій криві ресурси можуть жити роками і навіть десятиліттями. Наприклад, якийсь студент дуже давно написав систему обліку робочого часу на PHP. Система справно працює, юзери заходять у веб інтерфейс, списують свої трудовитрати, а керівники будують потрібні їм звіти по завантаженню. Навіщо щось змінювати, якщо все і так працює? Усе б нічого, але, по-перше, цей вебпортал використовує HTTP і призначені для користувача облікові дані йдуть мережею у відкритому вигляді, а, по-друге, сам код і бібліотеки, які використовуються, містять безліч вразливостей, які легко можна знайти за допомогою того самого сканера Nikto, що розглядався в попередній статті.

У разі, якщо облікові дані передаються по HTTP у відкритому вигляді, ми можемо їх перехопити за допомогою Wireshark.

Виглядати це може приблизно ось так:

З боку це може здатися дещо дивним, але в багатьох організаціях для внутрішніх потреб може використовуватися велика кількість різного даремного, дуже потрібного самописного софту, який ніхто особливо не підтримує і який містить безліч вразливостей. При цьому доопрацьовувати ці додатки нікому не треба, тому що “і так працює” і, крім того, це додаткові трудовитрати для адмінів і програмістів і організації не дуже хочеться витрачати на це кошти.

А якщо все-таки HTTPS або людина посередині

Припустимо, всі сисадміни та безпечники (якщо вони є) свідомі та використовують шифрування трафіку, або просто в HTTP-трафіку нічого справді корисного знайти не вдалося. Тоді можна спробувати вдатися до допомоги різних утиліт для реалізації атаки “людина посередині” (Man In The Middle, MiTM). Ця атака передбачає, що зловмисник встає посередині між учасниками інформаційного обміну і здійснює перехоплення модифікацію трафіку, що проходить.

Під час реалізації цього типу атак можна використовувати різні техніки. І вибір техніки може визначатися не тільки наявністю/відсутністю засобів захисту, а й безбашенністю пентестера, умовами договору між замовником і організацією, що проводить тестування. Отже, наша основна мета – змусити трафік між одержувачем і приймачем іти через контрольований нами вузол.

Для цього треба спочатку підготувати цей самий вузол, а саме налаштувати перенаправлення трафіку і маршрутизацію. Для форвардингу пакетів можна скористатися такою командою:

Також необхідно переглянути правила netfilter для того, щоб вони не заважали проходу трафіку. Буде не дуже здорово, якщо після початку атаки у користувачів просто пропаде з’єднання.

Ну і перевіримо налаштування маршрутизації за допомогою наступної команди:

Нам необхідно, щоб пакети, які прийшли на один інтерфейс, могли в незмінному вигляді відправлятися далі з іншого інтерфейсу. Втручатися в їхній вміст ми будемо трохи пізніше. Після того, як ми протестували здатність трафіку безперешкодно проходити через наш вузол у тестовому середовищі, поговоримо про те, якими способами можна переспрямувати реальний користувацький трафік через цей вузол під час пентесту.

Далі наводяться кілька фізично-логічних способів стати посередині:

1. Старий добрий шнурок

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

Для практичної реалізації таких підключень можна скористатися мікрокомп’ютерами типу Raspberry Pi. При цьому в якості другого мережевого інтерфейсу використовується перехідник USB-Ethernet. Звичайно, на великому обсязі трафіку пристрій почне захлинатися, але якщо сегмент, що підключається, містить менше десятка вузлів, то мікрокомп’ютер має впоратися.

2. Виснаження та підробка DHCP

Dynamic Host Configuration Protocol, DHCP – це прикладний протокол, що дає змогу мережевим пристроям автоматично отримувати IP-адресу та інші параметри, необхідні для роботи в мережі TCP/IP. До числа цих “інших параметрів” входить шлюз за замовчуванням. Якщо ми зможемо підсунути юзерам свої налаштування DHCP, в яких вказано як Default Gateway наш вузол, то трафік піде через нього, а це те, що нам потрібно. Далі нам необхідно підняти сервіс DHCP. Звісно, якщо є можливість, можна просто використати той самий Raspberry або маленький роутер з OpenWRT прошивкою, який роздаватиме адреси з потрібними нам налаштуваннями.

Але якщо в якості підробленого DHCP сервера використовується Kali Linux, то необхідно встановити isc-dhcp-server виконавши:

Далі необхідно внести правки до конфігураційного файлу DHCP, який повинен знаходитися в /etc/netplan/.

Структура файлу має бути приблизно такою:

Так чи інакше, але ми створили свій підроблений DHCP-сервер, але якщо ми його просто активуємо в призначеному для користувача сегменті, то навряд чи наші адреси та налаштування отримають багато користувачів, оскільки легальні сервери, як і раніше, в строю. Тому, перш ніж запустити свій DHCP сервер, необхідно вивести з ладу легальні DHCP.Зробити це найпростіше за допомогою атаки на вичерпання IP адрес (DHCP Starvation). Для цього необхідно спочатку дізнатися, які легальні DHCP сервери зараз присутні в мережі. Є кілька способів як дізнатися IP адреси цих серверів, але мабуть, найнадійніший – це використання утиліти dhclient.

Як видно на скріншоті ми запускаємо утиліту для інтерфейсу eth0. Спочатку відбувається запит gj по всій мережі, хто може надати IP адресу (DHCPDICOVER). На моєму стенді тільки один DHCP сервер, тому на кроці DHCPOFFER відгукнувся тільки вузол .254. Але якби серверів було кілька (а у великих мережах зазвичай їх не менше двох), то тут ми б отримали повний список потенційних цілей. На кроці DHCPREQUEST клієнт запитує вже конкретну адресу .149. DHCPACK – сервер видав адресу .149. Отже, наша мета 192.169.222.254.

Далі нам знадобиться утиліта Yersinia. Якщо у вашому дистрибутиві Kali вона не встановлена, виконайте:

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

У вікні, що відкрилося, вибираємо DHCP -> Launch attack. Далі відзначаємо sending DHCPDICOVER і тиснемо OK.

Атака почалася. Утиліта надсилатиме пакети DHCPDISCOVER від різних MAC-адрес, і сервер слухняно видаватиме IP-адреси кожному новому “клієнту” доти, доки вони не закінчаться. Через кілька хвилин тиснемо List Attacks -> Stop. Тепер можна активувати наш підроблений DHCP сервер і видавати свої адреси.

3. Атаки на канальному рівні

Утиліту Yersinia можна не закривати, вона нам ще знадобиться. Для розуміння реалізації описуваних далі маніпуляцій необхідне знайомство з основами роботи протоколу Spanning Tree (STP). Основним завданням STP є усунення петель у топології довільної мережі Ethernet, у якій є один або більше комутаторів, пов’язаних надлишковими з’єднаннями. STP вирішує це завдання, автоматично блокуючи з’єднання, які наразі для повної зв’язності комутаторів є надлишковими. Як ілюстрації роботи STP скористаюся картинками з мануалів вендора, який вже покинув Росію.

Для роботи STP необхідно вибрати кореневий комутатор (root). Вибір відбувається на основі пріоритетів кожного з комутаторів, а якщо пріоритети однакові, порівнюються MAC адреси. Перемагає найменший. Усі інші комутатори (крім root), вибирають єдиний порт, спрямований на root. Усі інші “зайві” (або запасні) порти блокуються. Після увімкнення комутаторів у мережу за замовчуванням кожен комутатор вважає себе кореневим (root). Потім кожен комутатор починає посилати по всіх портах конфігураційні Hello BPDU (Bridge Protocol Data Unit) фрейми раз на 2 секунди.

Ось тут то в гру і вступає наш зловмисник. Ми можемо: по-перше, за допомогою Wireshark дізнатися MAC адресу поточного кореневого комутатора. Потім за допомогою спеціальних утиліт відправити фрейм BPDU зі значенням, меншим за справжній root, і тим самим стати коренем. У результаті весь трафік піде через наш вузол.

Як приклад атаки знову скористаємося утилітою Yersinia. В інтерфейсі програми вибираємо STP -> Launch attack. Далі Claiming Root Role. Тиснемо OK.

4. ARP Spoofing

І завершимо ми наш “хіт парад” MiTM атак ще однією класичною атакою – ARP Spoofing, також відомою як ARP poisoning. ARP (Address Resolution Protocol) – протокол у комп’ютерних мережах, призначений для визначення MAC-адреси за IP-адресою іншого комп’ютера. Суть атаки полягає в такому: зловмисник надсилає неправдиві ARP-пакети, щоб переконати комп’ютер жертви в тому, що комп’ютер, який прослуховує, і є кінцевим адресатом. Далі пакети з комп’ютера жертви перехоплюють і пересилають реальному одержувачу, МАС-адресу відправника в них підміняють, щоб відповідні пакети теж ішли через комп’ютер, що прослуховує. Комп’ютер, що прослуховує, стає “шлюзом” для трафіку жертви, і зловмисники отримують можливість прослуховувати трафік, здійснюючи атаку “людина посередині”.

У реалізації цієї атаки нам допоможе утиліта arpspoof. Якщо вузол пентестера це С, вузол А – це машина жертви, а B – це шлюз або цільовий сервер, інформаційний обмін з яким нас цікавить, то виклик команди матиме такий вигляд:

Крім розглянутих способів реалізації MiTM існує також безліч інших методів, наприклад, впровадження помилкових маршрутів у протоколи динамічної маршрутизації, отруєння DNS, модифікація файлу hosts тощо. Для бездротових мереж також можна використовувати підняття підробленої точки доступу з подальшим перенаправленням усього трафіку на вузол зловмисника.

Шукаємо цікаве у трафіку

Тепер, коли ми знаємо, як перенаправити трафік через свій вузол, трохи поговоримо про те, як це можна використовувати. Почнемо з уже згаданого HTTPS. Для реалізації атаки нам знадобиться утиліта Sslsplit, що входить до складу Kali Linux.

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

І згенеруємо свій сертифікат:

Тепер SSLsplit зможе підписувати сформовані сертифікати запитуваних доменів.

Далі скористаємося Sslsplit для запуску прослуховування SSL трафіку:

Тут присутні вже згенеровані раніше сертифікати, файл журналу конектів і каталог, у якому зберігатимуться логи всіх підключень. Далі, після “ssl” ми вказуємо, що йде перехоплення саме SSL-трафіку, і буде проводитися підміна сертифіката. Далі вказуються інтерфейс і порт, на яких слухається трафік, інтерфейс і порт, до яких буде здійснюватися підключення. Тут постановка вузла зловмисника в загальному випадку необов’язкова, можна, звісно, отримувати просто копії трафіку, але під час установлення в розрив ми гарантовано бачитимемо весь трафік, що проходить.

Скористаємося утилітою Responder, що також входить до складу Kali Linux.

Далі утиліта відобразить свої опції та їхні статуси. Нас буде цікавити LLMNR, NBT-NS і MDNS. Вони мають бути ввімкнені.

Результати роботи утиліти виводяться на екран, як і перехоплені хеші, наприклад ось такі:

Перебір хешів ми вже розглядали в попередній статті, тому зараз на цій темі зупинятися не будемо. Але тут важливо розуміти, що якщо наш пентестер працює за моделлю Гість і йому вдалося перехопити і розшифрувати облікові дані доменного користувача, то він перетворюється на Внутрішнього порушника.

Не лише MitM

Усе, що описувалося в статті до цього, було тією чи іншою мірою присвячено скануванню мережевих ресурсів або перегляду та перехопленню трафіку. Однак це не єдиний напрямок розвитку атак, який може використовувати Внутрішній порушник. За наявності прав у домені можна намагатися заходити до знайдених мережевих папок, у яких зазвичай є багато всього цікавого. Наприклад, у вихідних кодах скриптів і застосунків можуть виявитися заархівковані облікові дані. Так, у наведеному нижче прикладі ми за допомогою утиліти fgrep шукаємо входження символів pass у скриптах на Python.

І знайшли закоментоване присвоєння змінній passw деякого значення. Начебто рядок був у коментарі, і пароль, найімовірніше, не був захардкожений, але, тим не менш, пентестеру непогано було б уважно вивчити код файлу test.py як щодо можливих корисних облікових даних, так і щодо вивчення загальної логіки. Аналогічно, можна використовувати fgrep для пошуку цікавих слів у різних документах, вихідних кодах і журналах подій.

Інші статті по темі
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.