Існує безліч сценаріїв для Red Team та завдань у форматі Capture the Flag (CTF), де ми стикаємося з Windows Server. Після успішної експлуатації та отримання початкового доступу до сервера («foothold»), витягнути дані буває непросто. Також трапляються ситуації, коли ми не можемо отримати прямий доступ до самого сервера (наприклад, через оболонку). Однак, використовуючи протокол SMB, ми можемо виконувати команди на сервері віддалено. Компанія SecureAuth реалізувала цю концепцію, створивши одну з найдивовижніших колекцій Python-класів для роботи з різними протоколами. Ця колекція відома під назвою Impacket.
Офіційний GitHub-репозиторій: SecureAuthCorp /impacket
Зміст
- Вступ до SMB
- Вступ до MSRPC
- Конфігурації, використані в практичній частині
- Категорії Impacket
- Встановлення
- smbclient.py
- lookupsid.py
- reg.py
- rpcdump.py
- samrdump.py
- services.py
- ifmap.py
- opdump.py
- getArch.py
- netview.py
- Висновок
Вступ до SMB
SMB (Server Message Block) — це мережевий протокол, який використовується для забезпечення зв’язку між клієнтом і сервером. Він призначений для надання спільного доступу до файлів, принтерів та інших мережевих ресурсів. Протокол був розроблений компанією IBM ще у 1980-х роках.
Протягом десятиліть він пройшов значну еволюцію: від ранніх версій (CIFS) до сучасних SMB 2.x та 3.x, які стали значно швидшими та безпечнішими. Проте для фахівців із кібербезпеки SMB залишається одним із найцікавіших протоколів, оскільки він часто використовується для пересування всередині мережі (Lateral Movement) та виконання віддалених команд.
Вступ до MSRPC
MSRPC (Microsoft Remote Procedure Call) — це, по суті, модифікована версія протоколу DCE/RPC. Зокрема, вона була створена компанією Microsoft для безперешкодної реалізації моделі «клієнт-сервер» у середовищі Windows. Більше того, доменні протоколи Windows Server повністю базуються на MSRPC, що підкреслює його фундаментальну роль у мережевій архітектурі Microsoft.
MSRPC дозволяє розподіленим програмам викликати сервіси на інших комп’ютерах. Коли ми використовуємо інструменти для віддаленого адміністрування (або атаки), ми часто звертаємося до специфічних інтерфейсів RPC, таких як Samr (для управління обліковими записами) або Lsar (для політик безпеки).
Configurations Used in PracticalКонфігурації, використані в практичній частині
- Машина зловмисника (Attacker Machine):
- OS: Kali Linux 2020.1
- IP Address: 168.1.112
- Цільова машина
- OS:Windows Server 2016
- IP Address: 168.1.105
Категорії Impacket
- Remote Execution (Віддалене виконання): Скрипти для отримання доступу до командного рядка (наприклад, psexec.py, wmiexec.py).
- Kerberos: Інструменти для атак на протокол автентифікації Kerberos (наприклад, GetUserSPNs.py для Kerberoasting).
- Windows Secrets (Секрети Windows): Дамп хешів паролів, квитків Kerberos та секретів LSA (secretsdump.py).
- Server Tools / MiTM Attacks: Інструменти для атак типу «людина посередині» та підняття серверів (наприклад, ntlmrelayx.py).
- WMI: Взаємодія з Windows Management Instrumentation.
- Known Vulnerabilities (Відомі вразливості): Експлуатація специфічних вразливостей (наприклад, EternalBlue).
- SMB/MSRPC: Пряма взаємодія з цими протоколами для розвідки та управління:
- smbclient.py
- lookupsid.py
- reg.py
- rpcdump.py
- samrdump.py
- services.py
- ifmap.py
- opdump.py
- getArch.py
- netview.py
- MSSQL / TDS: Взаємодія з базами даних Microsoft SQL Server.
- File Formats: Робота з різними форматами файлів Windows (наприклад, дампи пам’яті).
- Other: Різноманітні утиліти для обробки мережевого трафіку та протоколів.
Встановлення
Перед використанням набору інструментів Impacket у нашій системі, нам необхідно його встановити. Процес встановлення досить простий. Спочатку перейдіть до репозиторію на GitHub, натиснувши тут. Потім, використовуючи команду git clone, ми клонуємо весь репозиторій на нашу машину зловмисника. Після клонування ми побачимо файл setup.py, давайте встановимо його. Після встановлення ми перейдемо до каталогу examples і будемо використовувати скрипти за власним розсудом.
git clone https://github.com/SecureAuthCorp/impacket.git
cd impacket/
ls
python setup.py install
smbclient.py
Бувають моменти, коли нам потрібно виконати кілька дій між машиною зловмисника та цільовою машиною. Це може бути перегляд списку спільних ресурсів і файлів, перейменування файлів, завантаження бінарних файлів на сервер або скачування файлів із цільової машини. Трапляються ситуації, коли нам навіть потрібно створити одну або дві папки на цільовій машині. Виконання таких дій може бути складним під час роботи з оболочкою (shell), яка може бути виявлена або закритися в будь-який момент. Скрипт smbclient.py допомагає нам у таких ситуаціях. Він може підключатися до цільової машини за допомогою низки атрибутів.
Вимоги:
- Домен (Domain)
- Ім’я користувача (Username)
- Пароль або хеш пароля (Password/Password Hash)
- IP-адреса цілі (Target IP Address)
Коли ми надаємо ці параметри для smbclient у форматі, показаному нижче, ми підключаємося до цільової машини й отримуємо SMB-оболонку, яка дозволяє запускати цілий спектр команд, таких як: dir, cd, pwd, put, get, rename, more, del, rm, mkdir, rmdir, info тощо.
Синтаксис:
smbclient.py [domain]/[user]:[password/password hash]@[Target IP Address]
Команда:
smbclient.py ignite/Administrator:Ignite@987@192.168.1.105

lookupsid.py
Ідентифікатор безпеки (SID) — це унікальне значення змінної довжини, яке використовується для ідентифікації облікового запису користувача. Через перерахування користувачів за допомогою SID ми можемо отримати інформацію про те, які користувачі існують, та їхні дані. Скрипт Lookupsid може перераховувати як локальних, так і доменних користувачів. Для цієї атаки також існує модуль у Metasploit. Якщо ви плануєте впровадити на цільовий сервер «золотий» (golden) або «срібний» (silver) квиток, то однією з необхідних речей є SID користувача з ідентифікатором 500. Lookupsid.py можна використовувати саме в такому сценарії.
Вимоги:
- Домен
- Ім’я користувача
- Пароль або хеш пароля
- IP-адреса цілі
Синтаксис:
lookupsid.py [domain]/[user]:[password/password hash]@[Target IP Address]
Команда:
lookupsid.py ignite/Administrator:Ignite@987@192.168.1.105

reg.py
Цей скрипт Impacket був перенесений безпосередньо з утиліти reg.exe ОС Windows. reg.exe — це виконуваний сервіс, який може зчитувати, змінювати та видаляти значення реєстру, якщо використовувати його в комбінації з ключовими словами query, add та delete відповідно. Важко навіть висловити всю важливість доступу до реєстру. Реєстр контролює кожен аспект системи. Його можна використовувати для отримання інформації про різні політики, програмне забезпечення, а також для зміни деяких із цих політик.
Вимоги:
- Домен
- Ім’я користувача
- Пароль або хеш пароля
- IP-адреса цілі
- Назва ключа реєстру
Синтаксис:
reg.py [domain]/[user]:[password:password hash]@[Target IP Address] [action] [action parameter]
Команда:
reg.py ignite/Administrator:Ignite@987@192.168.1.105 query -keyName HKLM\SOFTWARE\Policies\Microsoft\Windows -s

rpcdump.py
RPC (Remote Procedure Call) — це технологія, яка дозволяє комп’ютерній програмі виконувати процедуру в іншому адресному просторі, що закодовано як звичайний виклик процедури. Цей скрипт може перераховувати такі кінцеві точки (endpoints) для нас. Він також порівнює їх із деякими загальновідомими кінцевими точками з метою їх ідентифікації.
Вимоги:
- Домен
- Ім’я користувача
- Пароль або хеш пароля
- IP-адреса цілі
Синтаксис:
rpcdump.py [domain]/[user]:[Password/Password Hash]@[Target IP Address]
Команда:
rpcdump.py ignite/Administrator:Ignite@987@192.168.1.105

samrdump.py
Samrdump — це додаток, який отримує конфіденційну інформацію про вказану цільову машину за допомогою менеджера облікових записів безпеки (SAM). Зокрема, це віддалений інтерфейс, доступний через службу DCE/RPC (Distributed Computing Environment / Remote Procedure Calls). Крім того, він виводить список усіх системних спільних ресурсів, облікових записів користувачів та іншу корисну інформацію щодо присутності цілі в локальній мережі. Як показано на зображенні, він чітко відображає всі облікові записи користувачів, які зберігаються на віддаленій машині. Перевірка всіх доступних спільних ресурсів на наявність конфіденційних даних та доступ до інших облікових записів користувачів можуть надалі виявити цінну інформацію.
Вимоги:
- Домен
- Ім’я користувача
- Пароль або хеш пароля
- IP-адреса цілі
Синтаксис:
samrdump.py [domain]/[user]:[Password/Password Hash]@[Target IP Address]
Команда:
samrdump.py ignite/Administrator:Ignite@987@192.168.1.105

services.py
Скрипт services з пакета Impacket взаємодіє зі службами Windows за допомогою інтерфейсу MSRPC. Він дозволяє запускати, зупиняти, видаляти, зчитувати статус, переглядати конфігурацію, виводити список, створювати та змінювати будь-яку службу. Під час виконання завдань Red Teaming трапляється чимало ситуацій, які можна було б значно спростити, маючи доступ до служб цільової машини. Цей інструмент робить такі завдання тривіальними.
Вимоги:
- Домен
- Ім’я користувача
- Пароль або хеш пароля
- IP-адреса цілі
- Дія (Action)
Синтаксис:
services.py [domain]/[user]:[Password/Password Hash]@[Target IP Address] [Action]
Команда:
services.py ignite/Administrator:Ignite@987@192.168.1.105 list

ifmap.py
Спочатку скрипт ifmap прив’язується до інтерфейсу керування (MGMT) цільової машини. Згодом він отримує список ідентифікаторів інтерфейсів і додає їх до іншого розлогого списку UUID, які вже є в його базі даних. Після цього скрипт намагається прив’язатися до кожного інтерфейсу та повідомляє про його статус — зазвичай як listed (у списку) або listening (прослуховується). Варто зазначити, що його здатність збирати детальну інформацію є неперевершеною. Крім того, модуль Metasploit, який функціонує подібно до цього скрипта, — це auxiliary/scanner/dcerpc/endpoint_mapper. Отриманий список UUID (Universal Unique Identifiers) відповідає різним службам, зіставленим сопоставлювачем кінцевих точок (endpoint mapper). Відповідно, після ідентифікації цих служб зловмисник може здійснити пошук у мережі, щоб визначити, чи є якісь із них вразливими до атак типу «переповнення буфера» через RPC.
Вимоги:
- IP-адреса цілі
- Порт цілі
- Ім’я хоста (необов’язково)
Синтаксис:
ifmap.py [Target IP Address] [Target Port]
Команда:
ifmap.py 192.168.1.105 135

opdump.py
Почнемо з того, що цей скрипт прив’язується до вказаного hostname:port і підключається до інтерфейсу DCERPC (Distributed Computing Environment/Remote Procedure Calls). Після підключення він намагається по черзі викликати кожне з перших 256 номерів операцій і повідомляє про результат кожного виклику. Це генерує сплеск TCP-з’єднань із вказаним хостом і портом!
Він видає результат у наступному вигляді:
op 0 (0x00): rpc_x_bad_stub_data
op 1 (0x01): rpc_x_bad_stub_data
op 2 (0x02): rpc_x_bad_stub_data
op 3 (0x03): success
op 4 (0x04): rpc_x_bad_stub_data
ops 5-255: nca_s_op_rng_error
rpc_x_bad_stub_data, rpc_s_access_denied, and success generally means there’s an operation at that number.
Вимоги:
- IP-адреса
- Ім’я хоста (необов’язково)
- Версія інтерфейсу порту
Синтаксис:
opdump.py [Target IP Address] [Port Interface Version]
Команда:
opdump.py 192.168.1.105 135 99FCFEC4-5260-101B-BBCB-00AA0021347A 0.0

getArch.py
Усі блоки PDU (Protocol Data Unit), закодовані за допомогою синтаксису передачі NDR64, повинні використовувати значення 0x10 для мітки формату представлення даних. Це значення використовується лише під час передачі в 64-бітних системах (x64). Цей скрипт, при вказанні цілі, намагається встановити зв’язок із цільовою системою та збирає значення мітки формату представлення даних. Потім він порівнює його із синтаксисом NDR64, збереженим у його коді. Після цього він може надати зловмиснику інформацію про те, є операційна система 64-бітною чи 32-бітною. Ми також можемо надати список цілей, і скрипт працюватиме одночасно з усіма об’єктами.
Вимоги:
Синтаксис:
getArch.py -target [Target IP Address]
getArch.py -targets [Target List]
Команда:
getArch.py -targets /root/Desktop/target.txt

netview.py
netview.py — це інструмент для перерахування (enumeration). Для пошуку хостів йому потрібне ім’я домену. Йому також можна надати список хостів або цілей. Після збору списку netview перевіряє кожен із наступних пунктів:
- IP-адреси
- Спільні ресурси (Shares)
- Сесії
- Користувачі, які увійшли в систему
Знайшовши інформацію, скрипт не зупиняється; натомість він продовжує циклічно опитувати виявлені хости та веде детальний облік того, хто входив у систему або виходив із неї на віддалених серверах. Крім того, він підтримує з’єднання з цільовими системами та залишається дуже непомітним (stealthy), оскільки надсилає лише кілька пакетів DCERPC. Зокрема, цей скрипт вимагає, щоб машина зловмисника могла розпізнавати NetBIOS-імена машин домену. Для цього DNS на машині зловмисника має бути налаштований так, щоб вказувати на DNS домену.
Вимоги:
- Домен
- IP-адреса цілі
- Ім’я користувача
Синтаксис:
netview.py [domain]/[User] -target [Target IP Address] -users [User List]
netview.py [domain]/[User] -targets [Target List] -users [User List]
Команда:
netview.py ignite/Administrator -targets /root/Desktop/target.txt -users /root/Desktop/user.txt

Висновок
У цій статті ми розглянули скрипти з набору інструментів Impacket, які можуть взаємодіяти зі службами SMB/MSRPC на цільовій системі. Impacket має багато категорій, які ми продовжимо досліджувати згодом.