Ein Tutorial zum Reverse Engineering der privaten API Ihrer Software: Hacking Your Couch

Veröffentlicht: 2022-03-11

Reisen ist meine Leidenschaft und ich bin ein großer Fan von Couchsurfing. Couchsurfing ist eine globale Community von Reisenden, in der Sie eine Unterkunft finden oder Ihr eigenes Zuhause mit anderen Reisenden teilen können. Darüber hinaus hilft dir Couchsurfing, ein echtes Reiseerlebnis zu genießen, während du mit Einheimischen interagierst. Ich bin seit über 3 Jahren in der Couchsurfing-Community involviert. Zuerst habe ich an Meetups teilgenommen, und dann konnte ich endlich Leute aufnehmen. Was für eine unglaubliche Reise! Ich habe so viele unglaubliche Menschen aus der ganzen Welt getroffen und viele Freunde gefunden. Diese ganze Erfahrung hat mein Leben wirklich verändert.

Ich habe selbst viele Reisende beherbergt, viel mehr, als ich tatsächlich gesurft bin. Als ich in einem der wichtigsten Touristenziele an der Côte d'Azur lebte, erhielt ich eine enorme Menge an Couchanfragen (bis zu 10 pro Tag in der Hochsaison). Als freiberuflicher Backend-Entwickler ist mir sofort aufgefallen, dass das Problem der Couchsurfing.com-Website darin besteht, dass sie mit solchen „Hochlast“-Fällen nicht richtig umgeht. Es gibt keine Informationen über die Verfügbarkeit Ihrer Couch - wenn Sie eine neue Couchanfrage erhalten, können Sie nicht sicher sein, ob Sie zu diesem Zeitpunkt bereits jemanden beherbergen. Es sollte eine visuelle Darstellung Ihrer akzeptierten und ausstehenden Anfragen geben, damit Sie sie besser verwalten können. Wenn Sie Ihre Couch-Verfügbarkeit öffentlich machen könnten, könnten Sie auch unnötige Couch-Anfragen vermeiden. Um besser zu verstehen, was ich vorhabe, werfen Sie einen Blick auf den Airbnb-Kalender.

Viele Unternehmen sind berüchtigt dafür, ihren Nutzern nicht zuzuhören. Da ich die Geschichte von Couchsurfing kenne, konnte ich mich nicht darauf verlassen, dass sie diese Funktion in absehbarer Zeit implementieren würden. Seit die Website zu einem gewinnorientierten Unternehmen wurde, verschlechterte sich die Community. Um besser zu verstehen, wovon ich spreche, schlage ich vor, diese beiden Artikel zu lesen:

  • http://www.nithincoca.com/2013/03/27/the-rise-and-fall-of-couchsurfing/
  • http://mechanicalbrain.wordpress.com/2013/03/04/couchsurfing-a-sad-end-to-a-great-idea/

Ich wusste, dass viele Community-Mitglieder sich über diese Funktion freuen würden. Also beschloss ich, eine App zu erstellen, um dieses Problem zu lösen. Es stellt sich heraus, dass keine öffentliche Couchsurfing-API verfügbar ist. Hier ist die Antwort, die ich von ihrem Support-Team erhalten habe:

„Leider müssen wir Ihnen mitteilen, dass unsere API nicht wirklich öffentlich ist und es derzeit keine Pläne gibt, sie öffentlich zu machen.“

In meine Couch einbrechen

Es war an der Zeit, einige meiner Lieblings-Software-Reverse-Engineering-Techniken anzuwenden, um bei Couchsurfing.com einzudringen. Ich bin davon ausgegangen, dass ihre mobilen Apps eine Art API verwenden müssen, um das Backend abzufragen. Also musste ich die HTTP-Anfragen abfangen, die von einer mobilen App an das Backend kamen. Zu diesem Zweck habe ich im lokalen Netzwerk einen Proxy eingerichtet und mein iPhone damit verbunden, um HTTP-Anfragen abzufangen. Auf diese Weise konnte ich Zugangspunkte ihrer privaten API finden und ihr JSON-Nutzdatenformat herausfinden.

Schließlich habe ich eine Website erstellt, die dazu dient, Menschen bei der Verwaltung ihrer Couchanfragen zu unterstützen und Surfern einen Couchverfügbarkeitskalender zu zeigen. Ich habe einen Link dazu in den Community-Foren veröffentlicht (die meiner Meinung nach auch ziemlich segmentiert sind und es schwierig ist, dort Informationen zu finden). Die Resonanz war größtenteils positiv, obwohl einige Leute die Idee nicht mochten, dass die Website Couchsurfing.com-Anmeldeinformationen erfordert, was wirklich Vertrauenssache ist.

Die Website funktionierte so: Sie melden sich mit Ihren Couchsurfing.com-Anmeldeinformationen auf der Website an, und nach ein paar Klicks erhalten Sie den HTML-Code, den Sie in Ihr Couchsurfing.com-Profil einbetten können, und voila – Sie haben einen automatisch aktualisierten Kalender dein Profil. Unten ist der Screenshot des Kalenders und hier die Artikel darüber, wie ich ihn erstellt habe:

  • https://github.com/nderkach/couchsurfing-python

Beispiel Kalender

Ich habe ein großartiges Feature für Couchsurfing erstellt und bin natürlich davon ausgegangen, dass sie meine Arbeit schätzen würden – vielleicht sogar eine Stelle in ihrem Entwicklungsteam anbieten würden. Ich habe eine E-Mail an jobs(at)couchsurfing.com mit einem Link zur Website, meinem Lebenslauf und einer Referenz gesendet. Ein Dankesbrief, den einer meiner Couchsurfing-Gäste hinterlassen hat:

Danke beachten.

Ein paar Tage später verfolgten sie meine Reverse-Engineering-Bemühungen. In der Antwort war klar, dass das einzige, worüber sie sich Sorgen machten, ihre eigene Sicherheit war, also baten sie mich, die Blog-Beiträge zu entfernen, die ich über die API und schließlich die Website geschrieben habe. Ich habe die Beiträge sofort entfernt, da ich nicht die Nutzungsbedingungen verletzen und nach Benutzerdaten fischen wollte, sondern der Couchsurfing-Community helfen wollte. Ich hatte den Eindruck, dass ich als Krimineller behandelt wurde, und das Unternehmen konzentrierte sich ausschließlich auf die Tatsache, dass meine Website Benutzerdaten erfordert.

Ich schlug vor, ihnen meine App kostenlos zu geben. Sie könnten es in ihrer Umgebung hosten und es über die Facebook-Authentifizierung verbinden. Schließlich ist es ein großartiges Feature, und die Community brauchte es. Hier ist die endgültige Auflösung, die ich erhalten habe:

„Wir kommen hier nach den Ferien wieder in Fahrt und wollten nachhaken.

Wir haben einige interne Diskussionen über deine Bewerbung geführt und wie wir die Kreativität und Initiative, die sie zeigt, würdigen können, ohne potenziell die Privatsphäre und Sicherheit der Daten von Couchsurfing-Benutzern zu gefährden, wenn sie ihre Zugangsdaten auf einer Website eines Drittanbieters eingeben.

Der Kalender füllt eindeutig eine Funktionslücke auf unserer Website, eine Funktion, die Teil eines größeren Projekts ist, an dem wir gerade arbeiten.

Das Problem des Sammelns von Benutzernamen und Passwörtern bleibt jedoch bestehen. Wir konnten uns keine einfache Möglichkeit einfallen lassen, es so einzurichten, dass wir es auf unserer Seite hosten oder unterstützen könnten, ohne dass Sie entweder auf diese Daten zugreifen können oder Ihre Website als unser Arbeitsprodukt angesehen wird.

Die derzeit verfügbare API wird bald durch eine Version ersetzt, die eine Authentifizierung/Autorisierung von Anwendungen erfordert, die darauf zugreifen.“

Heute, während ich dieses Reverse-Engineering-Software-Tutorial schreibe (ein Jahr nach den Ereignissen), ist die Kalenderfunktion bei Couchsurfing immer noch nicht implementiert.

Return To Innocence - Noch einmal meine Couch hacken

Vor ein paar Wochen wurde ich inspiriert, einen Artikel über die Techniken zum Reverse Engineering privater APIs zu schreiben. Natürlich habe ich beschlossen, die vorherigen Artikel, die ich zu diesem Thema geschrieben habe, zusammenzufassen und einige weitere Details hinzuzufügen. Als ich anfing, den neuen Artikel zu schreiben, wollte ich den Reverse-Engineering-Prozess mit einer aktuellen API präsentieren und einen weiteren Stummel zum API-Hacking machen. Basierend auf meinen bisherigen Erfahrungen und der Tatsache, dass Couchsurfing kürzlich eine komplett neue Webseite und mobile App http://blog.couchsurfing.com/the-future-of-couchsurfing-is-on-the-way/ angekündigt hat, habe ich beschlossen, ihre API erneut zu hacken.

Warum mache ich diesen Reverse-Engineering-Prozess? Nun, zunächst einmal macht es viel Spaß, Software im Allgemeinen zurückzuentwickeln. Was mir daran besonders gefällt, ist, dass nicht nur dein technisches Geschick gefragt ist, sondern auch deine Intuition. Manchmal ist der beste Weg, die Dinge herauszufinden, eine fundierte Vermutung anzustellen – es spart Ihnen viel Zeit im Vergleich zu Brute-Force. Kürzlich hörte ich eine Geschichte von einem Unternehmen, das mit proprietären APIs und wenig oder gar keiner Dokumentation arbeiten musste. Sie hatten tagelang damit gekämpft, die Nutzlast der API-Antwort in einem unbekannten Format zu entschlüsseln, dann beschloss jemand, ?decode=true am Ende der URL zu versuchen, und sie hatten einen richtigen JSON. Wenn Sie Glück haben, müssen Sie manchmal nur die JSON-Antwort verschönern.

Ein weiterer Grund, warum ich dieses Tutorial mache, ist, dass einige Unternehmen ewig brauchen, um eine bestimmte Funktion zu übernehmen, die von ihren Benutzern angefordert wird. Anstatt auf die Implementierung zu warten, können Sie die Leistungsfähigkeit ihrer privaten API nutzen und sie selbst erstellen.

Also habe ich mit der neuen Couchsurfing.com-API mit einem ähnlichen Ansatz begonnen und ihre neueste iOS-App installiert.

Zunächst müssen Sie in Ihrem LAN einen Proxy einrichten, um HTTP-Anforderungen von der App an die API zu fälschen, indem Sie einen Man-in-the-Middle-Angriff (MITM) durchführen.

Bei unverschlüsselten Verbindungen ist der Angriff recht einfach – ein Client verbindet sich mit dem Proxy und Sie leiten eingehende Anfragen hin und her an den Zielserver weiter. Sie können die Nutzlast möglicherweise ändern, falls erforderlich. In einem öffentlichen WLAN ist es ziemlich einfach, dies getarnt durchzuführen, indem man sich als WLAN-Router ausgibt.

Bei verschlüsselten Verbindungen gibt es einen kleinen Unterschied: Alle Anfragen werden Ende-zu-Ende verschlüsselt. Es ist dem Angreifer nicht möglich, die Nachricht zu entschlüsseln, es sei denn, er erhält irgendwie Zugriff auf den privaten Schlüssel (der während dieser Interaktionen natürlich nicht gesendet wird). Obwohl der API-Kommunikationskanal sicher ist, sind die Endpunkte – insbesondere der Client – ​​nicht so sicher.

Die folgenden Bedingungen müssen erfüllt sein, damit SSL ordnungsgemäß funktioniert:

  • Das Zertifikat des Servers muss bei einer vertrauenswürdigen Zertifizierungsstelle (CA) signiert sein.
  • Der allgemeine Name des Servers im Zertifikat muss mit dem Domänennamen des Servers übereinstimmen

Um die Verschlüsselung bei einem MITM-Angriff zu überwinden, muss unser Proxy als CA (Certificate Authority) fungieren und Zertifikate on the fly generieren. Wenn beispielsweise ein Client versucht, eine Verbindung zu www.google.com herzustellen, erstellt der Proxy dynamisch ein Zertifikat für www.google.com und signiert es. Jetzt denkt der Client, dass der Proxy tatsächlich www.google.com ist

Dieses Diagramm skizziert die Schritte zum Reverse Engineering einer privaten API.

Um einen Sniffing-Proxy zu implementieren, der zum Reverse Engineering der privaten API verwendet wird, verwende ich das Tool mitmproxy. Sie können jeden anderen transparenten HTTPS-Proxy verwenden. Charles ist ein weiteres Beispiel mit einer netten GUI. Damit dies funktioniert, müssen wir die folgenden Dinge einrichten:

Konfigurieren Sie das Standard-Gateway für die WLAN-Verbindung Ihres Telefons als Proxy (so dass der Proxy in der Mitte ist und alle Pakete passieren). Installieren Sie das Proxy-Zertifikat auf dem Telefon (so dass der Client den öffentlichen Schlüssel des Proxys in seinem Vertrauensspeicher hat).

Sehen Sie in der Dokumentation Ihres Proxys nach, wie Sie das Zertifikat installieren. Hier sind die Anweisungen für mitmproxy. Und hier ist die Zertifikat-PEM-Datei für iOS.

Um abgefangene HTTP-Anfragen zu überwachen, starten Sie einfach mitmproxy und stellen von Ihrem Mobiltelefon aus eine Verbindung her (Standardport ist 8080).

Mobiltelefoneinstellungen.

Öffnen Sie eine Website in Ihrem mobilen Browser. An dieser Stelle sollten Sie den Datenverkehr in mitmproxy sehen können.

Sobald Sie bestätigt haben, dass alles funktioniert, kann das Reverse Software Engineering beginnen.

Sobald Sie sichergestellt haben, dass alles wie geplant funktioniert, ist es an der Zeit, die private API Ihrer Wahl zu erkunden. Grundsätzlich können Sie an dieser Stelle einfach die App öffnen, damit herumspielen und sich ein Bild von API-Endpunkten und der Anforderungsstruktur machen.

Es gibt keinen strengen Algorithmus zum Reverse Engineering einer Software-API – die meiste Zeit verlassen Sie sich auf Ihre Intuition und treffen Annahmen.

Mein Ansatz besteht darin, die API-Aufrufe zu replizieren und mit verschiedenen Optionen zu spielen. Ein guter Anfang ist, eine Anfrage abzuspielen, die Sie in mitmproxy abgefangen haben, und zu sehen, ob sie funktioniert (drücken Sie 'r', um eine Anfrage abzuspielen). Der erste Schritt besteht darin, herauszufinden, welche Header obligatorisch sind. Es ist ziemlich praktisch, mit Mitmproxy mit Kopfzeilen zu spielen: Drücken Sie 'e', ​​um in den Bearbeitungsmodus zu gelangen, und dann 'h', um Kopfzeilen zu ändern. Mit den Abkürzungen, die sie verwenden, würden sich Vim-Süchtige wie zu Hause fühlen. Sie können auch Browsererweiterungen wie Postman verwenden, um die API zu testen, aber sie neigen dazu, unnötige Header hinzuzufügen, daher schlage ich vor, bei mitmproxy oder curl zu bleiben.

Ich habe ein Skript erstellt, das die mitmproxy-Dump-Datei liest und eine Curl-Zeichenfolge generiert – https://gist.github.com/nderkach/bdb31b04fb1e69fa5346

Beginnen wir mit der Anfrage, die gesendet wird, wenn Sie sich anmelden.

 POST https://hapi.couchsurfing.com/api/v2/sessions ← 200 application/json 

Der erste Schritt in diesem Reverse-Engineering-Tutorial besteht darin, die API-Aufrufe zu replizieren und mit den resultierenden Optionen zu spielen.

Das erste, was mir aufgefallen ist, ist, dass jede Anfrage einen obligatorischen Header X-CS-Url-Signature enthält, der jedes Mal anders ist. Ich habe auch versucht, nach einer Weile eine Anfrage erneut abzuspielen, um zu überprüfen, ob auf dem Server eine Zeitstempelprüfung vorhanden ist, und es gibt keine. Als nächstes müssen Sie herausfinden, wie diese Signatur berechnet wird.

An diesem Punkt beschloss ich, die Binärdatei zurückzuentwickeln und den Algorithmus herauszufinden. Da ich Erfahrung in der Entwicklung für das iPhone hatte und ein iPhone zur Verfügung hatte, entschied ich mich natürlich, mit dem iPhone ipa (iPhone-App lieferbar) zu beginnen. Es stellt sich heraus, dass ich zum Entschlüsseln ein Handy mit Jailbreak brauche. Stoppen! Hammerzeit.

Dann erinnerte ich mich daran, dass sie auch eine Android-App haben. Ich war etwas zögerlich, diesen Ansatz auszuprobieren, da ich nichts über Android oder Java weiß. Ich dachte dann, es wäre eine gute Gelegenheit, etwas Neues zu lernen. Es stellte sich heraus, dass es einfacher war, durch Dekompilieren von Java-Bytecode einen für Menschen lesbaren Quasi-Quellcode zu erhalten, als stark optimierter iPhone-Maschinencode.

Apk (Android-App lieferbar) ist im Grunde eine ZIP-Datei. Sie können jeden Zip-Extraktor verwenden, um den Inhalt zu entpacken. Sie finden eine Datei namensclasses.dex, die ein Dalvik-Bytecode ist. Dalvik ist eine virtuelle Maschine, die verwendet wird, um übersetzten Java-Bytecode auf Android auszuführen.

Um die .dex-Datei in den .java-Quellcode zu dekompilieren, habe ich das Tool namens dex2jar verwendet. Die Ausgabe dieses Tools ist eine JAR-Datei, die Sie mit einer Vielzahl von Tools dekompilieren können. Sie können sogar ein Glas in Eclipse oder IntelliJ IDEA öffnen und es wird die ganze Arbeit für Sie erledigen. Die meisten dieser Tools erzielen ein ähnliches Ergebnis. Es ist uns egal, ob wir es zurückkompilieren können, um es auszuführen, wir verwenden es lediglich, um den Quellcode zu analysieren.

Hier ist eine Liste von Tools, die ich ausprobiert habe:

  • FernFlower (jetzt Teil von IntelliJ IDEA)
  • CFR
  • JD-GUI
  • Krakatau
  • Procyon

CFR und FernFlower haben bei mir am besten funktioniert. JD-GUI konnte einige kritische Teile des Codes nicht dekompilieren und war nutzlos, während die anderen in etwa die gleiche Qualität hatten. Glücklicherweise scheint der Java-Code nicht verschleiert worden zu sein, aber es gibt Tools wie ProGuard http://developer.android.com/tools/help/proguard.html, die Ihnen helfen, den Code zu entschleieren.

Die Java-Dekompilierung ist nicht wirklich der Umfang dieses Reverse-Engineering-Tutorials – es wurde viel zu diesem Thema geschrieben, also nehmen wir an, Sie haben Ihren Java-Code erfolgreich dekompiliert und entschleiert.

Ich habe den gesamten relevanten Code, der zur Berechnung der X-CS-Url-Signatur verwendet wird, im folgenden Kern zusammengefasst: https://gist.github.com/nderkach/d11540e9af322f1c1c74

Zunächst habe ich nach Erwähnungen von X-CS-Url-Signature gesucht, die ich in RetrofitHttpClient gefunden habe. Ein bestimmter Aufruf schien interessant - für das EncUtils -Modul. Als ich mich damit befasste, stellte ich fest, dass sie HMAC SHA1 verwenden. HMAC ist ein Nachrichtenauthentifizierungscode, der eine kryptografische Funktion (in diesem Fall SHA1) verwendet, um einen Hash einer Nachricht zu berechnen. Es wird verwendet, um die Integrität (dh um zu verhindern, dass ein Man-in-the-Middle die Anfrage ändert) und die Authentifizierung sicherzustellen.

Wir brauchen zwei Dinge, um die X-CS-Url-Signature zu berechnen: den privaten Schlüssel und die verschlüsselte Nachricht (wahrscheinlich eine Variation der Nutzlast und URL der HTTP-Anfrage).

 final String a2 = EncUtils.a(EncUtils.a(a, s)); final ArrayList<Header> list = new ArrayList<Header>(request.getHeaders()); list.add(new Header("X-CS-Url-Signature", a2));

Im Code ist a eine Nachricht und s der Schlüssel, die verwendet werden, um den Header a2 zu berechnen (der doppelte Aufruf von EncUtils berechnet nur einen HMAC SHA1-Hex-Digest).

Das Auffinden des Schlüssels war kein Problem – er wurde im Klartext in ApiModule gespeichert und zum Initialisieren des zweiten Parameters von RetrofitHttpClient verwendet.

 RetrofitHttpClient a(OkHttpClient okHttpClient) { return new RetrofitHttpClient(okHttpClient, "v3#!R3v44y3ZsJykkb$E@CG#XreXeGCh"); }

Wenn wir uns den Aufruf von EncUtils , können wir sehen, dass das obige Zeichenfolgenliteral wörtlich als Schlüssel zur Berechnung des HMAC verwendet wird, außer in dem Fall, in dem this.b definiert ist. Im letzteren Fall wird this.b mit einem Punkt angehängt.

 String s; if (this.b == null) { s = this.a; } else { s = this.a + "." + this.b; }

Nun, nur durch einen Blick auf den Code war mir nicht klar, wo und wie this.b initialisiert wird (das einzige, was ich entdecken konnte, ist, dass es in einer Methode mit einer Signatur aufgerufen wird this.a(String b) , aber ich konnte nirgendwo im Code einen Aufruf dafür finden).

 public void a(final String b) { this.b = b; }

Ich ermutige Sie, es zu dekompilieren und selbst herauszufinden :)

Das Herausfinden der Nachricht war ziemlich einfach - im Code können Sie sehen, dass es sich um eine Verkettung des URL-Pfads handelt, dh /api/v2/sessions und einer Zeichenfolge mit JSON-Nutzlast (falls vorhanden).

 final byte[] b = this.b(request.getUrl()); byte[] a; if (request.getBody() != null && request.getBody() instanceof JsonTypedOutput) { System.out.println("body"); // this.a(x, y) concatenates byte arrays a = this.a(b, ((JsonTypedOutput)request.getBody()).a); } else { a = b; }

Allein durch das Betrachten des Codes war es schwierig, den genauen Algorithmus für die HMAC-Berechnung herauszufinden. Also beschloss ich, die App mit Debugging-Symbolen neu zu erstellen, um genau herauszufinden, wie die App funktioniert. Ich habe ein Tool namens apktool https://code.google.com/p/android-apktool/ verwendet, um den Dalvik-Bytecode mit smali https://code.google.com/p/smali/ zu zerlegen. Ich habe die Anleitung unter https://code.google.com/p/android-apktool/wiki/SmaliDebugging befolgt

Nachdem Sie die apk erstellt haben, müssen Sie sie signieren und auf Ihrem Gerät installieren. Da ich kein Android-Gerät hatte, habe ich den Emulator verwendet, der mit Android SDK geliefert wird. Mit etwas Löffelfütterung, so machst du es:

 jarsigner -verbose -keystore ~/.android/debug.keystore -storepass android -keypass android <path_to_your_built_apk> androiddebugkey jarsigner -verify -verbose -certs <path_to_your_built_apk> zipalign -v 4 <path_to_your_built_apk> <path_to_your_output_signed_apk>

Ich habe einen integrierten Android-Emulator verwendet, der mit dem SDK geliefert wird, und ein virtuelles Atom x86-Image mit aktiviertem HAXM, um sicherzustellen, dass es reibungslos läuft.

 tools/emulator -avd mydroid -no-boot-anim -cpu-delay 0

Hier ist eine schöne Anleitung zum Einrichten eines virtuellen Images: http://jolicode.com/blog/speed-up-your-android-emulator

Stellen Sie sicher, dass beim Start des Emulators die Zeile HAX funktioniert und der Emulator im schnellen Virt-Modus ausgeführt wird, um sicherzustellen, dass Sie HAXM aktiviert haben.

Dann habe ich die apk im Emulator installiert und die App ausgeführt. Nach dem apktool-Leitfaden habe ich den IntelliJ IDEA-Remote-Debugger genutzt, um eine Verbindung zum Emulator herzustellen und einige Zeilenhaltepunkte festzulegen:

Einige Reverse-Engineering-Techniken bestehen darin, die App auszuführen und einfach zu sehen, was passiert.

Als ich ein wenig mit der App herumgespielt habe, konnte ich herausfinden, dass der private Schlüssel, der zum Initialisieren von RetrofitHttpClient verwendet wird, zum Berechnen von HMAC einer Anmeldeanforderungssignatur verwendet wird. Als Antwort auf den Login-POST erhalten Sie eine Benutzer-ID und ein Zugriffstoken ( X-Access-Token ). Das Zugriffstoken wird verwendet, um alle folgenden Anforderungen zu autorisieren. Der HMAC für alle Post-Login-Anfragen ist genauso aufgebaut wie die Login-Anfrage, außer dass der Schlüssel zusammengesetzt wird, indem .<user_id> an den ursprünglichen privaten Schlüssel angehängt wird.

Dies zeigt den Autorisierungsprozess, der zum Reverse Engineering dieser privaten API erforderlich ist.

Sobald Sie autorisiert sind, sendet die App die folgende Anfrage:

 POST https://hapi.couchsurfing.com/api/v2/users/1003669205/registerDevice ← 200 application/json

Wie ich empirisch ableiten konnte, ist diese Anfrage für die Authentifizierung optional. Bonuspunkte, wenn Sie herausfinden, wofür es verwendet wird!

Nach der Authentifizierung können Sie eine Anfrage senden, um Ihr Benutzerprofil (oder das Benutzerprofil einer anderen Person) wie folgt abzurufen:

 GET https://hapi.couchsurfing.com/api/v2/users/1003669205 ← 200 application/json 

In diesem Reverse-Engineering-Prozess können Sie das Benutzerprofil eines jeden abrufen.

Ich bin nicht sehr ins Detail gegangen, aber mir ist aufgefallen, dass ein Profil mit einer PUT-Anfrage aktualisiert wird. Nur zum Spaß habe ich versucht, ein anderes Profil mit derselben Anfrage zu aktualisieren - es war nicht autorisiert, also sind anscheinend die Sicherheitsgrundlagen implementiert.

Ich habe ein einfaches Python-Skript geschrieben, um mich mit Ihren Couchsurfing.com-Anmeldeinformationen anzumelden und Ihr Benutzerprofil abzurufen: https://gist.github.com/nderkach/899281d7e6dd0d497533. Hier ist der Python-Wrapper für die API: https://github.com/nderkach/couchsurfing-python mit einem Paket, das im pypi-Repository verfügbar ist (pip install couchsurfing).

Nächste Schritte

Ich bin mir nicht sicher, was ich dieses Mal genau mit der API machen werde. HTML-Code in Benutzerprofilen ist nicht mehr erlaubt, also muss ich mir einen anderen Ansatz für das alte Problem einfallen lassen. Ich werde den Python-API-Wrapper weiter entwickeln und verbessern, wenn es eine Nachfrage danach gibt, und ich gehe davon aus, dass couchsurfing.com nicht zu viele Probleme verursachen wird. Ich habe die API nicht zu sehr untersucht und sie nur auf einige grundlegende Schwachstellen getestet. Es scheint sicher genug zu sein, aber es wäre interessant herauszufinden, ob Sie Zugriff auf die Daten erhalten können, die nicht über die Website verfügbar sind. In jedem Fall können Sie jetzt mein Reverse Software Engineering verwenden, um einen alternativen Client für Windows Phone, Pebble oder Ihre Smart-Couch zu erstellen.

Abschluss mit einer Frage

Es gibt eine Diskussion, die ich eröffnen möchte – warum veröffentlichen Sie nicht Ihre API und machen sie öffentlich? Selbst wenn ich es nicht schaffen würde, die API zu hacken, wäre es immer noch möglich, die Website zu scrapen. Es wäre langsamer und schwieriger zu warten, aber sie würden es Verbrauchern sicherlich vorziehen, eine API anstelle eines Web Scrapers zu verwenden. Die Verfügbarkeit der APIs würde es Drittentwicklern ermöglichen, das Produkt des Unternehmens zu verbessern und Mehrwertdienste darum herum aufzubauen. Man kann argumentieren, dass es teurer wäre, die öffentliche API zu pflegen als eine private; Andererseits würden die Vorteile Ihrer Community-Building-Services zusätzlich zu Ihrem Produkt die API-Wartungskosten überwiegen.

Ist es möglich, die Verwendung einer privaten API durch Clients von Drittanbietern vollständig zu verhindern? Ich glaube nicht. Die Verwendung von SSL-Pinning würde das Ausspionieren von API-Anforderungen mit einer einfachen transparenten Proxy-Technik, wie zuvor beschrieben, verhindern. Am Ende, selbst wenn Sie die Binärdatei verschleiern, wird ein motivierter Hacker mit einigen Ressourcen und Zeit immer in der Lage sein, die Binärdatei der App zurückzuentwickeln und den privaten Schlüssel/das Zertifikat zu erhalten. Ich denke, die Annahme, dass der Client-Endpunkt sicher ist, ist von Natur aus falsch. Ein API-Client ist eine Schwachstelle.

Indem eine API privat gehalten wird, vermittelt ein Unternehmen im Grunde eine Botschaft des Misstrauens an seine Benutzer. Sicherlich können Sie versuchen, Ihre private API noch weiter zu schützen. Möchten Sie jedoch nicht lieber eine grundlegende Sicherheit für die API implementieren, um eine böswillige Nutzung zu verhindern? und stattdessen Ihre Ressourcen auf die Verbesserung der Software konzentrieren, um eine bessere Benutzererfahrung zu bieten?

Couchsurfing, bitte schön, mit Zucker obendrauf, öffne die API.