hack: withings wlan waage

lange habe ich ueberlegt, ob ich mir die withings wlan waage (withings wifi body scale) kaufen soll. wenn man sich die mal anschaut, ist das ein richtig nerdiges gadget. irgendwie ein bischen appleliges design und auch der preis koennte von aplle sein. die daten der wiegung werden per wlan zu einer webseite uebertragen, die man sich dann wie browser (flash) oder ios app als diagramm anschauen kann. wenn man das will, kann man die daten auch an facebook weiterleiten und auf die eigene pinnwand posten. das ist dann genau der punkt, an dem ich mich frage, ob das denn wirklich so sein muss. ich haette gerne so ein geraet.. aber ich will meine daten nicht zu irgendeinem webserver schicken. und schon garnicht zu facebook (btw. das muss man auch nicht). die firma kann in ihren datenschutzrichtlinien verprechen was sie will… ich will das trotzdem nicht. und zu facebook brauch ich ja nichts weiter zu sagen.

die firma withings hat auf der eigenen webseite ihre “visionen” veroeffentlicht:

ok, kann man sich jetzt drueber streiten, ob das visionen sind oder marketing gelaber. nehmen wir mal an, dass das visionen sind – so habe ich meine eigene vision: da ich voll auf vernetzte geraete stehe, mein spieltrieb ausgepraegt ist, ich gerne verstehe wie die dinge funktionieren und ich diese daten in meiner eigenen “cloud” (“my own little cloud”… haha) haben will, kaufe ich mir das geraet einfach mal. mal schauen, was ich mit wenig aufwand machen kann, damit die waage mit einem webserver meiner wahl spricht. quasi das ding “hacken”, damit das produkt interessant wird… btw. dazu ist ein artikel bei technology review zu empfehlen.

die firmware des geraetes modifizieren faellt mangels kenntnisse ueber hardware erstmal aus. bleibt also nur der kommunikationsweg als loesung. dns umleitungen werden von unserer regierung gerne vorgeschlagen, wenns um zensur von schmuddelkram geht oder leute davon abgehalten werden sollen, an auslaendischen gluecksspielen teilzunehmen. auch der grossteil groesserer provider nutzen das, damit die user immer auf einer gesponsorten suchseite landen anstatt im nirwana, wenn sich der user mal vertippt hat. was also fuer eine demokratische regierung und riesige firmen gut ist, muss doch bei mir zuhause auch gut sein, zumal ich niemanden ausser mir selbst damit “reguliere”.

einmal muss man die waage erstmal per usb einrichten und mit ihrer praeferierten webseite reden lassen, damit man weiss, was die beiden sich zu sagen haben. die software zum einrichten gibts sogar fuer linux (und sogar x64!) und muss logischerweise einmal ausgefuehrt werden, damit die waage weiss, mit welchem wlan (und key) sie funken soll. ein freundliches tcpdump an dem switchport, auf den der port der firewall “ge-mirrored” ist und anschliessendes anschauen mit wireshark bringt licht in die kommunikation. als erstes waere da ein bischen dhcp, damit das ueberhaupt klappt mit dem netz und dann die dns abfrage fuer den datensammelserver:

ein dig zur kontrolle bestaetigt das:

um nun diese dns abfragen auf den eigenen dns-server umzuleiten kann ich einfach eine option in den dns-forwarder einstellungen auf meinem pfsense router einstellen:

auf dem dns-server selbst muss dazu eine zone angelegt werden, die einfach jede anfrage zu dieser domain mit der ip des webservers beantwortet, auf dem man die eigenen scripte dazu ablegt.

die konfigurationsdatei des bind (named.conf) muss man um eine zone erweitern:

// withings
zone "withings.net" {
     type master;
     file "/etc/bind/db.withings.net";
};

und in der eigentlichen zone ist ein wildcard eintrag mit der ip des erwaehnten webserver (und ns.meinheimnetz.net der lokale dns server):

$TTL 3600
$ORIGIN withings.net.
@ IN SOA ns.meinheimnetz.net. hostmaster.ns.meinheimnetz.net. (
      2011041601 ; serial
      7200       ; refresh (2 hours)
      1800       ; retry (30 minutes)
      1209600    ; expire (2 weeks)
      3600       ; minimum (1 hour)
      )
      NS   ns.meinheimnetz.net.
*     IN   A	10.1.1.3

weiter gehts mit dem tcp stream aus tcpdump. die waage schickt sechs anfragen mittels POST request, der selbstverstaendlich url kodiert ist, was ich hier zur besseren lesbarkeit schon decodiert habe… und der server antwortet (natuerlich auch) sechs mal in JSON notation. (die hier geposteten werte sind natuerlich abgeaendert)

1.
die waage sagt erstmal sowas wie “hier bin ich, los gehts”

POST /cgi-bin/once HTTP/1.1
[...]
Content-Type: application/x-www-form-urlencoded

action=get

2.
der server schickt darauf hin einen statuscode und irgendeine id zurueck

HTTP/1.1 200 OK
[...]
Content-Type: text/plain

{"status":0,"body":{"once":"3a6d21ef-2baed5f8"}}

3.
die waage will sich authentifizieren mit macadresse und irgendeinem hashwert, der fuer meine seite aber nicht von interesse ist. weiterhin gibts noch den batteriestand und irgendwelche sachen, die sowas wie firmwareversion, dauer von irgendwas und ein rebootflag sein koennten. ist aber in meinem fall bis auf den batteriezustand auch uninteressant.

HTTP/1.1
[...]
Content-Type: application/x-www-form-urlencoded

action=new&auth=00:24:d3:70:70:fa&hash=db4555e74eff4aa1c43dad9889
30c00¤tfw=70&batterylvl=100&duration=30&zreboot=0

4.
der webserver antwortet mit einem array der daten der ihm bekannten user der waage

HTTP/1.1 200 OK
[...]
Content-Type: text/plain

{"status":0,"body":{"sessionid":"d2cb-f8a47ce3-caf8eb4d","sp":
{"users":[{"id":5555751,"benutzer":"nick","wt":100.7,"ht":1.88,
"agt":25.1,"sx":1,"fm":3,"cr":1302150411,"att":0}]},"ind":{"lg":
"en_EN","imt":1,"stp":1,"f":0,"g":89522},"syp":{"utc":130301412},
"ctp":{"goff":7200,"dst":1317872200,"ngoff":3600}}}

was die werte alle zu bedeuten haben muss man erraten und/oder durch aenderungen auf der originalen webseite rausfinden. auf jeden fall dabei sind: benutzername, nickname, gewicht, groesse, das alter, geschlecht, creation date usw.

5.
darauf schickt die waage irgendwas “maintenance maessiges” zurueck.

POST /cgi-bin/maint HTTP/1.1
[...]
Content-Type: application/x-www-form-urlencoded

Expect: 100-continue

HTTP/1.1 100 Continue

action=store&sessionid=d2cb-f8a47ce3-caf8eb4d&source=1&type=3
&data=[...]

.. was ich hier mal gekuerzt habe, da es codiert und sehr lang ist. anscheinend ist es auch nicht fuer die funktion von bedeutung.

6.
der webserver beantwortet das nur mit einem ok:

HTTP/1.1 200 OK
[...]
Content-Type: text/plain

{"status":0}

7.
jetzt schickt die waage die interessanten daten wie naemlich das gewicht (value:100800)

POST /cgi-bin/measure HTTP/1.1
[...]
Content-Type: application/x-www-form-urlencoded

action=store&sessionid=d2cb-f8a47ce3-caf8eb4d&macaddress=
00:24:d3:70:70:fa&userid=5555751&meastime=130301533&
devtype=1&attribstatus=0&measures={"measures":[{"value":
100800,"type":1,"unit":-3}]}

das ist also der punkt den man abfangen muss fuer seine eigene statistik

8.
der webserver quittiert das

HTTP/1.1 200 OK
[...]
Content-Type: text/plain

{"status":0}

9.
die waage schickt wieder irgendwas (debug informationen, die ich entfernt habe)

POST /cgi-bin/measure HTTP/1.1
[...]
Content-Type: application/x-www-form-urlencoded

action=store&sessionid=d2cb-f8a47ce3-caf8eb4d&source=1&type=
2&data=[WDEBUG] dac: [...]

10.
wieder ein freundliches OK zurueck

HTTP/1.1 200 OK
[...]
Content-Type: text/plain

{"status":0}

11.
die waage will sich ausloggen bzw. session loeschen

POST /cgi-bin/maint HTTP/1.1
[...]
Content-Type: application/x-www-form-urlencoded

action=delete&sessionid=d2cb-f8a47ce3-caf8eb4d

12.
antwort: alles klar!

HTTP/1.1 200 OK
[...]
Content-Type: text/plain

{"status":0}

die ganze kommunikation gilt es nun auf dem webserver “nachzubauen”. der kram muss im verzeichnis “cgi-bin” abgelegt werden. das ist halt mal “vorgegeben” durch die waage. in den allermeisten faellen muss man dazu den directory alias fuer das cgi-bin verzeichnis aus der apache config rausnehmen.
damit ich mit einer in php geschriebenen datei auskomme, benutze ich mod_rewrite vom apache mit den passenden regeln in der .htaccess datei im gleichen verzeichnis:

RewriteEngine On
RewriteRule once$ withings.php?s=once
RewriteRule session$ withings.php?s=session
RewriteRule maint$ withings.php?s=maint
RewriteRule measure$ withings.php?s=measure

die passende datei “withings.php” habe ich hier zum download bereit gestellt. man muss natuerlich die werte der benutzer an seine eigenen beurfnisse anpassen. ich hab nicht ausprobiert, was die waage macht, wenn das nicht passt. der php code ist “mal schnell” gemacht. bestimmt geht das noch schoener, tut aber im moment genau das, was er soll. erstmal schreibt das ding die werte einfach in eine textdatei. die datenbankanbindung und das erstellen einer graphischen auswertung hebe ich mir fuer spaeter auf 😉

das wars erstmal… ein nettes spielzeug, dass ich einfach fuer die eigenen beduerfnisse angepasst habe. so macht die waage spass… ich weiss wo meine daten sind und wer sie sehen kann. auch wenn ich das projektchen fertig mache, wird es bestimmt nicht so huebsch aussehen wie das original und eine iphone app werde ich auch nicht haben. wozu auch?

Author: sd

24 thoughts on “hack: withings wlan waage

  1. Super! Ich hatte mich nicht getraut, so ein Ding zu kaufen, weil es ja wertlos würde, wenn withings mal nicht mehr mag. Jetzt weiß ich, dass ich es dann trotzdem weiter benutzen kann. Danke!

  2. Hi, super Beschreibung. Ich hab mir vor einer Woche so ein Teil bestellt und wollte auch mal schau’n ob ich per DNS auf den eigenen Webserver umleiten kann. Bin aber eher zufällig über Deine Seite gestolpert. Eine klasse Basis um da weiterzumachen. Besten Dank! Pit

  3. Hey! Super Beschreibung! Gibt es Hinweise darauf, wie man die anderen Daten, welche die Waage misst, an einen Server weitergeben kann (Körperfett etc.)?

  4. moin, dein beitrag wurde nicht geloescht, sondern nur noch nicht freigegeben. ich schau nicht jeden tag nach den comments 😉

    die anderen daten stehen sicherlich auch in den datenpaketen. ich hab mir nur nucht die muehe gemacht, diese raus zu suchen, da mich das zu diesem zeitpunkt nicht interessiert hat.

  5. Hello! Ich würde so eine Waage gerne für das Wiegen eines Kanisters (Verbrauch) verwenden. Kann die Waage entweder das Gewicht permanent senden, oder sendet sie wenn Gewicht drauf ist (Kanister bleibt ja stehen) und man Strom (Batterie raus, Netzteil mit Timer alle 15 Minuten rein) anlegt dann das Gewicht automatisch hinaus? Könnte mir bitte jemand diese Frage beantworten? Vielen Dank!
    LG RedRaz

  6. hallo RedRaz,
    die waage geht an, wenn das gewicht drauf steht und dann automatisch wieder aus (auch mit gewicht). ich kanns schlecht probieren, wie es ist, wenn man die batterie entfernt. das fach ist unten und zum rausnehmen muss man ja das gewicht runter nehmen. und um da mal was zu basteln um die stromversorgung zu unterbrechen, fehlt mir gerade die zeit.
    gruss
    sd

  7. Hat das Dingen denn keiner mal aufgeschraubt? Das werkelt doch bestimmt ( oder hoffentlich ) ein Linux drunter und man kann sich die ganze DNS rumschrauberrei sparen?

  8. öhm… nö.
    ich weiss auch nicht, ob ich da irgendwas erkennen wuerde. aber der ansatz ist gut 😉

  9. Hi, hat Jemand mal die neue (?) Withings WS-30 mit dem DNS Hack betieben ? Die sit billiger – nicht ganz so schön und hat zusätzlich Bluetooth eingebaut.

    @schwergewicht: Oft nutzt man da wifi Shields mit mini Betriebssystem (wie z.B. Wifly für 19 EUR) oder andere minimalistische Teile – die Kosten bei einem VK von 119 liegen sicherlich unter 50 EUR (App, Cloud und HW) dableibt für die eigentlichen Herstellkosten der Wage vielleicht 40 EUR übrig.

    -Ralf

  10. Hi Stefan,

    hast Du damals die Mac-Adresse und Once-ID anonymisiert? Bin aktuell dabei die WS-50 zu knacken, speziell das hinterlegte Secret. Ich würde gern wissen ob das Secret für jedes Gerät einzigartig ist oder ob es pro Gerätereihe verwendet wird.

    BG Matthias

  11. puuuh… das ist ein paar jaehrchen her und mein momentanes heimnetz setup laesst eine schnelle ueberpruefung nicht zu. ich nutze die waage im moment auch nur “offline” 😉

  12. Ich betreibe mit Hilfe der Anleitung hier nun meine WS-50 im Heimnetz. Vielen Dank dafür.
    Im Abschnitt session/action=new habe ich die Werte durch meine eigenen ersetzt.
    Diese habe ich einem Netzwerkmitschnitt entnommen.
    Die Waage liefert unter cgi-bin/v2/measure die Messdaten für CO2 und Temperatur.
    Dafür hab ich eine eigene Sektion eingefügt.
    Ich schreibe die Daten in eine mysql Datenbank und stelle sie mit Hilfe von morris.js dar.
    Ich kann meinen Code gerne zur Verfügung stellen.
    Soll ich ihn ans Comment hochladen?

    Gruss Christoph

  13. ja cool… kannst mir den code gerne per mail schicken. dann mache ich ein neues posting und verweise darauf.
    gruss
    stefan

  14. Ist schon etwas her der Eintrag hier, ich versuch aber trotzdem mal euch zu erreichen :).

    Ich habe mir einen Raspbery mit eurem Hack aufgesetzt, jedoch (Waage ist upgedated, fw version weiss ich nicht genau) sendet die waage als erstes ein POST zu cgi-bin/certificate? mit einem challenge Parameter dazu, woraufhin der Nokia/Withings Server dann eine entsprechende antwort generiert inkl. Zertifikat. Leider kann man das nicht emulieren, oder wüsste ich nicht genau wie.. Falls Ihr da akutelle info zu habt, wäre ich sehr dankbar.

  15. sorry… da kann ich leider nicht weiter helfen. seit mindesten sieben jahren liegt die waage irgendwo immer keller rum…

Leave a Reply

Your email address will not be published. Required fields are marked *