Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
Outils/GitHubGitHub/rasta-mouse/ost-c2-spec
ExploitationMouvement LatéralPost-ExploitationCommandement et ContrôleRed Teaming
GitHubrasta-mouse/ost-c2-spec

OST-C2-Spec

Source ouverte C&C Spécification

Voir le dépôt
283183il y a 1 anVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Brouillon : Demande de Discussion

Résumé

Ce document donne un aperçu de la version 1 de la spécification OST C&C. Il est destiné à fournir une description détaillée des messages et des champs contenus dans ces messages.

Introduction

La motivation derrière cette spécification est de fournir un protocole de messagerie C&C (incluant les tâches, la sortie structurée et le routage pair-à-pair) qui peut être implémenté tel quel, ou simplement servir d'inspiration aux développeurs de projets. Ce document n'est pas destiné à décrire ce qu'est un C&C. Il est supposé que le lecteur comprend ce que c'est et à quoi cela sert.

Les mots-clés « MUST », « MUST NOT », « REQUIRED », « SHALL », « SHALL NOT », « SHOULD », « SHOULD NOT », « RECOMMENDED », « MAY » et « OPTIONAL » doivent être interprétés comme décrit dans RFC2119.

Hypothèses environnementales

Cette spécification repose sur les hypothèses suivantes :

  • Les messages sont envoyés sur un réseau non chiffré.
  • Les charges utiles des implants embarquent la clé publique RSA utilisée par le serveur d'équipe avec lequel elles sont destinées à communiquer.

Glossaire des termes

Voici une liste des termes utilisés dans ce document.

  • Métadonnées de l'implant: Informations qu'un implant rapporte sur lui-même à un serveur d'équipe.

  • Requête de tâche: Tâche donnée à un implant pour qu'il l'exécute.

  • Réponse de tâche: Le statut et la sortie (le cas échéant) d'une tâche donnée.

  • : Clé de chiffrement unique utilisée par un implant pour chiffrer ses messages.

Télécharger l’outil
Clé de session

Messages de tâche

En-tête de tâche

Chaque message de requête et de réponse de tâche DOIT avoir l'en-tête de 16 octets suivant.```text | Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | -------------------------------------------------------------| | 0 | Type | Code | Flags | Label | | -------------------------------------------------------------| | 1 | Identifier | Length | | -------------------------------------------------------------|

root@kitploit:~
- **Type**: entier de 1 octet.  Le 'type' de tâche.  Voir [[Types de tâches et codes](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#task-types-and-codes)].
- **Code**: entier de 1 octet.  Un 'sous-code' pour le Type donné.  Voir [[Types de tâches et codes](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#task-types-and-codes)].
- **Flags**: entier de 2 octets.  Un ensemble de drapeaux binaires décrivant l'état du message.  Voir [[Drapeaux de tâche](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#task-flags)].
- **Label**: entier de 4 octets.  Une étiquette unique pour corréler plusieurs messages liés à la même tâche.
- **Identifier**: entier de 4 octets.  Un identifiant séquentiel utilisé pour reconstruire les messages fragmentés dans le bon ordre.
- **Length**: entier de 4 octets.  La longueur totale des données de la tâche.

## Types de tâches et codes```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                 |
|---------------------------------------------|

Indicateurs de tâche

Certains indicateurs sont mutuellement exclusifs et NE DOIVENT PAS être définis ensemble. Si aucun indicateur n'est défini, une tâche DEVRAIT être considérée comme terminée avec succès et la sortie associée (le cas échéant) n'est PAS fragmentée.```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:~
## Données de tâche

Les données de tâche sont ajoutées à l'en-tête et consistent en une structure binaire, selon le type et le code de tâche spécifiques.  Chaque type de message de requête et de réponse de tâche est défini dans [[Message Definitions](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#message-definitions)].

Il n'est PAS OBLIGATOIRE qu'une requête ou une réponse de tâche contienne des données si cela n'est pas requis.

## Message de tâche chiffré

Avant la transmission, l'en-tête de tâche et les données de tâche sont combinés puis chiffrés avec AES avec la clé de session de l'implant.```text
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| ------------------------------------ |
|  0   |            Iv                 |
|  8   |                               |
| ------------------------------------ |
|  16  |          Checksum             |
|  24  |                               |
|  32  |                               |
|  40  |                               |
| ------------------------------------ |
|  48  |           Data                |
|  ..  |                               |
| ------------------------------------ |
  • Iv: un vecteur d'initialisation de 16 octets.
  • Checksum: une somme de contrôle HMAC256 de 32 octets.
  • Data: les données chiffrées.

Échanges de messages

Enregistrement de l'implant

Un implant DOIT s'enregistrer auprès d'un serveur d'équipe avant de pouvoir recevoir ou envoyer des données de tâche.

Génération d'IMPLANT-METADATA

L'implant génère un message [IMPLANT-METADATA], le chiffre avec la clé publique RSA du serveur d'équipe, puis l'envoie à ce dernier.

Réception de l'IMPLANT-METADATA

Le serveur d'équipe utilise sa clé privée RSA pour déchiffrer l'[IMPLANT-METADATA] de l'implant et DOIT l'enregistrer en tant que nouvelle session/callback.

Check-in de l'implant

Un implant DOIT effectuer un « check-in » auprès du serveur d'équipe pour recevoir les éventuelles données de tâche en attente pour lui-même ou ses enfants.

Requête de check-in

La méthode de check-in est spécifique au canal C2 et n'entre pas dans le cadre de cette spécification. Un implant enregistré PEUT envoyer uniquement son ID pour effectuer le check-in. Toutefois, si l'implant a depuis modifié sa clé de session, sa configuration de sleep ou de jitter, il DOIT également renvoyer ses métadonnées.

Réponse de check-in

S'il n'y a aucune tâche en attente, un serveur d'équipe PEUT répondre sans données, ou avec des données factices sous la forme d'un ou de plusieurs messages [NOP]. Dans le cas contraire, il DOIT répondre avec une collection de requêtes de tâche chiffrées par AES avec la clé de session de l'implant.

Pair-à-pair

Réception de LINK-X-REQ

Un implant enfant DOIT écrire ses métadonnées sur le canal P2P (par exemple, un named pipe ou une socket TCP) dès qu'une connexion est établie avec un nouveau parent.

Génération de LINK-REP

Le parent DOIT lire ces métadonnées et les renvoyer au serveur d'équipe dans un message [LINK-REP].

Réception de LINK-REP

Le serveur d'équipe DOIT déchiffrer les métadonnées de l'enfant et l'enregistrer en tant que nouvelle session/callback, ou mettre à jour les relations parent-enfant existantes en cas de unlink & link.

Génération de LINK-ACK

Le serveur d'équipe DOIT renvoyer un message [LINK-ACK] au nouveau parent pour confirmer l'ID de l'enfant. Le parent DEVRAIT utiliser le Label du message pour corréler ce processus.

Tâches des enfants

Les tâches destinées aux implants enfants sont encapsulées dans un ou plusieurs messages [LINK-PASS-THRU]. Ceux-ci seront chiffrés avec la clé de session du parent. Dès réception, le parent DOIT déchiffrer le message et transmettre les données encapsulées à l'implant enfant indiqué par le champ child-id.

Les données encapsulées peuvent être la tâche elle-même ou un autre LINK-PASS-THRU si l'enfant est un niveau plus bas dans la chaîne.

Définitions des messages

Champs Timestamp

Tous les champs Timestamp sont transmis sous forme d'entiers signés 64 bits (Int64) qui représentent l'époque UNIX (le nombre de secondes écoulées depuis le 1er janvier 1970).

Champs optionnels

Certains langages ne font pas de distinction entre une valeur omise et une valeur transmise égale à zéro. Pour des raisons de cohérence, les implémentations DOIVENT préfixer les champs OPTIONNELS avec un octet 1 ou 0 (c.-à-d. TRUE ou FALSE) pour indiquer si la valeur est présente ou non.

Champs avec préfixe de longueur

Il n'est pas toujours possible de savoir quand un champ se termine et quand un autre commence lors de la lecture de données depuis un flux binaire. Cette spécification impose de préfixer ces champs avec une valeur de longueur, afin que les implémentations sachent combien d'octets, ou combien d'éléments, ce champ contient. Les types de données suivants DOIVENT être préfixés par une longueur :

  • String (PEUT également être terminée par un octet nul, mais ce n'est pas obligatoire).
  • SEQUENCEs dont la longueur n'est pas définie statiquement.
  • IPV4-ADDRESS.
  • IPV6-ADDRESS.

Extension de la spécification

Les implémentations PEUVENT inclure des types de messages, des codes de contrôle et des indicateurs qui ne sont pas définis dans cette spécification, selon leur conception et leurs fonctionnalités uniques. Cependant, il est RECOMMANDÉ d'utiliser des valeurs situées dans la partie supérieure du pool non réservé afin de réduire le risque qu'elles soient attribuées dans une révision future. Les implémentations NE DOIVENT PAS utiliser un type, un code ou un indicateur défini pour un usage autre que celui prévu.

Messages non reconnus

Les implémentations DEVRAIENT gérer avec élégance la réception d'un message contenant des champs ou des indicateurs qu'elles ne reconnaissent pas et renvoyer un message d'erreur approprié.

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:~
Les adresses IP DOIVENT être transmises dans l'ordre des octets du réseau.

### Platform```text
Platform {
  Linux   = 0,
  MacOS   = 1,
  Windows = 2
}

TASK-ERROR```text

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

root@kitploit:~
## Définitions NOP

### NOP```text
NOP {
  padding  [1]  SEQUENCE of Byte  OPTIONAL
}

Définitions des ensembles

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
}

Si le champ spawnto n'est pas défini, l'implant devrait revenir à sa configuration par défaut.

SET-BLOCKDLLS-REQ```text

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

root@kitploit:~
Si le champ `blockdlls` n'est *pas* défini, l'implant DEVRAIT revenir à sa configuration par défaut.

### SET-PPID-REQ```text
SET-PPID-REQ {
  ppid  [1]  UInt32  OPTIONAL
}

Si le champ ppid n'est pas défini, l'implant DEVRAIT revenir à sa configuration par défaut.

Définitions du système de fichiers

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
}

Si le champ path n'est pas défini, l'implant DEVRAIT changer son répertoire de travail vers un emplacement 'par défaut' (par exemple, le répertoire personnel de l'utilisateur).

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:~
Si le champ `path` n'est *pas* défini, l'implant DEVRAIT lister son répertoire de travail courant.

### 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

Drapeaux binaires.```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
}

Héritage

Indicateurs binaires.```text Inheritance { None = 0, ContainerInherit = 1, ObjectInherit = 2, }

root@kitploit:~
### Propagation

Drapeaux binaires.```text
Propagation {
  None               = 0,
  NoPropagateInherit = 1,
  InheritOnly        = 2,
}

Définitions WhoAmI

WHOAMI-REP```text

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

root@kitploit:~
## Définitions de processus

### 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:~
### Architecture```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
}

Intégrité```text

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

root@kitploit:~
## Définitions du registre

### 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
}

Définitions du transfert de port inverse

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
}

Définitions d'environnement

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 Définitions

### 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 }

root@kitploit:~

### 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

root@kitploit:~
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]  Séquence de [JobEntry]```

### JOB-KILL-REQ

```text
index  [1]  UInt32```

### JobEntry
```text
index  [1]  UInt32
  type   [2]  Byte
  code   [3]  Byte```