ASLR
Last updated
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Address Space Layout Randomization (ASLR) ist eine Sicherheitstechnik, die in Betriebssystemen verwendet wird, um die Speicheradressen zu randomisieren, die von System- und Anwendungsprozessen verwendet werden. Dadurch wird es einem Angreifer erheblich erschwert, den Standort bestimmter Prozesse und Daten, wie z. B. den Stack, den Heap und Bibliotheken, vorherzusagen, wodurch bestimmte Arten von Exploits, insbesondere Pufferüberläufe, gemildert werden.
Um den ASLR-Status auf einem Linux-System zu überprüfen, können Sie den Wert aus der Datei /proc/sys/kernel/randomize_va_space
lesen. Der in dieser Datei gespeicherte Wert bestimmt die Art des angewendeten ASLR:
0: Keine Randomisierung. Alles ist statisch.
1: Konservative Randomisierung. Gemeinsame Bibliotheken, Stack, mmap(), VDSO-Seite sind randomisiert.
2: Vollständige Randomisierung. Zusätzlich zu den durch konservative Randomisierung randomisierten Elementen wird der durch brk()
verwaltete Speicher randomisiert.
Sie können den ASLR-Status mit dem folgenden Befehl überprüfen:
Um ASLR zu deaktivieren, setzen Sie den Wert von /proc/sys/kernel/randomize_va_space
auf 0. Das Deaktivieren von ASLR wird außerhalb von Test- oder Debugging-Szenarien im Allgemeinen nicht empfohlen. So können Sie es deaktivieren:
Sie können ASLR auch für eine Ausführung mit folgendem Befehl deaktivieren:
Um ASLR zu aktivieren, können Sie den Wert 2 in die Datei /proc/sys/kernel/randomize_va_space
schreiben. Dies erfordert normalerweise Root-Rechte. Die vollständige Randomisierung kann mit dem folgenden Befehl aktiviert werden:
Änderungen, die mit den echo
-Befehlen vorgenommen werden, sind vorübergehend und werden beim Neustart zurückgesetzt. Um die Änderung persistent zu machen, müssen Sie die Datei /etc/sysctl.conf
bearbeiten und die folgende Zeile hinzufügen oder ändern:
Nach der Bearbeitung von /etc/sysctl.conf
wenden Sie die Änderungen mit an:
This will ensure that your ASLR settings remain across reboots.
PaX teilt den Adressraum des Prozesses in 3 Gruppen:
Code und Daten (initialisiert und nicht initialisiert): .text
, .data
und .bss
—> 16 Bits Entropie in der delta_exec
-Variablen. Diese Variable wird bei jedem Prozess zufällig initialisiert und zu den Anfangsadressen addiert.
Speicher, der durch mmap()
zugewiesen wird, und gemeinsame Bibliotheken —> 16 Bits, genannt delta_mmap
.
Der Stack —> 24 Bits, bezeichnet als delta_stack
. Allerdings verwendet er effektiv 11 Bits (vom 10. bis zum 20. Byte einschließlich), ausgerichtet auf 16 Bytes —> Dies ergibt 524.288 mögliche reale Stack-Adressen.
Die vorherigen Daten gelten für 32-Bit-Systeme, und die reduzierte endgültige Entropie macht es möglich, ASLR zu umgehen, indem die Ausführung immer wieder wiederholt wird, bis der Exploit erfolgreich abgeschlossen ist.
Wenn Sie einen großen Overflow haben, um einen großen NOP-Sled vor dem Shellcode zu hosten, könnten Sie einfach die Adressen im Stack brute-forcen, bis der Fluss über einen Teil des NOP-Sleds springt.
Eine weitere Option dafür, falls der Overflow nicht so groß ist und der Exploit lokal ausgeführt werden kann, ist es, den NOP-Sled und den Shellcode in einer Umgebungsvariablen hinzuzufügen.
Wenn der Exploit lokal ist, können Sie versuchen, die Basisadresse von libc brute-forcen (nützlich für 32-Bit-Systeme):
Wenn Sie einen Remote-Server angreifen, könnten Sie versuchen, die Adresse der libc
-Funktion usleep
brute-forcen, indem Sie als Argument 10 übergeben (zum Beispiel). Wenn der Server irgendwann 10 Sekunden länger für die Antwort benötigt, haben Sie die Adresse dieser Funktion gefunden.
In 64-Bit-Systemen ist die Entropie viel höher und das sollte nicht möglich sein.
Es ist möglich, einen großen Teil des Stacks mit Umgebungsvariablen zu belegen und dann zu versuchen, die Binärdatei hunderte oder tausende Male lokal auszunutzen. Der folgende Code zeigt, wie es möglich ist, einfach eine Adresse im Stack auszuwählen und bei einigen hundert Ausführungen wird diese Adresse die NOP-Anweisung enthalten:
/proc/[pid]/stat
)Die Datei /proc/[pid]/stat
eines Prozesses ist immer für alle lesbar und enthält interessante Informationen wie:
startcode & endcode: Adressen oberhalb und unterhalb des TEXT der Binärdatei
startstack: Die Adresse des Starts des Stacks
start_data & end_data: Adressen oberhalb und unterhalb, wo sich die BSS befindet
kstkesp & kstkeip: Aktuelle ESP- und EIP-Adressen
arg_start & arg_end: Adressen oberhalb und unterhalb, wo sich die CLI-Argumente befinden.
env_start &env_end: Adressen oberhalb und unterhalb, wo sich die Umgebungsvariablen befinden.
Daher, wenn der Angreifer sich auf demselben Computer wie die ausgenutzte Binärdatei befindet und diese Binärdatei nicht mit einem Überlauf von rohen Argumenten rechnet, sondern mit einem anderen Eingang, der nach dem Lesen dieser Datei erstellt werden kann. Ist es möglich für einen Angreifer, einige Adressen aus dieser Datei zu erhalten und von ihnen Offsets für den Exploit zu konstruieren.
Für weitere Informationen zu dieser Datei siehe https://man7.org/linux/man-pages/man5/proc.5.html und suche nach /proc/pid/stat
Die Herausforderung besteht darin, einen Leak zu geben
Wenn dir ein Leak gegeben wird (einfache CTF-Herausforderungen), kannst du Offsets daraus berechnen (angenommen, du kennst zum Beispiel die genaue libc-Version, die im System verwendet wird, das du ausnutzt). Dieses Beispiel-Exploit stammt aus dem Beispiel hier (siehe diese Seite für weitere Details):
ret2plt
Durch den Missbrauch eines Buffer Overflows wäre es möglich, ein ret2plt auszunutzen, um eine Adresse einer Funktion aus der libc zu exfiltrieren. Überprüfen Sie:
Ret2pltFormat Strings Arbitrary Read
Genau wie bei ret2plt, wenn Sie einen arbiträren Lesezugriff über eine Format-Strings-Schwachstelle haben, ist es möglich, die Adresse einer libc-Funktion aus der GOT zu exfiltrieren. Das folgende Beispiel stammt von hier:
You can find more info about Format Strings arbitrary read in:
Format StringsVersuchen Sie, ASLR zu umgehen, indem Sie Adressen im Stack ausnutzen:
Ret2ret & Reo2popDer vsyscall
-Mechanismus dient zur Leistungssteigerung, indem bestimmte Systemaufrufe im Benutzerspeicher ausgeführt werden, obwohl sie grundsätzlich Teil des Kernels sind. Der entscheidende Vorteil von vsyscalls liegt in ihren festen Adressen, die nicht der ASLR (Address Space Layout Randomization) unterliegen. Diese feste Natur bedeutet, dass Angreifer keine Informationsleckanfälligkeit benötigen, um ihre Adressen zu bestimmen und sie in einem Exploit zu verwenden.
Allerdings werden hier keine besonders interessanten Gadgets gefunden (obwohl es beispielsweise möglich ist, ein ret;
-Äquivalent zu erhalten).
(Das folgende Beispiel und der Code sind aus diesem Bericht)
Ein Angreifer könnte beispielsweise die Adresse 0xffffffffff600800
innerhalb eines Exploits verwenden. Während der Versuch, direkt zu einer ret
-Anweisung zu springen, nach der Ausführung einiger Gadgets zu Instabilität oder Abstürzen führen kann, kann das Springen zum Anfang eines syscall
, das von der vsyscall-Sektion bereitgestellt wird, erfolgreich sein. Durch sorgfältiges Platzieren eines ROP-Gadgets, das die Ausführung zu dieser vsyscall-Adresse führt, kann ein Angreifer die Codeausführung erreichen, ohne ASLR für diesen Teil des Exploits umgehen zu müssen.
Beachten Sie daher, wie es möglich sein könnte, ASLR durch den Missbrauch des vdso zu umgehen, wenn der Kernel mit CONFIG_COMPAT_VDSO kompiliert ist, da die vdso-Adresse nicht randomisiert wird. Für weitere Informationen siehe:
Ret2vDSOLernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)