
Marco de investigación de comando y control (C2) cifrado para educación en ciberseguridad, laboratorios de red team y experimentos de comunicación segura cliente‑servidor.
BlackBerryC2 es un framework de administración remota y C2 encriptado diseñado exclusivamente para uso educativo, investigación de seguridad y entornos de laboratorio controlados.

El proyecto demuestra cómo construir un servidor de comando y control personalizado con criptografía a nivel de aplicación, gestión de sesiones y comunicación segura con el cliente sin depender de pilas TLS externas.
Este proyecto NO es malware y NO está destinado para acceso no autorizado.
BlackBerryC2:
Úselo solo en sistemas y redes de su propiedad o para los que tenga autorización explícita para probar.
Dependencias de Python:
pip install cryptography prompt_toolkit zstandard
zstandardes opcional pero recomendado para transferencias mayores de 1 GB.
get -r, put -r)-b) — no bloqueantes, cancelables.partial + .resume)generate-payload)BlackBerryHTTPs_TLSProxyGUI)log)BlackBerryC2 v2.0 establece comunicación segura de la siguiente manera:
REQUEST_PUBKEY.secp256r1).HMAC_PRE_SHARED_SECRET).Cada sesión mantiene:
Todas las claves criptográficas se generan en tiempo de ejecución y nunca se reutilizan entre reinicios (a menos que se establezca --persistente).
python3 BlackBerryC2_server.py
Configuración por defecto:
0.0.0.09949Ejemplos:
# Inicio básico (solicita frase de paso para el registro)
python3 BlackBerryC2_server.py
# Claves ECDHE persistentes + verbose
python3 BlackBerryC2_server.py -p -vv
# Puerto personalizado, sin verificación HMAC
python3 BlackBerryC2_server.py -P 8080 --no-secure
# Port-knocking en puertos personalizados
python3 BlackBerryC2_server.py --spa --spa-mode knock --knock-seq 9001,9002,9003
# Modo BerryTransfer con auto-confirmación
python3 BlackBerryC2_server.py --berrytransfer --auto-confirm
# Ver/descifrar registros sin iniciar el servidor
python3 BlackBerryC2_server.py --logs
select <ID>)BerryTransfer es un modo de servidor dedicado solo a la transferencia de archivos inspirado en scp. Cuando está activo, el servidor rechaza todo acceso a la shell y solo acepta comandos de protocolo BT:*.
Inicio:
python3 BlackBerryC2_server.py --berrytransfer
python3 BlackBerryC2_server.py --berrytransfer --auto-confirm # sin aviso al operador para GETs
Comandos del shell BerryTransfer:
El registro de transferencias se escribe en logs/bt_transfer.jsonl (opcionalmente cifrado con AES-256-GCM).
Cuando --spa está activo, los clientes deben autenticarse vía UDP antes de que se acepte la conexión TCP.
Modo SPA (por defecto): El cliente envía un token HMAC-SHA256 de 32 bytes a SPA_UDP_PORT.
token = HMAC-SHA256(HMAC_SECRET, "{ip}:{time_window_30s}")
Modo Knock: El cliente toca una secuencia de puertos UDP en orden dentro de una ventana de tiempo.
python3 BlackBerryC2_server.py --spa --spa-mode knock --knock-seq 7001,7002,7003 --knock-timeout 10
Las IPs autorizadas son válidas durante --spa-ttl segundos (por defecto 60).
Vea los registros con el visor integrado:
BlackBerry> log
O de forma independiente (sin servidor):
python3 BlackBerryC2_server.py --logs
Este proyecto está destinado solamente para:
El uso no autorizado contra sistemas sin permiso está estrictamente prohibido.
Consulte el archivo LICENSE para obtener detalles completos de la licencia.
Este software se proporciona "tal cual", sin garantía de ningún tipo.
Los autores no asumen ninguna responsabilidad por el uso indebido o los daños causados por este software.
logs/last_start.json| Flag | Descripción |
|---|
-p / --persistente | Usa claves ECDHE persistentes de ecdhe-cert/ (solicita frase de paso) |
-v | Registro de depuración (debug) |
-vv | Registro verbose (relajado) |
-H <host> | Host de escucha (por defecto: 0.0.0.0) |
-P <port> | Puerto de escucha (por defecto: 9949) |
--no-secure | Acepta cualquier cliente ECDHE sin verificación HMAC |
--hmac <secret> | Secreto precompartido HMAC personalizado (hex o cadena) |
--log-passphrase <pass> | Cifra el registro del servidor con AES-256-GCM (PBKDF2 600k iter) |
--logs | Visor de registros interactivo — no inicia el servidor |
--spa | Habilita pre-autenticación SPA/port-knocking |
--spa-mode <spa|knock> | spa = token UDP único, knock = secuencia de puertos |
--spa-port <port> | Puerto UDP para el listener SPA (por defecto: 7331) |
--knock-seq <ports> | Secuencia de puertos para modo knock (por defecto: 7001,7002,7003) |
--knock-timeout <sec> | Segundos para completar la secuencia knock (por defecto: 10) |
--spa-ttl <sec> | Segundos que una IP autorizada permanece válida (por defecto: 60) |
--berrytransfer | Modo BerryTransfer: solo transferencia de archivos, sin shell |
--transfer-root <dir> | Directorio raíz para BerryTransfer (por defecto: ./berry_transfers) |
--auto-confirm | Aprueba automáticamente todas las solicitudes GET en BerryTransfer (sin aviso al operador) |
| Comando | Descripción |
|---|
list | Lista sesiones activas con estadísticas y nombre de host |
select <ID> | Interactúa con una sesión de cliente |
all <cmd> | Envía un comando a todos los clientes conectados |
report | Informe completo del estado del servidor (tiempo activo, sesiones, transferencias) |
set host <HOST> | Cambia el host de escucha (reengancha el servidor) |
set port <PORT> | Cambia el puerto de escucha (reengancha el servidor) |
sVbanner "<text>" | Cambia el banner de servicio |
generate-payload | Genera un payload para el cliente |
fingerprint | Muestra la huella digital de la clave ECDHE del servidor (SHA-256) |
ecdhe-keys | Imprime el par de claves ECDHE actual (PEM) |
kill <id|ip> | Termina una sesión por ID o IP |
block <IP> | Bloquea permanentemente una IP |
unblock <IP> | Desbloquea una IP (persistente + temporal) |
blocklist | Muestra las IPs bloqueadas (persistentes y temporales) |
log | Visor de registros interactivo (soporta registros encriptados) |
report | Resumen de estado: tiempo activo, sesiones, transferencias |
banner | Vuelve a mostrar el banner de inicio |
clean | Elimina los archivos de registro del servidor |
v | Alterna el registro de depuración (DEBUG) |
vv | Alterna el registro verbose (VERBOSE) |
cd <dir> | Cambia el directorio de trabajo local del servidor |
E <cmd> | Ejecuta comando mediante os.system localmente |
<any command> | Ejecuta localmente en el servidor |
exit | Detiene el servidor y sale |
| Comando | Descripción |
|---|
proxy | Inicia el demonio proxy TLS/HTTP (modo automático) |
proxy --mode <mode> | Modos: auto, tls, http, https, both, all |
proxy --stats | Muestra estadísticas del proxy |
proxy gui | Inicia la GUI del proxy (proceso separado) |
stop-proxy | Detiene el demonio proxy |
stop-proxy-gui | Detiene la GUI del proxy |
proxy-help | Ayuda completa del proxy |
| Comando | Descripción |
|---|
help | Muestra ayuda de la sesión |
exit | Vuelve al shell principal |
!<cmd> | Ejecuta comando localmente en el servidor |
<cmd> | Ejecuta comando en el cliente remoto |
cmd1 && cmd2 | Cadena: ejecuta cmd2 solo si cmd1 tuvo éxito |
cmd1 || cmd2 | Cadena: ejecuta cmd2 solo si cmd1 falló |
cmd1 ; cmd2 | Cadena: siempre ejecuta cmd2 |
| Comando | Descripción |
|---|
get <file> | Descarga archivo del cliente |
get <dir> -r | Descarga recursiva de directorio |
get <file> -b | Descarga en segundo plano (no bloqueante) |
get <dir> -r -b | Descarga recursiva en segundo plano |
put <file> | Sube archivo al cliente |
put <file> -exc | Sube y ejecuta en memoria (scripts) |
put <dir> -r | Subida recursiva de directorio |
put <file> -b | Subida en segundo plano |
transfers | Lista todas las transferencias activas y completadas |
stop <ID> | Cancela una transferencia en segundo plano (ej. stop T1) |
resume <local_file> | Reanuda una descarga interrumpida |
screenshot | Captura la pantalla del cliente |
| Comando | Descripción |
|---|
confirm <ID> | Aprueba una solicitud GET pendiente |
deny <ID> | Rechaza una solicitud GET pendiente |
pending | Lista solicitudes GET en espera de aprobación |
auto [on|off] | Activa/desactiva o establece auto-confirmación |
clients | Muestra sesiones BerryTransfer activas |
ls [dir] | Lista archivos en la raíz de transferencia |
tree [dir] | Árbol de archivos de la raíz de transferencia |
find <name> | Busca archivo en la raíz de transferencia |
rm <file> | Elimina archivo de la raíz de transferencia (con confirmación) |
log [N] | Muestra las últimas N entradas del registro de transferencias (por defecto 30) |
cd <dir> | Cambia el directorio de trabajo local |
pwd | Muestra el directorio local actual |
!<cmd> | Ejecuta comando local del sistema |
exit | Detiene el servidor BerryTransfer |
| Característica | Detalles |
|---|
| Intercambio de claves | ECDHE secp256r1 efímero o persistente |
| Cifrado de sesión | AES-256-GCM, nonce aleatorio de 12 bytes por mensaje |
| Autenticación del cliente | HMAC-SHA256 sobre secreto compartido durante el handshake |
| Integridad del mensaje | HMAC-SHA256 por paquete (cubre seq + nonce + ciphertext) |
| Antirrepetición | Rastreador de ventana de números de secuencia por sesión |
| Protección contra degradación | Tamaño mínimo de clave AES forzado (256 bits) |
| Limitación de velocidad de heartbeat | Mínimo 3s entre heartbeats; se rastrean violaciones |
| Protección contra inundación de comandos | Limitador de velocidad; desconexión automática tras umbral |
| Detección de escaneo | Contadores de escaneo de conexión, captura de banner, fallos de handshake |
| Gestión de IPs | Lista de bloqueo persistente + baneos temporales (automáticos y manuales) |
| Cifrado de registros | AES-256-GCM + PBKDF2-HMAC-SHA256 (600k iteraciones) |
| Jitter en respuestas | Jitter aleatorio de 10–50ms para resistir ataques de temporización |
| Pre-autenticación | Token SPA o port-knocking antes de aceptar TCP |
| Archivo de registro | Contenido |
|---|
logs/BlackBerryC2_Server.log | Registro rotativo en texto plano del servidor (INFO+) |
logs/BlackBerryC2_enc.log | Registro del servidor encriptado (si se estableció --log-passphrase) |
logs/sessions.jsonl | Eventos de sesión: conexión, desconexión, bytes |
logs/bt_transfer.jsonl | Registro de transferencias de archivos de BerryTransfer |
logs/last_start.json | Instantánea de configuración de inicio (host, puerto, token, pid) |