Mein Vorschlag:
Kleines Programm unter C compilieren, dann das S-Bit für root setzen,
ausführbar (nicht lesbar) für alle:
C-Proggi (restart_net.c): --
char bigpointer[1024];
int main (int argc, char *argv[]) { int i;
strcat (bigpointer, "/sbin/rcnetwork restart "); for (i=1;i
-- compilieren mit gcc: gcc restart_net.c -o restart_net.x
Dateiberechtigungen setzen: chmod u+s,go-rw restart_net.x
Damit könnte man es auch lösen.
Gruß, Wolfgang
Suuper, funktioniert. Vielen Dank. Also so etwas interresiert mich schon lange. Kleine Programme mit C. Danke nochmal und liebe Grüße Roger
________________________________
Hallo, Euch ist schon klar, dass das Programm ne astreine root-Vulnerability enthält, oder?
char bigpointer[1024];
int main (int argc, char *argv[]) { int i;
strcat (bigpointer, "/sbin/rcnetwork restart "); for (i=1;i
Der Puffer für bigpointer wird überlaufen, wenn die Anzahl der Kommandozeilenparameter >1024 ist (ab ca. 1090) und schon gibts nen Buffer Overflow. Mit suid-Berechtigung ist das der perfekte lokale root-Exploit. Danke. Viele Grüße, Werner.
Am Freitag, 7. Januar 2005 23:58 schrieb Werner Schalk:
Euch ist schon klar, dass das Programm ne astreine root-Vulnerability enthält, oder?
char bigpointer[1024];
int main (int argc, char *argv[]) { int i;
strcat (bigpointer, "/sbin/rcnetwork restart ");
Schon das hier ist gefährlich. Du kannst nicht davon ausgehen, dass bigpointer mit 0 initialisiert ist (beim gcc mags funktionieren, aber das ist keineswegs ein Fakt auf den man sich verlassen darf). Besser strcpy (noch besser strncpy, hier kann man drauf verzichten, weil die Längen vom Puffer und vom char* bekannt sind).
for (i=1;i
Der Puffer für bigpointer wird überlaufen, wenn die Anzahl der Kommandozeilenparameter >1024 ist (ab ca. 1090) und schon gibts nen Buffer Overflow. Mit suid-Berechtigung ist das der perfekte lokale root-Exploit. Danke.
Und das ist noch das kleinere Übel (dem man mit sauberer Längenprüfung begegnen kann). Aber man kann das Ding viel einfacher ausnutzen: Rufe das Programm doch mal so auf: programm parameter1 \; rm -rf / Da keinerlei Prüfungen der Argumente durchgeführt werden, führt der system()-call einfach die Kommandos /sbin/rcnetwork restart parameter1; rm -rf / nacheinander aus. Ein Abfangen solcher (und anderer) Übel ist deutlich aufwändiger. Mit: programm parameter1 \; /bin/bash hast Du gleich ne root-Shell. Ich habe den Thread nicht verfolgt, aber sudo ist doch sicher schon genannt worden, oder? Jan -- Linux-Quickies: http://www.jan-trippler.de PingoS: http://www.pingos.org
Am Samstag, den 08.01.2005, 13:05 +0100 schrieb Jan Trippler:
Am Freitag, 7. Januar 2005 23:58 schrieb Werner Schalk:
Euch ist schon klar, dass das Programm ne astreine root-Vulnerability enthält, oder?
char bigpointer[1024];
int main (int argc, char *argv[]) { int i;
strcat (bigpointer, "/sbin/rcnetwork restart ");
Schon das hier ist gefährlich. Du kannst nicht davon ausgehen, dass bigpointer mit 0 initialisiert ist (beim gcc mags funktionieren, aber das ist keineswegs ein Fakt auf den man sich verlassen darf).
Besser strcpy (noch besser strncpy, hier kann man drauf verzichten, weil die Längen vom Puffer und vom char* bekannt sind).
for (i=1;i
Der Puffer für bigpointer wird überlaufen, wenn die Anzahl der Kommandozeilenparameter >1024 ist (ab ca. 1090) und schon gibts nen Buffer Overflow. Mit suid-Berechtigung ist das der perfekte lokale root-Exploit. Danke.
Und das ist noch das kleinere Übel (dem man mit sauberer Längenprüfung begegnen kann). Aber man kann das Ding viel einfacher ausnutzen: Rufe das Programm doch mal so auf: programm parameter1 \; rm -rf /
Da keinerlei Prüfungen der Argumente durchgeführt werden, führt der system()-call einfach die Kommandos /sbin/rcnetwork restart parameter1; rm -rf / nacheinander aus. Ein Abfangen solcher (und anderer) Übel ist deutlich aufwändiger.
Mit: programm parameter1 \; /bin/bash hast Du gleich ne root-Shell.
Ich habe den Thread nicht verfolgt, aber sudo ist doch sicher schon genannt worden, oder?
Jan Ja, wurde vorgeschlagen. Jetzt muß ich mich wieder als Newbee bezeichnen, was ich wahrscheinlich auch noch bin. Von dem was in dem oberen Textteil steht, habe ich nur die Hälfte verstanden. Also ich habe das Programm, so wie in der Anleitung des Kollegen beschrieben, gebaut. Es funktionert auch. Die Probleme welche sich daraus ergeben, sind für mich als Newbee nicht ganz verständlich. Vieleicht könnt Ihr mir, in für Newbees vertändlichem Format, erklären was genau passieren kann, wenn ich das Netzwerk mit dem oben genannten Proggi starte. Aber ich werde es auch mit Sudo versuchen, wenn dies sicherer ist. Gruß Roger
-- Linux-Quickies: http://www.jan-trippler.de PingoS: http://www.pingos.org
Am Samstag, 8. Januar 2005 13:47 schrieb Roger Neuburg:
Am Samstag, den 08.01.2005, 13:05 +0100 schrieb Jan Trippler: [...]
Mit: programm parameter1 \; /bin/bash hast Du gleich ne root-Shell.
Ich habe den Thread nicht verfolgt, aber sudo ist doch sicher schon genannt worden, oder?
Jan
Ja, wurde vorgeschlagen. Jetzt muß ich mich wieder als Newbee bezeichnen, was ich wahrscheinlich auch noch bin. Von dem was in dem oberen Textteil steht, habe ich nur die Hälfte verstanden. Also ich habe das Programm, so wie in der Anleitung des Kollegen beschrieben, gebaut. Es funktionert auch.
"Funktionieren" ist ein weiter Begriff ;-) Das Programm erlaubt jedem Benutzer, das Netzwerk neu zu starten, es erlaubt aber noch viel mehr, was nicht im Sinne der ursprünglichen Aufgabe ist. Für mich funktioniert es damit nicht.
Die Probleme welche sich daraus ergeben, sind für mich als Newbee nicht ganz verständlich. Vieleicht könnt Ihr mir, in für Newbees vertändlichem Format, erklären was genau passieren kann, wenn ich das Netzwerk mit dem oben genannten Proggi starte.
Zusammengefasst: Das vorgestellte Programm erlaubt es jedem Benutzer, root-Rechte zu erlangen. Einmal mit dem oben von mir aufgezeigten Weg (das kannst Du ruhig mal probieren), zum anderen dadurch, dass man es durch viele / lange Parameter gezielt abstürzen lassen kann ("Buffer Overflow" ist eine der häufigsten Ursachen für Security-Probleme). Wenn Du es wie oben beschrieben startest, findest Du Dich in einer Shell mit root-Rechten wieder und kannst alles machen, was root auch darf - z. B. das root-Passwort ändern, beliebig Dateien löschen, Backdoors installieren, den Kernel patchen, ... Das Programm auf einem Rechner installiert ist also ungefähr das Gleiche, als wenn Du das root-Passwort öffentlich verteilen würdest. Lösche es wieder, das ist mein dringender Rat.
Aber ich werde es auch mit Sudo versuchen, wenn dies sicherer ist.
Auf jeden Fall. Jan -- Linux-Quickies: http://www.jan-trippler.de PingoS: http://www.pingos.org
Hallo, Am Samstag, 8. Januar 2005 13:47 schrieb Roger Neuburg:
Am Samstag, den 08.01.2005, 13:05 +0100 schrieb Jan Trippler:
[..] Mit: programm parameter1 \; /bin/bash hast Du gleich ne root-Shell.
Ich habe den Thread nicht verfolgt, aber sudo ist doch sicher schon genannt worden, oder? [..]
Ja, wurde vorgeschlagen. Jetzt muß ich mich wieder als Newbee bezeichnen, was ich wahrscheinlich auch noch bin. Von dem was in dem oberen Textteil steht, habe ich nur die Hälfte verstanden. Also ich habe das Programm, so wie in der Anleitung des Kollegen beschrieben, gebaut. Es funktionert auch. Die Probleme welche sich daraus ergeben, sind für mich als Newbee nicht ganz verständlich. Vieleicht könnt Ihr mir, in für Newbees vertändlichem Format, erklären was genau passieren kann, wenn ich das Netzwerk mit dem oben genannten Proggi starte.
Das C-Programm prüft nicht genau, mit welchen Argumenten es aufgerufen wird. Es dürften eigentlich nur Argumente wie start, stop, restart oder so sein. Dass das Programm dann aber auch Befehle ausführt, die mit ; einfach hintendran gehängt werden, wurde wohl nicht bedacht. Also wenn irgendein User auf deinem Rechner das Programm ausführt, und dabei noch andere Argumente anfügt, wie Jan das gezeigt hat, kann er mit root-Rechten alles Mögliche anrichten. Oder halt einfach eine root-Shell starten und dann alles Mögliche machen. Da wohl nur du und $Tochter den Computer nutzen, dürfte sich das Risiko in Grenzen halten. Allerdings sollte man soetwas eigentlich gar nicht erst zulassen, da es so oder so ein riesiges Sicherheitsloch ist, das auch von irgendwelchen Skripten ausgenutzt werden kann, sofern diese wissen, dass es existiert... Wenn du deiner Tochter das Root-PW nicht anvertraust, löst das IMHO auch "kriminelle Energie" aus, weil sie vermutlich nach 2 Minuten gogeln auf den Bootparameter init=/bin/sh stoßen wird und dann hat sie ihre root-Shell, sofern du den physikalischen Zugriff auf den Rechner nicht auch einschränkst...
Aber ich werde es auch mit Sudo versuchen, wenn dies sicherer ist.
Dafür habe ich hier mal einen Thread aus dem Archiv herausgesucht: http://lists.suse.com/archive/suse-linux/2004-Jan/1971.html Wenn dir das zu kompliziert ist, kannst du ja auch einfach (hat das schon jemand genannt?) in /etc/init.d/rc5.d eine Datei mit Namen S99 anlegen, in der folgendes drin steht: #!/bin/bash rcnetwork restart Dann noch chmod +x drauf machen und es sollte gehen ;-) Diese Datei wird zuletzt bei Eintritt in Runlevel 5 ausgeführt und somit birgt das IMHO auch kein Sicherheitsrisiko. Alternativ kannste auch etwas ähnliches in /etc/init.d/boot.local machen... Gruß Sören
Also erstmal vielen Dank allen die mich mit Ihren Tipps unterstützt haben. Es gibt, wie von euch vorgeschlagen, mehrere Wege die zum Ziel führen. Das Sicherheitsrisiko ist im Moment, glaube ich, zu verantworten wenn der Name des Skriptes nur zwei Menschen bekannt ist. Das Skript war auch nur als Notlösung gedacht, wenn die Ip Vergabe über DHCP beim booten scheitert. Oder meine andere Tochter aus versehen den Router ausknipst. Ich werde aber die sudo Lösung auch versuchen. Danke Sören für den Link Viele Grüße Roger
Aber ich werde es auch mit Sudo versuchen, wenn dies sicherer ist.
Dafür habe ich hier mal einen Thread aus dem Archiv herausgesucht: http://lists.suse.com/archive/suse-linux/2004-Jan/1971.html
Danke nochmal, hat mit Sudo geklappt. Die Syntax hat mir zwar ein bis zwei graue Haare mehr eingebracht, aber schließlich habe ich es doch noch geschafft. Gruß Roger
participants (4)
-
Jan.Trippler@t-online.de
-
Roger Neuburg
-
Sören Wengerowsky
-
Werner Schalk