Kommandolinjeadgang fra din browser ved hjælp af shell.php
On januar 5, 2022 by adminI nogle tilfælde ønsker du shell-adgang fra din browser. Det kan opnås ved hjælp af PHP, hvis sikkerhedsindstillingerne tillader det. Jeg har implementeret denne funktionalitet i shell.php (tilgængelig på Github). I ovenstående skærmbillede kan du se, hvordan shell-adgang fra en browser fungerer. Scriptet giver dig mulighed for at uploade, downloade, få vist, redigere og fjerne en fil, zippe og udpakke en mappe og gennemse mapperne på serveren ved hjælp af musen, men du kan også indtaste brugerdefinerede kommandoer ved hjælp af tastaturet.
Sikkerhedsadvarsel og ansvarsfraskrivelse
Kør venligst kun dette script på maskiner, du ejer (eller under en autoriseret pentest). Sørg også for, at maskinen er korrekt firewalled (port 80 bør ikke kunne nås fra internettet). Brug det ikke til skadelige formål! Læs mere om misbrug af shell-scripts her.
Kendte problemer
Hvis scriptet ikke virker, kan det skyldes, at PHP-funktionen “passthru”, som det er afhængig af, er deaktiveret. For at få en liste over deaktiverede PHP-funktioner skal du udføre følgende PHP-kode:
var_dump(ini_get('safe_mode'));var_dump(explode(',',ini_get('disable_functions')));var_dump(explode(',',ini_get('suhosin.executor.func.blacklist')));
På en out-of-the-box Ubuntu 14.04, der vil output:
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-udførelseskommandoer
Hvis scriptet ikke kører med passthru()
, vil det prøve et par andre kommandoer. De følgende kommandoer ligner hinanden:
-
exec()
Returnerer sidste linje af kommandoer output -
passthru()
Overfører kommandoer output direkte til browseren -
system()
Overfører kommandoer output direkte til browseren og returnerer sidste linje -
shell_exec()
Returnerer kommandoer output -
popen()
Åbner læse- eller skrive pipe til proces af en kommando -
proc_open()
Svarer til popen(), men større grad af kontrol -
pcntl_exec()
Udfører et program
Hærder din server med open_basedir
Hvis ovenstående script virker skræmmende for dig, så vil du måske forhindre det i at blive udført på din server. Det kan du gøre ved at aktivere safe mode (deprecated), bruge variablen “disable_functions” i php.ini og/eller Suhosin-funktionens blacklist til udførelse af funktioner.
Jeg har fundet et velskrevet indlæg om sikring af din PHP-installation, tjek det ud! Udover at begrænse de eksekverbare funktioner anbefaler de også konfigurationsvariablen “open_basedir” php.ini. Den begrænser de filer, der kan tilgås af PHP, til det angivne mappetræ. Jeg mener, at dette er et effektivt værktøj.
Det kan også være en god idé at sikre din “/tmp”-mappe med “nodev”-, “nosuid”- og “noexec”-flag som beskrevet her.
Kan du ikke finde Suhosin?
Bemærk, at pakken “php5-suhosin” (en PHP-sikkerhedsudvidelse) ikke længere er installeret eller tilgængelig på Debian-baserede systemer. Nogle af sikkerhedsforbedringerne er blevet indarbejdet i de seneste PHP-versioner (5.4 og 5.5). Hvis du ønsker at installere Suhosin (fra Github) på Ubuntu 14.04 (PHP 5.5.9) kan du følge denne vejledning.
Du kan læse mere om kontroversen omkring fjernelse af Suhosin på LWN.net.
Privilege separation
Hvis der er flere brugere på systemet er “privilegieseparation” et MUST. Det betyder, at PHP-koden skal køres i brugerkonteksten (f.eks. som bruger “maurits”) og ikke som bruger “www-data”. Jeg har fundet en god artikel der forklarer hvordan dette kan opnås. Den nemmeste løsning er at køre:
sudo apt-get install libapache2-mpm-itk
Og derefter tilføje “AssignUserID”-direktivet til hver “VirtualHost”-konfiguration. Bemærk, at dette måske ikke er den sikreste løsning, men den fungerer godt og er nem at installere.
Konklusion
Du bør altid opdatere og patche PHP til den nyeste version for at forhindre udnyttelse af kendte sikkerhedshuller. Værktøjer som “disable_functions”, “open_basedir”, Suhosin og filsystemflag reducerer angrebsfladen og forhindrer udnyttelse af ukendte sikkerhedshuller. Du kan bruge dem til at skabe en lagdelt sikkerhedsstrategi. Glem heller ikke privilegieadskillelse.
Skriv et svar