+ Antworten
Seite 1 von 18 1 2 3 11 ... LetzteLetzte
Ergebnis 1 bis 10 von 176
  1. #1
    Registriert seit
    Dec 2006
    Ort
    Delmenhorst
    Beiträge
    185

    Standard Miele@Home XKM 3100W Protokollanalyse

    Nachdem mich unser Forenmitglied "Brovning" angesprochen hatte und fragte, ob sein Miele WLAN-Modul XKM 3100W sich direkt per IPS ansteuern ließe, hat mir das eine Ruhe gelassen. "Brovning" war so freundlich, mir sein Modul zu zusenden. Danke dafür nochmal!

    In diesem Thema soll es darum gehen, wie das Modul XKM 3100W kommuniziert und ob man es mit IPS direkt ohne Miele Gateway (XGW 3000) ansteuern kann.
    mfg

    Michael Scholze

  2. #2
    Registriert seit
    Dec 2006
    Ort
    Delmenhorst
    Beiträge
    185

    Das Modul ist eingebaut - Nun kanns los gehen!

    Als erstes habe ich das Modul erstmal auf Werkseinstellungen gesetzt. Das geht entweder über die Taste auf dem Modul (10 Sekunde drücken = Werkszustand) oder über das Miele@Home Menü der Waschmaschine.

    Danach habe ich über mein Handy das Gerät ins WLAN eingebunden. Das Modul spannt ein eigenes Miele-WLAN auf, wo man sich mit dem Handy einbuchen muss. Das Passwort die die SerienNr der Maschine ohne führende Nullen. Dann kann man über die Miele@Mobile App das Netzwerk konfigurieren.

    Nachdem man dann das WLAN auf dem Handy zurück auf das eigene gesetzt hat, sollte das Modul (Waschmaschine) gefunden werden.

    Um die Kommunikation analysieren zu können, habe ich das Modul an einen Bintec Accesspoint angemeldet. Dieser Accespoint lässt es zu, die Kommunikation mit Wireshark zu analysieren.

    Mich interessierte als erstes, wie die Anmeldung des Moduls mit der App funktioniert. Voraussetzung ist dabei, dass das Modul bereits im WLAN eingebunden ist.


    1. Broadcast Frames

    Jedes Miele-Gerät sendet auf dem Netzwerk regelmäßig Broadcast-Frames. Meine Waschmaschine sendet den Strings
    Code:
    mieleathome.tcp.local         W   Miele WMR860
    .

    Damit kann z.B. die Miele@Mobile App das Gerät finden.
    Vermutung: Das "W" bei der Gerätekennung besagt, dass das Gerät ein Waschautomat ist. "T" würde für Trockner stehen.


    2. Hinzufügen des Gerätes zur Miele@Mobile App

    Nachdem die App das Gerät via Broadcast gefunden hat, kann man das Gerät auswählen und hinzufügen.
    Nun passiert folgendes:

    Die App sendet via HTTP-PUT folgendes ans Modul:

    Code:
    PUT /Security/Commissioning/ HTTP/1.1
    Host: Miele-001D63FFFE049B4F.local.
    Connection: keep-alive
    Date: Sun, 12 Mar 2017 12:42:04 GMT
    Accept: application/vnd.miele.v1+json
    User-Agent: Miele@mobile 2.3.3 iOS
    Content-Length: 172
    Accept-Language: de-de
    Accept-Encoding: gzip, deflate
    
    {"GroupID":"0025DC69F3CE9FA4","GroupKey":"9F944A76F46AAAC11B818439BA53735A869BF1E1ACE6C3FCBAE898BFA87FE2CE595CB27BB23F3F6C1921D94D28FA0EB048537A2ADEC666B05F7BE4CDD5D46BDB"}
    Das Modul antwortet mit:
    Code:
    HTTP/1.1 200 OK
    Content-Type: application/vnd.miele.v1+json; charset=utf-8
    access-control-allow-origin:*
    access-control-allow-headers:Authorization
    Date: Sun, 12 Mar 2017 12:42:03 GMT
    Content-Length:205
    
    [
    	{"Success":{"GroupID":"0025DC69F3CE9FA4"}},
    	{"Success":{"GroupKey":"9F944A76F46AAAC11B818439BA53735A869BF1E1ACE6C3FCBAE898BFA87FE2CE595CB27BB23F3F6C1921D94D28FA0EB048537A2ADEC666B05F7BE4CDD5D46BDB"}}
    ]
    Was jetzt hier genau gemacht wird, kann ich nicht 100%ig sagen. Es scheint so, dass eine Verschlüsselung initialisiert wird. Die GroupID scheint eine Art einmalige Kennung des Gerätes zu sein. Der GroupKey wird eine Art Verschlüsselungszertifikat sein, womit die weitere Kommunikation verschlüsselt wird.

    3. Gerätedaten abfragen
    Die weitere Kommunikation erfolgt über HTTP-GET Aufrufe.
    Die App fragt die allgemeinen Gerätedaten ab:

    Code:
    GET /Devices/ HTTP/1.1
    Host: Miele-001D63FFFE049B4F.local.
    Connection: keep-alive
    Date: Sun, 12 Mar 2017 12:42:09 GMT
    Accept: application/vnd.miele.v1+json
    User-Agent: Miele@mobile 2.3.3 iOS
    Authorization: MieleH256 0025DC69F3CE9FA4:733979F4F79A0E4D638E040DF0C218D355A85E7DA9D4BCE43F6A85A5D9FE1684
    Accept-Language: de-de
    Accept-Encoding: gzip, deflate
    Das Modul antwortet mit:
    Code:
    HTTP/1.1 200 OK
    Content-Type: application/vnd.miele.v1+json; charset=utf-8
    access-control-allow-origin:*
    access-control-allow-headers:Authorization
    Date: Sun, 12 Mar 2017 12:42:08 GMT
    Content-Length:112
    X-Signature: MieleH256 0025DC69F3CE9FA4:DC65CAE29ABFF0D0E8836FBD1123AEB439591D360F2A976A4816F3B903EDD8DC
    
    ..>....u....@Z?.....p.1LE.T...V.z.[..m..L.b. ..iDm...iZ..F..@..O..T....V.....A.-.I!.p....K...=.m.@...~.u.U......
    Bei der Anfrage wird als Authentication "MieleH256" gesendet. Danach die GroupID und ein 32Byte lange Zeichenfolge, Hex-kodiert. Was das genau ist, kann ich nicht sagen.
    Die eigentlichen Daten sind nicht lesbar, da verschlüsselt. Da bei Content-Type oben was von "json" steht, kann man wohl von verschlüselten JSON-Daten ausgehen.

    Soweit erstmal der aktuelle stand.

    Fazit:
    • Die Kommunikation erfolgt über einfache HTTP-Nachrichten
    • Die eigentlichen Daten sind verschlüsselt mittels eines eigenen Verfahrens, was Miele "MieleH256" nennt
    • Eine Kommunikation wäre grundsätzlich möglich, wenn wir die Verschlüsselung verstehen würden


    weiteres folgt in Kürze.
    mfg

    Michael Scholze

  3. #3
    Registriert seit
    Dec 2006
    Ort
    Delmenhorst
    Beiträge
    185

    So, habe mich weiter mit der Verschlüsselung beschäftigt.

    Die Verschlüsselte Nachricht wird gebildet aus folgenden drei Teilen:

    1. Die unverschlüsselten Nachricht (JSON)
    2. Der 64Byte lange GroupKey, der beim Paring ausgetauscht wird (Jedes Gerät hat seinen eigenen)
    3. Die 32Byte Folge, die im jedem Header einer Verschlüsselten Nachricht steht (MieleH256 [GroupID]:[MessageKey])



    Ich vermute, die Verschlüsselung ist symmetrisch. Es könnte AES sein (wegen der Kennung "MieleH256" und dem 64 Byte GroupKey => 256bit).

    Interessant dabei ist, das die selbe Nachricht (z.B. die 1. Nachricht beim Start eines Gerätes) verschlüsselt immer anders ist.
    Der Grund könnte der MessageKey sein. Dieser wird vermutlich zufallsgeneriert und sorgt für immer andere Ergebnisse bei der Verschlüsselung.

    Fragen über Fragen...
    mfg

    Michael Scholze

  4. #4
    Registriert seit
    Dec 2010
    Beiträge
    10

    Hast Du schonmal versucht per Miele@Home App unter Geräteeinstellungen "SmartHome Integration" ein Passwort zu vergeben? Evtl ist ja dann damit auch ein Kommunikationsaufbau möglich.

  5. #5
    Registriert seit
    Dec 2010
    Beiträge
    10

    H256 bedeutet HMAC SHA256, der hintere Teil der Nachricht ist nur eine Signatur (vermutlich erzeugt mit dem initial festgelegten Key)

  6. #6
    Registriert seit
    Apr 2017
    Beiträge
    1

    Hello!

    Firstly, my apologies for not being able to communicate in German without the aid of my wife or Google Translate, however I have just installed an XKM 3100W in a H 6860 BP oven and would also like to understand the protocol. When I get the chance I will attempt to also use tcpdump and follow what is being sent. In the meantime this document might be of interest:

    https://www.iana.org/assignments/med...vnd.miele+json

    I'm be happy to help if there is anything I can do.

    Best wishes,

    James

    Google Translate:

    Hallo!

    Zuerst entschuldige ich mich, dass ich nicht in der Lage bin, auf Deutsch ohne die Hilfe meiner Frau oder Google Translate zu kommunizieren, aber ich habe gerade ein XKM 3100W in einem H 6860 BP Ofen installiert und möchte auch das Protokoll verstehen. Wenn ich die Chance bekomme, werde ich versuchen, auch tcpdump zu benutzen und dem zu folgen, was gesendet wird. In der Zwischenzeit könnte dieses Dokument von Interesse sein:

    https://www.iana.org/assignments/med...vnd.miele+json

    Ich würde mich freuen, wenn es etwas gibt, was ich tun kann.

    Mit freundlichen Grüßen,

    James

  7. #7
    Registriert seit
    Dec 2010
    Beiträge
    10

    The description of the document is interesting, but it just confirms what has been written above. In posting #2 you can also see the output of a tcpdump.
    The hashing doesn't seem to be the problem, generating the initial trust level is. However, so far I have not seen any secret pieces, i.e. an own script should be able to do the same thing the Miele@Home App is doing, register with a key and then use it so hash subsequent requests.

  8. #8
    Registriert seit
    Jul 2009
    Ort
    Berlin
    Beiträge
    105

    Gibt es hier Neuigkeiten?

  9. #9
    Registriert seit
    Sep 2017
    Beiträge
    5

    Hallo,

    Idee: Die Android App kann eine Verbindung herstellen, also muss das im Source ersichtlich sein. Ergo: Android App auseinandernehmen (mit APKTOOL) und schauen, was diese genau sendet bzw. empfängt...

    Interessant könnte z.B. diese Klasse sein:

    .class public Lde/miele/infocontrol/networking/http/interceptor/GroupModeAuthInterceptor; (enthält Konstante "MieleH256", die sich auch per Wireshark finden lässt) sowie
    .class public Lde/miele/infocontrol/networking/auth/PayloadEncryptor; (enthält u.a. :
    .field private static final ALGORYTHM:Ljava/lang/String; = "AES"
    .field private static final CIPHER_TYPE:Ljava/lang/String; = "AES/CBC/NoPadding")

    sowie die Methoden "encrypt" und "decrypt".

    Ich glaube nicht, dass ich in den nächsten Wochen dazu komme.. aber vielleicht hat ja jemand anders Lust, sich ein wenig da durch zu debuggen? :-)

    Viele Grüße

    phenx

  10. #10
    Registriert seit
    Sep 2017
    Beiträge
    5

    Ich nochmal.. nach ein wenig Decompilen und Smali in Java zurückverwandeln gibt es erste Ansätze, zumindest schonmal zum Entschlüsseln der empfangen Daten. Das habe ich testweise zusammengeschrieben hierfür:

    Code:
    public class Test {
        private static final String ALGORYTHM = "AES";
        private static final String CIPHER_TYPE = "AES/CBC/NoPadding";
        
    	public static void main(String[] args) throws GeneralSecurityException {
    		byte[] mGroupKey = javax.xml.bind.DatatypeConverter.parseHexBinary("<<<GROUP_KEY>>>");
    		byte[] payload = javax.xml.bind.DatatypeConverter.parseHexBinary("<<<PAYLOAD>>>");
    		String requestSignature = "<<<SIGNATURE>>>";
    		
    		// Die ersten 50 Prozent der "requestSignature" bilden den initVectorString
            String initVectorString = requestSignature.substring(0x0, (requestSignature.length() / 0x2));
            byte[] initVector = javax.xml.bind.DatatypeConverter.parseHexBinary(initVectorString);
            IvParameterSpec ivParameterSpec = new IvParameterSpec(initVector);
    		
    		// Die ersten 50 Prozent des "key" aus dem Konstruktor bilden den secretKey
    		byte[] secretKey = Arrays.copyOf(mGroupKey, (mGroupKey.length / 0x2));
            SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey, ALGORYTHM);
    
    		// Java Standardklassen für die tatsächliche Entschlüsselung
    		Cipher cipher = Cipher.getInstance(CIPHER_TYPE);
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
    		byte[] decryptedPayload = cipher.doFinal(payload);
    		
    		System.out.print(new String(decryptedPayload, StandardCharsets.UTF_8));
    	}
    
    }
    Mit:
    <<<GROUP_KEY>>> als hexadezimalem Groupkey, der sich in der DB der Android App findet.
    <<<PAYLOAD>>> Dem per Wireshark mitgeschnittenen Inhalt, der von der Miele gesendet wurde
    <<<SIGNATURE>>> Dem Teil nach dem Doppelpunkt in der X-Signatur der Miele Response

    Output (auf die GET /Devices/<<<DEVIDE_ID>>>/State/ HTTP/1.1) Anfrage:
    Code:
    {
    	"Status":3,
    	"InternalState":3,
    	"ProgramType":0,
    	"ProgramID":1,
    	"ProgramPhase":256,
    	"RemainingTime":[2,59],
    	"StartTime":[0,0],
    	"TargetTemperature":[4000],
    	"Temperature":[-32768,-32768,-32768],
    	"SignalInfo":false,
    	"SignalFailure":false,
    	"SignalDoor":true,
    	"RemoteEnable":[15,0,0],
    	"ProcessAction":0,
    	"Light":0,
    	"ElapsedTime":[0,0],
    	"ExtendedState":"00180104000006400102010116013A98025801C2025801C200000000000000000000000100000000000000000000000000000000000000005514000000FF0200000102"
             }
    Fehlt natürlich noch die andere Richtung, das Senden von Befehlen. Das scheint aber auch gar nicht allzu kompliziert zu sein...

Ähnliche Themen

  1. Antworten: 81
    Letzter Beitrag: 03.11.17, 15:57
  2. Antworten: 72
    Letzter Beitrag: 27.10.17, 11:41
  3. Anbindung Miele@Home
    Von nofo im Forum Haustechnik
    Antworten: 29
    Letzter Beitrag: 20.11.15, 14:02
  4. Miele @ Home - updates?
    Von dmeyer8803 im Forum Anleitungen / Nützliche PHP Skripte
    Antworten: 8
    Letzter Beitrag: 26.04.15, 21:12
  5. Miele@home
    Von Sven im Forum Allgemeine Diskussion
    Antworten: 5
    Letzter Beitrag: 02.11.08, 13:24

Stichworte