|
Funktionshooking unter Linux 1: LD_PRELOAD (German) |
|
Written by cr
|
|
Wednesday, 16 May 2007 |
|
Ein etwas älterer Text der Möglichkeiten des Funktionshooking unter Linux beschreibt in 4 Teilen. Teil 1 bschreibt an einem einfachen Beispiel LD_PRELOAD.
Funktionshooking Teil 1: LD_PRELOAD
LD_PRELOAD ist eine Umgebungsvariable der Shell, die angibt welche dynamischen Bibliotheken zur Laufzeit in das Programm geladen werden. Dadurch ist es möglich eigenen Code mit Hilfe anderer Programme auszuführen.
Beispiel: Ein Programm namens geteuid das über die Systemfunktion geteuid() die euid des ausführenden Users abfragt.
-------------geteuid.c-----------------
#include <unistd.h> #include <sys/types.h> #include <stdio.h>
int main(void) { printf("EUID=%i\n",geteuid()); return 0; }
-------------geteuid.c-----------------
cr@chronos:~$ gcc -o geteuid geteuid.c cr@chronos:~$ ./geteuid EUID=1000 cr@chronos:~$
Wenn wir jetzt uns selber eine andere euid geben wollen könnte man das zb. über eine eigene geteuid()Funktion machen. Dazu schreiben wir als erstes die entsprechende Funktion:
-------------euid.c-----------------
#include <unistd.h> #include <sys/types.h>
uid_t geteuid(void) { return 666; }
-------------euid.c-----------------
Im Anschluss kompilieren wir diese als shared libary:
gcc -c -fPIC euid.c gcc -shared -Wl,-soname,libeuid.so.1 -o libeuid.so euid.o
Wenn wir jetzt export LD_PRELOAD=./libeuid.so machen und anschliessend das ursprüngliche Programm geteuid ausführen erhalten wir die korrigierte guid.
Eleganter ist es dafür ein kleines Shellscript zu basteln wie zb:
------------seuid.sh-----------------
#!/bin/sh export LD_PRELOAD=./libeuid.so exec ./geteuid
------------seuid.sh-----------------
cr@chronos:~$ chmod +x seuid.sh cr@chronos:~$ ./seuid.sh EUID=666 cr@chronos:~$
Schutz: Prüfen ob zum Zeitpunkt der Ausführung des Programms die Umgebungsvariable gesetzt ist und gegebenenfalls das Programm abbrechen. Einen weiteren Schutz bietet die Tatsache das setuid root Programme die LD_PRELOAD Variable nicht nutzen wenn die wirkliche uid nicht 0 (root) ist.
Info: Autor cr |
|
Last Updated ( Friday, 18 May 2007 )
|