prozesse/programme mit root rechten von php starten
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
all
apache
befehl
code
datei
datenbank
erledigen
forum
frage
http
index
jemand
kontrollieren
parameter
programm
rest
server
system
teil
url
-
der grund hierfür ist da zu sehen. dabei geht es dort darum, dass @jnuk per php seinen computer - auf den wunsch seinens vaters - ausschalten will. dabei tauch aber das problem auf, dass man den entsprechenden befehl nur mit root rechten ausführen kann (exec und co. ist bei ihm ja kein problem).
und wenn jemand da etwas dazu beitragen möchte, bitte keine schwafelei, sondern argumente von besten.
um mal zu zeigen, dass dieses thema nicht immer und um jeden preis TÖDLICH endet, werde ich da - ab heute nacht - eine seite einrichten. den rest werden wir dann sehen ;)
und hier mal gleich das WIE? (das ist allerding nur eine möglichkeit!)
auszug aus httpd.conf:
wie man es sieht, apache rennt bei mir (fedora 16) als apache:apache und hat dabei so gut wie keine rechte.# If you wish httpd to run as a different user or group, you must run # httpd as root initially and it will switch. # # User/Group: The name (or #number) of the user/group to run httpd as. # . On SCO (ODT 3) use "User nouser" and "Group nogroup". # . On HPUX you may not be able to use shared memory as nobody, and the # suggested workaround is to create a user www and use that user. # NOTE that some kernels refuse to setgid(Group) or semctl(IPC_SET) # when the value of (unsigned)Group is above 60000; # don't use Group #-1 on these systems! # User apache Group apache
was hat apache für ein passwort?:
no!?. apache hat das passwort '', also leer! oder von mir aus kein!$ su Password: # passwd -S apache apache LK 2011-11-24 0 99999 7 -1 (Password locked.) # passwd -fu apache Unlocking password for user apache. passwd: Success # passwd -S apache apache NP 2011-11-24 0 99999 7 -1 (Empty password.) # passwd -l apache Locking password for user apache. passwd: Success
und jetzt noch die nötigen schritte, um von php aus ein anderes programm mit root rechten zu starten. aber vorhin meine warnung:
WARNUNG! sollte man tunlichst nur dann tun, wenn man es genau weißt, was man tut!! und ich übernehme natürlich keine haftung für nur irgendwas. hinzu kommt, wenn jemand windows verwendet (XAMPP), dann kann ich ihm/ihr überhaupt nicht helfen (kann überhaupt jemand?)
1.
in der 'sudoers'-datei steht irgendwo einmal
das sollte jetzt mal schnell auskommentiert werden (wofür man das prog. visudo verwendet!)Defaults requiretty
#Defaults requiretty
2.
im 'main part' von 'sudoers' steht dann irgendwo
nach diesem eintrag fügen wir dann das ein (auch mit visudo!):root ALL=(ALL) ALL
apache ALL=(ALL) NOPASSWD: ALL
ALL DAS BISHER TUST NICHT AUF EINEM RECHNER, DER IM INTERNET ERREICHBAR IST! (entschuldigung für das schreien!)
3.
dann schreibst in eine php datei rein:
und deine box startet auch schon brav neu. fürs herunterfahren nimmst natürlich 'shutdown -h now'.<?php echo `echo -e '' | sudo -S -u root shutdown -r now 2>&1`;
ABER!
das DING steckt in dem teil:
mit dem kannst genau dosieren, was apache alles kann und darf! und das entsteht - wie gesagt - genau da.apache ALL=(ALL) NOPASSWD: ALL
also her mit den fundierten beiträgen!
Beitrag zuletzt geändert: 30.12.2011 2:10:43 von hemiolos -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Wäre es nicht simpler ein C-Programm aufzurufen, welches durch das SUID-Bit als root ausgeführt wird?
Zumal man dann nur dieses eine Programm als root laufen hat.
Kleines Beispiel:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { if(setuid(0) ) { fprintf(stderr,"ERROR: setuid(0)\n"); return 2; } system("/usr/bin/id"); return 0; }
Beitrag zuletzt geändert: 27.12.2011 22:07:36 von thomasba -
thomasba schrieb:
ich habe ja nichts dagegen, nur ich muss mich dann fragen, wie erledigt das einzige kleine c-prog all das, was man mit einer ganzen php-datei erreichen kann? und lohnt es sich überhaupt, mit kanonen (C) auf spatzen zu schießen?
Wäre es nicht simpler ein C-Programm aufzurufen, welches durch das SUID-Bit als root ausgeführt wird?
Zumal man dann nur dieses eine Programm als root laufen hat.
noch einmal, mit nur einer zeile in httpd.conf
kann man alle oder nur ein (paar) programm(e) zulassen, ohne dass etwas im hintergrund laufen muss. man muss nur wissen, wofür die drei ALL's stehen und wie man sie bedient.apache ALL=(ALL) NOPASSWD: ALL
und ja! natürlich! aufpassen musst du auf dein php wie ein haftelmacher! du machst dabei nur einen fehler. also den einzeiler in punkt 3, so wie ich vorhin gezeigt habe, würde ich nicht so einsetzen ;)
Beitrag zuletzt geändert: 27.12.2011 22:18:00 von hemiolos -
hackyourlife schrieb:
wer sagt das bitte, was mein oder dein script erledigen muss?? das kann kapiteln schreiben! festplatte mounten und remote klonen ... oder was du haben willst. das neustarten war nur ein beispiel - wenn auch ein schlechtes :)
hemiolos schrieb:
Es muss ja nur genau den Teil erledigen für den root benötigt wird! Also z.B. den PC herunterfahren oder so was.
ich habe ja nichts dagegen, nur ich muss mich dann fragen, wie erledigt das einzige kleine c-prog all das, was man mit einer ganzen php-datei erreichen kann? -
hemiolos schrieb:
wer sagt das bitte, was mein oder dein script erledigen muss?? das kann kapiteln schreiben! festplatte mounten und remote klonen ... oder was du haben willst. das neustarten war nur ein beispiel - wenn auch ein schlechtes :)
Dennoch kann man mit einem C-Programm wesentlich besser kontrollieren, was ausgeführt wird. Wenn man PHP/Apache pauschal das recht gibt ein Programm zu nutzen, können auch andere Parameter als die Gewünschten übergeben werden.
Bei einem System, auf das mehrere User ihre PHP-Scripte laden, könnte das durchaus unerwünschte Nebeneffekte haben.
Des weiteren kann man mit manchen Befehlen das System stark beeinträchtigen, es zum Absturz bringen…
→ Mit einem sauber Programmierten C-Programm hat man eine bessere Kontrollmöglichkeit, was der User macht.
Auf einem Single-User System ist das natürlich nicht so dramatisch.
Beitrag zuletzt geändert: 28.12.2011 23:27:45 von thomasba -
thomasba schrieb:
und kannst du bitte hier allen leuten auch gleich, wie genau erklären, woran das liegen mag? nebenbei - ist php nicht in c programmiert?
Dennoch kann man mit einem C-Programm wesentlich besser kontrollieren, was ausgeführt wird.
Wenn man PHP/Apache pauschal das recht gibt ein Programm zu nutzen, können auch andere Parameter als die Gewünschten übergeben werden.
dann ist nur der php-programmierer der dumme. bei sauberer programmierung kannst da nichts antun!
Bei einem System, auf das mehrere User ihre PHP-Scripte laden, könnte das durchaus unerwünschte Nebeneffekte haben.
kann man userbereich von adminbereich sauber trennen? ich glaube schon ;)
Des weiteren kann man mit manchen Befehlen das System stark beeinträchtigen, es zum Absturz bringen…
du wiederholst dich, also siehe oben.
→ Mit einem sauber Programmierten C-Programm hat man eine bessere Kontrollmöglichkeit, was der User macht.
Auf einem Single-User System ist das natürlich nicht so dramatisch. -
thomasba schrieb:
Er ist warscheinlich davon ausgegangen dass einige User PHP-Scripts hochladen können. Wenn PHP generell über sudo einige Programme ausführen darf ist das doch schon ein Sicherheitsrisiko.
Dennoch kann man mit einem C-Programm wesentlich besser kontrollieren, was ausgeführt wird. Wenn man PHP/Apache pauschal das recht gibt ein Programm zu nutzen, können auch andere Parameter als die Gewünschten übergeben werden.
hemiolos schrieb:
Du wirst trotzdem folgendes machen wollen:
wer sagt das bitte, was mein oder dein script erledigen muss?? das kann kapiteln schreiben! festplatte mounten und remote klonen ... oder was du haben willst. das neustarten war nur ein beispiel - wenn auch ein schlechtes :)
PHP ruft ein C-Programm auf => C-Programm läuft als root (über SUID) und tut z.B. "festplatte mounten".
Den Rest wirst du hoffentlich in PHP schreiben. Das C-Programm wäre dann genau so gebaut dass es "nur festplatte mounten" kann und sonst nichts. Dazu braucht PHP kein Programm als root starten können (sudo ist also unnötig). SUID reicht dazu dann völlig aus (damit das C-Programm und all seine Child-Prozesse als root läuft).
Das soll heißen: nur der Teil für den root benötigt wird wird im C-Programm erledigt, der Rest in PHP.
-
ich würde folgendes machen: EIne Datenbank, in der ich folgendes Hinterlege:
Validierungsstring(PK) | Konsolenbefehl | erlaubteSchalter
für den zugriff über PHP.
Die Syncronisierst du manuell mit einer tabelle in einer anderen datenbank. es darf keine PHP verbindung zu der anderen Datenbank geben, auch der zugriff soll extra passwortgeschützt sein.
dann schreibst du ein C-Programm, das Zugriff auf beide datenbanken hat und dem du dann die parameter übergibst:
cprogramm /v #validierungsstring /k "#fertig zusammengebautes_kommando_mit/Schaltern"
damit überprüfst du erlaubte schalter, ob der validierungsstring stimmt und ob beide datenbanken noch identisch sind. bei unterschieden zurück mit fehlermeldung ohne ausgeführt. und übers C-Programm würde ich alle root-geschichten steuern, die ich über die datenbank zugelassen habe. dann kannst du über den PHP-code deine befehle zusammenbauen, hast aber vorher festgelegt, welchje Befehle nciht erlaubt sind...
und dicht dürfstest du es bekommen, wenn du eine tabelle forbiddenCommands machst, wo er auf den string prüft, was veroten ist... passwd würd ich nicht zulassen über PHP... fdisk wär auch ne geschichte, die ich nciht über den webserver machen würde... umount auf die Systempartition würdich auch nciht zulassen... da kann man dann das reinschreiben, was man auf gar keinen fall ausgeführt haben will, selbst wenn der befehl in der datenbank vorhanden ist (falls manipuliert...)
denke ich ist sicherer, als alles dem PHP code zu überlassen... ist vielleicht etwas aufwändiger... -
eine schöne panne ist mir passiert ;)
ich habe einen komplett falschen titel gehabt! heute habe ich aus dem grund karpfen darum gebeten, da eine änderung anzubringen, was er auch prompt erledigt hat. danke karpfen! und ich hoffe, jetzt wird etwas verständlicher, was ich da eigentlich will und mache.
aus dem grund lese ich jetzt nochmals alles durch und versuche das ganze bisherige zusammen zu fassen.
es handelt sich - zu eurer allen beruhigung - nicht darum, dass apache und oder php als root ausgeführt wird. bloß nicht! es handelt sich nur darum, dass man apache und php es beibringen kann, ein (sys)prog. mit root rechten zu starten. dabei rennt apache und php in alter manier.
dass das natürlich besondere aufmerksamkeit in punkto sicherheit bedarf, steht außer frage. aber wir können hier nicht alle themen auf einmal berühren und gleich alle ungereimtheiten auch ausräumen :o)
hackyourlife schrieb:
wenn man kunden hat, hat man keine user die php-freaks sind. ich habe mit allen meinen kunden einen arbeits- und einen security-vertrag. damit ist die sache geregelt ;)
... Er ist warscheinlich davon ausgegangen dass einige User PHP-Scripts hochladen können.
Wenn PHP generell über sudo einige Programme ausführen darf ist das doch schon ein Sicherheitsrisiko.
schon, ja. aber der größte risiko ist noch immer das stromkabel. wenn wir ganz ganz sicher sein wollen, dann möchten wir bitte die strippe aus der steckdose reißen.
... Du wirst trotzdem folgendes machen wollen:
ok. und wo werden dann die parameter, die c bekommt dann nach bomben gefiltert?
PHP ruft ein C-Programm auf ...
Das soll heißen: nur der Teil für den root benötigt wird wird im C-Programm erledigt, der Rest in PHP.
das könne wir jetzt ein für alle mal ausklammern: bei mir rennt auch weder apache noch php als root. nur das, was muss und das ist wahrscheinlich ein c-prog.
Beitrag zuletzt geändert: 30.12.2011 3:22:01 von hemiolos -
hemiolos schrieb:
Dass PHP/Apache nicht als root laufen ist schon klar.
es handelt sich - zu eurer allen beruhigung - nicht darum, dass apache und oder php als root ausgeführt wird. bloß nicht! es handelt sich nur darum, dass man apache und php es beibringen kann, ein (sys)prog. mit root rechten zu starten. dabei rennt apache und php in alter manier.
dass das natürlich besondere aufmerksamkeit in punkto sicherheit bedarf, steht außer frage. aber wir können hier nicht alle themen auf einmal berühren und gleich alle ungereimtheiten auch ausräumen :o)
Das soll heißen: nur der Teil für den root benötigt wird wird im C-Programm erledigt, der Rest in PHP.
das könne wir jetzt ein für alle mal ausklammern: bei mir rennt auch weder apache noch php als root. nur das, was muss und das ist wahrscheinlich ein c-prog.
Nur hat man mit dem erlauben von sudo und ein paar Programmen die man dann als root ausführen kann die möglichkeit "Bomben" als Parameter an diese Programme zu übergeben (um mit einem Programm dass man für einen Zweck einsetzen möchte und deswegen als sudo erlaubt ist gleich noch ganz was anderes, unbeabsichtigtes, machen).
Das C-Programm tut nur ganz genau das, was vorgesehen ist, also z.B.
. Da muss das C-Programm schon einen Fehler haben dass man noch was Anderes damit machen kann.system("umount /mnt");
Wenn hingegen
erlaubt ist kann jeder irgendwelche Parameter an das Programm übergeben und z.B. folgendes (vom Admin nicht geplantes) ausführen:sudo umount
.umount /
-
hemiolos schrieb:
thomasba schrieb:
und kannst du bitte hier allen leuten auch gleich, wie genau erklären, woran das liegen mag? nebenbei - ist php nicht in c programmiert?
Dennoch kann man mit einem C-Programm wesentlich besser kontrollieren, was ausgeführt wird.
Siehe unten ^^
Mit was PHP Programmiert ist, ist hier irrelevant.
Wenn man PHP/Apache pauschal das recht gibt ein Programm zu nutzen, können auch andere Parameter als die Gewünschten übergeben werden.
dann ist nur der php-programmierer der dumme. bei sauberer programmierung kannst da nichts antun!
Bei einem System, auf das mehrere User ihre PHP-Scripte laden, könnte das durchaus unerwünschte Nebeneffekte haben.
kann man userbereich von adminbereich sauber trennen? ich glaube schon ;)
Das ist auf ein System bezogen, auf das mehrere User PHP-Code hochladen können, (Wie z.B. bei Lima-City)
Zumal einige "Programmierer" nicht wissen was sie tun
Hier mal ein kleines Angriff Szenario:
Voraussetzungen:
•
kann als root ausgeführt werdenmount
• An
können beliebige Parameter übergeben werden.mount
• Es können Netzwerk-Dateisysteme gemounted werden.
Vorbereitungen:
• NFS-Server aufsetzen.
• Einen NFS-Share aufsetzen, der einen
-Befehl enthält, welcher das Ausführen andere Befehle als root ermöglicht.mount
Nun da alle Vorbereitungen getroffen sind, kann man sich ein PHP-Script schreiben, das den NFS-Share nach /bin mounted.
Nachdem das erfolgreich war, kann man sein selber geschriebenes "mount"-Programm als root ausführen.mount <server>:/nfs /bin
Wie kann man das verhindern?
Kontrollieren, was gemountet wird, bzw. was für Parameter an ein Programm übergeben wird.
z.B: in dem man klare Fälle definiert, z.B. mit Hilfe eines Switch-Statements in C.
-
OK! das alte jahr ist vorbei, mein urlaub+grippe ist vorbei und hier ist alles wie eingeschlafenes fußwasser!
alles in ehren: C und PHP-sicherheit, aber das war bisher nichts als theorie!
hier das praktische:
index.phps
globals.phps
CRemoteAccessLog.phps
CSsh.phps
html.phps
das programm ist in einem beliebigen ordner auf meinem dev-server (hinter external-firewall/router/switch/SWfirewall), das einer meinen dedizierten server (oft sagt man ganz falsch rootserver) befragt (nach access_log oder was man will). und genau da ist man - als begnadeter C programmierer oder PHP-sicherheitsapostel - gerne eingeladen, das szenario zu korrumpieren! das ganze sollte natürlich VON AUSSEN (mit erfolg) durchgfeführt werden, sonst gilt nix!
die beweisführung sollte aber für alle (auch für meine wenigkeit) nachvollziebar sein!
wenn jemand zu der funktionsweise des progs hilfe von mir braucht, ist eigentlich schon ... ja schade :o(
gut hack!
Beitrag zuletzt geändert: 16.1.2012 19:02:16 von hemiolos -
hemiolos schrieb:
[...]das ganze sollte natürlich VON AUSSEN (mit erfolg) durchgfeführt werden, sonst gilt nix!
die beweisführung sollte aber für alle (auch für meine wenigkeit) nachvollziebar sein!
wenn jemand zu der funktionsweise des progs hilfe von mir braucht, ist eigentlich schon ... ja schade :o(
gut hack!
Glaubst du ernsthaft mit deiner herablassenden Haltung motivierst du jmd dazu dir zu helfen?
Entweder fragt man nett und bittet um etwas, oder du läufst Gefahr an den Falschen zu geraten, der dein Geschreibsel zwar als Motivation sieht, aber als Motivation deine Kiste zu zerpflücken.
Von dem was ich verstanden habe, kann ich dir sagen, dass du um die vorgeschlagenen Konzepte nicht drum herum kommst.
Du musst den Bereich PHP von dem Bereich trennen der mit root Rechten läuft.
D.h. du benötigst eine Schnittstelle, die wohl definiert ist.
Am besten gefällt mir dabei die Idee von sebulon. Inbesondere weil die MySQL Datenbank auf einem anderen Server ausgelagert werden kann. Durch die Rechteverwaltung verweigert man nun das Löschen von Datensätzen. Wenn der Angreifer auf dem Server mit den Scripten root Rechte erhält, kann man in der MySQL Tabelle sehr schön sehen, wie er es geschafft hat. Und der Angreifer hat keine Chance diese Daten zu löschen, ohne den MySQL Server ebenfalls zu übernehmen. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage