Command line access from your browser using shell.php
On januari 5, 2022 by adminSoms wil je shell toegang vanuit de browser. Dit kan worden bereikt met PHP als de beveiligingsinstellingen het toestaan. Ik heb deze functionaliteit geïmplementeerd in shell.php (beschikbaar op Github). In de bovenstaande screenshot zie je hoe shell toegang vanuit een browser werkt. Met het script kunt u een bestand uploaden, downloaden, bekijken, bewerken en verwijderen, een directory zippen en unzippen en de directories op de server doorzoeken met de muis, maar u kunt ook aangepaste commando’s typen met het toetsenbord.
Veiligheidswaarschuwing en disclaimer
Laat dit script alleen draaien op machines waarvan u de eigenaar bent (of tijdens een geautoriseerde pentest). Zorg er ook voor dat de machine goed is gefirewalled (poort 80 mag niet bereikbaar zijn vanaf het Internet). Gebruik het niet voor kwaadwillige doeleinden! Lees hier meer over misbruik van shell scripts.
Bekende problemen
Als het script niet werkt, kan dat komen doordat de PHP “passthru” functie waar het op vertrouwt is uitgeschakeld. Om een lijst van uitgeschakelde PHP functies uit te voeren, voert u de volgende PHP code uit:
var_dump(ini_get('safe_mode'));var_dump(explode(',',ini_get('disable_functions')));var_dump(explode(',',ini_get('suhosin.executor.func.blacklist')));
Op een out-of-the-box Ubuntu 14.04 zal dat het volgende opleveren:
bool(false)Array( => pcntl_alarm => pcntl_fork => pcntl_waitpid => pcntl_wait => pcntl_wifexited => pcntl_wifstopped => pcntl_wifsignaled => pcntl_wexitstatus => pcntl_wtermsig => pcntl_wstopsig => pcntl_signal => pcntl_signal_dispatch => pcntl_get_last_error => pcntl_strerror => pcntl_sigprocmask => pcntl_sigwaitinfo => pcntl_sigtimedwait => pcntl_exec => pcntl_getpriority => pcntl_setpriority =>)Array( =>)
PHP shell executie commando’s
Als het script niet draait met passthru()
, zal het een paar andere commando’s proberen. De volgende commando’s zijn vergelijkbaar:
-
exec()
Geeft laatste regel van opdrachtuitvoer -
passthru()
Geeft opdrachtuitvoer direct door aan de browser -
system()
Geeft opdrachtuitvoer direct door aan de browser en geeft laatste regel terug -
shell_exec()
Geeft opdrachtuitvoer terug -
popen()
Opent lees of schrijf pijp naar proces van een commando -
proc_open()
Lijkt op popen() maar grotere mate van controle -
pcntl_exec()
Voert een programma uit
Hardt uw server met open_basedir
Als het bovenstaande script u eng lijkt, dan wilt u misschien voorkomen dat het op uw server wordt uitgevoerd. U kunt dit doen door de veilige modus in te schakelen (deprecated), gebruik te maken van de “disable_functions” php.ini variabele en/of de Suhosin functie executie blacklist.
Ik heb een goed geschreven post gevonden over het beveiligen van uw PHP installatie, check it out! Naast het beperken van de uitvoerbare functies raden ze ook de “open_basedir” php.ini config variabele aan. Deze beperkt de bestanden die kunnen worden benaderd door PHP tot de opgegeven directory-boom. Ik denk dat dit een krachtig hulpmiddel is.
Ook kan het een goed idee zijn om uw “/tmp” directory te beveiligen met “nodev”, “nosuid” en “noexec” vlaggen zoals hier beschreven.
Kan Suhosin niet vinden?
Merk op dat het “php5-suhosin” pakket (een PHP beveiliging uitbreiding) niet langer is geinstalleerd, noch beschikbaar is op Debian gebaseerde systemen. Sommige van de beveiligingsverbeteringen zijn verwerkt in de laatste PHP versies (5.4 en 5.5). Als u Suhosin (van Github) op Ubuntu 14.04 (PHP 5.5.9) wilt installeren, kunt u deze tutorial volgen.
U kunt meer lezen over de controverse rond het verwijderen van Suhosin op LWN.net.
Privilege scheiding
Als er meerdere gebruikers op het systeem zijn, is “privilege scheiding” een MUST. Dit betekent dat de PHP-code in de gebruikerscontext moet worden uitgevoerd (bijv. als gebruiker “maurits”) en niet als gebruiker “www-data”. Ik heb een geweldig artikel gevonden dat uitlegt hoe dit bereikt kan worden. De eenvoudigste oplossing is om:
sudo apt-get install libapache2-mpm-itk
En dan de “AssignUserID” directive toe te voegen aan elke “VirtualHost” configuratie. Merk op dat dit misschien niet de veiligste oplossing is, maar het presteert goed en is eenvoudig te installeren.
Conclusie
U moet PHP altijd updaten en patchen naar de laatste versie om uitbuiting van bekende beveiligingslekken te voorkomen. Tools als “disable_functions”, “open_basedir”, Suhosin en filesystem flags verkleinen het aanvalsoppervlak en voorkomen uitbuiting van onbekende veiligheidslekken. Je kunt ze gebruiken om een gelaagde beveiligingsstrategie te implementeren. Vergeet ook de scheiding van privileges niet.
Geef een antwoord