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:

#include <stdio.h>


void login(){
    // hier soll abgefragt werden, ob der Nutzer den festgelegten PIN kennt
    // kennt er ihn nicht, hängt er in einer endlosen Schleife fest
    int pin = 12345;
    int input = 0;


    for(;;){
        printf("Please input pin: ");
        scanf("%5d", &input);


        if(input != pin){
            printf("Wrong pin! Try again.\n");
        }else{
            printf("Correct pin! continue...\n");
            return;
        }
    }
}


int main(){
    login();
    // sollte erst nach richtiger PIN-Eingabe ausgegeben werden
    printf("Login successful!\n");
}

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:

user@PC:~$ ./login-programm
Please input pin: 2222
Wrong pin! Try again.
Please input pin: 12345
Correct pin! continue...
Login successful!

 

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:

user@PC:~$ ./login-programm
Login successful!

 

 

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]:

apt install aide

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:

# The daily cron job depends on these paths
database=file:/var/lib/aide/aide.db
database_out=file:/var/lib/aide/aide.db.new
database_new=file:/var/lib/aide/aide.db.new
gzip_dbout=yes

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

NORMAL = R+b+sha1
 
/etc p+i+u+g
/home NORMAL
/media NORMAL
!/media/example

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 --config=/etc/aide/aide.conf --config-check

 

AIDE nutzen

Ist die Konfiguration abgeschlossen, kann AIDE initialisiert werden:

aide --config=/etc/aide/aide.conf --init

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:

aide --config=/etc/aide/aide.conf --check

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:

Start timestamp: 2022-09-28 13:08:08 +0200 (AIDE 0.16.1)
AIDE found differences between database and filesystem!!
Verbose level: 6
 
Summary:
Total number of entries: 4369
Added entries: 0
Removed entries: 0
Changed entries: 1
 
---------------------------------------------------
Changed entries:
---------------------------------------------------
 
f <.... mc..C . : /home/user/directoy/login_programm
 
---------------------------------------------------
Detailed information about changes:
---------------------------------------------------
 
File: /home/user/directoy/login_programm
Size : 5409 | 0
Mtime : 2022-09-28 13:07:07 +0200 | 2022-09-28 13:08:08 +0200
Ctime : 2022-09-28 13:07:07 +0200 | 2022-09-28 13:08:08 +0200
RMD160 : 3P3jJI5Py1yl2hQwiLIYmu3VcPc= | nBGFpcXp/FRhKAiXfuj1SLIljTE=
TIGER : yeoa37uQP8PswwEg70TZhy037fhY2vdX | JPATDGOskzIWFm52sbuSX/Nz3i1JWE56
SHA256 : 09ZmIT08ZKsXBS/Vg7VpQAAzvE2LUlPX | 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NM
0hOGCX+rEDQ= | pJWZG3hSuFU=
SHA512 : +a5eJiroTSoo82w4DZIhLdTisaYLMnBf | z4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXc
AoAKKH5TmqiqSE4wWmzo6PcUyifY8qcg | g/SpIdNs6c5H0NE8XYXysP+DGNKHfuwv
pOkxl2JdKEx0E0R8ZwTEvA== | Y7kxvUdBeoGlODJ6+SfaPg==
CRC32 : 25fKwQ== | AAAAAA==
HAVAL : HuKazlmnt4G7aTmM4iVwotgroePcLnLz | T2k4Ux8LyJkfYtp7vW994/rURWK4xvTr
uznRDJjrJKA= | 8UbVtORvfBc=
GOST : mY17eqRRScOJIX/9sg/C7rsRsBVR49Uh | zoW5nMRnUv/+41yrmnsCeKu0wtIFXP9o
p0LR9uxxoqk= | WvSRLElJD40=
 
 
---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------
 
/var/lib/aide/aide.db
RMD160 : DFlsf9bhMv11uys/l/0GuQ3zEfs=
TIGER : EkPsm+2XBHhBphSaELIFpSzPtZg2d6VN
SHA256 : D8sCR+/lvF2ZGDVrICp4ngi1fNqMfKp0
ZyuYElDwVhY=
SHA512 : lxm5R/yWS6hYiKfAS9f6gNCyMGWcbCs9
vu8jKMLvhi0q4Ys730gB0F4pEuJ7zJxN
t9WIwy731g907vnUvU8zZA==
CRC32 : 9KoDXA==
HAVAL : 0OCFObfkmniRWOnp5IB0XvWuWKOuXiY1
P4yyXsRlyF0=
GOST : KSznHY86cA0kKXjIRp5OQJSaJrAMDrKM
+7sQr/8pgOA=
 
 
End timestamp: 2022-09-28 13:08:14 +0200 (run time: 0m 6s)

 

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.

 

Co-Autor: Ruben Miller

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. Erforderliche Felder sind mit * markiert

*Pflichtfelder

*