Wifi without internet on a Marabu flight

Just as james vaughan, I spent a recent flight finding out what I could do with a connection to the flight’s wifi, but without access to the internet. After reading james‘ blogpost, I decided to share my story ‒ I found more data 🙂

I was on my way to Greece, a direct flight from Hamburg to Lefkada. It’s a long flight. Marabu’s wifi is not for browsing the Internet but for accessing the inflight entertainment system only. I was bored, did not like the movie selection, so I opened up my browser’s network dev tools to see if I could figure out what was going on.

Citing james,

I used my browser’s “Copy as cURL” feature to quickly get a command to hit the endpoint. As an aside, this feature is present in Firefox and all chromium-based browsers and it’s really handy if you ever need to reply requests made by your browser and want to send all the same headers.

The information the API returned in the beginning were not too interesting. I cannot provide an example response from one of those first requests. If I remember correctly, the responses showed only data that drives the inflight wifi portal’s flight status screen, showing our plane’s location, air speed, etc.

However, since this was one of the few things I could access on this network, I decided to make the most of it. The following API endpoint is what caught my eye: https://marabu.everhub.aero/monitor/status?path=/system/net/.

{
  "apn": "internet.emt.ee",
  "interfaces": [
    {
      "iface": "enp3s0",
      "ip4": "10.20.30.235",
      "mac": "00:e0:4c:da:e5:f6",
      "operstate": "up"
    }
  ],
  "domain": "marabu.everhub.aero",
  "eth-ip": "NON-IP",
  "wireless": {
    "2.4GHz": "enabled",
    "5GHz": "enabled"
  },
  "modem": {
    "modem": {
      "device": "ttyUSB2",
      "power": "low",
      "state": "disabled",
      "fail-reason": "--",
      "signal": "0",
      "imei": "867<redacted>",
      "operator": {
        "code": "--",
        "name": "--",
        "registration": "--"
      }
    },
    "sim": {
      "code": "<redacted>",
      "name": "Telia",
      "imsi": "248<redacted>",
      "iccid": "893<redacted>"
    },
    "bearer": {
      "interface": "",
      "status": "",
      "apn": "",
      "roaming": "",
      "ip-type": "",
      "ip": ""
    },
    "system": {
      "state": "unavailable",
      "ip": "",
      "connection": ""
    }
  },
  "cc-connection": "error",
  "ext-ip": "none",
  "type": "O",
  "connected-users": 0,
  "ssid": "marabu005",
  "wds": {
    "info": [
      "",
      "WAP is not in WDSAP mode. Exiting."
    ],
    "ssids": []
  }
}

I did not expect that the API would provide access to IMSI, IMEI and ICCID. Then, I decided to change the path parameter: https://marabu.everhub.aero/monitor/status?path=/. Now, the response of the server revealed even more, including information about

  • file system
  • OS
    • „distro“: „Ubuntu“
    • „release“: „20.04.6 LTS“
  • installed packages, scripts and their versions
    • „paxapp-version“: „2.0.3-1“
    • „crewapp-version“: „2.0.1-1“
  • squawk code and emergency status
    • „squawk“: „4144“
    • „emergency“: „none“
  • recent boot and shutdown times
{
  "alerts": [],
  "system": {
    "net": {
      "apn": "internet.emt.ee",
      "interfaces": [
        {
          "iface": "enp3s0",
          "ip4": "10.20.30.235",
          "mac": "00:e0:4c:da:e5:f6",
          "operstate": "up"
        }
      ],
      "domain": "marabu.everhub.aero",
      "eth-ip": "NON-IP",
      "wireless": {
        "2.4GHz": "enabled",
        "5GHz": "enabled"
      },
      "modem": {
        "modem": {
          "device": "ttyUSB2",
          "power": "low",
          "state": "disabled",
          "fail-reason": "--",
          "signal": "0",
          "imei": "867<redacted>",
          "operator": {
            "code": "--",
            "name": "--",
            "registration": "--"
          }
        },
        "sim": {
          "code": "<redacted>",
          "name": "Telia",
          "imsi": "248<redacted>",
          "iccid": "893<redacted>"
        },
        "bearer": {
          "interface": "",
          "status": "",
          "apn": "",
          "roaming": "",
          "ip-type": "",
          "ip": ""
        },
        "system": {
          "state": "unavailable",
          "ip": "",
          "connection": ""
        }
      },
      "cc-connection": "error",
      "ext-ip": "none",
      "type": "O",
      "connected-users": 2,
      "ssid": "marabu005",
      "wds": {
        "info": [
          "",
          "WAP is not in WDSAP mode. Exiting."
        ],
        "ssids": []
      }
    },
    "batt_cycle": {
      "cycle_0": 7,
      "cycle_1": 0
    },
    "temperatures": {
      "cpu0": 56,
      "cpu1": 56,
      "cpu2": 58,
      "cpu3": 58,
      "mb": 31,
      "batt1": 27.85,
      "batt2": 0,
      "sda": null,
      "sdb": 44
    },
    "uptime": "1h 56m 54.3s",
    "powerboard": {
      "charging": false,
      "cycle_0": 7,
      "cycle_1": 0,
      "hardver": 2,
      "mah_0": 4267,
      "mah_1": 0,
      "percent_0": 69,
      "percent_1": 0,
      "poweroff": false,
      "serial_0": 26486,
      "serial_1": 0,
      "softver": 3,
      "switch": true,
      "temp_0": 28.05,
      "temp_1": 0,
      "volt_0": 15.46,
      "volt_1": 0
    },
    "fs": [
      {
        "size": "245 GB",
        "used": "33 GB",
        "use": "14.05 %",
        "mount": "/"
      },
      {
        "size": "639 GB",
        "used": "219 GB",
        "use": "36.21 %",
        "mount": "/data"
      },
      {
        "size": "209 GB",
        "used": "22 MB",
        "use": "0.01 %",
        "mount": "/data/internal"
      },
      {
        "size": "987 MB",
        "used": "125 MB",
        "use": "13.56 %",
        "mount": "/data/crypto"
      }
    ],
    "kernel": "5.4.0-150-generic",
    "memory": {
      "total": "7 GB",
      "free": "2 GB",
      "used": "5 GB"
    },
    "os": {
      "platform": "linux",
      "distro": "Ubuntu",
      "release": "20.04.6 LTS",
      "kernel": "5.4.0-150-generic",
      "arch": "x64"
    },
    "flight_mode": "adsb",
    "services": {
      "system": {
        "dnsmasq": "active",
        "NetworkManager": "active",
        "docker": "active",
        "pm2-root": "active",
        "salt-minion": "active",
        "openresty": "active",
        "ifd-system-status": "active",
        "ifd-wap-status": "active",
        "ifd-switch-status": "active",
        "ifd-power-status": "active",
        "ifd-dump1090": "active",
        "ModemManager": "active"
      },
      "docker": {
        "gde-web": "active",
        "gde-events": "active",
        "ad-engine": "active",
        "ad-proxy": "active",
        "ad-registration": "active",
        "mongo": "active",
        "datasync": "active",
        "syncmanager": "active",
        "games-api": "active",
        "games-web": "active",
        "tomcat": "active",
        "wvpl.ideanovatech.com": "active",
        "fps.ideanovatech.com": "active",
        "socket": "active",
        "flightdata": "active",
        "tiles": "active",
        "mediausage": "active",
        "metadata": "active",
        "flightpush": "active",
        "fp3d": "active",
        "orders": "active"
      },
      "pm2": {
        "manager": "active",
        "importer": "active",
        "monitor": "active"
      }
    },
    "boots": [
      {
        "start": "2023-08-31 03:32:08",
        "duration": "00:22",
        "stop": "2023-08-31 03:54:08",
        "type": "down"
      },
      {
        "start": "2023-08-30 12:04:35",
        "duration": "15:26",
        "stop": "2023-08-31 03:30:35",
        "type": "crash"
      },
      {
        "start": "2023-08-30 03:20:21",
        "duration": "08:43",
        "stop": "2023-08-30 12:03:21",
        "type": "crash"
      },
      {
        "start": "2023-08-29 12:12:48",
        "duration": "07:55",
        "stop": "2023-08-29 20:07:48",
        "type": "down"
      },
      {
        "start": "2023-08-28 12:20:05",
        "duration": "23:51",
        "stop": "2023-08-29 12:11:05",
        "type": "crash"
      }
    ]
  },
  "updatedAt": "2023-08-31T06:40:28.385Z",
  "serverId": "1c19aaee-bc86-4566-bd94-705c9558eff1",
  "hostname": "marabu005",
  "id": {
    "hostname": "marabu005",
    "serverId": "1c19aaee-bc86-4566-bd94-705c9558eff1",
    "hardwareId": "00e04cdae5f9",
    "sda": "S5RRNF0W305357W",
    "sdb": "50026B76836BBD63",
    "batt1": "26486",
    "batt2": "0"
  },
  "client": {
    "json": {
      "IATA": "EE",
      "name": "Marabu Airlines"
    }
  },
  "timestamp": "2023-08-31T06:40:28.000Z",
  "config": {
    "apps": {
      "paxapp-version": "2.0.3-1",
      "paxapp": "EE-0723",
      "panelapp-version": "3.0.0",
      "crewapp-version": "2.0.1-1",
      "crewapp": "EE"
    }
  },
  "drm": {
    "id": "59c427298abe59d53925c779b56472dfb5973c0ec2aa13e6cac31be8be875ac2",
    "is-installed": "yes",
    "validity": "2023-12-28",
    "is-test-license": "no"
  },
  "certs": {
    "wv": "2023-10-24",
    "fps": "2023-03-23",
    "ssl": "2023-12-07",
    "ssl-chain": "2023-12-07,2030-12-31,2028-12-31,2028-12-31"
  },
  "release": "-",
  "flight": {
    "_state": {
      "hex": "511171",
      "flight": "MBU6298 ",
      "alt_baro": 35000,
      "alt_geom": 35775,
      "gs": 482.1,
      "ias": 263,
      "tas": 448,
      "mach": 0.776,
      "track": 152.6,
      "track_rate": 0,
      "roll": 0.2,
      "mag_heading": 150.8,
      "baro_rate": 0,
      "geom_rate": 0,
      "squawk": "4144",
      "emergency": "none",
      "category": "A3",
      "nav_qnh": 1012.8,
      "nav_altitude_mcp": 35008,
      "lat": 46.048233,
      "lon": 16.148027,
      "nic": 8,
      "rc": 186,
      "seen_pos": 0.5,
      "version": 2,
      "nic_baro": 1,
      "nac_p": 9,
      "nac_v": 1,
      "sil": 3,
      "sil_type": "perhour",
      "gva": 2,
      "sda": 3,
      "mlat": [],
      "tisb": [],
      "messages": 111911,
      "seen": 0.1,
      "rssi": -9.3,
      "now": "2023-08-31T05:45:00Z",
      "registration": null,
      "flight_code": ""
    },
    "_lastSeen": "2023-08-31T05:45:00Z",
    "schedule": {
      "flight_code": null,
      "departure_iata": null,
      "destination_iata": null
    }
  },
  "versions": {
    "os": "20.04.6 LTS (Focal Fossa)",
    "kernel": "5.4.0-150",
    "software": "B0523",
    "webapp": "10.0.0",
    "panelapp": "3.0.0",
    "crewapp": "4.1.0",
    "tools": {
      "node": "v16.20.0",
      "npm": "9.6.7",
      "json5": "2.2.3",
      "n": "v9.1.0",
      "pm2": "5.2.0",
      "fx": "24.0.0",
      "jq": "1.6-159-gcff5336-dirty",
      "jc": "1.23.2",
      "lnav": "0.11.1-49-gaeea356",
      "yq": "v4.34.1",
      "aws": "2.11.25"
    },
    "deb": {
      "ifd-bare0-system-prerequisites": "4.0.0-1",
      "ifd-bare0-system-tools": "7.2.6-1",
      "ifd-core0-system-scripts": "6.5.11-1",
      "ifd-core1-disk-encrypted-part-ext": "1.0.1",
      "ifd-core1-disk-encrypted-part-int": "1.0.0",
      "ifd-core1-disk-setup": "5.0.6-1",
      "ifd-core2-network-settings": "5.1.5-1",
      "ifd-core2-network-settings-everbox": "5.0.3-1",
      "ifd-core3-hw-dump1090-generic": "2.1.4-1",
      "ifd-core3-hw-modem-generic": "2.0.1-1",
      "ifd-core3-hw-powerboard-everbox": "2.0.4-1",
      "ifd-core3-hw-temperature-everbox": "1.1.0-1",
      "ifd-core3-hw-touchscreen-everbox": "4.2.3-1",
      "ifd-core3-hw-wap-everbox": "6.1.0-1",
      "ifd-core4-helpers-aws-s3-cfg": "2.0.0-1",
      "ifd-core4-helpers-nexus-cfg": "2.0.0-1",
      "ifd-full0-svc-svc-monitor": "5.0.1-1",
      "ifd-full0-svc-switch-status": "3.0.3-1",
      "ifd-full0-svc-system-status": "2.1.1-1",
      "ifd-full1-certs-ssl": "2.0.1-1",
      "ifd-full2-docker-common": "9.2.1-1",
      "ifd-full2-docker-common-cfg-generic": "1.0.3-1",
      "ifd-full2-docker-common-img-datasync": "8.0.1-129",
      "ifd-full2-docker-common-img-mongo": "3.6.23-22",
      "ifd-full2-docker-common-img-syncmanager": "3.0.1-30",
      "ifd-full2-docker-common-sync-cfg": "1.1.0-1",
      "ifd-full3-addon-ad-engine": "1.3.1-1",
      "ifd-full3-addon-ad-engine-cfg-generic": "1.0.1-1",
      "ifd-full3-addon-ad-engine-img-engine": "0.0.7",
      "ifd-full3-addon-ad-engine-img-proxy": "0.0.1",
      "ifd-full3-addon-ad-engine-img-registration": "0.0.2",
      "ifd-full3-addon-drm-support": "6.2.1-1",
      "ifd-full3-addon-drm-support-certs-fairplay": "3.0.0-1",
      "ifd-full3-addon-drm-support-certs-license": "2.0.3-1",
      "ifd-full3-addon-drm-support-certs-widevine": "2.0.3-1",
      "ifd-full3-addon-drm-support-cfg-generic": "1.0.1-1",
      "ifd-full3-addon-drm-support-img-fp": "5.6.4",
      "ifd-full3-addon-drm-support-img-proxy": "5.0.3",
      "ifd-full3-addon-drm-support-img-wv": "5.5.3",
      "ifd-full3-addon-drm-support-tpm": "2.0.2-1",
      "ifd-full3-addon-fp3d": "1.1.0-1",
      "ifd-full3-addon-fp3d-cfg-generic": "1.0.0-1",
      "ifd-full3-addon-fp3d-content-ea": "2.0.0-1",
      "ifd-full3-addon-fp3d-content-generic": "2.0.0-1",
      "ifd-full3-addon-fp3d-img": "7.17.3",
      "ifd-full3-addon-gde-demo": "1.1.0-1",
      "ifd-full3-addon-gde-demo-cfg-generic": "1.0.0-1",
      "ifd-full3-addon-gde-demo-img": "1.0.1-1",
      "ifd-full3-addon-gde-events": "1.1.0-1",
      "ifd-full3-addon-gde-events-cfg-generic": "1.0.0-1",
      "ifd-full3-addon-gde-events-img": "2.0.0-1",
      "ifd-full3-addon-gladi8tor": "7.1.2-1",
      "ifd-full3-addon-gladi8tor-cfg-generic": "1.0.4-1",
      "ifd-full3-addon-gladi8tor-content-v3#0#1-ifd": "1.0.0-1",
      "ifd-full3-addon-gladi8tor-img-api": "2.2.1",
      "ifd-full3-addon-gladi8tor-img-web": "3.5.0",
      "ifd-full3-addon-mediausage": "4.1.0-1",
      "ifd-full3-addon-mediausage-cfg-generic": "1.0.0-1",
      "ifd-full3-addon-mediausage-img": "6.0.1-72",
      "ifd-full3-addon-metadata": "5.1.0-1",
      "ifd-full3-addon-metadata-cfg-generic": "1.0.0-1",
      "ifd-full3-addon-metadata-img": "8.0.3-61",
      "ifd-full3-addon-metadata-scripts": "3.1.0-1",
      "ifd-full3-addon-moving-map": "8.1.0-1",
      "ifd-full3-addon-moving-map-cfg-generic": "1.0.1-1",
      "ifd-full3-addon-moving-map-data": "1.0.7-1",
      "ifd-full3-addon-moving-map-img": "8.0.1-82",
      "ifd-full3-addon-moving-map-img-tiles": "5.0.1-43",
      "ifd-full3-addon-moving-map-push": "2.1.0-1",
      "ifd-full3-addon-moving-map-push-cfg-generic": "1.0.0-1",
      "ifd-full3-addon-moving-map-push-img": "2.0.1-17",
      "ifd-full3-addon-orders": "5.1.0-1",
      "ifd-full3-addon-orders-cfg-generic": "1.0.0-1",
      "ifd-full3-addon-orders-img": "2.0.1-21",
      "ifd-full3-addon-socket": "6.1.0-1",
      "ifd-full3-addon-socket-cfg-generic": "1.0.0-1",
      "ifd-full3-addon-socket-img": "2.0.3-54",
      "ifd-full4-app-crew": "4.1.0-1",
      "ifd-full4-app-crew-config-ee": "2.0.1-1",
      "ifd-full4-app-crew-config-generic": "2.0.30-4",
      "ifd-full4-app-crew-dev": "1.0.1-1",
      "ifd-full4-app-crew-scripts": "1.2.9-1",
      "ifd-full4-app-panel": "3.0.0-1",
      "ifd-full4-app-panel-auth": "2.0.1-1",
      "ifd-full4-app-panel-config-generic": "1.1.2-1",
      "ifd-full4-app-panel-dev": "1.0.1-1",
      "ifd-full4-app-panel-scripts": "1.0.0-1",
      "ifd-full4-app-pax-ng": "10.0.0-1",
      "ifd-full4-app-pax-ng-config-ee-0723": "2.0.3-1",
      "ifd-full4-app-pax-ng-config-generic": "2.0.123-5",
      "ifd-full4-app-pax-ng-dev": "1.1.3-1",
      "ifd-full4-app-pax-ng-scripts": "1.3.8-1",
      "ifd-full5-pm2-data-importer": "8.0.2-1",
      "ifd-full5-pm2-data-importer-scripts": "2.0.0-1",
      "ifd-full5-pm2-server-manager": "6.0.2-2",
      "ifd-full5-pm2-server-manager-cfg-generic": "1.0.0-1",
      "ifd-full5-pm2-server-monitor": "6.0.2-2",
      "ifd-full5-pm2-server-monitor-cfg-generic": "1.0.0-1",
      "ifd-full5-pm2-server-monitor-config": "4.0.0-1",
      "ifd-full5-pm2-server-monitor-config-cpu-mem": "2.0.0-1",
      "ifd-full5-pm2-server-monitor-config-temp-everbox": "2.0.0-1",
      "ifd-full5-pm2-server-monitor-scripts": "3.0.4-1"
    },
    "svc_pm2": {
      "manager": "6.0.2",
      "importer": "8.0.2",
      "monitor": "6.0.2"
    },
    "svc_docker": {
      "flightpush": "2.0.1-17",
      "tomcat": "5.0.3",
      "mediausage": "6.0.1-72",
      "datasync": "8.0.1-129",
      "flightdata": "8.0.1-82",
      "syncmanager": "3.0.1-30",
      "metadata": "8.0.3-61",
      "orders": "2.0.1-21",
      "tiles": "5.0.1-43",
      "socket": "2.0.3-54",
      "fps#ideanovatech#com": "5.6.4",
      "gde-web": "1.0.1-1",
      "ad-engine": "0.0.7",
      "gde-events": "2.0.0-1",
      "mongo": "3.6.23-22",
      "ad-registration": "0.0.2",
      "ad-proxy": "0.0.1",
      "wvpl#ideanovatech#com": "5.5.3",
      "games-api": "2.2.1",
      "fp3d": "7.17.3",
      "games-web": "3.5.0"
    },
    "svc_systemd": {
      "wap-status#sh": "2.0.0",
      "disk-setup#sh": "2.8.3",
      "svc-monitor#sh": "3.0.1",
      "power-status#py": "2.1.4",
      "system-status#sh": "2.1.1",
      "docker-compose-up#sh": "1.1.1",
      "power-status#sh": "2.0.2",
      "switch-status#sh": "2.0.0",
      "wap-status#py": "3.2.0",
      "after-start/51-bitmeteros": "1.0.0",
      "after-start/61-modem": "1.0.1",
      "after-start/42-crew-app-config": "2.0.0",
      "after-start/71-flightmode": "1.0.0",
      "after-start/62-ssid": "1.0.1",
      "after-start/63-wap": "1.0.0",
      "after-start/41-pax-app-config": "1.0.1",
      "after-start#sh": "3.0.2",
      "dump1090#sh": "1.3.0",
      "before-shutdown#sh": "2.0.0",
      "docker-cleanup#sh": "1.1.0"
    },
    "scripts": {
      "get-ip": "3.0.0",
      "ifd-upgrade": "1.0.1",
      "ifd-ad-engine-setup": "1.0.0",
      "ifd-crew-app-dev": "1.0.1",
      "ifd-panel-app-dev": "1.0.0",
      "featureflags": "2.1.0",
      "_mount_ext": "1.0.1",
      "_make_boot_image#sh": "3.0.0",
      "ifd-tiles": "1.1.0",
      "set-hostname": "2.0.1",
      "wapssh": "1.0.0",
      "_remove_drm_keys#sh": "1.0.0",
      "_common#sh": "5.0.4",
      "ifd-help": "1.0.1",
      "ifd-update": "1.0.0",
      "switch-mode#py": "0.0.3",
      "ifd-gladi8tor-content": "1.1.1",
      "_setup#sh": "2.0.5",
      "ifd-info": "3.0.2",
      "temperature": "2.1.0",
      "_deep_cleanup#sh": "2.1.0",
      "prepare-status": "1.4.0",
      "test-cc-connection": "1.0.2",
      "ifd-pax-app-dev": "1.3.1",
      "version": "3.0.1",
      "flight-info": "1.0.1",
      "svcmon": "1.0.1",
      "ifd-pax-app-config": "3.0.1",
      "ifd-gladi8tor-setup": "2.1.0",
      "boots": "1.1.0",
      "ifd-pax-app-media": "3.0.1",
      "id/_spread_id#sh": "1.1.1",
      "id/_clear_id#sh": "1.0.2",
      "id/_backup_id#sh": "1.0.1",
      "id/_common_id#sh": "1.1.1",
      "get-id": "1.1.0",
      "flight-debug": "1.0.0",
      "provision": "5.0.3",
      "restart#sh": "1.0.0",
      "powerboard-debug#sh": "2.0.3",
      "webdrm-decrypt": "",
      "ifd-sync-phases": "1.0.1",
      "pax-app": "5.0.0",
      "ifd-metadata-install": "4.1.0",
      "ifd-os-care": "1.6.1",
      "ifd-domain": "2.0.0",
      "_create_release#sh": "4.1.0",
      "ifd-status": "1.0.0",
      "webdrm-license": "1.2.1",
      "restart-helper#sh": "1.0.0",
      "ifd-metadata-update": "3.1.0",
      "flight-mode": "2.1.0",
      "ifd-sync": "4.1.1",
      "webdrm-provision": "1.0.3",
      "connected-users": "3.0.0",
      "events": "1.1.0",
      "ifd-wap-config": "3.0.1",
      "webdrm-install": "2.1.0",
      "powerboard": "1.0.0",
      "svc": "2.0.0",
      "ifd-wap-password": "1.0.3",
      "battery": "1.0.1",
      "apn": "1.0.1",
      "ifd-wap-wds": "1.3.3",
      "_mount_int": "1.0.1",
      "webdrm-multi-license-generator": "1.0.0",
      "alerts": "3.0.0",
      "flight-sim": "2.0.1",
      "crew-app": "4.0.0",
      "ssid": "4.0.1",
      "panel": "2.0.0",
      "renew-ip": "1.0.0",
      "webdrm-generate": "1.0.0",
      "ifd-logs": "3.0.0",
      "modem": "1.1.2",
      "presync-remove-bad-status-files#sh": "1.0.0",
      "wap": "3.1.0",
      "ifd-crew-app-config": "2.0.1",
      "ifd-hw-switch": "1.0.2"
    },
    "gladi8tor": {
      "games": {
        "version": "h1:E23E56PYPboLVH0/DnKFETXwg6wiEOiP0fH9r62+uBM=",
        "registered_at": "2023-08-31T05:37:46.917263525Z"
      },
      "streams": {
        "version": "h1:zbYAu8XmXwFZF3ZOkjHjA6W4b9+TDgqbAsIHycOJyBU=",
        "registered_at": "2023-08-31T05:37:46.926787425Z"
      },
      "news": {
        "version": "h1:thk8Ry7B+fXYGumCMegERdy2lGaU0rZOVyZ8kocCTbw=",
        "registered_at": "2023-07-06T12:23:36.550332941Z"
      },
      "advertisements": {
        "version": "h1:E/WJEs3INb1Qc+IWtbHjNA0oWRJet41YiLcgHK+pnJU=",
        "registered_at": "2023-07-06T12:23:36.867154783Z"
      },
      "sliders": {
        "version": "h1:CnVnZYjr1pJHJKXP31oBeBF/JFDrjbYWfDJDf+B0s2U=",
        "registered_at": "2023-07-06T12:23:37.150018105Z"
      },
      "content": ""
    }
  }
}

And then, we finally arrived in Levkada, I made a photo of the server and did not think about sharing my story until james shared his.

If it were my inflight entertainment system, I would not want it to leak so much. Many more airlines rely on the same system. Thus, I also notified the vendor.

Schutzranzen

Am 22.01.2018 hat Digitalcourage einen Artikel über das Tracking von Kindern und Schulranzen veröffentlicht. Dies haben wir zum Anlass genommen, die Schutzranzen-App der Coodriver GmbH einmal näher anzuschauen. Nach kurzer Suche sind wir auf eine API gestoßen, über die sie unter anderem IMEIs, Telefonnummern oder Zeitstempel der letzten bekannten Positionen abrufen konnten. Laut Coodriver GmbH war der ausgenutzte API-Endpunkt nur zu Testzwecken aktiv.

Details

Zuerst wurde mit Packet Capture der Datenverkehr der Schutzranzen-App mitgeschnitten. Dadurch konnten die URL einer API und dazugehörige HTTP Basic Auth Zugangsdaten in Erfahrung gebracht werden.

Anschließend wurde die apk mit apktool entpackt und nach Schlagwörtern wie http oder api gesucht. So wurden 14 verschiedene Funktionen identifiziert, die die API über HTTP GET oder PUT zur Verfügung stellte.

Eine dieser Funktionen lieferte eine Liste aller registrierten Tracker curl 'https://<http basic auth Zugangsdaten>@<URL der API>/.../trackers'. Die Liste enthielt für jeden Tracker die IMEI, die Telefonnummer, einen Namen (“… Test …”), den Zeitstempel des letzten Positionsupdates und den Zeitstempel der letzten Aktivität, den Batteriestatus (niedrig oder nicht), sowie eine Flag, ob der Tracker Eltern akzeptiert.

Für Regionen sectors?latitude=%.6f&longitude=%.6f&radius=%d konnte abgefragt werden, welche Tracker sich in diesem Sektor befinden. Durch einen sehr großen Radius, etwa radius=900000000, konnten Daten zu fast 100 Trackern abgerufen werden.

      {
         "id":"<IMEI>",
         "phone":"<TELEFONNR>",
         "name":"Test Internal 7",
         "lastSeen":1515187629000,
         "lastPositionUpdate":1515187634000,
         "visible":false,
         "acceptingParents":true,
         "batteryLow":false
      },

Mit den IMEIs der Tracker und über eine andere Funktion der API konnten die Eltern, die einem Tracker zugeordnet waren, abgerufen werden. Die Antwort der API enthielt mehrere IDs und einen Namen.

  {
      "tracking":true,
      "name":"Papa",
      "server":"<API>",
      "slot":"UNKNOWN",
      "primaryId":5,
      "appId":"12345-1234-1234-1234-12345678"
   },

Hier gibt es eine Stellungnahme von Coodriver zur gefundenen Lücke. heise online berichtete über die Einstellung des Projekts.

Disclosure Timeline

  • 22.01.2018
    • Telefonat mit Coodriver
    • Technische Details der Lücke per E-Mail an Coodriver gesendet
    • Nachfrage per E-Mail von Coodriver zu weiteren Details
    • Telefonat mit Coodriver zu weiteren Details
  • 23.01.2018
  • 06.02.2018
    • Nachfrage, ob Lücke geschlossen wurde, da für Ende Januar eine neue Version angekündigt worden war
    • Coodriver teilt mit, dass die neue Version voraussichtlich Ende Februar erscheinen wird
  • 22.02.2018
    • Nachfrage, ob die Lücke geschlossen wurde, da die API-Zugangsdaten nicht mehr funktionieren
    • Coodriver teilt mit, dass die Lücke noch nicht dauerhaft geschlossen wurde
  • 05.03.2018
  • 06.03.2018
    • Coodriver teilt mit, dass die Lücke geschlossen wurde und die Ortungsfunktion entfernt wurde

Kreditech

Das Fintech-Startup Kreditech vergibt Kredite und bewertet die Kreditwürdigkeit der Kreditnehmerinnen durch Analyse von Nutzerinnendaten in sozialen Netzwerken. Die Firma hat ein Nexus Repository offen zugänglich am Internet betrieben. Diese Software erlaubte den Zugang zu Quelltext und Konfigurationsdaten, einschließlich Zugangsdaten und API-Keys.

Die Schwachstelle

Nexus Repositories werden oft unter einer „nexus.“-Subdomain bereitgestellt. Dies macht es Angreiferinnen leicht, potentielle Ziele zu identifizieren. Hinzu kommt, dass die Software standardmäßig einen anonymen Zugang gestattet.

By default, the user interface as well as the repositories and the contained components are available to unauthenticated users for read access

sonatype documentation

Bei einem Blick auf die Kreditech-Subdomains ist eine solche Subdomain aufgefallen:

 - www.mail.kreditech.com
 - vpn.kreditech.com
 - kreditech.com
 - nexus.kreditech.com
 - cloud.kreditech.com
 - ...

Dort befand sich also das Nexus Repository mit diversen Verzeichnissen. In einem dieser Verzeichnisse befand sich ein Archiv kredito-core-XX.jar mit Quelltext und den Dateien staging.properties und production.properties. Diese enthielten u.a. Zugangsdaten für externe Validierungs-, SMS-, Geolokalisierungs- und Postdienste sowie weitere Details der Konfiguration des Systems zur Zahlungsabwicklung. Ich habe die Schwachstelle am 31. Januar 2018 gemeldet und noch am gleichen Tag wurde die Schwachstelle geschlossen.

Update 1: Sonatype Update

Da neben Kreditech auch viele andere Unternehmen übersehen, dass Nexus Repository OSS und Nexus Repository Pro mit einem standardmäßig aktivierten Gast-Account daherkommen und solche Systeme leicht über Certificate Transparency Logs oder Google Dorks gefunden werden können, habe ich im Juli 2019 den Hersteller Sonatype kontaktiert. Dieser bestätigte das grundsätzliche Problem und erklärte, dass sie das Problem bereits angehen würden. Mit Version 3.17 werden (neue) Nutzerinnen explizit gefragt, ob sie den anonymen Zugang aktivieren möchten. Aus Legacy-Gründen wurden bestehende Installationen nicht angefasst. D.h., ältere Systeme können weiterhin gefunden werden.

Update 2: Insolvenz

Im März 2020 wurde Kreditech in Monedo umbenannt. Im September 2020 ging Monedo insolvent. Die Firma wurde zum Ende des Jahres liquidiert.

Telekom Austria

Die Telekom Austria schrieb auf Twitter, dass sie Kundenpasswörter im Klartext speichern würden. Das haben manche als Einladung verstanden, sich die Dienste der Telekom einmal näher anzuschauen.

What if this doesn’t happen because our security is amazingly good? ^Käthe

Unter blog.t-mobile.at, kids.t-mobile.at und newsroom.t-mobile.at lagen .git-Verzeichnisse mit MySQL-Zugangsdaten. Ein öffentlich zugängliches phpMyAdmin gab es auch. Hanno Böck ist ebenfalls darüber gestolpert und fand via Twitter schneller als ich den richtigen Ansprechpartner bei der Telekom 🙂 Bei golem gibt es einen ausführlichen Artikel.