Was macht Linux-ELF-Malware analysieren?
Wann einsetzen
- Ein Linux-Server oder -Container wurde kompromittiert und es wurden verdächtige ELF-Binärdateien gefunden
- Analyse von Linux-Botnets (Mirai, Gafgyt, XorDDoS), Kryptominern oder Ransomware
- Untersuchung von Malware, die auf Cloud-Infrastruktur, Docker-Container oder Kubernetes-Pods abzielt
- Reverse Engineering von Linux-Rootkits und Kernel-Modulen
- Analyse plattformübergreifender Malware, die für Linux x86_64, ARM oder MIPS kompiliert wurde
Nicht verwenden für die Analyse von Windows-PE-Binärdateien; verwenden Sie PEStudio, Ghidra oder IDA für Windows-Malware.
Voraussetzungen
- Ghidra oder IDA mit Linux-ELF-Unterstützung für Disassemblierung und Dekompilierung
- Linux-Analyse-VM (Ubuntu 22.04 empfohlen) mit installierten Entwicklungstools
- strace, ltrace und GDB für dynamische Analyse und Debugging
- readelf, objdump und nm aus GNU binutils für statische Inspektion
- Radare2 für schnelles binäres Triage und scriptgesteuerte Analyse
- Docker für isolierte, containerbasierte Malware-Ausführung
Arbeitsablauf
Schritt 1: ELF-Binärdaten-Eigenschaften identifizieren
Untersuchen Sie den ELF-Header und die grundlegenden Eigenschaften:
# Dateityp-Identifizierung
file verdaechtige_binaerdatei
# Detaillierte ELF-Header-Analyse
readelf -h verdaechtige_binaerdatei
# Abschnitts-Header
readelf -S verdaechtige_binaerdatei
# Programm-Header (Segmente)
readelf -l verdaechtige_binaerdatei
# Symboltabelle (falls nicht gestrippt)
readelf -s verdaechtige_binaerdatei
nm verdaechtige_binaerdatei 2>/dev/null
# Dynamische Verknüpfungsinformationen
readelf -d verdaechtige_binaerdatei
ldd verdaechtige_binaerdatei 2>/dev/null # Nur bei passender Architektur!
# Hashes berechnen
md5sum verdaechtige_binaerdatei
sha256sum verdaechtige_binaerdatei
# Auf Packing/UPX prüfen
upx -t verdaechtige_binaerdatei
# Python-basierte ELF-Analyse
from elftools.elf.elffile import ELFFile
import hashlib
with open("verdaechtige_binaerdatei", "rb") as f:
data = f.read()
sha256 = hashlib.sha256(data).hexdigest()
with open("verdaechtige_binaerdatei", "rb") as f:
elf = ELFFile(f)
print(f"SHA-256: {sha256}")
print(f"Klasse: {elf.elfclass}-Bit")
print(f"Endian: {elf.little_endian and 'Little' or 'Big'}")
print(f"Maschine: {elf.header.e_machine}")
print(f"Typ: {elf.header.e_type}")
print(f"Einsprungspunkt: 0x{elf.header.e_entry:X}")
# Prüfen, ob gestrippt
symtab = elf.get_section_by_name('.symtab')
print(f"Gestrippt: {'Ja' if symtab is None else 'Nein'}")
# Abschnittsentropie-Analyse
import math
from collections import Counter
for section in elf.iter_sections():
data = section.data()
if len(data) > 0:
entropy = -sum((c/len(data)) * math.log2(c/len(data))
for c in Counter(data).values() if c > 0)
if entropy > 7.0:
print(f" [!] Abschnitt mit hoher Entropie: {section.name} ({entropy:.2f})")
Schritt 2: Zeichenketten und Indikatoren extrahieren
Suchen Sie nach eingebetteten IOCs und Hinweisen auf die Funktionalität:
# ASCII-Zeichenketten
strings verdaechtige_binaerdatei > strings_ausgabe.txt
# Nach Netzwerk-Indikatoren suchen
grep -iE "(http|https|ftp)://" strings_ausgabe.txt
grep -iE "([0-9]{1,3}\.){3}[0-9]{1,3}" strings_ausgabe.txt
grep -iE "[a-zA-Z0-9.-]+\.(com|net|org|io|ru|cn)" strings_ausgabe.txt
# Nach Shell-Befehlen suchen
grep -iE "(bash|sh|wget|curl|chmod|/tmp/|/dev/)" strings_ausgabe.txt
# Nach Crypto-Mining-Indikatoren suchen
grep -iE "(stratum|xmr|monero|pool\.|mining)" strings_ausgabe.txt
# Nach SSH-/Credential-Diebstahl suchen
grep -iE "(ssh|authorized_keys|id_rsa|shadow|passwd)" strings_ausgabe.txt
# Nach Persistenzmechanismen suchen
grep -iE "(crontab|systemd|init\.d|rc\.local|ld\.so\.preload)" strings_ausgabe.txt
# FLOSS für obfuskierte Zeichenketten (falls verfügbar)
floss verdaechtige_binaerdatei
Schritt 3: Systemaufrufe und Bibliotheksnutzung analysieren
Identifizieren Sie, welche Systemaufrufe und Bibliotheken die Malware verwendet:
# Importierte Funktionen auflisten (dynamisch verknüpft)
readelf -r verdaechtige_binaerdatei | grep -E "socket|connect|exec|fork|open|write|bind|listen"
# Systemaufrufe während der Ausführung verfolgen (nur in isolierter VM)
strace -f -e trace=network,process,file -o strace_ausgabe.txt ./verdaechtige_binaerdatei
# Bibliotheksaufrufe verfolgen
ltrace -f -o ltrace_ausgabe.txt ./verdaechtige_binaerdatei
# Wichtige Systemaufrufe, auf die zu achten ist:
# Netzwerk: socket, connect, bind, listen, accept, sendto, recvfrom
# Prozess: fork, execve, clone, kill, ptrace
# Datei: open, read, write, unlink, rename, chmod
# Persistenz: inotify_add_watch (Dateiüberwachung)
Schritt 4: Dynamische Analyse mit GDB
Debuggen Sie die Malware, um das Laufzeitverhalten zu beobachten:
# GDB mit der Binärdatei starten
gdb ./verdaechtige_binaerdatei
# Haltepunkte auf Schlüsselfunktionen setzen
(gdb) break main
(gdb) break socket
(gdb) break connect
(gdb) break execve
(gdb) break fork
# Ausführen und analysieren
(gdb) run
(gdb) info registers # Register-Status anzeigen
(gdb) x/20s $rdi # Zeichenketten-Argument untersuchen
(gdb) bt # Rückverfolgung
(gdb) continue
# Bei gestrippten Binärdateien am Einsprungspunkt unterbrechen
(gdb) break *0x400580 # Einsprungspunkt von readelf
(gdb) run
# Netzwerkverbindungen während der Ausführung überwachen
# In einem anderen Terminal:
ss -tlnp # Laufende Listener-Sockets auflisten
ss -tnp # Bestehende Verbindungen auflisten
Schritt 5: Reverse Engineering mit Ghidra
Führen Sie eine tiefgehende Code-Analyse der ELF-Binärdatei durch:
Ghidra-Analyse für Linux-ELF:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. Importieren: Datei -> Importieren -> ELF-Binärdatei auswählen
- Ghidra erkennt das ELF-Format und die Architektur automatisch
- Standardanalyse-Optionen akzeptieren
2. Wichtige Analyseziele:
- main()-Funktion (oder Einsprungspunkt, falls gestrippt)
- Socket-Erstellungs- und Verbindungsfunktionen
- Befehlsverteilungslogik (switch/case für empfangene Daten)
- Verschlüsselungs-/Kodierungsroutinen
- Persistenz-Installationscode
- Selbstvermehrungs-/Scan-Funktionen
3. Bei Mirai-ähnlichen Botnets suchen nach:
- Credential-Liste für Brute-Force (Telnet/SSH)
- Angriffsmodul-Auswahl (UDP-Flood, SYN-Flood, ACK-Flood)
- Scanner-Modul (Port-Scanning für verwundbare Geräte)
- Killer-Modul (Ausschalten konkurrierender Botnets)
4. Bei Kryptominern suchen nach:
- Mining-Pool-Verbindung (Stratum-Protokoll)
- Wallet-Adress-Zeichenketten
- CPU/GPU-Nutzungsfunktionen
- Prozessversteck-Techniken
Schritt 6: Linux-spezifische Persistenz analysieren
Prüfen Sie auf Persistenzmechanismen:
# Auf LD_PRELOAD-Rootkit prüfen
strings verdaechtige_binaerdatei | grep "ld.so.preload"
# Malware, die in /etc/ld.so.preload schreibt, kann alle dynamischen Bibliotheksaufrufe abfangen
# Auf Crontab-Persistenz prüfen
strings verdaechtige_binaerdatei | grep -i "cron"
# Auf systemd-Dienst-Erstellung prüfen
strings verdaechtige_binaerdatei | grep -iE "systemd|\.service|systemctl"
# Auf Init-Skript-Erstellung prüfen
strings verdaechtige_binaerdatei | grep -iE "init\.d|rc\.local|update-rc"
# Auf SSH-Schlüssel-Injektion prüfen
strings verdaechtige_binaerdatei | grep -i "authorized_keys"
# Auf Kernel-Modul- (Rootkit-)Laden prüfen
strings verdaechtige_binaerdatei | grep -iE "insmod|modprobe|init_module"
# Auf Prozessverstecken prüfen
strings verdaechtige_binaerdatei | grep -iE "proc|readdir|getdents"
Schlüsselkonzepte
| Begriff | Definition |
|---|---|
| ELF (Executable and Linkable Format) | Standard-Binärformat für Linux-Programme, gemeinsame Bibliotheken und Core-Dumps mit Headern, Abschnitten und Segmenten |
| Gestrippte Binärdatei | ELF-Binärdatei, bei der Debug-Symbole entfernt wurden, was Reverse Engineering erschwert, da Funktionsnamen fehlen |
| LD_PRELOAD | Linux-Umgebungsvariable, die angibt, welche gemeinsamen Bibliotheken vor allen anderen geladen werden sollen; von Rootkits missbraucht, um Systembibliotheksaufrufe abzufangen |
| strace | Linux-Systemaufruf-Tracer, der alle Systemaufrufe und Signale eines Prozesses protokolliert und so Datei-, Netzwerk- und Prozessoperationen offenlegt |
| GOT/PLT | Global Offset Table und Procedure Linkage Table; ELF-Strukturen für dynamisches Verknüpfen, die für Funktions-Hooking gekapert werden können |
| Statisch verknüpft | Binärdatei, die mit allen Bibliothekscodes kompiliert wurde; häufig bei IoT-Malware, um auf Systemen ohne passende gemeinsame Bibliotheken zu laufen |
| Mirai | Weit verbreitetes Linux-Botnet, das IoT-Geräte per Telnet-Brute-Force angreift; Quellcode durchgesickert, was zu vielen Varianten führte |
Werkzeuge und Systeme
- Ghidra: NSA-Reverse-Engineering-Tool mit vollständiger ELF-Unterstützung für x86, x86_64, ARM, MIPS und andere Linux-Architekturen
- Radare2: Open-Source-Reverse-Engineering-Framework mit Befehlszeilenschnittstelle für schnelle Binäranalyse und Skripterstellung
- strace: Linux-Systemaufruf-Tracing-Tool zur Beobachtung des Binärverhaltens, einschließlich Datei-, Netzwerk- und Prozessoperationen
- GDB: GNU-Debugger zum Setzen von Haltepunkten, Untersuchen des Speichers und schrittweisem Durchlaufen der Linux-Binärausführung
- pyelftools: Python-Bibliothek zum programmatischen Parsen von ELF-Dateien für automatisierte Analyse-Pipelines
Häufige Szenarien
Szenario: Analyse eines Kryptominers auf einem kompromittierten Linux-Server
Kontext: Ein Cloud-Server zeigt 100% CPU-Auslastung. Die Untersuchung ergibt eine unbekannte Binärdatei, die von /tmp mit einem verdächtigen Namen ausgeführt wird. Die Binärdatei muss analysiert werden, um zu bestätigen, dass es sich um einen Kryptominer handelt, und um die Wallet und den Pool des Angreifers zu identifizieren.
Vorgehen:
- Kopieren Sie die Binärdatei in eine Analyse-VM und berechnen Sie den SHA-256-Hash
- Führen Sie
fileundreadelfaus, um Architektur und Verknüpfungsart zu identifizieren - Extrahieren Sie Zeichenketten und suchen Sie nach Mining-Pool-Adressen (stratum+tcp://) und Wallet-Adressen
- Führen Sie die Binärdatei mit
stracein einer Sandbox aus, um Netzwerkverbindungen (Mining-Pool-Verbindung) zu beobachten - Importieren Sie die Binärdatei in Ghidra, um den Mining-Algorithmus und die Konfigurationsextraktion zu identifizieren
- Prüfen Sie auf Persistenzmechanismen (crontab, systemd-Dienst, SSH-Schlüssel)
- Dokumentieren Sie alle IOCs, einschließlich Pool-Adresse, Wallet, C2 für Updates und Persistenz-Artefakte
Fallstricke:
- Ausführen von
lddauf Malware außerhalb einer Sandbox (lddkann Code in der Binärdatei ausführen) - Nicht auf ARM/MIPS-Architektur prüfen, bevor ein x86_64-Laufversuch unternommen wird
- Fehlende Begleitskripte (.sh-Dateien), die Persistenz und Bereinigung handhaben könnten, übersehen
- Ignorieren des anfänglichen Zugriffsvektors (wie der Miner bereitgestellt wurde: SSH-Brute-Force, Web-Exploit, Container-Ausbruch)
Ausgabeformat
LINUX-ELF-MALWARE-ANALYSEBERICHT
====================================
Datei: /tmp/.X11-unix/.rsync
SHA-256: e3b0c44298fc1c149afbf4c8996fb924...
Typ: ELF 64-Bit LSB-Programm, x86-64
Verknüpfung: Statisch verknüpft (alle Bibliotheken eingebettet)
Gestrippt: Ja
Größe: 2.847.232 Bytes
Packer: UPX 3.96 (für Analyse entpackt)
KLASSIFIZIERUNG
Familie: XMRig Kryptominer (modifiziert)
Variante: Eigener Build mit C2-Update-Mechanismus
FUNKTIONALITÄT
[*] XMR (Monero)-Mining über RandomX-Algorithmus
[*] Stratum-Pool-Verbindung zur Arbeitseinreichung
[*] C2-Check-In für Konfigurationsupdates
[*] Prozessnamen-Verschleierung (argv[0] = "[kworker/0:0]")
[*] Töten konkurrierender Prozesse (tötet andere Miner)
[*] SSH-Schlüssel-Injektion für Wiederzugriff
NETZWERK-INDIKATOREN
Mining-Pool: stratum+tcp://pool.minexmr[.]com:4444
C2-Server: hxxp://update.malicious[.]com/config
Wallet: 49jZ5Q3b...Monero_Wallet_Adresse...
PERSISTENZ
[1] Crontab-Eintrag: */5 * * * * /tmp/.X11-unix/.rsync
[2] SSH-Schlüssel zu /root/.ssh/authorized_keys hinzugefügt
[3] systemd-Dienst: /etc/systemd/system/rsync-daemon.service
[4] /etc/ld.so.preload für Prozessverstecken modifiziert
PROZESSVERSTECKEN
LD_PRELOAD: /usr/lib/.libsystem.so
Hook: readdir(), um /tmp/.X11-unix/.rsync vor ls zu verstecken
Hook: fopen(), um vor /proc/*/maps-Lesen zu verstecken