Arquitectura
Componentes del sistema
JustC2 se compone de cuatro elementos principales que trabajan juntos:
JustServer (Servidor)
El servidor es el núcleo del framework, escrito en Go. Sus responsabilidades incluyen:
- Gestión de conexiones — Acepta conexiones de clientes (operadores) y agentes simultáneamente
- API REST — Expone endpoints sobre TLS para todas las operaciones
- WebSocket — Canal de comunicación en tiempo real con los clientes para notificaciones y sincronización
- Carga de plugins — Carga dinámicamente los extenders (
.so) al inicio - Base de datos — Almacena agentes, tareas, credenciales, targets y descargas en SQLite
- Compilación de agentes — Compila payloads en tiempo real usando el toolchain de Go del sistema
- Gestión de túneles — Maneja proxies SOCKS y port forwarding
Estructura del servidor
JustServer/
├── core/
│ ├── connector/ # API REST y WebSocket (Gin framework)
│ ├── database/ # Capa de persistencia SQLite
│ ├── eventing/ # Sistema de eventos y notificaciones
│ ├── extender/ # Cargador de plugins .so
│ ├── profile/ # Parsing de profile.yaml
│ ├── server/ # Lógica central del teamserver
│ └── utils/ # Criptografía, tokens JWT, logging
├── extenders/ # Código fuente de los extenders
├── go.mod
├── go.work
├── profile.yaml # Configuración principal
└── ssl_gen.sh # Script de generación de certificadosJustClient (Cliente)
El cliente gráfico está desarrollado en C++ con Qt6 y utiliza varias bibliotecas especializadas:
- Qt6 — Framework de interfaz gráfica multiplataforma
- Qlementine — Motor de temas JSON para personalización visual
- KDDockWidgets — Sistema de paneles acoplables y reorganizables
- Konsole — Emulador de terminal integrado
Funcionalidades de la interfaz
| Panel | Descripción |
|---|---|
| Sesiones (tabla) | Lista de agentes activos con estado, IP, usuario, etc. |
| Sesiones (grafo) | Vista gráfica de la red con nodos por agente |
| Consola | Terminal de interacción con cada agente |
| Listeners | Gestión de listeners activos |
| Tareas | Historial de tareas y jobs en ejecución |
| Túneles | Gestión de proxies SOCKS y port forwarding |
| Descargas | Control de descargas activas y completadas |
| Credenciales | Base de datos de credenciales recolectadas |
| Targets | Registro de sistemas objetivo |
| Capturas | Galería de capturas de pantalla |
| Chat | Comunicación entre operadores |
| Terminales | Sesiones de terminal interactivas |
Extenders (Plugins)
Los extenders son bibliotecas compartidas (.so) compiladas en Go que implementan la funcionalidad de listeners y agentes. Cada extender se define mediante un archivo config.yaml:
# Ejemplo: extender de listener
extender_type: "listener"
extender_file: "listener_beacon_http.so"
ax_file: "ax_config.axs"
listener_name: "BeaconHTTP"
listener_type: "external"
protocol: "http"# Ejemplo: extender de agente
extender_type: "agent"
extender_file: "agent_beacon.so"
ax_file: "ax_config.axs"
agent_name: "beacon"
agent_watermark: "be4c0149"
listeners:
- "BeaconHTTP"
- "BeaconTCP"
- "BeaconSMB"
- "BeaconDNS"
multi_listeners: falseTipos de extenders
| Tipo | Plugin | Descripción |
|---|---|---|
| Listener | listener_beacon_http.so | Listener HTTP para Beacon |
| Listener | listener_beacon_tcp.so | Listener TCP bind para Beacon |
| Listener | listener_beacon_smb.so | Listener SMB bind para Beacon |
| Listener | beacon_listener_dns.so | Listener DNS para Beacon |
| Listener | listener_gopher_tcp.so | Listener TCP para Gopher |
| Agent | agent_beacon.so | Builder y handler del agente Beacon |
| Agent | agent_gopher.so | Builder y handler del agente Gopher |
Agentes (Implantes)
Los agentes son los ejecutables que se despliegan en los sistemas objetivo. Se compilan dinámicamente en el servidor a partir del código fuente incluido en el directorio del extender correspondiente (src_beacon/, src_gopher/).
Flujo de datos
Conexión del operador
1. Operador inicia JustClient
2. Introduce host:port, usuario y contraseña
3. Cliente envía POST /endpoint/login con credenciales
4. Servidor valida (SHA-256 constant-time compare)
5. Servidor retorna access_token + refresh_token (JWT)
6. Cliente abre WebSocket en /endpoint/connect (via OTP)
7. Cliente solicita sincronización inicial POST /endpoint/sync
8. Servidor envía estado completo (agentes, listeners, tareas...)Comunicación con agentes
1. Agente se conecta al listener (HTTP callback, TCP bind, etc.)
2. Listener procesa el handshake y registra al agente
3. Servidor asigna un ID único y notifica a los clientes via WS
4. Operador envía comandos desde la consola del cliente
5. Comandos se encolan como tareas para el agente
6. En el próximo check-in, el agente recibe las tareas pendientes
7. Agente ejecuta y devuelve resultados
8. Servidor procesa resultados y notifica a los clientesSistema de tokens
JustC2 utiliza JWT con dos tipos de token:
- Access Token — Vida corta (configurable, por defecto 12 horas), usado para autenticar cada petición API
- Refresh Token — Vida larga (configurable, por defecto 168 horas / 7 días), usado para renovar el access token sin reautenticar
Módulo axc2
El módulo axc2 es una biblioteca Go compartida que define los tipos de datos e interfaces comunes entre el servidor y los extenders:
- Interfaces de plugin —
PluginListener,PluginAgent,ExtenderListener,ExtenderAgent - Estructuras de datos —
AgentData,TaskData,ListenerData,TunnelData, etc. - Callbacks —
TunnelCallbacks,TerminalCallbackspara operaciones asíncronas - Constantes — Estados de descarga, tipos de túnel, códigos SOCKS5
Los extenders importan este módulo para implementar las interfaces requeridas, mientras que el servidor lo usa internamente para definir las estructuras de datos compartidas.