Logo du projet fl3xbl0w

Curiosités de Bowflex - fl3xbl0w

Lancé le 28 mai 2022

Projet d'ingénierie inverse. A commencé avec le tapis de course Bowflex Treadmill 22 mais s'est généralisé pour tout appareil Android vendu par Nautilus Inc. (Nautilus, Bowflex, Schwinn).

Le fichier /sdcard/Pictures/nautilus

En décompilant NautilusLauncher, vous pouvez voir des références à ce chemin spécifique :

// chemin : com/nautilus/nautiluslauncher/LauncherService.java
public void run() {
  if (!new File("/sdcard/Pictures/nautilus").exists()) {
    LauncherService.access$000(LauncherService.this).disableAdbDebug();
    LauncherService.access$000(LauncherService.this).enterKioskMode();
    return;
  }
  LauncherService.access$000(LauncherService.this).enableAdbDebug();
}
// chemin : com/nautilus/nautiluslauncher/MainActivity.java
protected void onCreate(Bundle bundle) {
  // ...
  if (!new File("/sdcard/Pictures/nautilus").exists()) {
    this.mPlatformControl.disableAdbDebug();
    this.mPlatformControl.enterKioskMode();
  } else {
    this.mPlatformControl.enableAdbDebug();
  }
  // ...
}

L’effet de placer le fichier à cet endroit est que NautilusLauncher activera adb après chaque redémarrage. Si le fichier N’EST PAS en place, NautilusLauncher DÉSACTIVERA activement adb (s’il était activé auparavant).

Le fichier /sdcard/Nautilus/redbend/Credentials.txt

Il semble que Red Bend Software (acquis par Harman, maintenant je comprends pourquoi tant de références à KNOX) fournit des services OTA pour le matériel de Nautilus. J’ai trouvé quelques références à ce fichier dans com.redbend.client.apk.

package com.redbend.client;
public class Ipl {
  protected static final String AUTO_SELF_REG_FILE_PATH = "Credentials.txt";
  // ...
  public static int iplGetAutoSelfRegDomainInfo(Context context, String[] strArr) {
    // ...
    File file = new File("/sdcard/Nautilus/redbend/");
    if (!file.exists()) {
      file.mkdirs();
    }
    copyAssets(context, "Credentials.txt", file.getCanonicalPath());
    bufferedReader = new BufferedReader(new FileReader(new File(file.getAbsoluteFile(), "Credentials.txt")));
    // ...
  }
  // ...
}

Aussi dans com.redbend.client.ClientService nous pouvons trouver :

// ...
public class ClientService extends SmmService {
  // ...
  @Override // com.redbend.app.SmmService, android.app.Service
  public void onCreate() {
    // ...
    if (Ipl.iplGetAutoSelfRegDomainInfo(this, strArr) == 0) {
      sendEvent(new Event("D2B_AUTO_SELF_REG_INFO").addVar(new EventVar("DMA_VAR_AUTO_SELF_REG_DOMAIN_NAME", strArr[0])).addVar(new EventVar("DMA_VAR_AUTO_SELF_REG_DOMAIN_PIN", strArr[1])));
      }
    // ...
  }
  // ...
}

Avec ces informations, nous pouvons étiqueter le contenu du fichier /sdcard/Nautilus/redbend/Credentials.txt comme :

Première ligne : DOMAIN_NAME
Deuxième ligne : DOMAIN_PIN

DOMAIN_PIN semble être un vrai code PIN car c’est un nombre à six chiffres.

Il y a quelques identifiants au sein du “Réseau Red Bend” pour associer une machine à une marque/un produit spécifique pour les mises à jour OTA. J’espère que ces identifiants sont IDENTIQUES sur tout le matériel de Nautilus. Le fichier est inclus dans l’APK com.redbend.client et est extrait lors de son installation.

J’ai trouvé des références de com.redbend.client ici, et j’ai trouvé cela assez drôle de voir qu’il s’écrasait dans une voiture. J’espère qu’il ne plante pas aussi souvent dans nos machines.

Moniteur de Fréquence Cardiaque Bluetooth

Celui-ci a été assez facile à déchiffrer. Le nom Bluetooth apparaît comme CL831-xxxxxxx (numéro caché) de CHILEAF.

En le scannant via nRF Connect, l’adresse MAC de l’appareil et quelques données clés ont été exposées :

Fréquence Cardiaque :
UUID : 0x180D
Mesure de la Fréquence Cardiaque
UUID : 0x2A37

Cela semblait assez standard, et un post de la Communauté Home Assistant avait déjà découvert cela (pas le même modèle, mais il semble que le Moniteur de Fréquence Cardiaque utilise un protocole standard). J’ai créé un fichier de configuration ESPHome ici comme preuve de concept :

Capture d'écran de Home Assistant montrant un capteur de fréquence cardiaque
Contenu traduit par gpt-4-1106-preview

©2022-2024 Sebastián Barrenechea. Tous droits réservés.

Construit avec Astro v4.16.13.