Ich schrieb ein kleines C-Dienstprogramm namens killSPR
, um die folgenden Prozesse auf meiner RHEL-Box zu töten. Die Idee ist, dass jeder, der sich in diese Linux-Box einloggt, in der Lage ist, dieses Dienstprogramm zu benutzen, um die unten erwähnten Prozesse zu beenden (was nicht funktioniert - unten erklärt).setuid auf einer ausführbaren Datei scheint nicht zu funktionieren
[email protected] /tmp > ps -eaf | grep -v grep | grep " SPR "
cadmn 5822 5821 99 17:19 ? 00:33:13 SPR 4 cadmn
cadmn 10466 10465 99 17:25 ? 00:26:34 SPR 4 cadmn
cadmn 13431 13430 99 17:32 ? 00:19:55 SPR 4 cadmn
cadmn 17320 17319 99 17:39 ? 00:13:04 SPR 4 cadmn
cadmn 20589 20588 99 16:50 ? 01:01:30 SPR 4 cadmn
cadmn 22084 22083 99 17:45 ? 00:06:34 SPR 4 cadmn
[email protected] /tmp >
Dieses Dienstprogramm von dem Benutzer besessen wird cadmn
(unter denen diese Prozesse ausgeführt werden) und hat die setuid- Flagge auf ihrem festgelegt (siehe unten).
/*
* Program Name: killSPR.c
* Description: A simple program that kills all SPR processes that
* run as user cadmn
*/
#include <stdio.h>
int main()
{
char *input;
printf("Before you proceed, find out under which ID I'm running. Hit enter when you are done...");
fgets(input, 2, stdin);
const char *killCmd = "kill -9 $(ps -eaf | grep -v grep | grep \" SPR \" | awk '{print $2}')";
system(killCmd);
return 0;
}
ein Benutzer (pmn
) verschieden von cadmn
versucht, die oben genannten Verfahren mit diesem Programm zu töten und nicht (siehe unten):
[email protected] /tmp > ls -l killSPR
-rwsr-xr-x 1 cadmn cusers 9925 Dec 17 17:51 killSPR
[email protected] /tmp >
Der C-Code ist unten angegeben
[email protected] /tmp > ./killSPR
Before you proceed, find out under which ID I'm running. Hit enter when you are done...
sh: line 0: kill: (5822) - Operation not permitted
sh: line 0: kill: (10466) - Operation not permitted
sh: line 0: kill: (13431) - Operation not permitted
sh: line 0: kill: (17320) - Operation not permitted
sh: line 0: kill: (20589) - Operation not permitted
sh: line 0: kill: (22084) - Operation not permitted
[email protected] /tmp >
Während der Benutzer wartet, um oben zu kommen, wird der Prozess killSPR
inspiziert und läuft als der Benutzer cadmn
((siehe unten), obwohl killSPR die Prozesse nicht beenden kann.
[email protected] /tmp > ps -eaf | grep -v grep | grep killSPR
cadmn 24851 22918 0 17:51 pts/36 00:00:00 ./killSPR
[email protected] /tmp >
BTW, keine der Hauptpartitionen hat jede nosuid
auf sich
[email protected] /tmp > mount | grep nosuid
[email protected] /tmp >
Der setuid-Flag auf der ausführbaren Datei scheint nicht die gewünschte Wirkung zu haben. Was fehlt mir hier? Habe ich missverstanden, wie setuid funktioniert?
gibt es einen Grund, dies nicht nur ein Shell-Skript statt einer kompilierten Binärdatei mit '777' Berechtigungen sein könnte? – txtechhelp
@txtechhelp - Ein Shell-Skript mit Dauerwelle 777 wird nicht funktionieren. Hier ist der Grund - Wenn der Benutzer 'pmn' dieses Skript aufgerufen hat, würde der folgende Prozess als Benutzer' pmn' ausgeführt werden, der keine Privilegien zum Töten der Prozesse hat, die als Benutzer 'cadmn' ausgeführt werden (außer Sie sind der root, Sie können keine Prozesse beenden, die von anderen ausgeführt werden. BTW, setzen Setuid-Flag auf Skripts auch nicht: setuid auf Skripten, die in einer der Shell-Sprachen geschrieben werden, werden vom System als Sicherheitsfunktion ignoriert. Daher muss dies ein kompiliertes Programm sein. Hoffe das beantwortet Ihre Frage. – pmn
Ich verstehe Benutzerrechte und Einschränkungen von Linux/Unix-Systemen, ich frage, warum Sie versuchen, dies über ein C-Programm (das die gleichen Einschränkungen, wenn als separaten Benutzer in einem separaten Login ausgeführt wird) angesichts der Code Sie tun habe gepostet ... du rufst einfach einen Systembefehl von einem C-Programm auf, das den gleichen Effekt hat wie den gleichen Befehl ('kill' in deinem Programm) durch ein Shell-Skript aufzurufen.Stattdessen klingt es so, als ob Sie einem bestimmten Programm "Dienst wie Kontrolle" für Nicht-Root-Benutzer geben möchten. Wenn das korrekt ist, formulieren Sie bitte Ihre Frage um: – txtechhelp