GoPro HERO3+/HERO4: Steuerung ohne GoPro App

Eine GoPro-Kamera wird grundsätzlich mit einer Android- oder iOS-App gesteuert. Die Kommunikation zwischen Kamera und App erfolgt hauptsächlich über HTTP und einfachen (RESTful-ähnlichen) URL-Anfragen, wie eine Traffic-Analyse mit Wireshark zeigt.

GoPro HERO3+

Port-Scan

Der Port-Scan mit nmap gibt eine erste Idee über die Dienste, welche die GoPro HERO3+ anbietet bzw. zur Kommunikation nutzt. Sie ist stets unter der lokalen IP-Adresse 10.5.5.9 zu erreichen und vergibt für verbundene WLAN-Clients IP-Adressen ab 10.5.5.110.

Starting Nmap 7.01 ( https://nmap.org )
PORT     STATE SERVICE VERSION
80/tcp   open  http    GoPro HERO3 camera http interface 1.0
8080/tcp open  http    Cherokee httpd 1.2.101b150604_3b16072
| http-methods: 
|_  Supported Methods: GET OPTIONS HEAD POST
|_http-server-header: Cherokee/1.2.101b150604_3b16072 (UNIX)
|_http-title: Site doesn't have a title (text/html; charset=utf-8).
Service Info: OS: Unix; Device: webcam; CPE: cpe:/h:gopro:hero3

Die GoPro HERO3+ hat zwei http-Server auf den TCP-Ports 80 und 8080.

Traffic-Analyse

Als Sicherheitsstandard zur Verschlüsselung der WLAN-Kommunikation kommt WPA bei der GoPro zum Einsatz. Der WPA-Schlüssel mit der Länge von 32 Byte wird dabei aus einem Passwort (Passphrase) und der SSID (Salt) mit der PBKDF2 mit 4096 Iterationen erzeugt.

Wireshark

Folgende Voraussetzungen müssen für die Traffic-Analyse mit Wireshark erfüllt sein:

  • der WLAN-Adapter (Netzwerk-Karte) muss sich im Monitor-Mode befinden
  • der WPA-Schlüssel muss bekannt/erzeugt und in Wireshark hinterlegt worden sein

Mit Hilfe eines Filters kann der typischerweise sehr unübersichtliche Netzwerk-Verkehr auf das Wesentliche reduziert werden.

 

 

 

 

 

 

 

 

 

 

GoPro App und GoPro

Die Kommunikation zwischen GoPro App (egal ob iOS oder Android) und GoPro zeigt die folgenden „Regelmäßigkeiten“:

  • fast alle Befehle haben einen einheitlichen Aufbau
    • http://10.5.5.9/[app]/[cmd]?t=[pass]&p=[opt]
      • das Modul [app] hat entweder den Wert „camera“ oder „bacpac“
      • der Befehl [cmd] besteht aus zwei Zeichen (Buchstaben)
      • das Passwort [pass] wird im Klartext übertragen
      • der Parameter [opt] ist eine Folge aus (mindestens einem) zweistelligen hexadezimalen Wert(en) mit vorangestelltem Prozentzeichen (%)
  • es gibt diverse „keepalive“-Signale (für die verschiedenen GoPro-Modelle und den verschiedenen Modi)
    • http://10.5.5.9/bacpac/se?t=[pass]
    • http://10.5.5.9/camera/sx?t=[pass]
    • ein UDP-Paket mit dem Inhalt „_GPHD_:1:0:2:0“ und dem Ziel-Port 8554 ungefähr alle zwei bis drei Sekunden
  • kurz nach einem Verbindungsaufbau
    • werden Geräte-Informationen abgefragt
      • http://10.5.5.9/bacpac/cv
      • http://10.5.5.9/camera/cv
    • und das Datum sowie Uhrzeit mit der Systemzeit abgeglichen
      • http://10.5.5.9/camera/TM?t=[pass]&p=[YY][MM][DD][hh][mm][ss]
  • der Inhalt der SD-Karte wird mit einem gesonderten Befehl von dem Cherokee-Server abgefragt und in JSON übertragen
    • http://10.5.5.9:8080/gp/gpMediaList

Steuerung

http://10.5.5.9/[app]/[cmd]?t=[pass]&p=[opt]

Die Befehle zur Steuerung können unter GNU/Linux in einer bash mit curl abgesetzt werden.

if [ ${OPT} ]; then
  PARA="&p=%"${OPT}
fi
echo -ne $(curl -s -m 2 "http://10.5.5.9/${APP}/${CMD}?t=${PASS}${PARA}") | \
sed -e "s/[\o0\o1\o2\o3\o4\o5\o6\o7\o10]//g" | \
sed -e "s/[\o25]/\n/g" | \
sed -e 's/^[[:space:]]*//'

Das Passwort kann ebenfalls mit curl abgefragt werden.

PASS=$(curl -s -m 4 "http://10.5.5.9/bacpac/sd" | \
sed -e "s/[\o0\o1\o2\o3\o4\o5\o6\o7\o10]//g")

Das Werkzeug sed entfernt bzw. ersetzt die (ungewöhnlichen) Steuerzeichen, welche (vermutlich) als Bestätigung bzw. Quittierung von der GoPro gesendet werden.

Befehle

GoPro HERO3+ Silver Edition

  • Allgemein (app=camera)
    • LED (cmd=LB)
      • Off (opt=00) ; 2 (opt=01) ; 4 (opt=02)
    • Beep (cmd=BS)
      • Off (opt=00) ; 70% (opt=01) ; 100% (opt=02)
    • Default Mode at Power Up (cmd=DM)
      • Video (opt=00) ; Photo (opt=01) ; Burst (opt=02) ; Time Lapse (opt=03)
    • NTSC/PAL (cmd=VM)
      • NTSC (opt=00) ; PAL (opt=01)
    • Mode (cmd=CM)
      • Video (opt=00) ; Photo (opt=01) ; Burst (opt=02) ; Time Lapse (opt=03) ; HDMI (opt=05)
  • Kamera (app=camera)
    • Video Resolution (cmd=VV)
      • 1080p (opt=03) ; 960p (opt=02) ; 720p (opt=01) ; WVGA (opt=00)
    • NTSC Frame Rate (cmd=FS)
      • 30 (opt=04) ; 60 (opt=07) ; 120 (opt=09)
    • PAL Frame Rate (cmd=FS)
      • 25 (opt=03) ; 50 (opt=06) ; 100 (opt=08)
    • Field of View (cmd=FV)
      • Wide (opt=00) ; Medium (opt=01) ; Narrow (opt=02)
    • Photo Resolution (cmd=PR)
      • 10MP (opt=08) ; 7MP (opt=04) ; 5MP (opt=03)
    • Burst Rate (cmd=BU)
      • 3/1s (opt=00) ; 5/1s (opt=01) ; 10/1s (opt=02)
    • Time Lapse (cmd=TI)
      • 0,5s (opt=00) ; 1s (opt=01) ; 2s (opt=02) ; 5s (opt=05) ; 10s (opt=0A) ; 30s (opt=1E) ; 60s (opt=3C)
  • Aufnahme (app=camera)
    • Upside Down (cmd=UP)
      • On (opt=01) ; Off (opt=00)
    • Spot Meter (cmd=EX)
      • On (opt=01) ; Off (opt=00)
    • Looping Video (cmd=LO)
      • Off (opt=00) ; 5min (opt=01) ; 20min (opt=02) ; 60min (opt=03) ; 120min (opt=04) ; Max (opt=05)
  • Betrieb (app=bacpac)
    • Ein-/Ausschalten (cmd=PW)
      • Ein (opt=01) ; Aus (opt=00)
  • Funktion (app=camera)
    • Löschen der letzten Datei (cmd=DL)
    • Löschen von allen Dateien (cmd=DA)
    • Geräusch zur Lokalisierung (cmd=LL)
      • Aktivieren (opt=01) ; Deaktivieren (opt=00)
    • Aufnahme (cmd=SH)
      • Starten (opt=01) ; Stoppen (opt=00)
    • Vorschau (cmd=PV)
      • Starten (opt=02) ; Stoppen (opt=00)

Vorschau

Die Vorschau erfolgt über den Cherokee-Webserver mit HLS (HTTP Live Streaming). Die Playlist (.m3u8-Datei) beinhaltet die HTTP-Adressen der dem Stream zugehörigen Mediendateien.

http://10.5.5.9:8080/live/amba.m3u8

Der Stream wird von der GoPro aktualisiert, wenn alle paar Sekunden ein „keepalive“-Signal von ihr empfangen wird.

http://10.5.5.9/bacpac/se?t=[pass]

Unter GNU/Linux kann das mit einer bash und curl realisiert werden:

curl -s -m 1 "http://10.5.5.9/camera/PV?t=${PASS}&p=%02" &>/dev/null
while true; do
  curl -s -m 1 "http://10.5.5.9/camera/se?t=${PASS}" &>/dev/null
  sleep 2.5
done

Die Verzögerung des HLS-Streams beträgt von der Aufnahme bis zur Anzeige ungefähr 2,5 s.

GoPro HERO4

Der Mechanismus der Steuerung ist dem der HERO3+ sehr ähnlich, wenn auch mit ein paar Unterschieden.

Unterschiede zur HERO3+

  • Die Kameras der HERO4-Familie haben einen anderen Befehlssatz, verstehen aber (zur Not) die Befehle der HERO3+.
    • Steuerung: /gp/gpControl/command/…  bzw. /gp/gpControl/execute/…
    • Einstellung: /gp/gpControl/setting/…
    • Statistik: /gp/gpControl/analytics/…
    • Status: /gp/gpControl/status
    • Pairing: /gpPair/…
  • Das Streaming erfolgt nicht mit HLS, sondern MPEG-kodiert über UDP auf dem Port 8554.
  • Die Kamera gibt Informationen jeglicher Art ausschließlich in JSON aus.
  • Das „keepalive“-Signal erfolgt nicht mit TCP (HTTP), sondern mit einem UDP-Paket und definiertem Inhalt.
  • Die Funktion „Power On“ bzw. „Wake Up“ erfolgt nicht mehr über TCP (HTTP), sondern mit UDP (WOL) in Form eines „Magic Packet“, welches auch für „Wake On LAN“ genutzt wird.

Traffic-Analyse

 

 

 

 

 

 

 

 

 

 

Vorschau

Für die Vorschau kann das „keepalive“-Signal mit einer bash wie folgt realisiert werden:

while true; do
  #sendip -p ipv4 -p udp -us 8554 -is 10.5.5.101 -ud 8554 -d "_GPHD_:1:0:2:0" 10.5.5.9
  echo -ne "_GPHD_:1:0:2:0" > /dev/udp/10.5.5.9/8554
  sleep 2.5
done

Wake On LAN

Das „Magic Packet“ zum Aufwecken der GoPro kann mit einer bash z. B. so gemacht werden:

echo -e "\xff\xff\xff\xff\xff\xff\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9" > /dev/udp/10.5.5.9/4000

Links

 


Fehlt etwas? Ist etwas falsch? Kritik bitte hier als Kommentar hinterlassen.