kostenloser Webspace werbefrei: lima-city


prozesse/programme mit root rechten von php starten

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    hemiolos

    Kostenloser Webspace von hemiolos

    hemiolos hat kostenlosen Webspace.

    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:
    # 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
    wie man es sieht, apache rennt bei mir (fedora 16) als apache:apache und hat dabei so gut wie keine rechte.

    was hat apache für ein passwort?:
    $ 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
    no!?. apache hat das passwort '', also leer! oder von mir aus kein!

    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
    Defaults    requiretty
    das sollte jetzt mal schnell auskommentiert werden (wofür man das prog. visudo verwendet!)
    #Defaults    requiretty

    2.
    im 'main part' von 'sudoers' steht dann irgendwo
    root	 ALL=(ALL) 	ALL
    nach diesem eintrag fügen wir dann das ein (auch mit visudo!):
    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:
    <?php
    echo `echo -e '' | sudo -S -u root shutdown -r now 2>&1`;
    und deine box startet auch schon brav neu. fürs herunterfahren nimmst natürlich 'shutdown -h now'.

    ABER!
    das DING steckt in dem teil:
    apache ALL=(ALL)  NOPASSWD: ALL
    mit dem kannst genau dosieren, was apache alles kann und darf! und das entsteht - wie gesagt - genau da.

    also her mit den fundierten beiträgen!

    Beitrag zuletzt geändert: 30.12.2011 2:10:43 von hemiolos
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. thomasba

    Co-Admin Kostenloser Webspace von thomasba

    thomasba hat kostenlosen Webspace.

    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
  4. Autor dieses Themas

    hemiolos

    Kostenloser Webspace von hemiolos

    hemiolos hat kostenlosen Webspace.

    thomasba schrieb:
    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.
    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?
    noch einmal, mit nur einer zeile in httpd.conf
    apache ALL=(ALL)  NOPASSWD: ALL
    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.
    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
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    hemiolos 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?
    Es muss ja nur genau den Teil erledigen für den root benötigt wird! Also z.B. den PC herunterfahren oder so was.
  6. Autor dieses Themas

    hemiolos

    Kostenloser Webspace von hemiolos

    hemiolos hat kostenlosen Webspace.

    hackyourlife schrieb:
    hemiolos 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?
    Es muss ja nur genau den Teil erledigen für den root benötigt wird! Also z.B. den PC herunterfahren oder so was.
    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 :)
  7. thomasba

    Co-Admin Kostenloser Webspace von thomasba

    thomasba hat kostenlosen Webspace.

    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
  8. Autor dieses Themas

    hemiolos

    Kostenloser Webspace von hemiolos

    hemiolos hat kostenlosen Webspace.

    thomasba schrieb:
    Dennoch kann man mit einem C-Programm wesentlich besser kontrollieren, was ausgeführt wird.
    und kannst du bitte hier allen leuten auch gleich, wie genau erklären, woran das liegen mag? nebenbei - ist php nicht in c programmiert?
    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…
    → 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.
    du wiederholst dich, also siehe oben.
  9. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    thomasba schrieb:
    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.
    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.

    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 :)
    Du wirst trotzdem folgendes machen wollen:
    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.
  10. 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...
  11. Autor dieses Themas

    hemiolos

    Kostenloser Webspace von hemiolos

    hemiolos hat kostenlosen Webspace.

    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:
    ... Er ist warscheinlich davon ausgegangen dass einige User PHP-Scripts hochladen können.
    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 ;)

    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:
    PHP ruft ein C-Programm auf ...
    ok. und wo werden dann die parameter, die c bekommt dann nach bomben gefiltert?

    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
  12. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    hemiolos schrieb:
    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.
    Dass PHP/Apache nicht als root laufen ist schon klar.
    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.
    system("umount /mnt");
    . Da muss das C-Programm schon einen Fehler haben dass man noch was Anderes damit machen kann.
    Wenn hingegen
    sudo umount
    erlaubt ist kann jeder irgendwelche Parameter an das Programm übergeben und z.B. folgendes (vom Admin nicht geplantes) ausführen:
    umount /
    .
  13. thomasba

    Co-Admin Kostenloser Webspace von thomasba

    thomasba hat kostenlosen Webspace.

    hemiolos schrieb:
    thomasba schrieb:
    Dennoch kann man mit einem C-Programm wesentlich besser kontrollieren, was ausgeführt wird.
    und kannst du bitte hier allen leuten auch gleich, wie genau erklären, woran das liegen mag? nebenbei - ist php nicht in c programmiert?

    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:
    mount
    kann als root ausgeführt werden
    • An
    mount
    können beliebige Parameter übergeben werden.
    • Es können Netzwerk-Dateisysteme gemounted werden.

    Vorbereitungen:
    • NFS-Server aufsetzen.
    • Einen NFS-Share aufsetzen, der einen
    mount
    -Befehl enthält, welcher das Ausführen andere Befehle als root ermöglicht.

    Nun da alle Vorbereitungen getroffen sind, kann man sich ein PHP-Script schreiben, das den NFS-Share nach /bin mounted.
    mount <server>:/nfs /bin
    Nachdem das erfolgreich war, kann man sein selber geschriebenes "mount"-Programm als root ausführen.


    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.
  14. Autor dieses Themas

    hemiolos

    Kostenloser Webspace von hemiolos

    hemiolos hat kostenlosen Webspace.

    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
  15. 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.
  16. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!