CodeGate 2012 Quals –
forensics #2

CodeGate CTF 2012 - Forensics #2 - task description

In dieser Challenge (forensics #2) scheint es das Ziel zu sein, den Versuch eines SQL-Injection-Angriffes ausfindig zu machen. Als einzigen Hinweis erhalten wir die Information, dass der Browser beim Ausführen der SQL-Injection abgestürzt ist.

Beim Entpacken der Dateien stellen wir direkt fest, dass es sich (wieder) um das Benutzerverzeichnis eines Windows-Systems handelt. Wiederum sind es die Daten des Benutzers “proneer” (vermutlich war es sogar das selbe Archiv, wie in der Forensic #1 – Challenge).

Wonach suchen wir nun am cleversten in den Benutzerdaten? Wir wissen, dass der Browser beim SQL-Angriff abgestürzt ist und wir wissen auch – und kennen das vermutlich aus eigener Erfahrung -, dass Browser beim Schließen die letzten Sitzungen speichern und beim erneuten Öffnen dem Benutzer wieder anbieten. Unser Ziel ist es also, zuerst den verwendeten Browser zu identifizieren und in einem zweiten Schritt zu versuchen, die Aktionen der letzten Sitzung zu rekonstruieren.

rup0rt@lambda:~/forensic2/Users/proneer/AppData/Local$ ls
010 Editor           History                Temp
Adobe                IconCache.db           Temporary Internet Files
Apple                Microsoft              VirtualStore
Application Data     Microsoft_Corporation  VMware
GDIPFONTCACHEV1.DAT  Microsoft Help
Google               Mozilla
rup0rt@lambda:~/forensic2/Users/proneer/AppData/Local$ ls Google/
Chrome  CrashReports  Google Talk
rup0rt@lambda:~/forensic2/Users/proneer/AppData/Local$ ls Mozilla/
Firefox
rup0rt@lambda:~/forensic2/Users/proneer/AppData/Local$ ls Microsoft
Assistance    Feeds Cache           Office        Windows Mail
CoreCon       Internet Explorer     VisualStudio  Windows Media
Credentials   Media Player          VSA           Windows Sidebar
Event Viewer  Microsoft SQL Server  VSTAHost
Feeds         MSDN                  Windows

Ein Blick in die lokalen Anwendungsdaten zeigt uns, dass zumindest für die drei gängigsten Browser (Chrome, Firefox und Internet Explorer) Verzeichnisse existieren. Um herauszufinden, welcher zuletzt verwendet wurde, sehen wir uns die Zeitstempel der Sitzungsdateien an.

Der Microsoft Internet Explorer speichert seine zuletzt geöffneten Sitzungen in dem Verzeichnis “AppData/Local/Microsoft/Internet Explorer/Recovery” und legt hier pro Sitzung eine “.dat”-Datei mit einzigartiger Benennung ab.

rup0rt@lambda:~/.../AppData/Local/Microsoft/Internet Explorer/Recovery$ ls -lh *
Active:
total 84K
... Feb 12 02:38 {744C7267-5492-11E1-8400-000C29D6D5A8}.dat
... Feb 12 02:38 {DC0E0347-5491-11E1-8400-000C29D6D5A8}.dat
... Feb 12 02:38 {F587CDD1-5491-11E1-8400-000C29D6D5A8}.dat
... Feb 12 02:38 RecoveryStore.{DC0E0346-5491-11E1-8400-000C29D6D5A8}.dat

Last Active:
total 20K
... Feb 12 02:38 {FE400BB3-5514-11E1-A011-000C29D6D5A8}.dat
... Feb 12 02:38 RecoveryStore.{8D73C18E-5497-11E1-8075-000C29D6D5A8}.dat

Die Sitzungsdaten von Google Chrome befinden sich im Verzeichnis “AppData/Local/Google/Chrome/User Data/Default” und sind mit “Last”- und “Current”- “Session” beziehnungsweise “Tabs” benannt.

rup0rt@lambda:~/.../AppData/Local/Google/Chrome/User Data/Default$ ls -lh *Tabs *Session
-rw-r--r-- 1 rup0rt rup0rt 1.6K Feb 12 02:38 Current Session
-rw-r--r-- 1 rup0rt rup0rt 1.4K Feb 12 02:38 Current Tabs
-rw-r--r-- 1 rup0rt rup0rt  93K Feb 12 02:38 Last Session
-rw-r--r-- 1 rup0rt rup0rt  46K Feb 12 02:38 Last Tabs

Der Mozilla Firefox speichert die zuletzt geöffneten Sitzungen im Verzeichnis “AppData/Roaming/Mozilla/Firefox/Profiles/” im Unterverzeichnis der jeweiligen Nutzer-ID (hier: “075lfxbt.default”) in der Datei “sessionstore.js”.

rup0rt@lambda:~/.../AppData/Roaming/Mozilla/Firefox/Profiles/075lfxbt.default$ ls -lh sessionstore.js
-rw-r--r-- 1 rup0rt rup0rt 2.4K Feb 12 02:39 sessionstore.js

Der direkte Vergleich aller Zeitstempel zeigt uns nun, dass der Firefox zuletzt verwendet und geschlossen wurde. Wir gehen also an dieser Stelle davon aus, dass dies der Browser sein muss, über den der SQL-Injection-Angriff ausgeführt wurde. (Die Zeitstempel müssen natürlich kein Indiz dafür sein! Im Zweifel müsste man alle Sitzungsdateien durchsuchen!)

Die “sessionstore.js”-Datei speichert die Sitzungen in der “JavaScript Object Notation” (JSON). Um dieses Format etwas übersichtlicher betrachten zu können, verwenden wir einen Online JSON Parser. Das Einfügen der “sessionstore.js”-Datei und Einklappen der “windows”-Elemente vermittelt uns nun einen guten Überblick über die Sitzungen.

CodeGate CTF 2012 - Forensics #2 - sessionstore.js firefox data

Man kann erkennen, dass es zwei Sitzungen gab. Interessant ist hierbei die Variable “state”, die angibt, ob eine Sitzung zuletzt aktiv (“running”) war. Für unsere Nachforschung kommt also nur die obere Sitzung in Frage. Zusätzlich ist hier auch ersichtlich, wann die Sitzung zuletzt verwendet wurde – dies ist an der Variable “lastUpdate” auszumachen.

Das Schrittweise ausklappen des oberen “windows”-Elementes sowie der “tabs”-Elemente zeigt uns, dass bei letzter Verwendung zwei Tabs im Firefox geöffnet waren. Beim Durchsehen der in den Tabs verwendeten URLs, sticht beim zweiten Eintrag des ersten Tabs auch bereits eine vermutliche SQL-Injection ins Auge.

CodeGate CTF 2012 - Forensics #2 - sessionstore.js SQL injection

Ohne weiter auf das Format der Variable “formdata” eingehen zu müssen, ist erkennbar, dass der Benutzer versucht hat ein Formular mit einem Eingabefeld namens “s” auszufüllen. Das Eingabefeld war befüllt mit der Zeichkette “1_UNI/**/ON_SELECT”, was dekodiert “1 UNION SELECT” entspricht und eine übliche SQL-Injection-Attacke darstellt.

Zusammen mit dem Zeitstempel der Variable “lastUpdate” von “1329009797205” aus der “running”-Sitzung sollten wir alle Daten beisammen haben, um die Challenge lösen zu können. Es muss also nur noch die Antwort im korrekten Format erstellt werden. Verlangt ist “injection_value|time”.

Den “injection_value” kennen wir bereits. Bleibt nur noch der Zeitstempel in die von der Aufgabenstellung geforderte Form zu bringen. “1329009797205” ist mit 13 Stellen ein Zeitstempel, der Millisekunden beinhaltet. Da wir diese nicht benötigen, streichen wir die letzten drei Zeichen und übergeben den Wert “1329009797” an das Werkzeug “date”.

rup0rt@lambda:~$ date -u -d @1329009797 +%Y-%m-%dT%H:%M:%S%:z
2012-02-12T01:23:17+00:00

Dieses Datum umgerechnet auf das geforderte UTC +09:00 entspricht “2012-02-12T10:23:17+09:00”.

Die Antwort lautet also “1_UNI/**/ON_SELECT|2012-02-12T10:23:17+09:00“.

Leave a Reply

Your email address will not be published. Required fields are marked *