Eine Einführung in x86-Assembly (Teil 1 von X)

Mit dieser mehrteiligen Einführung möchte ich eine leichte, verständliche Einführung in x86-Assembly geben. Falls du dieses Tutorial also liest und etwas falsch, schwer verständlich oder interessant findest, gib mir gern Feedback oder stell mir deine Frage. Da ich hoffe auch Anfänger mit dieser Einführung zu erreichen, beginnen wir heute mit den grundlegenden Begriffen und Funktionsweisen.

Die x86-Instruction-Set Architektur schlägt im Herzen vieler moderner Prozessoren(CPUs). Ein Befehlssatz enthält alle Maschinenbefehle die ein bestimmter Prozessor ausführen kann. x86-Assembly steht für die Befehlssatzarchitekturen von Intel und AMD Prozessoren. Es gibt noch ARM-, RISC und weitere Befehlssätze je nachdem mit welcher Prozessorarchitektur man sprechen möchte.

Heutzutage kann man komplexe Programme und Systeme beschreiben, auch ohne Assembly schreiben zu können. Befasst man sich jedoch mit dem Reverse-Engineering von Malware oder anderem bereits kompilierten Code, kommt man an Assembly nicht vorbei. Auch bei Systemen die sehr schnell sein müssen, kitzelt man das letzte bisschen Performance am effizientesten mit Assembly Code raus.

Von Bits und Bytes

Die grundlegende Recheneinheit eines Computers heißt Bit. Ein Bit hat
zwei Zustände 1 für AN und 0 für AUS. Da wir nur zwei Zustände kennen, nutzen wir zur Repräsentation das Dual- oder Binärsystem. Ein Prozessor fasst acht Bits zu einem Byte zusammen. Zwei Byte ergeben ein Wort (WORD) und vier Bytes ergeben ein Doppelwort (DWORD). Haben wir 1024 Bytes sprechen wir von einem Kilobyte (KB) und bei 1.048.576 Byte von einem Megabyte (MB).

Bits werden also immer in Achtergruppen oder Vielfachen davon verarbeitet. Hat man ein WORD 11111111 ist dieses äquivalent zu Dezimalwert 255.

Bitwert11111111
Bitposition76543210
Position als Exponent zur Basis 21286432168421

Die Summe der Positionen des Bits als Exponent mit der Basis zwei ist 255 und das ist dasselbe wie (2^8)-1. Ein Byte kann also jeden Wert zwischen 0 und 255 annehmen, ein WORD kann von 0-65.535 und ein DWORD einen maximalen Wert von 4.294.967.295 annehmen.

Schaut man in der Praxis Daten an, beispielsweise in einem Wireshark-Mitschnitt, so sind diese meist Hexadezimal dargestellt. Ein WORD wird meist aus Komfortgründen zur Basis 16 dargestellt. Dies bedeutet, dass Werte von 0-15 durch 0123456789ABCDEF dargestellt werden, das ganze ist in der nachfolgenden Tabelle dargestellt:

DezimalBinärHexadezimal
000000
100011
200102
300113
401004
501015
601106
701117
810008
910019
101010A
111011B
121100C
131101D
141110E
151111F

Um eine Hexadezimale Zahl als Binärzahl darzustelen, schreiben wir jedes Element in sein vierstelliges binäres Äquivalent um: Das WORD A43F ist also 1010 0100 0011 1111 in binärer Schreibweise.

Register in der CPU

Ein Register ist ein Ort an dem Daten auf der CPU abgelegt werden können, um damit zu in Zukunft etwas zu machen, beispielsweise rechnen. Register können in unterschiedliche Klassen aufgeteilt werden: Klassischerweise gibt es folgende acht Mehrzweck Register(General Purpose) in x86 Architekturen:

EAX, EBX, ECD, EDX, ESI, EDI, EBP, ESP.

Ein Mehrzweck-Register hat eine Größe von 32 Bit, kann also ein DWORD enthalten. Es gibt außerdem noch Segmentregister und Statusregister.
Segmentregister werden wir im nächsten Teil näher betrachten hier gibt es nur eine kurze Einführung: Der Hexadezimale Wert 0x40 kann entweder eine Instruktion oder ein Datenwert sein. Die CPU weiß nur dank des Segmentregisters, wie der Wert zu verarbeiten ist.

Ein Statusregister markiert (flaggt) Werte um einen Status zu repräsentieren. Das Zero-Flag zeigt beispielsweise, dass das Resultat der letzten Rechnung null ist. Ein Vorzeichen (Sign) Flag, zeigt ob Daten mit einem Vorzeichen zu interpretieren sind oder nicht. Bedingte Sprunganweisungen, beispielsweise
if-Konstruktionen in C, Python oder anderen Hochsprachen, hängen meist von den Flags ab.

Außerdem gibt es einen Extended Instruction Pointer. Dieser hat in der CPU eine ähnliche Funktion wie die das sprechende Navi im Straßenverkehr
wenn wir abbiegen sollen: Er zeigt auf die nächste Instruction, die auszuführen ist.

Abschluss der Einführung in x86-Assembly

Das wars für den ersten Teil. Wenn du Fragen oder sonstiges Feedback hast schreib mich einfach an.  Das nächste Mal machen wir dann mit Segmentregistern weiter.

Using the Strava Heatmap to Identify and Track Military Personnel

Fit Leaking leaks Identities

Fitness tracking companies Strava and Suunto released heatmaps which reveal military positions through their collection and visualization of fitness data. For this article I focus on the Strava based map because they offer a feature which makes the data easily exploitable. The global heatmap shows in aggregated and anonymized form every public actitvity uploaded by a Strava user. If this is done in rural and less trafficked localities, this can highlight excercise focused individuals, for example active military personnel. But in activity dense regions it is possible to find military bases and identify the individuals stationed there.

Strava Leak
Strava Global Heatmap

What’s the Problem?

While the current focus is on the presence, activity and profile of sensitive establishments identification is not covered in current media ouputs. Individuals serving duty on military bases can easily be identified and in certain cases their deployments can be historically tracked through the Strava service. The feature we exploit to identify personnel is called „Segments“.

Segments are member created and edited portions of tracks where athletes compete against each other. Users will try to run faster than other users who already ran this „Segment“. A segment could be marked private but the competitive and social encouragement factors seem to outweigh than the privacy factor. Therefore we can find public segments on several european and international army bases. To see the full leaderboard of a segment an adversary only needs a Strava account. No further authorization is required. We focus on military personnel in this article but the scenario is also applicable for companies and their employees as described in Scott-Railtons blog post.

Case Study

We conducted a small case study after release of the heatmap. Therefore, we chose eleven military bases around the world and looked for segments on site, if any soldiers were identifiable and whether their identity was verifiable through official documents or reports in newspapers e.g.. From the eleven bases one did not contain a segment on site. In every base we could identify at least one individual with a military background and could verify this in ten cases.

Böblingen Base
Heatmap View of Böblingen Base

Take for example the Panzer Kaserne in Böblingen, Germany. There is a highschool on site called „Stuttgart High School“ and if you look for „Segments“ in Strava you find the track of the highschool to be frequently used. All users which ran the segment and competed against each other are visible. Non-surprisingly most of them seem to have a military background.

If users that ran this segment share their running history on their profile it can be tracked where individual users were stationed over time. From the eleven individuals that we identified we could track six individuals to at least one more military base. It was also possible to determine when and where they’ve been on holiday. There are privacy settings in Strava which can prevent this leakage of private information, but they are multi layered and users always have to opt-out.

Böblingen Map
Normal Map of the Base

While we did our small case study by hand it seems easy to automatically scrape the segments for relevant data. Segments are always behind a URL of the following scheme „www.strava.com/segments/##########“. To see a preview of the leaderboard containing 20 athletes you do not need to be logged in.

Conclusion

In Conlusion this incident illustrates how interconnected we are and how many problems and potential threats arise from that interconnectedness. Location data offers giant threats for many parties. Especially if the data is owned and sold by private companies (Strava has an advertisement on the heatmap. It pitches Metro, which helps safety and transportation organizations to analyze trends and counts). The high granularity of the heatmap and the ease at which individuals in security zones can be identified underlines that Stravas current model of privacy is not working in practice.

 

 

Since Strava is an internationally used app this blog post is in English. If you need a german translation, contact me.

 

Rubber Ducky Quick Start

Dieses Tutorial dient der Aufklärung von IT-Sicherheitsrisiken und dem Selbstschutz. Sei dir darüber im klaren, dass du eine Straftat begehst, wenn du Technologien, Tools oder Angriffsmethoden unbefugst nutzt, um Daten und Systeme anderer zu manipulieren.

Warum dieses Rubber Ducky Tutorial?

Es gibt eine Menge Tutorials zum USB Rubber Ducky, einem sehr vielseitigem Tool für Penetrationstester. Es scheint ein unschuldiger schwarzer USB-Stick zu sein. Wird der Rubber Ducky allerdings an einen Computer angeschlossen, registriert er sich als Tastatur und kann vorprogrammierte Tastenanschläge tippen. In quasi Lichtgeschwindigkeit.

Mit dem Rubber Ducky geht so ziemlich alles, vom Hintergrund ändern über Keylogger bis hin zur vollwertigen Backdoor. Er kostet circa $45 und kann hier bestellt werden.

Ist der Rubber Ducky dann angekommen, gibt es eine Tüte mit viel Kleinkram und wenig Erklärungen. Möchte man den Rubber Ducky im deutschsprachigen Raum nutzen, muss man außerdem ein zwei Dinge beachten, die in englischsprachigen Tutorials nicht deutlich erwähnt werden, daher
dieses kleine Tutorial.

Rubber Ducky
Rubber Ducky

Bevor der Rubber Ducky mehr macht als ein Editor-Fenster mit „Hello World“ zu öffnen, müssen wir ihn auseinander nehmen und die miniSD-Karte in den mitgelieferten miniSD auf USB Adapter stecken und mit unserem Rechner verbinden.  Mehr dazu in Schritt 2.

Rubber Ducky Einzelteile
Rubber Ducky Einzelteile

Ich habe einen Windows 10 PC mit installiertem Java(brauchen wir für den DuckEncoder) für dieses Tutorial genutzt, da ich den gerade offen hatte.
Wir nutzen aber auch hier die Kommandozeile und die Schritte sind auf einem Linux-System weitestgehend ähnlich, bei Bedarf schreibe ich dazu nochmal was. Ich zeige euch jetzt wie ihr mit dem Rubber Ducky ein Bild aus dem Internet ladet und es als Hintergrund einstellt. Am Ende haben wir alle essentiellen Teile für reale Penetrationstests zusammen, bei denen man evtl. Software auf einen im Test-Unternehmen stehenden PC runterladen möchte.

Schritt eins: Den Duck Encoder runterladen

Um den Rubber Ducky mit Payloads auszustatten und eine inject.bin aus unserem Ducky Script zu kreiiren, müssen wir den Duck Encoder herunterladen. Diese Datei ist verantwortlich für die Tastenanschläge. Es gibt unterschiedliche Möglichkeiten diese Datei zu erstellen, unter anderem auch
ein Webinterface, allerdings haben die Exploits nicht einfach funktioniert. Deswegen empfehle ich das .jar-Programm HIER herunterzuladen. Wir laden die Datei herunter, erstellen einen neuen Ordner, zum Beispiel auf dem Desktop, und kopieren die .jar-Datei dort hinein.

Schritt 2: Einsetzen der microSD-Karte

Steckt man den Rubber Ducky nach dem auspacken in den PC sollte sich ein Editor-Fenster mit „Hello World“ öffnen(Vorsicht bei Nicht-Windows  Systemen, hier können andere Dinge passieren). Wir möchten den Stick aber neu beschreiben, daher die SD-Karte mittels eines Kartenlesegeräts (wird mitgeliefert) an den PC stecken. Nach kurzer Wartezeit sollte die SD-Karte wie ein „normaler“ USB-Stick verfügbar sein.

Schritt 3: Payload generieren

Du kannst nicht programmieren? Kein Problem. Der RubberDucky spricht DuckyScript und mit ein paar Befehlen kommst du schon ans Ziel. Eine vollständige Übersicht von Duckyscript gibt es HIER.

Wir öffnen eine neue .txt Datei mit Rechtsklick->Neu->Textdokument benennen diese zum Beispiel change_wallpaper und tippen folgendes ein:


REM Skript zum Ändern des Hintergrunds bei Win10
REM Standard-App muss zum öffnen der Fotos verwendet werden
REM IMPORTANT Wenn Google Chrome genutzt wird: Google Chrome merkt REM sich wo zuletzt gespeichert wurde!Verzeichnis evtl anpassen.
DELAY 5000
CONTROL ESCAPE
DELAY 100
REM Note: Chrome klappt gut, firefox oder ie wahlweise (Verzeichnis unten anpassen)
REM Evtl. eigenes Bild einfügen
STRING chrome https://montimon.mirfac.uberspace.de/wordpress/wp-content/uploads/2018/01/pwnie_pic.png
ENTER
DELAY 4000
CONTROL s
DELAY 2000
ENTER
DELAY 300
CONTROL ESCAPE
DELAY 300
REM Bei Interne Explorer, ändere 'Downloads' to 'Documents'
REM Bei Firefox Firefox, change 'Downloads' to 'Pictures'
STRING %USERPROFILE%\Downloads\pwnie_pic.png
DELAY 500
ENTER
DELAY 500
TAB
DELAY 500
TAB
DELAY 500
TAB
DELAY 500
TAB
DELAY 500
TAB
DELAY 500
TAB
DELAY 500
TAB
DELAY 500
TAB
DELAY 500
TAB
DELAY 500
TAB
DELAY 500
ENTER
DELAY 500
DOWN
DELAY 500
DOWN
DELAY 500
DOWN
DELAY 500
DOWN
DELAY 500
DOWN
DELAY 500
ENTER
DELAY 500
DOWN
DELAY 500
ENTER

Nun zum Code: Wir starten mit ein paar Kommentaren. Kommentare erkennt ihr an REM am Anfang der Zeile. Im Anschluss warten wir fünf Sekunden, mittels DELAY 5000. CONTROL ECAPE öffnet dann das Startmenü von Windows 10 und STRING chrome ... öffnet eine Webseite mit Hilfe von Chrome über das Windows-10 eigene Suchfeld. Wir warten vier Sekunden und speichern dann mittels CONTROL s das Bild. Anschließend drücken wir ENTER und öffnen wieder das Startmenü. Mit STRING %USERPROFILE%\Downloads\pwnie_pic.png öffnen wir nun das heruntergeladene Bild und navigieren mit Hilfe von RIGHT und DOWN zu dem Menüpunkt im Windows-Bildbetrachter, den wir haben wollen. In unserem Falle ist es die Option „Als Hintergrund festlegen“.

Den Code gibt es auch auf GitHub.

Schritt 4: Kompilieren des DuckyScripts zu inject.bin

Jetzt brauchen wir den DuckEncoder aus Schritt 1 um unsere inject.bin zu kompilieren. Hierfür müssen wir im Ordner in dem unser duckencoder und die change_wallpaper.txt liegen ein Kommandozeilen Fenster öffnen. Mit Shift+F10 öffnen wir das Kontextmenü und können „Power Shell Fenster hier öffnen“ oder „Kommandozeile hier öffnen“ klicken. Nachfolgend tippen wir den Befehl ein.

java -jar duckencoder.jar -i change_wallpaper.txt -o inject.bin -l de

java -jar duckencoder.jar ruft das Programm innerhalb unseres Verzeichnisses auf. -i change-wallpaper sagt dem Programm, was der Input ist, in diesem Fall unser DuckyScript. -o inject.bin sagt dem duckencoder, das er bitte als output inject.bin produzieren soll und -l de gibt an, dass wir eine deutschsprachige Tastatur nutzen wollen. Dies ist wichtig, da der Duck Encoder die inject.bin sonst für eine englischsprachige Tastatur kompiliert und falsche Tasten anschlägt.

Abschließend schieben wir die entstandene inject.bin auf die in Schritt 2 eingesetzte USB-Karte und können testen.

Schritt 5: Der Selbsttest
Bevor wir den Stick nun bei einem Penetrationstest einsetzen, sollten wir ihn an einem Testsystem testen, beispielsweise unserem eigenen Rechner. Wir setzen die microSD-Karte nun wieder in den Rubber Ducky und stecken ihn ein (noch nicht das Plastikgehäuse drummachen, falls etwas nicht korrekt ist, muss man sonst immer fummeln).

Jetzt gilt es nur noch dem RubberDucky bei der Arbeit zuzuschauen und zu prüfen ob alles klappt.

Bonusschritt:

Auf Github oder Ducktoolkit findet ihr viele vorgefertigte Payloads, die ihr nur runterladen, kompilieren und testen müsst. Solltest du den RubberDucky wirklich in einem Penetrationstest einsetzen musst du vorher prüfen, ob die kompilierte inject.bin korrekt arbeitet. Aus eigener Erfahrung müsst ihr hier fast immer nochmal ran und das Skript verändern.

Happy Pentesting

Was lernen wir?

Wie du gesehen hat, sieht der Rubber Ducky aus wie ein normaler USB-Stick ist es aber nicht. Er lässt sich sehr leicht programmieren und eignet sich daher besonders gut für Anfänger im Bereich Penetrationstesting. Gerade mit den Delay-Funktionen lässt sich spielen, so dass der Stick beispielsweise nachts beginnt zu arbeiten, wenn du schläfst. Sei also immer vorsichtig, wenn du einen USB-Stick irgendwo findest und Ihn an eines deiner Geräte anschließen willst, egal ob privat oder im Berufsleben.

Falls du Fragen oder Anmerkungen hast, du findest mich auf Twitter unter @montimonte