Подробный гайд: Полный справочник по протоколу SMB: команды SMB / SMB2 / SMB3 - Часть 1
Справочник по командам протокола SMB: SMBv1/CIFS и современным SMB2/SMB3. Дополнительно даны подкоманды, IOCTL/FSCTL, типовые потоки обмена, диагностика и команды ОС/утилит, чтобы не путать «команды протокола» и «команды управления SMB».
Важно:
SMB1 крайне устарел и небезопасен. В современных сетях следует использовать SMB 2.1/3.x, отключать SMB1, включать подпись и, где нужно, шифрование.
1. Что такое SMB и какие бывают “команды”
SMB — сетевой протокол для доступа к файлам, принтерам, именованным каналам, общим ресурсам и служебным операциям.
Под “командами SMB” обычно понимают одно из двух:
1. Команды протокола — коды запросов в пакете SMB:
- в SMB1 — однобайтовое поле
Command; - в SMB2/SMB3 — 16-битное поле
Command.
2. Команды ОС и утилит — net use, Get-SmbShare, smbclient, mount.cifs и т.п.
Они лишь используют протокол, но сами не являются командами внутри SMB-пакета.
В этом гайде основной упор сделан на команды протокола.
2. Транспорты и порты
| Транспорт / порт | Назначение |
|---|---|
| TCP 139 | SMB поверх NetBIOS Session Service, чаще старый стиль |
| TCP 445 | SMB напрямую поверх TCP, основной вариант |
| TCP 5445 | SMB Direct / SMB over RDMA |
| UDP 137/138 | NetBIOS Name Service / Datagram, исторически |
| QUIC / 443 | SMB over QUIC в новых системах, для безопасного доступа через Интернет |
Современный SMB обычно работает поверх TCP 445. SMB Direct использует RDMA, но набор команд SMB2/SMB3 остаётся тем же.
3. Версии и диалекты
3.1. Основные диалекты
| Диалект | Строка/значение | Комментарий |
|---|---|---|
| Ранний SMB1 | PC NETWORK PROGRAM 1.0, MICROSOFT NETWORKS 1.03, DOS LM1.2X002, LANMAN2.1 |
Исторические диалекты |
| SMB1 / CIFS | NT LM 0.12 |
Основной SMB1-диалект. Устарел |
| SMB 2.0.2 | SMB 2.002 / 0x0202 |
Vista / Server 2008 |
| SMB 2.1 | SMB 2.1 / 0x0210 |
Windows 7 / Server 2008 R2 |
| SMB 3.0 | SMB 3.0 / 0x0300 |
Windows 8 / Server 2012 |
| SMB 3.0.2 | SMB 3.02 / 0x0302 |
Windows 8.1 / Server 2012 R2 |
| SMB 3.1.1 | SMB 3.1.1 / 0x0311 |
Windows 10 / Server 2016 и новее |
| Специальный | 0x02FF |
wildcard в SMB2 Negotiate, “любой SMB2” |
3.2. Возможности по версиям
| Версия | Ключевые возможности |
|---|---|
| SMB1 | Базовый доступ к файлам, транзакции, устаревшая модель аутентификации |
| SMB 2.0.2 | Новая структура пакетов, меньше команд, кредиты, улучшенная производительность |
| SMB 2.1 | Leasing, улучшенный oplock, больший масштаб |
| SMB 3.0 | Шифрование, Multichannel, SMB Direct, directory leasing, persistent handles |
| SMB 3.0.2 | Улучшения эффективности и управления |
| SMB 3.1.1 | Negotiate contexts, preauth integrity, улучшенная криптография, более безопасный обмен |
4. Базовая структура пакетов
4.1. SMB1
SMB1-пакет начинается с сигнатуры 0xFF 'S' 'M' 'B'.
Основные поля заголовка:
| Поле | Назначение |
|---|---|
Command |
Код команды |
Status |
NTSTATUS или DOS-ошибка |
Flags, Flags2 |
Флаги пакета |
TID |
Tree ID — подключение к общему ресурсу |
PID |
Идентификатор процесса |
UID |
User ID — сессия пользователя |
MID |
Multiplex ID — сопоставление запрос/ответ |
WordCount |
Количество 16-битных слов параметров |
ByteCount |
Длина блока данных |
В SMB1 часто используется механизм ANDX: одна команда может нести в себе следующую.
Например:
SESSION_SETUP_ANDX -> TREE_CONNECT_ANDX -> NT_CREATE_ANDX
4.2. SMB2/SMB3
SMB2-пакет начинается с сигнатуры 0xFE 'S' 'M' 'B'.
Основные поля заголовка:
| Поле | Назначение |
|---|---|
StructureSize |
Обычно 64 |
CreditCharge |
Стоимость операции в кредитах |
Status |
Статус выполнения |
Command |
Код команды |
CreditRequest/CreditResponse |
Запрос/выдача кредитов |
Flags |
Request/response, async, related, replay и др. |
NextCommand |
Смещение следующего пакета в compound-запросе |
MessageId |
Идентификатор сообщения |
TreeId |
Идентификатор подключения к шару |
SessionId |
Идентификатор сессии |
Signature |
Подпись сообщения |
Важные особенности SMB2:
- меньше команд, чем в SMB1;
- многие старые операции заменены универсальными
IOCTL,QUERY_INFO,SET_INFO; - поддерживаются составные пакеты — compound requests;
- используются кредиты для управления потоком;
- есть шифрование через
SMB2_TRANSFORM_HEADER, который не является отдельной командой, а оборачивает зашифрованный SMB2-сообщение.
5. Перечень команд SMB1
Коды указаны в шестнадцатеричном виде. Это однобайтовые значения поля Command в SMB1.
5.1. Основные команды SMB1
| Код | Команда | Описание |
|---|---|---|
0x00 |
SMB_COM_CREATE_DIRECTORY |
Создание каталога |
0x01 |
SMB_COM_DELETE_DIRECTORY |
Удаление каталога |
0x02 |
SMB_COM_OPEN |
Открытие файла |
0x03 |
SMB_COM_CREATE |
Создание файла |
0x04 |
SMB_COM_CLOSE |
Закрытие файла |
0x05 |
SMB_COM_FLUSH |
Сброс данных файла на диск |
0x06 |
SMB_COM_DELETE |
Удаление файла |
0x07 |
SMB_COM_RENAME |
Переименование/перемещение |
0x08 |
SMB_COM_QUERY_INFORMATION |
Запрос информации о файле по пути |
0x09 |
SMB_COM_SET_INFORMATION |
Установка информации о файле по пути |
0x0A |
SMB_COM_READ |
Чтение данных |
0x0B |
SMB_COM_WRITE |
Запись данных |
0x0C |
SMB_COM_LOCK_BYTE_RANGE |
Блокировка диапазона байтов |
0x0D |
SMB_COM_UNLOCK_BYTE_RANGE |
Разблокировка диапазона байтов |
0x0E |
SMB_COM_CREATE_TEMPORARY |
Создание временного файла |
0x0F |
SMB_COM_CREATE_NEW |
Создание нового файла |
0x10 |
SMB_COM_CHECK_DIRECTORY |
Проверка существования каталога |
0x11 |
SMB_COM_PROCESS_EXIT |
Служебная/устаревшая команда выхода процесса |
0x12 |
SMB_COM_SEEK |
Позиционирование внутри файла |
0x13 |
SMB_COM_LOCK_AND_READ |
Блокировка и чтение |
0x14 |
SMB_COM_WRITE_AND_UNLOCK |
Запись и разблокировка |
0x1A |
SMB_COM_READ_RAW |
“Сырое” чтение для производительности |
0x1B |
SMB_COM_READ_MPX |
Мультиплексное чтение |
0x1C |
SMB_COM_READ_MPX_SECONDARY |
Вторичная часть мультиплексного чтения |
0x1D |
SMB_COM_WRITE_RAW |
“Сырая” запись |
0x1E |
SMB_COM_WRITE_MPX |
Мультиплексная запись |
0x1F |
SMB_COM_WRITE_MPX_SECONDARY |
Вторичная часть мультиплексной записи |
0x20 |
SMB_COM_WRITE_COMPLETE |
Завершение отложенной записи |
0x21 |
SMB_COM_QUERY_SERVER |
Запрос информации о сервере, редко используется |
0x22 |
SMB_COM_SET_INFORMATION2 |
Установка информации по открытому файлу |
0x23 |
SMB_COM_QUERY_INFORMATION2 |
Запрос информации по открытому файлу |
0x24 |
SMB_COM_LOCKING_ANDX |
Расширенная блокировка/разблокировка диапазонов |
0x25 |
SMB_COM_TRANSACTION |
Транзакция: именованные каналы, mailslot, служебные операции |
0x26 |
SMB_COM_TRANSACTION_SECONDARY |
Продолжение транзакции |
0x27 |
SMB_COM_IOCTL |
IOCTL-запрос |
0x28 |
SMB_COM_IOCTL_SECONDARY |
Продолжение IOCTL |
0x29 |
SMB_COM_COPY |
Копирование |
0x2A |
SMB_COM_MOVE |
Перемещение |
0x2B |
SMB_COM_ECHO |
Эхо-запрос, проверка доступности |
0x2C |
SMB_COM_WRITE_AND_CLOSE |
Запись и закрытие |
0x2D |
SMB_COM_OPEN_ANDX |
Расширенное открытие файла |
0x2E |
SMB_COM_READ_ANDX |
Расширенное чтение |
0x2F |
SMB_COM_WRITE_ANDX |
Расширенная запись |
0x30 |
SMB_COM_NEW_FILE_SIZE |
Установка размера файла |
0x31 |
SMB_COM_CLOSE_AND_TREE_DISC |
Закрытие и отключение дерева/шары |
0x32 |
SMB_COM_TRANSACTION2 |
Расширенные транзакции для файловых операций |
0x33 |
SMB_COM_TRANSACTION2_SECONDARY |
Продолжение TRANSACTION2 |
0x34 |
SMB_COM_FIND_CLOSE2 |
Закрытие поиска, связанного с TRANSACTION2 |
0x35 |
SMB_COM_FIND_NOTIFY_CLOSE |
Закрытие уведомления о поиске |
0x70 |
SMB_COM_TREE_CONNECT |
Подключение к общему ресурсу |
0x71 |
SMB_COM_TREE_DISCONNECT |
Отключение от общего ресурса |
0x72 |
SMB_COM_NEGOTIATE |
Согласование диалекта протокола |
0x73 |
SMB_COM_SESSION_SETUP_ANDX |
Установка сессии, аутентификация |
0x74 |
SMB_COM_LOGOFF_ANDX |
Завершение сессии |
0x75 |
SMB_COM_TREE_CONNECT_ANDX |
Расширенное подключение к общему ресурсу |
0x80 |
SMB_COM_QUERY_INFORMATION_DISK |
Запрос информации о диске/томе |
0xA0 |
SMB_COM_SEARCH |
Поиск файлов |
0xA1 |
SMB_COM_FIND |
Поиск файлов, более развитый вариант |
0xA2 |
SMB_COM_FIND_UNIQUE |
Поиск одного уникального результата |
0xA3 |
SMB_COM_FIND_CLOSE |
Закрытие операции поиска |
0xC0 |
SMB_COM_NT_TRANSACT |
NT-транзакции: безопасность, change notify и др. |
0xC1 |
SMB_COM_NT_TRANSACT_SECONDARY |
Продолжение NT-транзакции |
0xC2 |
SMB_COM_NT_CREATE_ANDX |
Создание/открытие с NT-семантикой, основной файловый open в SMB1 |
0xC4 |
SMB_COM_NT_CANCEL |
Отмена запроса |
0xC5 |
SMB_COM_NT_RENAME |
Переименование с расширенными флагами |
0xD0 |
SMB_COM_OPEN_PRINT_FILE |
Открытие файла печати |
0xD1 |
SMB_COM_WRITE_PRINT_FILE |
Запись в файл печати |
0xD2 |
SMB_COM_CLOSE_PRINT_FILE |
Закрытие файла печати |
0xD3 |
SMB_COM_GET_PRINT_QUEUE |
Получение очереди печати |
0xE0 |
SMB_COM_READ_BULK |
Массовое чтение |
0xE1 |
SMB_COM_WRITE_BULK |
Массовая запись |
0xE2 |
SMB_COM_WRITE_BULK_DATA |
Массовая запись данных |
0xFF |
SMB_COM_NONE |
Пустая/служебная команда, часто как завершитель цепочки |
5.2. Подкоманды SMB1 TRANSACTION2
SMB_COM_TRANSACTION2 использует поле Setup для указания подкоманды.
| Код | Подкоманда | Описание |
|---|---|---|
0x0000 |
TRANS2_OPEN2 |
Расширенное открытие файла |
0x0001 |
TRANS2_FIND_FIRST2 |
Начало поиска файлов |
0x0002 |
TRANS2_FIND_NEXT2 |
Продолжение поиска файлов |
0x0003 |
TRANS2_QUERY_FS_INFORMATION |
Запрос информации о файловой системе |
0x0004 |
TRANS2_SET_FS_INFORMATION |
Установка информации о файловой системе |
0x0005 |
TRANS2_QUERY_PATH_INFORMATION |
Запрос информации о файле/каталоге по пути |
0x0006 |
TRANS2_SET_PATH_INFORMATION |
Установка информации о файле/каталоге по пути |
0x0007 |
TRANS2_QUERY_FILE_INFORMATION |
Запрос информации по открытому файлу |
0x0008 |
TRANS2_SET_FILE_INFORMATION |
Установка информации по открытому файлу |
0x0009 |
TRANS2_FSCTL |
FSCTL-подобные операции, ограниченно |
0x000A |
TRANS2_IOCTL2 |
IOCTL-подобные операции, ограниченно |
0x000B |
TRANS2_FIND_NOTIFY_FIRST |
Начало уведомления об изменениях каталога |
0x000C |
TRANS2_FIND_NOTIFY_NEXT |
Продолжение уведомления об изменениях |
0x000D |
TRANS2_CREATE_DIRECTORY |
Создание каталога через TRANSACTION2 |
0x000E |
TRANS2_SESSION_SETUP |
Редко используемая/историческая операция |
5.3. Подкоманды SMB1 NT_TRANSACT
SMB_COM_NT_TRANSACT также использует поле функции/подкоманды. Набор зависит от реализации и уровня поддержки.
| Код | Подкоманда | Описание |
|---|---|---|
0x0001 |
NT_TRANSACT_CREATE |
Создание объекта, исторически/ограниченно |
0x0002 |
NT_TRANSACT_IOCTL |
IOCTL |
0x0003 |
NT_TRANSACT_SET_SECURITY_DESCRIPTOR |
Установка security descriptor |
0x0004 |
NT_TRANSACT_NOTIFY_CHANGE |
Подписка на изменения каталога |
0x0005 |
NT_TRANSACT_RENAME |
Переименование |
0x0006 |
NT_TRANSACT_QUERY_SECURITY_DESCRIPTOR |
Запрос security descriptor |
0x0007 |
NT_TRANSACT_GET_USER_QUOTA |
Запрос пользовательской квоты |
0x0008 |
NT_TRANSACT_SET_USER_QUOTA |
Установка пользовательской квоты |
5.4. Особенности SMB1
- Много устаревших команд.
- Есть несколько параллельных механизмов: обычные команды,
ANDX,TRANSACTION,TRANSACTION2,NT_TRANSACT. - Плохая масштабируемость по сравнению с SMB2.
- Исторически слабее защита.
- Многие современные серверы и клиенты отключают SMB1 по умолчанию.
6. Перечень команд SMB2 / SMB3
В SMB2 команда задаётся 16-битным полем Command.
| Код | Команда | Описание |
|---|---|---|
0x0000 |
SMB2 NEGOTIATE |
Согласование диалекта, возможностей, GUID, лимитов, безопасности |
0x0001 |
SMB2 SESSION_SETUP |
Аутентификация и создание сессии |
0x0002 |
SMB2 LOGOFF |
Завершение сессии |
0x0003 |
SMB2 TREE_CONNECT |
Подключение к общему ресурсу |
0x0004 |
SMB2 TREE_DISCONNECT |
Отключение от общего ресурса |
0x0005 |
SMB2 CREATE |
Открытие/создание файла, каталога, именованного канала |
0x0006 |
SMB2 CLOSE |
Закрытие дескриптора |
0x0007 |
SMB2 FLUSH |
Принудительный сброс данных |
0x0008 |
SMB2 READ |
Чтение данных |
0x0009 |
SMB2 WRITE |
Запись данных |
0x000A |
SMB2 LOCK |
Блокировка/разблокировка диапазонов |
0x000B |
SMB2 IOCTL |
Управляющие операции, включая FSCTL и операции с именованными каналами |
0x000C |
SMB2 CANCEL |
Отмена предыдущего запроса |
0x000D |
SMB2 ECHO |
Проверка доступности сессии |
0x000E |
SMB2 QUERY_DIRECTORY |
Перечисление содержимого каталога |
0x000F |
SMB2 CHANGE_NOTIFY |
Подписка на изменения в каталоге |
0x0010 |
SMB2 QUERY_INFO |
Запрос информации о файле, ФС, безопасности, квотах |
0x0011 |
SMB2 SET_INFO |
Установка информации о файле, ФС, безопасности, квотах |
0x0012 |
SMB2 OPLOCK_BREAK |
Уведомление/подтверждение оппортунистической блокировки или lease |
Отдельно стоит упомянуть:
| Элемент | Назначение |
|---|---|
SMB2_TRANSFORM_HEADER |
Оборачивание зашифрованного SMB2-сообщения |
SMB2_COMPRESSION_TRANSFORM_HEADER |
Сжатие данных в SMB 3.1.1 |
| Compound-запросы | Несколько SMB2-команд в одном сообщении |
| Async-сообщения | Асинхронные операции, например длительные locks/notify |
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.