Detecta cámaras IP en tu red doméstica, te dice si están capadas, e intenta descaparlas. De un solo click.
Hecho para gente que se quedó una cámara IP de un proveedor de alarmas (Movistar Prosegur, Securitas Direct, etc.) después de dar de baja el servicio, o que se ha olvidado las credenciales de su propia cámara, o que simplemente quiere auditar qué hay conectado en su LAN.
Sólo Python stdlib. Cero dependencias externas. Funciona en Windows, Linux y macOS.
Este software es solo para usarse contra cámaras que sean de tu propiedad o para las que tengas autorización explícita. Escanear y/o intentar acceder a dispositivos ajenos sin permiso puede ser delito en tu jurisdicción (en España, art. 197 y 264 del Código Penal). El autor no se responsabiliza del uso indebido.
Casos de uso legítimos:
- Recuperar el acceso a una cámara IP propia con credenciales olvidadas.
- Reusar hardware abandonado por un proveedor de servicios (con el contrato finalizado).
- Auditar la postura de seguridad de tu propia red doméstica.
- Aprender sobre seguridad de dispositivos IoT en un entorno controlado.
git clone https://github.com/IsoDev1337/CamScan.git
cd CamScan
# Doble click en descapar.bat (Windows)
# o
py camscan.pyEl script:
- Encuentra cámaras en tu red
- Identifica el fabricante real (aunque la cámara esté rebrandeada)
- Prueba credenciales por defecto
- Si están capadas, intenta romper con exploits conocidos
- Te da la URL RTSP lista para pegar en VLC
- Ping sweep paralelo del
/24local - Lectura de la tabla ARP
- OUI lookup contra una base interna de prefijos MAC de fabricantes de cámaras IP
- Escaneo TCP de 25 puertos típicos (HTTP, RTSP, ONVIF, DVRIP, XMEye, etc.)
- Fingerprint HTTP por banner del servidor, rutas características y contenido del body
- Soporte para Hikvision, Dahua, XiongMai/XM, Foscam, Reolink, Axis, Mobotix, TP-Link Tapo
- Detección de stubs cloud (Eagle Eye Networks, Movistar Prosegur, etc.)
- Lista priorizada por vendor + genéricas (~30 combos)
- HTTP Basic Y Digest (implementado en stdlib, sin libs externas)
- Validación contra endpoints que requieren auth — evita falsos positivos con páginas estáticas
- CVE-2021-33044 (Dahua/Imou auth bypass vía
clientType: NetKeyboard) - CVE-2021-33045 (Dahua/Imou auth bypass vía
loginType: Loopback) - Escalada de privilegio vía
system.multicall - Exploración del servicio
PasswdFind - 6 variantes de factory reset remoto (
magicBox.factoryResety sinónimos)
- Dump completo de config vía
configManager.getConfigymagicBox.* - Búsqueda de hashes de password en el dump
- Activación remota de RTSP/ONVIF
- Cambio de credenciales (
userManager.modifyUser,addUser)
- Sondeo de 12 paths de snapshot HTTP (Dahua, Hikvision, ONVIF, etc.)
- Sondeo de 8 paths de stream MJPEG
- Probe de ONVIF
GetSystemDateAndTime(no requiere auth por spec) - Handshake RTMP en :1935
- Handshake DVRIP en :37777
- Cliente RTSP nativo (no necesita
ffprobe) - Soporta Basic y Digest auth
- Templates de URL específicas por fabricante
Requisitos:
- Python 3.10+ (probado en 3.10, 3.11, 3.12, 3.14)
- Permisos para ejecutar
pingy leer la tabla ARP (en Windows funciona out-of-the-box; en Linux puede que necesitessudopara el ping)
git clone https://github.com/IsoDev1337/CamScan.git
cd CamScanNo hay pip install. No hay dependencias. Es a propósito.
py camscan.pyO doble click en descapar.bat (Windows). Lanza el pipeline completo: discovery → identificación → creds → exploits → vista.
py camscan.py discover # solo descubrimiento
py camscan.py scan 192.168.1.50 # escaneo de puertos
py camscan.py fingerprint 192.168.1.50 # identificar OEM
py camscan.py creds 192.168.1.50 # probar credenciales por defecto
py camscan.py rtsp 192.168.1.50 # probar URLs RTSP
py camscan.py report 192.168.1.50 # scan + fingerprint + creds
py camscan.py attack 192.168.1.50 # auth-bypass Dahua/Imou
py camscan.py attack 192.168.1.50 --no-takeover # solo sondeo, no modifica
py camscan.py view 192.168.1.50 # busca vista sin credenciales
py camscan.py reset 192.168.1.50 # FACTORY RESET REMOTO (destructivo)CamScan solo da dos estados, sin medias tintas confusas:
- ABIERTA (verde): hay URL RTSP que puedes pegar en VLC. Se acabó la historia.
- CAPADA (rojo): no se puede ver. La nota explica exactamente por qué.
▸ 192.168.1.50 (Hikvision)
OEM real: Hikvision (score 5)
✓ Credenciales: admin/12345
✓ Stream RTSP funciona
192.168.1.50 ABIERTA
RTSP: rtsp://admin:12345@192.168.1.50:554/Streaming/Channels/101
Web : http://192.168.1.50:80 (admin/12345)
▸ 192.168.1.237 (Dahua/Imou)
⚠ Web bloqueada por cloud: Stub de cloud genérico
✗ Ninguna credencial por defecto funciona
Probando auth-bypass Dahua/Imou…
✓ Exploit CVE-2021-33044 funciona
· modifyUser 'admin': OK
· enable RTSP via Rtsp: OK
✓ DESCAPADA vía exploit
192.168.1.237 ABIERTA
RTSP: rtsp://admin:NuevaPass@192.168.1.237:554/cam/realmonitor?channel=1&subtype=0
▸ 192.168.1.237 (Dahua/Imou)
✓ Exploit CVE-2021-33044 funciona (NetKeyboard)
· modifyUser 'admin': fail — error 604 (privilegio insuficiente)
✗ Exploit OK pero sin cambio de credenciales ni acceso al stream
192.168.1.237 CAPADA
Nota: Auth-bypass CVE-2021-33044 (NetKeyboard) funciona, pero la sesión está
capada: el firmware rechaza modificar credenciales (error 604) y RTSP
sigue exigiendo la password real de admin. Sin acceso físico o a la
nube del proveedor, esta cámara no se puede ver.
▸ 192.168.1.171 (B4:E2:65:46:5A:6E, OUI desconocido)
⚠ No parece una cámara — posiblemente otro IoT (enchufe, repetidor, etc.)
192.168.1.171 CAPADA
Nota: Probablemente no es una cámara. Verifica con `py camscan.py scan 192.168.1.171`
Toda la data está en data/*.json — editable sin tocar código:
| Fichero | Qué contiene |
|---|---|
ports.json |
Puertos típicos de cámara y su descripción |
oui.json |
Prefijos MAC → fabricante |
fingerprints.json |
Firmas HTTP para identificar OEMs |
creds.json |
Credenciales por defecto, genéricas y por vendor |
rtsp_paths.json |
Templates de URL RTSP por fabricante |
¿Tienes una cámara con un fabricante no soportado? Añade su OUI, su fingerprint y su URL RTSP a esos JSONs y el pipeline la cogerá automáticamente. PRs bienvenidas.
Esto no es magia. No abre cámaras que estén realmente bien aseguradas:
-
Firmware moderno con todos los CVEs parcheados — si la cámara recibió actualizaciones recientes (>2022), los auth-bypass de Dahua/Imou ya no muerden.
-
Cloud-managed devices con password aleatoria — algunos proveedores (Movistar Prosegur, Securitas, Ring) inicializan cada cámara con una password aleatoria por dispositivo, almacenada solo en su nube. Sin acceso al cloud account = sin password = sin acceso. Y los exploits que tienen acceso administrativo a esos firmwares modernos rara vez tienen permiso para extraer o cambiar la pass (se ha visto: bypass da sesión "NetKeyboard" con privilegios capados, suficiente para activar servicios pero no para tocar
userManager). -
Cámaras con factory-reset que no toca el firmware — algunas variantes OEM (notable: la firmware Movistar Prosegur basada en Imou IPC-A22E-S2) tienen un botón de reset que solo borra la config de usuario, no el firmware capador. En ese caso solo UART/JTAG da una vía real.
-
Wireguard del proveedor — algunos servicios encierran la cámara en una VPN propia. Si pierdes el certificado de cliente, la cámara queda en una red privada inaccesible.
-
No hay brute force masivo de credenciales — la cámara se bloquea típicamente cada 5 intentos fallidos durante 5 minutos. El tool no fuerza contra eso a propósito; no merece la pena.
- Cámaras IP china OEM cualquiera con firmware <2021 → 80%+ tasa de éxito
- Cámaras propias con creds olvidadas → 90%+ tasa de éxito
- Detección y fingerprint de cualquier IPC → ~100% (aunque no se pueda entrar)
- Activación de RTSP/ONVIF en cámaras Dahua/Imou de hasta ~2022 con CVE → muy alto
- Firmware Movistar Prosegur 2020+ basado en Imou — confirmado experimentalmente, ver caso de estudio abajo
- Hikvision con security baseline reciente y "activación inicial" forzada
- Reolink con firmware ≥3.x
- Cualquier cosa detrás de TLS client cert obligatorio
Esta es la cámara que motivó la herramienta. Resumen del análisis completo:
| Campo | Valor |
|---|---|
| Modelo etiquetado | Eagle Eye Networks EN-CCUZ-002a |
| Modelo OEM real | Imou IPC-A22E-S2 |
| SoC | Sigmastar SSC325DE |
| Firmware | 2.800.00PS001.1.R (build 2020-12-06) |
| OEMVersion | 00PS001 (build especial Prosegur) |
| Puertos abiertos | 80 (stub Eagle Eye), 554 (RTSP), 1935 (RTMP), 37777 (DVRIP-TLS) |
Qué funciona:
- Identificación: la detecta como Dahua/Imou bajo el rebrand.
- CVE-2021-33044 (NetKeyboard): muerde, da sesión válida.
configManager.setConfigcon sesión bypass: funciona (puedes activar RTSP/ONVIF).- Dump completo de
configManager.getConfig,magicBox.*,userManager.getActiveUserInfoAll: funciona.
Qué NO funciona:
- Credenciales por defecto contra HTTP/RTSP/ONVIF — la pass admin es aleatoria por dispositivo, set por Movistar durante el provisioning.
- CVE-2021-33045 (Loopback): parcheado.
userManager.modifyUser: error 604 (privilegio insuficiente — la sesión NetKeyboard está capada por diseño).userManager.modifyPassword: error 611 (exige pwdOld real, no acepta empty).userManager.addUser: error 609.system.multicallcon userManager dentro: el privilege check se aplica a cada call interna.PasswdFind.*: el servicio existe pero los métodos retornan "Method not found".magicBox.factoryResety 5 variantes: todas rechazadas.- Lectura de la tabla
Account(donde están los hashes): protegida. - Reset físico del botón: borra config de usuario pero NO el firmware capador.
Conclusión: la única vía remaining sería UART/TFTP reflash. Movistar/Prosegur hizo bien su trabajo en este modelo.
El dump completo del análisis está incluido en el commit history como referencia para gente que se encuentre con la misma cámara.
Estructura del pipeline en cmd_auto():
┌─────────────────────────────────────────┐
│ 1. Discovery (ping sweep + ARP) │
└──────────────┬──────────────────────────┘
▼
┌─────────────────────────────────────────┐
│ 2. Candidatos a cámara │
│ (OUI match OR puerto delator) │
└──────────────┬──────────────────────────┘
▼
┌─────────────────────────────────────────┐
│ 3. Fingerprint OEM (HTTP banner+paths) │
└──────────────┬──────────────────────────┘
▼
┌─────────────────────────────────────────┐
│ 4. Detección de cloud-lock (stubs) │
└──────────────┬──────────────────────────┘
▼
┌─────────────────────────────────────────┐
│ 5. Test credenciales por defecto │
└────┬─────────────────┬───────────────────┘
│ HIT │ MISS
▼ ▼
Test RTSP ┌───────────────────────┐
│ │ 6. RTSP con default │
│ OK │ (sin web válida) │
▼ └────┬──────────────────┘
ABIERTA │ MISS
▼
┌─────────────────────────────────┐
│ 7. Auth-bypass Dahua/Imou │
│ (CVE-2021-33044/33045) │
└────┬───────────┬────────────────┘
│ HIT │ MISS
▼ ▼
Takeover ┌─────────────────────┐
(modify │ 8. View sin auth │
+ RTSP │ (snapshot/MJPEG/ │
+ ONVIF │ ONVIF/RTMP) │
retry) └────┬────────────────┘
│ │
┌─────────┤ │
│ stream │ sin │
│ funciona│ stream │
▼ ▼ ▼
ABIERTA CAPADA CAPADA
(honesto) (con motivo)
El status final es binario por diseño: ABIERTA si hay URL pegable en VLC, CAPADA en cualquier otro caso. La nota explica con detalle por qué.
Cosas pendientes que aceptaría como contribución:
- Módulo UART/TFTP para reflasheo guiado (con
pyserialopcional) - Soporte Hikvision: explotar CVE-2017-7921 (auth bypass por
?auth=YWRtaW46MTEK) - Soporte Hikvision ISAPI: PUT /ISAPI/Security/users/1 con XML para reset de pass
- Discovery por WS-Discovery multicast (UDP 3702) — encuentra cámaras incluso sin ARP entry
- Brute force RTSP con wordlist + manejo del lockout (re-intentar después del cooldown)
- Soporte para Reolink, mejorando los paths actuales
- Generación automática de URL RTSP a partir de respuesta ONVIF
GetStreamUri - Export a Frigate
config.yaml(cámaras detectadas → config listo para usar)
Aceptado y bienvenido:
-
Añadir vendors en los JSONs: si tienes una cámara que el tool no reconoce, añade su MAC OUI a
data/oui.json, su fingerprint HTTP adata/fingerprints.json, y los paths RTSP adata/rtsp_paths.json. PR directo. -
Nuevos CVEs: si conoces algún exploit de auth bypass publicado contra fabricantes soportados, añádelo siguiendo el patrón de
exploit_dahua_authbypass(). -
Bugs: abre un issue con la salida completa del subcomando que falle.
-
Mejoras de output / UX: bienvenidas, sobre todo en plataformas no-Windows.
CamScan/
├── camscan.py # Tool principal (single file, stdlib only)
├── descapar.bat # Launcher Windows
├── data/
│ ├── ports.json # Puertos típicos de cámara
│ ├── oui.json # Prefijos MAC → fabricante
│ ├── fingerprints.json # Firmas HTTP por vendor
│ ├── creds.json # Credenciales por defecto
│ └── rtsp_paths.json # Templates RTSP por vendor
├── README.md
├── LICENSE
└── .gitignore # Excluye dump_*.json (sensible)
MIT. Uso a tu propio riesgo. No te metas en líos.
- Comunidad de ipcamtalk.com por años de ingeniería inversa publicada sobre Dahua/Imou
- Investigadores de las CVEs que usa este tool: bashis (CVE-2021-33044/33045), QihooJ
- Hilo de elotrolado.net sobre cámaras Movistar Prosegur — el aviso de "está todo capado por el firmware" estaba bien dado
- Manual y FCC database de Eagle Eye Networks por la info del modelo EN-CCUZ-002a