Der letzte Hackathon ist schon eine ganze Weile her, aber meine Wenigkeit war ebenfalls beim AMCS Hackathon anwesend. Ich bin jedoch fast ohne Ideen zum Hackathon gegangen und dachte, ich lasse mich von den Anwesenden und deren Ideen inspirieren.
Was mich jedoch viel mehr inspiriert hat, waren die Kisten Mate, die uns freundlicherweise zur Verfügung gestellt wurden und da ich auf einem Hackathon war, dachte ich mir, suche ich nach einer Möglichkeit, Mate auf Knopfdruck zu bestellen!
Gesagt, getan! Nachdem ich die Option, einen eigenen Mate-Lieferservice auf die Beine zu stellen, schnell wieder verworfen hatte, suchte ich mir einen Lieferanten, der das stattdessen für mich erledigt. Ich bin ich schnell auf eine große, deutsche Einzelhandelskette gestoßen, deren Namen ich nicht nennen möchte! Da diese Kette auch eine eigene App besitzt, dachte ich mir, dass sie auch eine API haben könnte, die ich selbst ansprechen kann.
Eine Google-Suche nach “$KETTENNAME API” lieferte mir auf der ersten Seite auch gleich die passende URL. Nach 15 minütigem erfolglosen Suchen (404!) von Endpunkten der API gab ich auf. Ein an meinem Tisch sitzender Mit-Hacker kam dann auf die Idee, den Netzwerkverkehr der App mitzuschneiden und damit herauszufinden, mit welcher API ich sprechen musste.
Nächster Schritt war also, einen Android-Emulator für Windows 7 zu finden. Die Nacherzählung der langatmigen Suche (Android SDK, Genymotion, Bluestacks) erspare ich dem gemeinen Leser. Die Lösung war AndY, ein sehr einfach zu nutzender Android-Emulator. Er hat insofern überzeugt, dass er mir nach der Installation in wenigen Minuten ein funktionierendes Android zur Verfügung gestellt hat; ohne Konfigurationsaufwand!
Schnell im Play Store angemeldet und die Bestell-App der Kette heruntergeladen. Account angelegt und kurzen Funktionstest (erfolgreich!) durchgeführt.
Die erste Idee war nun, den Netzwerkverkehr mit Wireshark mitzuschneiden. Ich habe jedoch feststellen müssen, dass die Kommunikation zwischen App und API nur verschlüsselt (zum Glück!) stattfindet.
Also brauchte ich etwas, um den verschlüsselten Verkehr zu entschlüsseln. Gemeinhin nennt man so etwas einen Man-in-the-Middle-Angriff. Dabei wird beim Zertifikatsaustausch zwischen zwei Kommunikationspartnern beiden ein falsches Zertifikat vorgetäuscht. Somit kann dann der Mann in der Mitte den verschlüsselten Verkehr mitlesen.
Ein Windows-Programm, was genau das tut, ist der Charles Proxy.
Nach der Installation muss hier jedoch noch Einiges vorgenommen werden, damit der verschlüsselte Traffic mitgelesen werden kann.
Charles gibt sich selbst als HTTP-Proxy aus, der standardmäßig auf Port 8888 läuft. Mit dem Tastenkürzel STRG-UMSCHALT-P im Charles wird der Proxy für Windows aktiviert. Dann muss noch der SSL-Proxy (unter Proxy -> SSL Proxying Setup) aktiviert werden. Als Location kann der Einfachheit halber *:*
genutzt werden:
In den Access Control Settings muss dann noch die IP-Adresse des Android eingetragen werden.
Die nächsten beiden Schritte sind im Android auszuführen.
Zum einen muss das Charles SSL-Zertifikat im Zertifikatsspeicher des Android abgelegt werden. Dazu muss man einfach nur im Browser die URL www.charlesproxy.com/getssl/ aufgerufen werden. Dadurch wird das Zertifikat heruntergeladen und auf dem Android installiert:
Zum anderen muss der Charles-Proxy in den Android-Einstellungen aktiviert werden:
Wenn man diese Schritte alle erledigt hat, kann man die App aufrufen und man sollte im Charles-Frontend Requests gegen die API sehen!
Wenn die Requests hier nicht zu sehen sind, hat man entweder bei der Einrichtung etwas falsch gemacht, oder die Kommunikation wird mittels HTTP Public Key Pinning geschützt. Sollte das der Fall sein, kommt man hier leider mit Charles auch nicht weiter.
Zum Glück für mich war das bei der App nicht der Fall und so konnte ich alle Requests gegen die API mitlesen. Charles selbst hat eine Funktion, mit der man jeden Request als cURL-Request kopieren und auf der Kommandozeile ausführen kann.
Damit war ich meinem Ziel schon um einiges näher gekommen! Die nächsten Stunden habe ich (neben Mate und Bier trinken) damit verbracht, mir die cURL-Requests anzusehen und zu verändern.
Dabei bin ich so weit gekommen, Mate in den Warenkorb zu legen (Witzig: man kann maximal 99 Kisten in den Warenkorb legen, liefern lassen kann man sich aber nur 7 Kisten; bei Bananen hingegen ist die “haushaltsübliche Menge” 199!), sowie die Bestellung auch auszulösen. Leider gehören zu einer erfolgreichen Bestellung mehr Schritte als diese beiden, unter Anderem Anmelden, Lieferadresse und Zahlungsinformationen hinterlegen und vieles mehr.
Hier ein anonymisierter Beispiel-cURL-Request:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
curl -H 'ruleVersion: 1' \ -H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxx' \ -H 'Correlation-Id: xxxxxxxxxxxxxxx' \ -H 'Content-Type: application/json; charset=UTF-8' \ -H 'Host: xxxxxxxxxxxx' \ -X PATCH \ --compressed 'https://xxxxxxxxxxxxx/mobile/basket/xxxxxxxxxxxxxxxxxxxxxxxxxxx' --data-binary '{ "actions":[ { "action":"modifyLineItem", "lineItem":{ "category":{ "id":"20794", "name":"" }, "product":{ "articleId":"xxxxxxxxxxxx", "baseAmount":1, "baseMeasure":"L", "basePrice":155, "baseQuantity":0.5, "brand":"Club Mate", "bulkyGoodsShare":100, "categoryId":"xxxxxx", "description":"", "gtin":"xxxxxxx", "imageUrl":"xxxxxx", "nan":"xxxxxxx", "orderLimit":99, "price":1549, "productId":"xxxxxxxxxxxxxx", "quantityType":"L", "refundPrice":450, "title":"Club-Mate 20x0,5l", "volumeCode":"STK" }, "quantity":1, "totalPrice":1549, "totalRefundPrice":450 } } ], "version":39 }' |
Um nicht unnötig Bestellungen bei der Einzelhandelskette auszulösen, habe ich hier jedoch meine weiteren Versuche abgebrochen. Im Sinne des Hackathons habe ich jedoch viel nachgedacht und noch mehr gelernt.
Club Mate sei Dank!
Übrigens: Am 16.11.2017 findet unser nächster Hackathon statt, wir werden also wieder hier exklusiv berichten!
Mit über 15 Jahren Erfahrung als System Engineer und System Architekt bin ich die “Allzweckwaffe” im Kampf gegen Bugs und Performanceprobleme. Den Rest meiner Arbeitszeit verwende ich zur Verbesserung unseres Monitoringsystems und des Netzwerks in unseren Rechenzentren.