19 VIEWS

Binary Exploitation erkennen mit AIDE

09.11.2022

Hatte jemand unautorisierten Zugriff auf das eigene Dateisystem, kann der oder diejenige verheerende Schäden anrichten. Beispielsweise können Sicherheitsbeschränkungen umgangen, oder Passwörter mit einem Keylogger gestohlen werden.

Ein Weg, solch einen Angriff durchzuführen und langfristig zu verstecken, ist die Manipulation von Executables (Binary Exploitation[8]).  Eine Executable ist eine Datei, die eine Folge von Anweisungen (Maschinencode) enthält, die das System direkt ausführen kann[1]. Diese Angriffe können mit AIDE entdeckt werden.

Manipulieren von Executables

Bei richtiger Umsetzung wird eine Manipulation weder vom Benutzenden noch vom System erkannt. Deswegen kann eine solche Manipulation sehr lange unbemerkt bleiben. Beispielsweise kann ein Angreifender einen Passwortschutz umgehen, indem er Teile des Maschinencodes überspringt. Wie das umgesetzt werden kann, wird im Folgenden anhand eines Beispiels gezeigt.

 

 

Manipulation einer einfachen Executable

Beispielhaft wählen wir hier ein einfaches Programm, das eine PIN von der Kommandozeile einliest und gegen einen hinterlegten Wert prüft:

In der main()-Methode wird zuerst die login()-Funktion aufgerufen, die Logik für das Einlesen der Nutzereingabe und Validierung der PIN enthält. Falls die korrekte PIN eingegeben wurde, wird “Login successful!” auf der Kommandozeile ausgegeben. Die login()-Funktion liest so lange PINs ein, bis ein korrekter Wert eingegeben wurde.

Eine Ausführung des obigen Codes könnte wie folgt aussehen:

 

Beispielhaft möchten wir nun das obige Programm manipulieren und die PIN-Abfrage überspringen. Dafür überspringen wir den Aufruf der login()-Funktion im Maschinencode. Da das obige Programm kompiliert wurde, liegt es im Binärformat vor und muss zunächst mit einem Decompiler dekompiliert werden, um wieder menschenlesbar zu werden[2].

Die main()-Methode sieht nach dem Dekompilieren mit reko[5] wie folgt aus:

Da der Name der Funktionen beim Kompilieren erhalten bleibt, ist er hier auch sichtbar und macht den Code verständlicher. In der fünften Zeile wird die login()-Funktion mit einer call[6] Instruktion aufgerufen, die fünf Bytes umfasst (im obigen Bild rot markiert). Soll dieser call nicht ausgeführt werden, kann er mit einer jmp[5] Instruktion übersprungen werden. Ein jmp springt zu einer bestimmten Position – im Gegensatz zum call ist er kürzer und nur zwei Bytes lang:

Im Bild oben werden die ersten zwei Bytes des call mit einem jmp überschrieben, um die nächsten drei Bytes zu überspringen. Somit wird über die Gesamtlänge der call Instruktion gesprungen und damit auch der Aufruf der login()-Funktion komplett übersprungen. Deshalb ist deren Aufruf auch nicht mehr im Dekompilat sichtbar. Nun wird direkt “Login successful!” auf der Kommandozeile ausgegeben, ohne einen PIN-Abgleich durchzuführen:

 

 

Erkennen einer Manipulation mit AIDE

Was ist AIDE?

AIDE steht für “Advanced Intrusion Detection System”. Es ist ein Programm, mit dem Änderungen im Dateisystem erkannt werden können, wie beispielsweise die Manipulation von Executables (siehe oben). Außerdem können auch Änderungen von Berechtigungen, Ordnern und Log-Dateien erkannt werden.  AIDE erstellt ein Abbild oder Snapshot des Dateisystems. Dieses Abbild wird in einer Datenbank gespeichert, die extern abgelegt werden kann. Besteht Verdacht auf eine Manipulation, kann mit AIDE zwischen einem früheren Stand aus der Datenbank, und dem jetzigen, verglichen werden[3].

 

Konfiguration von AIDE

AIDE ist für jedes moderne UNIX-System verfügbar. Es kann entweder hier heruntergeladen werden oder – für Ubuntu oder Debian – wie folgt per Terminal-Befehl installiert werden[7]:

Nach der Installation muss AIDE konfiguriert werden[4], das geschieht mithilfe der Datei /etc/aide/aide.confIn diesem Beitrag werden die wichtigsten Konfigurationsschritte für AIDE erläutert, für weitere Informationen sind die man pages (man aideman aide.conf) zu empfehlen. Die Datei aide.conf enthält wichtige Konfigurationsparameter, wie beispielsweise den Speicherort der Snapshot- und Vergleichs-Datenbank:

Welche Dateieigenschaften von AIDE gespeichert werden, wird wie folgt festgelegt:

Die obige Konfiguration bewirkt, dass vom Ordner /etc und allen enthaltenen Unterordnern und Dateien die Eigenschaften Berechtigungen p, Inode i, Benutzer und Gruppe g gespeichert werden. So ein Vorgehen kann aber – etwa bei Änderungen der Konfiguration – schnell unübersichtlich werden. Dies kann verhindert werden, indem Schlüsselwörter genutzt werden. Unter dem Schlüsselwort NORMAL, in Zeile 1 des oberen Codesnippets, werden einige Parameter gespeichert. In Zeile 4 und 5 werden den Ordnern /home und /media dadurch die in NORMAL gespeicherten Parameter zugewiesen.

Gibt es Ordner oder Dateien, die sich sehr häufig ändern, können diese die Ausgabe von AIDE unübersichtlich machen. Will man diese deshalb nicht untersuchen, können sie mit einem Ausführungszeichen vor dem Pfad ausgeschlossen werden. Wie hier in Zeile 5 zu sehen ist, wird zuerst bestimmt, dass der Ordner /media untersucht werden soll. In Zeile 6 wird aber der Unterordner /media/example davon ausgeschlossen. Dieser Ordner wird dadurch nicht von AIDE untersucht.

Die Konfiguration kann mit folgendem Terminalbefehl getestet werden:

 

AIDE nutzen

Ist die Konfiguration abgeschlossen, kann AIDE initialisiert werden:

Dabei wird die Snapshot-Datenbank /var/lib/aide/aide.db.new erzeugt. Um diese Datenbank zukünftig zu vergleichen, muss sie zu aide.db umbenannt werden. Um Veränderungen im Dateisystem zu erkennen, wird der Vergleich der Datei /var/lib/aide/aide.db mit dem momentanen Stand des Systems mit folgendem Befehl gestartet:

Diese Prozedur kann auch mit cron Jobs automatisiert werden, um das eigene System regelmäßig, automatisiert, zu überprüfen.

Bei einer Überprüfung des momentanen Stands des Systems würden Veränderungen an Dateien sichtbar werden. So kann auch die oben gezeigte Manipulation erkannt werden:

 

Fazit

Mit AIDE kann ein Angriff nicht rückgängig gemacht, aber Schäden minimiert oder ganz verhindert werden. Wurde eine Executable im eigenen System verändert, ist es sehr wichtig möglichst schnell davon zu erfahren, andernfalls können schnell hohe Schäden entstehen. Erfahrene Angreifende werden versuchen, ihre eigenen Spuren bestmöglich zu verschleiern. Mit AIDE können diese gefunden werden.

 

Quellen:

[1] https://www.malwarebytes.com/blog/news/2021/10/what-is-an-exe-file-is-it-the-same-as-an-executable, Aufgerufen am 8.11.2022, 8:30

[2] https://de-academic.com/dic.nsf/dewiki/312194 Aufgerufen am 30.09.2022, 13:00

[3] https://aide.github.io/ Aufgerufen am 30.09.2022, 13:00

[4]  https://www.tecmint.com/check-integrity-of-file-and-directory-using-aide-in-linux/ Aufgerufen am: 30.09.2022, 12:30.

[5] https://github.com/uxmal/reko#readme, Aufgerufen am 8.11.2022, 8:30

[6] https://c9x.me/x86/html/file_module_x86_id_147.html, Aufgerufen am 8.11.2022, 8:30

[7] https://aide.github.io/ , Aufgerufen am 8.11.2022, 8:30

[8] https://ctf101.org/binary-exploitation/overview/ , Aufgerufen am 9.11.2022, 7:30

Zurück zur Übersicht

Ein Kommentar zur “Binary Exploitation erkennen mit AIDE

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht.

*Pflichtfelder

*