Skip to content

IsoDev1337/CamScan

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CamScan

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.


⚠️ Disclaimer

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.

TL;DR

git clone https://github.com/IsoDev1337/CamScan.git
cd CamScan
# Doble click en descapar.bat (Windows)
#   o
py camscan.py

El script:

  1. Encuentra cámaras en tu red
  2. Identifica el fabricante real (aunque la cámara esté rebrandeada)
  3. Prueba credenciales por defecto
  4. Si están capadas, intenta romper con exploits conocidos
  5. Te da la URL RTSP lista para pegar en VLC

Capacidades

Descubrimiento

  • Ping sweep paralelo del /24 local
  • 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.)

Identificación

  • 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.)

Credenciales

  • 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

Exploits implementados

  • 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.factoryReset y sinónimos)

Post-explotación

  • Dump completo de config vía configManager.getConfig y magicBox.*
  • Búsqueda de hashes de password en el dump
  • Activación remota de RTSP/ONVIF
  • Cambio de credenciales (userManager.modifyUser, addUser)

Visualización sin credenciales

  • 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

Test RTSP

  • Cliente RTSP nativo (no necesita ffprobe)
  • Soporta Basic y Digest auth
  • Templates de URL específicas por fabricante

Instalación

Requisitos:

  • Python 3.10+ (probado en 3.10, 3.11, 3.12, 3.14)
  • Permisos para ejecutar ping y leer la tabla ARP (en Windows funciona out-of-the-box; en Linux puede que necesites sudo para el ping)
git clone https://github.com/IsoDev1337/CamScan.git
cd CamScan

No hay pip install. No hay dependencias. Es a propósito.


Uso

Modo express (recomendado)

py camscan.py

O doble click en descapar.bat (Windows). Lanza el pipeline completo: discovery → identificación → creds → exploits → vista.

Modo experto — subcomandos

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)

Estados que verás

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é.

Ejemplos de salida

Cámara abierta (mejor caso)

▸ 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)

Cámara que se descapa vía exploit

▸ 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

Cámara realmente capada (firmware blindado)

▸ 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.

IoT confundido con cámara

▸ 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`

Personalización

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.


Limitaciones

Esto no es magia. No abre cámaras que estén realmente bien aseguradas:

  1. Firmware moderno con todos los CVEs parcheados — si la cámara recibió actualizaciones recientes (>2022), los auth-bypass de Dahua/Imou ya no muerden.

  2. 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).

  3. 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.

  4. 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.

  5. 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.

Lo que SÍ funciona bien

  • 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

Lo que NO funciona

  • 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

Caso de estudio: Cámara Movistar Prosegur EN-CCUZ-002a

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.setConfig con 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.multicall con userManager dentro: el privilege check se aplica a cada call interna.
  • PasswdFind.*: el servicio existe pero los métodos retornan "Method not found".
  • magicBox.factoryReset y 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.


Cómo funciona

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é.


Roadmap / TODO

Cosas pendientes que aceptaría como contribución:

  • Módulo UART/TFTP para reflasheo guiado (con pyserial opcional)
  • 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)

Contribuir

Aceptado y bienvenido:

  1. 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 a data/fingerprints.json, y los paths RTSP a data/rtsp_paths.json. PR directo.

  2. Nuevos CVEs: si conoces algún exploit de auth bypass publicado contra fabricantes soportados, añádelo siguiendo el patrón de exploit_dahua_authbypass().

  3. Bugs: abre un issue con la salida completa del subcomando que falle.

  4. Mejoras de output / UX: bienvenidas, sobre todo en plataformas no-Windows.


Estructura del repo

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)

License

MIT. Uso a tu propio riesgo. No te metas en líos.


Reconocimientos

  • 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

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors