
Especificación de C&C de código abierto
Borrador: Solicitud de Discusión
Este documento proporciona una visión general de la Versión 1 de la Especificación OST C&C. Su objetivo es ofrecer una descripción detallada de los mensajes y de los campos que contienen.
La motivación detrás de esta especificación es proporcionar un protocolo de mensajería C&C (que incluya asignación de tareas, salida estructurada y enrutamiento peer-to-peer) que pueda implementarse literalmente, o simplemente servir de inspiración para los desarrolladores de proyectos. Este documento no pretende describir qué es C&C. Se asume que el lector entiende qué es y para qué se utiliza.
Las palabras clave "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" y "OPTIONAL" deben interpretarse tal como se describe en [RFC2119].
Esta especificación asume lo siguiente:
A continuación se presenta una lista de términos utilizados a lo largo de este documento.
Metadatos del implante: Información que un implante reporta sobre sí mismo a un servidor de equipo.
Solicitud de tarea: Una tarea dada a un implante para que la realice.
Respuesta de tarea: El estado y la salida (si la hay) de una tarea determinada.
Clave de sesión: Una clave de cifrado única utilizada por un implante para cifrar sus mensajes.
Cada mensaje de solicitud y respuesta de tarea DEBE tener el siguiente encabezado de 16 bytes.```text | Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | -------------------------------------------------------------| | 0 | Type | Code | Flags | Label | | -------------------------------------------------------------| | 1 | Identifier | Length | | -------------------------------------------------------------|
- **Type**: entero de 1 byte. El 'tipo' de tarea que es. Ver [[Tipos de tareas y códigos](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#task-types-and-codes)].
- **Code**: entero de 1 byte. Un 'subcódigo' para el Tipo dado. Ver [[Tipos de tareas y códigos](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#task-types-and-codes)].
- **Flags**: entero de 2 bytes. Un conjunto de banderas de bits para describir el estado del mensaje. Ver [[Banderas de tarea](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#task-flags)].
- **Label**: entero de 4 bytes. Una etiqueta única para correlacionar múltiples mensajes relacionados con la misma tarea.
- **Identifier**: entero de 4 bytes. Un identificador secuencial utilizado para construir mensajes fragmentados en el orden correcto.
- **Length**: entero de 4 bytes. La longitud total de los datos de la tarea.
## Tipos de tareas y códigos```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 |
|---------------------------------------------|
Algunos indicadores son mutuamente excluyentes y NO DEBEN establecerse juntos. Si no se establece ningún indicador, se DEBERÍA asumir que una tarea se completó correctamente y la salida asociada (si la hay) NO está fragmentada.```text
| Value | Description |
|---|---|
| 0 | No flags |
| 1 | Task Error |
| 2 | Task Running (as job) |
| 4 | Message is fragmented, more to follow |
| 8 | Message is fragmented, no more to follow |
## Datos de la tarea