Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
OST-C2-Spec — Открытая спецификация C&C | Kitploit
Инструменты/GitHubGitHub/rasta-mouse/ost-c2-spec
ЭксплуатацияЛатеральное перемещениеПост-эксплуатацияКомандование и УправлениеRed Teaming
GitHubrasta-mouse/ost-c2-spec

OST-C2-Spec

Открытая спецификация C&C

Репозиторий
2831831 год назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Черновик: Запрос на Обсуждение

Аннотация

В этом документе представлен обзор Версии 1 спецификации OST C&C. Он предназначен для подробного описания сообщений и полей, входящих в состав этих сообщений.

Введение

Мотивация, стоящая за этой спецификацией, — предоставить протокол обмена сообщениями C&C (включая постановку задач, структурированный вывод и одноранговую маршрутизацию), который можно реализовать дословно или просто использовать в качестве источника вдохновения для разработчиков проектов. Этот документ не предназначен для описания того, что такое C&C. Предполагается, что читатель понимает, что это такое и для чего используется.

Ключевые слова «MUST», «MUST NOT», «REQUIRED», «SHALL», «SHALL NOT», «SHOULD», «SHOULD NOT», «RECOMMENDED», «MAY» и «OPTIONAL» следует интерпретировать так, как описано в [RFC2119].

Допущения об окружении

Данная спецификация основана на следующих допущениях:

  • Сообщения передаются по незашифрованной сети.
  • В полезные нагрузки имплантов встроен открытый ключ RSA, используемый тем командным сервером, с которым импланту предстоит взаимодействовать.

Глоссарий

Ниже приведён список терминов, используемых в этом документе.

  • Метаданные импланта: информация, которую имплант сообщает о себе командному серверу.

  • Запрос задачи: задача, выдаваемая импланту для выполнения.

  • Ответ на задачу: статус и выходные данные (при их наличии) конкретной задачи.

  • Сеансовый ключ: уникальный ключ шифрования, используемый имплантом для шифрования своих сообщений.

  • Сообщения задач

    Заголовок задачи

    Каждое сообщение запроса задачи и ответа на неё ДОЛЖНО иметь следующий 16-байтовый заголовок.```text | Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | -------------------------------------------------------------| | 0 | Type | Code | Flags | Label | | -------------------------------------------------------------| | 1 | Identifier | Length | | -------------------------------------------------------------|

    root@kitploit:~
    - **Тип**: 1-байтовое целое число.  «Тип» этой задачи.  См. [[Типы задач и коды](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#task-types-and-codes)].
    - **Код**: 1-байтовое целое число.  «Подкод» для данного типа.  См. [[Типы задач и коды](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#task-types-and-codes)].
    - **Флаги**: 2-байтовое целое число.  Набор побитовых флагов, описывающих состояние сообщения.  См. [[Флаги задач](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#task-flags)].
    - **Метка**: 4-байтовое целое число.  Уникальная метка для сопоставления нескольких сообщений, относящихся к одной и той же задаче.
    - **Идентификатор**: 4-байтовое целое число.  Последовательный идентификатор, используемый для сборки фрагментированных сообщений в правильном порядке.
    - **Длина**: 4-байтовое целое число.  Общая длина данных задачи.
    
    ## Типы задач и коды```text
    |------------------|--------------------------|
    | Type             | Code                     |
    |------------------|--------------------------|
    | 0 - NOP          | 0                        |
    |------------------|--------------------------|
    | 1 - Exit         | 0                        |
    |------------------|--------------------------|
    | 2 - Set          | 0 - Sleep/Jitter         |
    |                  | 1 - SpawnTo              |
    |                  | 2 - BlockDLLs            |
    |                  | 3 - PPID                 |
    |------------------|--------------------------|
    | 3 - File         | 0 - Copy                 |
    |                  | 1 - Move                 |
    |                  | 2 - Delete               |
    |                  | 3 - Upload               |
    |                  | 4 - Download             |
    |------------------|--------------------------|
    | 4 - Directory    | 0 - Print                |
    |                  | 1 - Change               |
    |                  | 2 - Create               |
    |                  | 3 - Copy                 |
    |                  | 4 - Move                 |
    |                  | 5 - List                 |
    |                  | 6 - Delete               |
    |------------------|--------------------------|
    | 5 - WhoAmI       | 0                        |
    |------------------|--------------------------|
    | 6 - Process      | 0 - List                 |
    |                  | 1 - Kill                 |
    |                  | 2 - Inject Spawn         |
    |                  | 3 - Inject Explicit      |
    |------------------|--------------------------|
    | 7 - Registry     | 0 - Query                |
    |                  | 1 - Add                  |
    |                  | 2 - Delete               |
    |------------------|--------------------------|
    | 8 - RPortFwd     | 0 - Start                |
    |                  | 1 - Data                 |
    |------------------|--------------------------|
    | 9 - Environment  | 0 - Get                  |
    |                  | 1 - Set                  |
    |------------------|--------------------------|
    | 10 - SOCKS       | 0 - Connect              |
    |                  | 1 - Data                 |
    |                  | 2 - Close                |
    |------------------|--------------------------|
    | 11 - Tokens      | 0 - List                 |
    |                  | 1 - Make                 |
    |                  | 2 - Steal                |
    |                  | 3 - Use                  |
    |                  | 4 - Revert               |
    |                  | 5 - Delete               |
    |                  | 6 - Purge                |
    |------------------|--------------------------|
    | 12 - Run         | 0                        |
    |------------------|--------------------------|
    | 13 - ItemStore   | 0 - List                 |
    |                  | 1 - Add                  |
    |                  | 2 - Delete               |
    |                  | 3 - Purge                |
    |------------------|--------------------------|
    | 14 - LocalExec   | 0 - .NET                 |
    |                  | 1 - BOF                  |
    |                  | 2 - Managed PowerShell   |
    |                  | 3 - Unmanaged PowerShell |
    |------------------|--------------------------|
    | 15 - PrintScreen | 0                        |
    |------------------|--------------------------|
    | 16 - RemoteExec  | 0 - WinRM                |
    |                  | 1 - WMI                  |
    |                  | 2 - PsExec               |
    |                  | 3 - SSH                  |
    |------------------|--------------------------|
    | 17 - Link        | 1 - Link SMB             |
    |                  | 2 - Link TCP             |
    |------------------|--------------------------|
    | 18 - Unlink      | 0                        |
    |------------------|--------------------------|
    | 19 - P2P         | 0 - Acknowledge          |
    |                  | 1 - PassThru             |
    |------------------|--------------------------|
    | 20 - Jobs        | 0 - List                 |
    |                  | 1 - Kill                 |
    |---------------------------------------------|
    

    Флаги задач

    Некоторые флаги являются взаимоисключающими и НЕ ДОЛЖНЫ устанавливаться вместе. Если ни один флаг не установлен, задача СЛЕДУЕТ считать успешно завершённой, а связанный вывод (если он есть) НЕ фрагментируется.```text

    ValueDescription
    0No flags
    1Task Error
    2Task Running (as job)
    4Message is fragmented, more to follow
    8Message is fragmented, no more to follow
    root@kitploit:~
    ## Task Data
    
    Данные задачи добавляются к заголовку и представляют собой бинарную структуру, которая зависит от конкретного типа задачи и кода. Каждый тип сообщения запроса и ответа задачи определён в [[Message Definitions](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#message-definitions)].
    
    Для запроса или ответа задачи наличие данных НЕ ОБЯЗАТЕЛЬНО, если они не требуются.
    
    ## Encrypted Task Message
    
    Перед передачей заголовок задачи и данные задачи объединяются и шифруются с помощью AES с использованием ключа сеанса импланта.```text
    | Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
    | ------------------------------------ |
    |  0   |            Iv                 |
    |  8   |                               |
    | ------------------------------------ |
    |  16  |          Checksum             |
    |  24  |                               |
    |  32  |                               |
    |  40  |                               |
    | ------------------------------------ |
    |  48  |           Data                |
    |  ..  |                               |
    | ------------------------------------ |
    
    • Iv: 16-байтовый вектор инициализации.
    • Checksum: 32-байтовая контрольная сумма HMAC256.
    • Data: Зашифрованные данные.

    Обмен сообщениями

    Регистрация импланта

    Формирование IMPLANT-METADATA

    Имплант формирует сообщение [IMPLANT-METADATA], шифрует его открытым RSA-ключом team-сервера и отправляет его на team-сервер.

    Получение IMPLANT-METADATA

    Team-сервер использует свой закрытый RSA-ключ для расшифровки [IMPLANT-METADATA] импланта и ОБЯЗАН зарегистрировать его как новую сессию/обратный вызов.

    Проверка связи импланта

    Запрос проверки связи

    Метод проверки связи зависит от конкретного C2-канала и не рассматривается в данной спецификации. Зарегистрированный имплант МОЖЕТ отправлять только свой ID для проверки связи. Однако если имплант с момента последней проверки изменил свой сессионный ключ, параметры сна или джиттера, он также ОБЯЗАН повторно отправить свои метаданные.

    Ответ на проверку связи

    Если ожидающих задач нет, team-сервер МОЖЕТ ответить без данных или с фиктивными данными в виде одного или нескольких сообщений [NOP]. В противном случае он ОБЯЗАН ответить набором запросов задач, зашифрованных с помощью сессионного ключа импланта алгоритмом AES.

    Peer-to-Peer

    Получение LINK-X-REQ

    Дочерний имплант ОБЯЗАН записать свои метаданные в P2P-канал (например, именованный канал или TCP-сокет) после установления соединения с новым родителем.

    Формирование LINK-REP

    Родитель ОБЯЗАН прочитать эти метаданные и отправить их обратно на team-сервер в сообщении [LINK-REP].

    Получение LINK-REP

    Team-сервер ОБЯЗАН расшифровать метаданные дочернего импланта и зарегистрировать его как новую сессию/обратный вызов или обновить существующие связи «родитель-ребёнок» в случае отвязки и привязки (unlink & link).

    Формирование LINK-ACK

    Team-сервер ОБЯЗАН отправить сообщение [LINK-ACK] новому родителю для подтверждения ID дочернего импланта. Родителю СЛЕДУЕТ использовать поле Label сообщения для сопоставления этого процесса.

    Задачи дочерних имплантов

    Задачи для дочерних имплантов упаковываются в одно или несколько сообщений [LINK-PASS-THRU]. Они будут зашифрованы сессионным ключом родителя. После получения родитель ОБЯЗАН расшифровать сообщение и переслать упакованные данные дочернему импланту, указанному в поле child-id.

    Упакованные данные могут представлять собой саму задачу или другое сообщение LINK-PASS-THRU, если дочерний имплант находится ещё на один уровень ниже по цепочке.

    Определения сообщений

    Поля временных меток

    Все поля Timestamp передаются как 64-битные целые числа со знаком (Int64), представляющие эпоху UNIX (количество секунд, прошедших с 1 января 1970 года).

    Необязательные поля

    В некоторых языках не различаются пропущенное значение и переданное нулевое значение. Для единообразия реализации ОБЯЗАНЫ добавлять к НЕОБЯЗАТЕЛЬНЫМ полям префикс в виде байта 1 или 0 (т.е. TRUE или FALSE), указывающий, присутствует ли значение.

    Поля с префиксом длины

    При чтении данных из бинарного потока не всегда можно определить, где заканчивается одно поле и начинается другое. Данная спецификация требует использования префикса длины для таких полей, чтобы реализации знали, сколько байт или сколько элементов содержит это поле. Для следующих типов данных ОБЯЗАТЕЛЬНО использование префикса длины:

    • String (МОЖЕТ также завершаться нулевым байтом, но это не обязательно).
    • SEQUENCE, если длина не определена статически.
    • IPV4-ADDRESS.
    • IPV6-ADDRESS.

    Расширение спецификации

    Реализации МОГУТ включать типы сообщений, управляющие коды и флаги, не определённые в данной спецификации, в соответствии со своими уникальными особенностями проектирования и функциональности. Тем не менее РЕКОМЕНДУЕТСЯ использовать значения из верхней части незарезервированного пула, чтобы снизить вероятность их назначения в будущих редакциях. Реализации НЕ ДОЛЖНЫ использовать тип, код или флаг, определённый для иных целей, кроме предусмотренных.

    Не распознанные сообщения

    Реализациям СЛЕДУЕТ корректно обрабатывать получение сообщения с полями или флагами, которые они не распознают, и возвращать соответствующее сообщение об ошибке.

    IMPLANT-METADATA```text

    IMPLANT-METADATA { id [1] UInt32 session-key [2] SEQUENCE of Byte (32) sleep [3] UInt32 OPTIONAL jitter [4] UInt32 OPTIONAL username [5] String OPTIONAL host-id [6] String OPTIONAL hostname [7] String OPTIONAL domain [8] String OPTIONAL ipv4-ips [9] SEQUENCE of IPV4-ADDRESS OPTIONAL ipv6-ips [10] SEQUENCE of IPV6-ADDRESS OPTIONAL process-name [11] String OPTIONAL process-id [12] UInt32 OPTIONAL architecture [13] [Architecture] OPTIONAL platform [14] [Platform] OPTIONAL os-description [15] String OPTIONAL integrity [16] [Integrity] OPTIONAL }

    root@kitploit:~
    ### IPV4-ADDRESS```text
    IPV4-ADDRESS {
      address  [1]  SEQUENCE of Byte (4)
    }
    

    IPV6-ADDRESS```text

    IPV6-ADDRESS { address [1] SEQUENCE of Byte (16) }

    root@kitploit:~
    IP-адреса ДОЛЖНЫ передаваться в сетевом порядке байтов.
    
    ### Платформа```text
    Platform {
      Linux   = 0,
      MacOS   = 1,
      Windows = 2
    }
    

    TASK-ERROR```text

    TASK-ERROR { error-code [1] UInt32 message [2] String OPTIONAL }

    root@kitploit:~
    ## Определения NOP
    
    ### NOP```text
    NOP {
      padding  [1]  SEQUENCE of Byte  OPTIONAL
    }
    

    Определения наборов

    SET-SLEEP-REQ```text

    SET-SLEEP-REQ { interval [1] UInt32 jitter [2] Byte OPTIONAL }

    root@kitploit:~
    ### SET-SPAWNTO-REQ```text
    SET-SPAWNTO-REQ {
      spawnto  [1]  String  OPTIONAL
    }
    

    Если поле spawnto не задано, имплант ДОЛЖЕН вернуться к своей конфигурации по умолчанию.

    SET-BLOCKDLLS-REQ```text

    SET-BLOCKDLLS-REQ { blockdlls [1] Boolean OPTIONAL }

    root@kitploit:~
    Если поле `blockdlls` *не* задано, имплант ДОЛЖЕН вернуться к своей конфигурации по умолчанию.
    
    ### SET-PPID-REQ```text
    SET-PPID-REQ {
      ppid  [1]  UInt32  OPTIONAL
    }
    

    Если поле ppid не установлено, имплант СЛЕДУЕТ вернуть к его конфигурации по умолчанию.

    Определения файловой системы

    FILE-COPY-REQ```text

    FILE-COPY-REQ { source [1] String destination [2] String force [3] Boolean OPTIONAL }

    root@kitploit:~
    ### FILE-MOVE-REQ```text
    FILE-MOVE-REQ {
      source       [1]  String
      destination  [2]  String
    }
    

    FILE-DELETE-REQ```text

    FILE-DELETE-REQ { path [1] String }

    root@kitploit:~
    ### FILE-UPLOAD-REQ```text
    FILE-UPLOAD-REQ {
      destination  [1]  String
      content      [2]  SEQUENCE of Byte
    }
    

    FILE-DOWNLOAD-REQ```text

    FILE-DOWNLOAD-REQ { path [1] String }

    root@kitploit:~
    ### FILE-DOWNLOAD-REP```text
    FILE-DOWNLOAD-REP {
      current-chuck  [1]  UInt16
      total-chunks   [2]  UInt16
      chunk-content  [3]  SEQUENCE of Byte
    }
    

    DIR-PRINT-REP```text

    DIR-PRINT-REP { path [1] String }

    root@kitploit:~
    ### DIR-CHANGE-REQ```text
    DIR-CHANGE-REQ {
      path  [1]  String  OPTIONAL
    }
    

    Если поле path не задано, имплант ДОЛЖЕН изменить свою рабочую директорию на расположение 'по умолчанию' (например, домашнюю директорию пользователя).

    DIR-CREATE-REQ```text

    DIR-CREATE-REQ { path [1] String }

    root@kitploit:~
    ### DIR-CREATE-REP```text
    DIR-CREATE-REP {
      entry  [1]  [FileSystemEntry]
    }
    

    DIR-COPY-REQ```text

    DIR-COPY-REQ { source [1] String destination [2] String }

    root@kitploit:~
    ### DIR-MOVE-REQ```text
    DIR-MOVE-REQ {
      source       [1]  String
      destination  [2]  String
    }
    

    DIR-LIST-REQ```text

    DIR-LIST-REQ { path [1] String OPTIONAL access-control [2] Boolean OPTIONAL }

    root@kitploit:~
    Если поле `path` *не* задано, имплант ДОЛЖЕН вывести список своего текущего рабочего каталога.
    
    ### DIR-LIST-REP```text
    DIR-LIST-REP {
      entries  [1]  SEQUENCE of [FileSystemEntry]
    }
    

    DIR-DELETE-REQ```text

    DIR-DELETE-REQ { path [1] String recurse [2] Boolean OPTIONAL }

    root@kitploit:~
    ### FileSystemEntry```text
    FileSystemEntry {
      path            [1]  String
      length          [2]  UInt32                      OPTIONAL
      attributes      [3]  [FileAttributes]            OPTIONAL
      owner           [4]  String                      OPTIONAL
      created         [5]  Timestamp                   OPTIONAL
      last-accessed   [6]  Timestamp                   OPTIONAL
      last-written    [7]  Timestamp                   OPTIONAL
      access-control  [8]  SEQUENCE of [FileSecurity]  OPTIONAL
    }
    

    FileAttributes

    Битовые флаги.```text FileAttributes { Normal = 1, Archive = 2, Compressed = 4, ReadOnly = 8, Hidden = 16, Directory = 32, System = 64 }

    root@kitploit:~
    ### FileSecurity```text
    FileSecurity {
      identity     [1]  String
      access-mask  [2]  Int32
      inheritance  [3]  [Inheritance]  OPTIONAL
      propagation  [4]  [Propagation]  OPTIONAL
    }
    

    Наследование

    Побитовые флаги.```text Inheritance { None = 0, ContainerInherit = 1, ObjectInherit = 2, }

    root@kitploit:~
    ### Распространение
    
    Побитовые флаги.```text
    Propagation {
      None               = 0,
      NoPropagateInherit = 1,
      InheritOnly        = 2,
    }
    

    Определения WhoAmI

    WHOAMI-REP```text

    WHOAMI-REP { primary [1] String impersonation [2] String OPTIONAL }

    root@kitploit:~
    ## Определения процессов
    
    ### PROC-LIST-REP```text
    PROC-LIST-REP {
      processes  [1]  SEQUENCE of [ProcessEntry]
    }
    

    PROC-KILL-REQ```text

    PROC-KILL-REQ { process-id [1] UInt32 force [2] Boolean OPTIONAL }

    root@kitploit:~
    ### PROC-INJ-REQ```text
    PROC-INJ-REQ {
      shellcode   [1]  SEQUENCE of Byte
      capability  [2]  SEQUENCE of Byte
      process-id  [3]  UInt32            OPTIONAL
    }
    

    ProcessEntry```text

    ProcessEntry { process-name [1] String process-id [2] UInt32 parent-process-id [3] UInt32 OPTIONAL session-id [4] Byte OPTIONAL owner [5] String OPTIONAL architecture [6] [Architecture] OPTIONAL integrity [7] [Integrity] OPTIONAL }

    root@kitploit:~
    ### Архитектура```text
    Architecture {
      X86   = 0,  // 32-bit Intel
      X64   = 1,  // 64-bit Intel
      Arm   = 2,  // 32-bit ARM
      Arm64 = 3,  // 64-bit ARM
      Wasm  = 4   // WebAssembly
    }
    

    Целостность```text

    Integrity { Untrusted = 0, Low = 1, Medium = 2, // user High = 3, // sudoers System = 4 // root }

    root@kitploit:~
    ## Определения реестра
    
    ### REG-QUERY-REQ```text
    REG-QUERY-REQ {
      hive            [1]  [RegistryHive]
      key             [2]  String          OPTIONAL
      value           [3]  String          OPTIONAL
      access-control  [4]  Boolean         OPTIONAL
    }
    

    REG-QUERY-REP```text

    REG-QUERY-REP { values [1] SEQUENCE of [RegistryValue] keys [2] SEQUENCE of [RegistryKey] }

    root@kitploit:~
    ### REG-ADD-REQ```text
    REG-ADD-REQ {
      hive   [1]  [RegistryHive]
      key    [2]  String
      name   [3]  String               OPTIONAL
      kind   [4]  [RegistryValueKind]  OPTIONAL
      value  [5]  SEQUENCE of Byte     OPTIONAL
    }
    

    REG-DELETE-REQ```text

    REG-DELETE-REQ { hive [1] [RegistryHive] key [2] String }

    root@kitploit:~
    ### RegistryHive```text
    RegistryHive {
      ClassesRoot   = 0,
      CurrentUser   = 1,
      LocalMachine  = 2,
      Users         = 3,
      CurrentConfig = 4
    }
    

    RegistryKey```text

    RegistryKey { name [1] String access-control [2] [RegistrySecurity] OPTIONAL }

    root@kitploit:~
    ### RegistryValue```text
    RegistryValue {
      name            [1]  String
      type            [2]  [RegistryValueKind]
      data            [3]  SEQUENCE of Byte
      access-control  [4]  SEQUENCE of [RegistrySecurity]  OPTIONAL
    }
    

    RegistryValueKind```text

    RegistryValueKind { None = 0, // REG_NONE String = 1, // REG_SZ ExpandString = 2, // REG_EXPAND_SZ Binary = 3, // REG_BINARY DWord = 4, // REG_DWORD MultiString = 5, // REG_MULTI_SZ Qword = 6 // REG_QWORD }

    root@kitploit:~
    ### RegistrySecurity```text
    RegistrySecurity {
      identity     [1]  String
      access-mask  [2]  Int32
      inheritance  [3]  [Inheritance]  OPTIONAL
      propagation  [4]  [Propagation]  OPTIONAL
    }
    

    Определения обратного проброса портов

    RPORTFWD-START```text

    RPORTFWD-START { bind-port [1] UInt16 localhost-only [2] Boolean OPTIONAL forward-host [3] String forward-port [4] UInt16 }

    root@kitploit:~
    ### RPORTFWD-DATA```text
    RPORTFWD-DATA {
      data  [1]  SEQUENCE of Byte
    }
    

    Определения окружения

    ENV-GET-REQ```text

    ENV-GET-REQ { key [1] String }

    root@kitploit:~
    ### ENV-GET-REP```text
    ENV-GET-REP {
      value  [1]  String
    }
    

    ENV-SET-REQ```text

    ENV-SET-REQ { key [1] String value [2] String }

    root@kitploit:~
    ## Определения SOCKS
    
    ### SOCKS-CONNECT-REQ```text
    SOCKS-CONNECT-REQ {
      id      [1]  UInt32
      target  [2]  SEQUENCE of Byte (4)
      port    [3]  UInt16
    }
    

    SOCKS-DATA```text

    SOCKS-DATA { id [1] UInt32 data [2] SEQUENCE of Byte }

    root@kitploit:~
    ### SOCKS-CLOSE-REQ```text
    SOCKS-CLOSE-REQ {
      id  [1]  UInt32
    }
    
    ## Token Definitions
    
    ### TOKEN-LIST-REP
    
    ```text
    TOKEN-LIST-REP {
      tokens  [1]  SEQUENCE of [TokenEntry]
    }```
    
    ### TOKEN-CREATE-REQ
    
    ```text
    TOKEN-CREATE-REQ {
      username  [1]  String
      domain    [2]  String  OPTIONAL
      password  [3]  String  OPTIONAL
    }```
    
    ### TOKEN-STEAL-REQ
    
    ```text
    TOKEN-STEAL-REQ {
      process-id   [1]  UInt32
      access-mask  [2]  UInt32  OPTIONAL
    }```
    
    ### TOKEN-USE-REQ
    
    ```text
    TOKEN-USE-REQ {
      index  [1]  Byte
    }```
    
    ### TOKEN-DELETE-REQ
    
    ```text
    TOKEN-DELETE-REQ {
      index  [1]  Byte
    }```
    
    ### TokenEntry
    
    ```text
    Token {
      index       [1]  Byte
      username    [2]  String
      handle      [3]  String  OPTIONAL
      process-id  [4]  UInt32  OPTIONAL
    }```
    
    ## Implant Store Definitions
    
    ### STORE-LIST-REP
    
    ```text
    STORE-LIST-REP {
      items  [1]  SEQUENCE OF [StoreItem]
    }```
    
    ### STORE-ADD-ITEM Definition
    
    ```text
    STORE-ADD-ITEM-REQ {
      item  [1]  SEQUENCE of Byte
      name  [2]  String
      type  [3]  [StoreItemType]
    }```
    
    ### STORE-DELETE-ITEM Definition
    
    ```text
    STORE-DELETE-ITEM-REQ {
      index  [1]  Byte
    }```
    
    ### StoreItem
    
    ```text
    StoreItem {
      index  [1]  Byte
      name   [2]  String
      type   [3]  [StoreItemType]
    }```
    
    ### StoreItemType
    
    ```text
    StoreItemType {
      Assembly = 0,
      BOF      = 1,
      Script   = 2,
      Generic  = 3
    }```
    
    ## Local Execution Definitions
    
    ### RUN-REQ
    
    ```text
    RUN-REQ {
      program    [1]  String
      arguments  [2]  String  OPTIONAL
      token      [3]  Byte    OPTIONAL
    }```
    
    ### RUN-REP
    
    ```text
    RUN-REP {
      output  [1]  String
    }```
    
    ### EXEC-ASM-REQ
    
    Either store-index or assembly MUST be provided.
    
    ```text
    EXEC-ASM-REQ {
      store-index  [1]  Byte                OPTIONAL
      assembly     [2]  SEQUENCE of Byte    OPTIONAL
      arguments    [3]  SEQUENCE of String  OPTIONAL
      bypass-amsi  [4]  Boolean             OPTIONAL
      bypass-etw   [5]  Boolean             OPTIONAL
    }```
    
    ### EXEC-ASM-REP
    
    ```text
    EXEC-ASM-REP {
      output  [1]  String
    }```
    
    ### EXEC-BOF-REQ
    
    Either store-index or bof MUST be provided.
    
    ```text
    EXEC-BOF-REQ {
      store-index  [1]  Byte              OPTIONAL
      bof          [2]  SEQUENCE of Byte  OPTIONAL
      arguments    [3]  SEQUENCE of Byte  OPTIONAL
      bypass-amsi  [4]  Boolean           OPTIONAL
      bypass-etw   [5]  Boolean           OPTIONAL
    }```
    
    ### EXEC-BOF-REP
    
    ```text
    EXEC-BOF-REP {
      output  [1]  String
    }```
    
    ### EXEC-POSH-REQ
    
    Either store-index or script MUST be provided.
    
    ```text
    EXEC-POSH-REQ {
      cmdlet       [1]  String
      store-index  [2]  Byte              OPTIONAL
      script       [3]  SEQUENCE of Byte  OPTIONAL
      bypass-amsi  [3]  Boolean           OPTIONAL
      bypass-etw   [4]  Boolean           OPTIONAL
    }```
    
    ### EXEC-POSH-REP
    
    ```text
    EXEC-POSH-REP {
      output  [1]  String
    }```
    
    ## Screenshot Definitions
    
    ### SCRNSHOT-REP
    
    ```text
    SCRNSHOT-REP {
      data  [1]  SEQUENCE of Byte
    }```
    
    ## Remote Execution Definitions
    
    ### WINRM-REQ
    
    ```text
    WINRM-REQ {
      target     [1]  String
      program    [2]  String
      arguments  [3]  String  OPTIONAL
    }```
    
    ### WMI-REQ
    
    ```text
    WMI-REQ {
      target     [1]  String
      program    [2]  String
      arguments  [3]  String  OPTIONAL
    }```
    
    ### PSEXEC-REQ
    
    ```text
    PSEXEC-REQ {
      target               [1]  String
      service-name         [2]  String
      service-description  [3]  String  OPTIONAL
      bin-path             [4]  String
    }```
    
    ## Peer-to-Peer Definitions
    
    ### LINK-SMB-REQ
    
    ```text
    LINK-SMB-REQ {
      target    [1]  String
      pipename  [2]  String
    }```
    
    ### LINK-TCP-REQ
    
    ```text
    LINK-TCP-REQ {
      target  [1]  String
      port    [2]  UInt32
    }```
    
    ### LINK-REP
    
    ```text
    LINK-SMB-REP {
      child-metadata  [1]  SEQUENCE of Byte
    }```
    
    ### LINK-ACK
    
    ```text
    LINK-ACK {
      child-id  [1]  UInt32
    }```
    
    ### LINK-PASS-THRU
    
    ```text
    LINK-PASS-THRU {
      child-id  [1]  UInt32
      message   [2]  SEQUENCE of Byte
    }```
    
    ## JOB Definitions
    
    ### JOB-LIST-REP
    
    ```text
    jobs  [1]  Последовательность [JobEntry]```
    
    ### JOB-KILL-REQ
    
    ```text
    index  [1]  UInt32```
    
    ### JobEntry
    ```text
    index  [1]  UInt32
      type   [2]  Byte
      code   [3]  Byte```
    
    Скачать инструмент