الخميس، 1 أغسطس 2013

Go Deep Pro (1 de 2)

GO Deep Pro
Analizando el WIFI de la GoPro
En esta pequeña entrada analizaremos el trafico de portátil, diminuta pero potente GoPro Hero 3.
Por ahí alguno aun no lo sabe, pero las nuevas GoPro Hero en su serie 3 incluyen conectividad wifi para poder operarlas remotamente. También existe el adaptador para convertir tu "vieja" hero 1 y 2 en wifi también. que funciona casi de la misma manera.

La camara posee un boton directo para prender la funcion wifi sin encender la camara en si. Este boton dispara el modulo de wifi y levanta un navegador web internamente en la camara. Por defecto es algo asi como GOPRO-BP-######, donde # el numero de serie de la camara, y sin password. Para poder cambiar el SSID y ponerle password hay que descargar una tool de gopro, que baja el firmware y lo edita con la configuracion que nosotros elijamos y re-flashea la camara (en resumen no es algo de todos los dias andar cambiando la configuracion de la wifi).
Para poder acceder a la camara desde la GOPRO o desde la pc (como mostraremos) necesitamos conectarnos a esa red wifi que no da (si, la camara queda en modo AP). 

Al conectanos nos otorga una IP en el rango 10.5.5.100 en adelante, y siendo siempre la 10.5.5.9 la IP de la camara, (la respuesta de DHCP tambien asigna como puerta de enlace la ip 10.5.5.9, dns 8.8.8.8 y sec 4.4.4.4)

La aplicacion oficial de GoPro de android al abrirse dispara 2 peticiones:

1 - DNS Query a gopro.com
2 - Connection HTTP a 10.5.5.9 

Si el query de DNS responde, la app comienza a hacer peticiones de URL al servidor de GoPro y de Youtube para luego cargar los videos destacados de la semana, sino resuelve no intenta abrir ningun link.

Si la conneccion a 10.5.5.9 es correcta comienza a hacer una serie de peticiones bastantes peculiares que las analizaremos a continuacion:

1: GET /bacpac/cv HTTP/1.1\r\n 
La respuesta de la peticion es un archivo llamado cv, que contiene la SSID de la wifi de la camara, o sea si configuramos nuestra camara para que la wifi se llamara "pepe" el archivo CV contendra "pepe"

2: GET /bacpac/sd HTTP/1.1\\r\\n
La respuesta de la peticion es un archivo llamado sd, que contiene la password de la wifi de la camara, o sea si configuramos para que sea 1234, el contendi de este archivo sera 1234.

La contraseña de la wifi es la que nos dara acceso al servidor web. Imagino yo (y es una opinion personal) con el afan de hacer la aplicacion facil y sin mucha configuracion, los programadores hicieron esto de que la camara devuelva la contraseña tras una peticion especifica, total hay que tener la contraseña para poder conectarte a la wifi en una primera instancia, y siendo que la APP no puede obtener la contraseña del wifi almacenada en el celular (al menos no sin acceso root).

3: GET /bacpac/se?t=1234
Esto es una especie de "ping". El software hace esta peticion cada 2 segundos, para saber que la camara aun sigue ahi. La respuesta es un archivo llamado se, de 14 bytes, en este archivo le dice a la app en que modo esta la camara (video, photo, burst, etc) y el nivel de bateria. Notese tambien que de ahora en adelante toda la comunicacion con la camara se realiza con el parametro t con el contenido (si, en plano y por url) la contraseña.

De esta manera ya nos vamos dando cuenta que toda la comunicacion con la camara es mediante peticiones GET, no por post.

Comandos encontrados:

PW: (Power)
A: GET /bacpac/PW?t=1234&p=%01
Comando PW: Encender y apagar camara, el valor %01 enciende la camara y el valor la apaga. (o sea haciendo esta peticion desde cualquier navegador, hacia la ip de la camara la encenderá o apagara)

PV: (Preview)
B: GET /camera/PV?t=1234&p=%01
(notese que el directorio de la peticion cambio a "camara") Comando PV: Este comando nos permite activar y desactivar el modo streamning de la camara siendo el valor %01 off y el %02 on.
Cuando activamos el streamming (la aplicacion de android lo hace para mostrar el preview en pantalla del celular) el SO de la camara abre el puerto 8080

Live Stream: (Una ves activdo el commando PV)
C: GET /live/amba.m3u8 (peticion realizada en el puerto 8080)
Esto inicia la descarga del archivo de datos de stream AMBA.m3u8. Si usamos un cliente de stream como el VLC podremos ver la camara computadora. 

A esta altura todo ya viaja sin autenticacion (ni basica), o sea, si la camara tiene habilitado el "preview" o streaming, con ir directo a esa URL ya podremos ver la camara, o hasta podremos pedir los archivos separados de secuencia:
#EXTM3U
#EXT-X-TARGETDURATION:1
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:7016
#EXTINF:0.26693,
amba_hls-16.ts
#EXTINF:0.26693,
amba_hls-1.ts
#EXTINF:0.26693,
amba_hls-2.ts
#EXTINF:0.26693,
amba_hls-3.ts
#EXTINF:0.26693,
amba_hls-4.ts
#EXTINF:0.26693,
amba_hls-5.ts
#EXTINF:0.26693,
amba_hls-6.ts
#EXTINF:0.26693,
amba_hls-7.ts

con hacer un get directo de cualquier archivo .ts del listado tendremos un video de 2 segundos directo de la camara.

SH: (Shooter)
D: GET /bacpac/SH?t=1234&p=%01
Comando SH: Activa el disparo, dependiendo de el modo en que se encuentre la camara, si es video comienza a grabar, si es foto, saca una foto, es virtualmente simil a precionar el boton de disparo de la camara (fisicamente), se encuentra la variable esta funciona solo en modo video o time lapse, que detiene la grabacion.

CM: (ChangeMode)
E: GET /camera/CM?t=1234&p=
El comando CM cambia el modo de la camara (el modo actual de la camara, al apagar la camara y encender volvera a iniciar con el modo predefinido). Modificadores:

: Modo Video
%01: Modo Foto
%02: Modo Burst (Foto secuencia)
%03: Modo 
Time Lapse (Foto cada X segundos)

VR: (VideoRecording)
F: GET /camera/VR?t=1234&p=
El comando VR cambia las opciones del modo de grabacion de Video. Modificadores:

: WVGA 60
%01:
%02: 720 30
%03: 720 60
%04: 960 30
%05:
%06: 1080 30

TM: (Time)
G: GET /camera/TM?t=1234&p=%0d%07%07%10%2b%2d
El comando TM setea la fecha de la cam.

LL: (Locate)
H: GET /camera/LL?t=1234&p=%01
El commando LL inicia una serie de pitidos en la camara para encontrarla. Esta segura pitando hasta que se le pase el comando con el modificador

CN: (ChangeName)
I: GET /camera/CN?t=1234&p=%09Nombre_Nuevo
El comando CH cambia el nombre interno de la camara (no la SSID de la wifi). Este nombre figurara en la APP cuando se conecte a esta camara.


DL: (Delete)
J: GET /camera/DL?t=1234
El comando DL borra el ultimo archivo de la SD

DA: (Delete All)
K: GET /camera/DA?t=1234
Borra todo el contenido de la SD (Incluyendo los archivos ocultos .LRV que genera la camara cuando graba video.  No toca ningun archivo que no tenga el formato de nombre de gopro (o sea, generado por la camara). 


Otras Curiosidades:
La camara al encender genera un archivo dentro de /MISC/version.txt donde contiene los datos de la camara. Este archivo es consultado desde el servidor web (en modo preview en el puerto 8080) por la aplicacion.


{
"info version":"1.1",
"firmware version":"HD3.01.01.10",
"wifi version": "3.4.2.9",
"wifi bootloader version": "0.2.2",
"wifi mac":"xx:xx:xx:xx:xx:xx",
"camera type":"Hero3-White Edition",


Tambien la aplicacion de actualizacion de gopro (java) consulta este archivo.

Opinion sobre seguridad.

Mas alla de lo obvio, de la peticion en plano, del protocolo http (y no ssl o ttl), y si nos conformaramos con que la seguridad sea el saber la pass de la wifi, igual surgen pequeñeces:



  • Si desconectas el wifi del celu, por ejemplo te acordastes de chekear un correo o mandar un mensaje por internet, y te cambias de wifi a uno con acceso a internet, la app de gopro, sigue enviando el "ping" a la camara para ver si aun sigue ahi, con la password en plano en la peticion. Por lo que quedara pegado por todos lados la contraseña de la camara.
  • Lo mismo pasa si apagas el wifi de la camara, algo bastante normal. Si te has cansado de jugar con la camara o se quedo sin bateria, el celular al no tener conexion con la wifi, se conectara a la proxima en  su lista, y la app de la gopro enviara la peticion con la contraseña, hacia ese AP. 
  • Debido a que tarde o temprano el soft de gopro se conecta enviando la contraseña en plano por la url, cuando configuras la firmware para ponerle una contraseña, el software no te deja poner caracteres "raros" ni espacios. Por lo que ya sabemos que la contraseña de la gopro tendra solo caracteres alfanumericos (por ahi facilitando un poquito mas un ataque de bruteforce).
  • Si tienes acceso a la red wifi de la camara, tienes acceso a todo. Reflashear un firmware no es algo que cualquiera haga, ni que se realice todos los dias. Muchas camaras quedaran con la wifi por defecto, y quienes le hayan puesto una, si se descubre la contraseña (ya sea viendo los de un ap o accediendo al telefono o pc donde se guardo la red wifi) es dificil que el dueño de la camara vuelva a pasar por todo el proceso de flasheo para cambiar periodicamente la contraseña (recordemos que es la unica manera de cambiar la SSID y PASS del wifi de la gopro).
  • La firmware es procesada localmente por el soft y luego enviada a la camara, por lo que facilita el trabajo a quienes gusten modificar el firmware a gusto y flashearselo (claro, con el riesgo que conlleva "brikear" la cam).
WebServer

     Habilitando el modo streaming, la camara abre el puerto 8080, sin restricciones (cualquiera conectado a la red wifi tiene acceso a la memoria de la camara de forma directa, al igual que al streaming en vivo)
GoPro Connector PIN-Out


  1. GND
  2. R video out – component Pb/Cb or composite (composite video out activated by grounding ID3 and ID4, component video out activate by grounding ID2 – only valid for old firmwares, current versions require eeprom).
  3. G video out – component Y
  4. B video out – component Pr/Cr
  5. USB +5V power
  6. as above
  7. USB Data+
  8. USB Data-
  9. GND
  10. Audio out Right
  11. Audio out Left
  12. Pwr/Mode button (tie to ground to activate)
  13. Playback mode button (tie to ground to activate)
  14. Audio in Right
  15. Audio in Left
  16. IR input
  17. Trig digital output
  18. GND (?)
  19. ID1 digital input
  20. ID2 digital input
  21. ID3 digital input
  22. ID4 digital input
  23. Adapter output – power output for external equipment (follows internal battery power).
  24. as above, but only powered when camera is on
  25. VBat+ external power input ?
  26. as above
  27. GND
  28. DATA interface I2C
  29. CLK interface I2C
  30. GND

ليست هناك تعليقات:

إرسال تعليق