Soup.io

Soup.io hacken
Der heutige Hack von Soup.io hat zum Ziel, dass man mehrere Bilder automatisiert auf seinen Soup-Account hochladen kann. Hier eine Zusammenfassung.

Gestern abend stellte ich fest, dass ich das automatisiert haben möchte und stellte eine diesbezügliche Frage im #hasi-chanel. Das Bash-Programm curl wurde mir empfohlen, welches ich nicht kannte - im Sinne von nicht durchdringend verstand.

Schritt 1: Session etablieren
Nomis probierte und erklärte mit später ausführlich, dass mit den flags -b und -c eine Cookie-Datei angelegt beziehungsweise beim Verbindungsaufbau verwendet werden kann. Damit war mir klar, dass das Session-Problem "Hallo Soup-Server, ich bin nanooq und dieses Cookie authentifiziert mich für meine weiteren Aktionen" gelöst ist.

Schritt 2: Wireshark-Voyeurismus
Nomis wusste es aus Erfahrung, ich aus Deduktion, dass wireshark zum Einsatz kommen musste. Das Mitschneiden des Streams, wie über das Web-Interface ein Bild hochgeladen wird (im Folgenden "wireshark.io" genannt) und wie unser Bash-Skript es macht (im Folgenden "wireshark.me" genannt), zeigte uns wie es geht, nur, dass wir es nicht verstanden. Das jeweilige Schritt-für-Schritt durchgehen des Prozesses war mir wegen Unerfahrenheit zu komplex, als das es mir hätte helfen können. Da mir klar war, dass wireshark.me aussehen muss wie wireshark.io um die selbe Funktionalität auszuführen, entschied ich mich beide gefollowten TCP-Streams als ASCII abzuspeichern und mit einem diff-Programm zu vergleichen. Die Entscheidung mit dem ASCII-Format traf ich zufälliger und glücklicher Weise. Nur so konnte ich beide Streams vergleichen, nichts verstehen, aber Nomis meine Fragen stellen. Hier trennten sich unsere Wege.

Schritt 3: Header-Problem "Expect 100"
Während ich ziellos versuchte mit curl die Header von wireshark.io zu imitieren, verstand Nomis zwei Dinge: Andere Fragen:
 * 1) Es gibt Redirects, denen man Folgen muss
 * 2) curl fügt eine problematische Header-Eigenschaft "Expect: 100" ein.
 * Sind die anderen Cookies relevant? Diese konnte ich durch Googeln mit "Nein" beantworten, denn sie dienten nur dem Loggen des Nutzerverhalten (think Google Analytics).
 * Nomis fand heraus, dass curl mit seinem "Expect 100" sich falsch, also anders als wireshark.io, verhält. Ein -H "Expect:" löste dies. Die Option "-D -" dumpt die Ausgabe auf den Standartoutput, damit kann man das Verhalten sehr viel besser nachvollziehen und seine nächsten Schritte entsprechend planen.

Schritt 4: Redirects oder "Follow the white rabbit"
Da ich, trotz "man curl" die Vorteile von "-D -" nicht wahr genommen habe, erkannte Nomis aus der diff-Gegenüberstellung von wireshark.me und wireshark.io, dass curl nicht den Redirects folgt. Ich glaube, -L war die entsprechende Option. Außerdem erkannte Nomis aus der Gegenüberstellung, durch das curlen an host unter "/new/image" aus irgendwelchen Gründen auf die Aufnahme von Bildern vorbereitet werden muss. Das ist eine Erkenntnis, die ich, obwohl wir beide das gleiche Verhalten beobachteten, nicht gewann.

Schritt 5: Curl lernt Soup.io-isch zu sprechen
Durch vorherige Kommunikationsanalyse mit Firebug, war uns beiden klar, dass eine bekannte, wenn auch nicht im einzelnen nachvollzogene Anzahl an Name-Value-Strings übergeben werden muss. Mit @filename drückt curl dann auch das Bild auf Soup drauf. Das Skript läuft erfolgreich durch

Fazit
Abschließend ist festzuhalten, dass es mir sehr viel Spaß gemacht hat neben Nomis zu sitzen und den Hack zu versuchen. Mit dem Ziel meine Probleme erst mit Nomis zu besprechen, wenn ich sie nachvollziehbar machen konnte, konnte Nomis mir jeweils erklären, woran es liegt und Handlungsempfehlungen aussprechen. Es sind diese Momente des Austauschs, in denen er auch mir seine Erkenntnisse und sein aktuelles Problem detailiert mitteilte. Ich konnte also meine Fehler beheben und schnell zu Nomis "aufschließen". Unter dem Strich war aber nur mein "Wireshark-Diff"-Vorschlag in diesem Hack hilfreich.

Am Schluss, als Nomis Skript Erfolg hatte, erklärte er mir die einzelnen, relevanten Unterschiede zu meinem Skript - ich hatte gezielt danach gefragt. Mir fehlten noch die Redirects und das "Expect 100". Letzteres kannt ich dann schon, las aber nicht die man und vernachlässigte es. Außerdem stellte ich fest, dass Nomis sehr viel benutzerfreundlicher mit Variablen arbeitete wie ich und schon Schleifen zur späteren Verwendung eingebaut hat.

Happy Hacking!