Přístup k příkazovému řádku z prohlížeče pomocí shell.php
On 5 ledna, 2022 by adminNěkdy chcete mít přístup k shellu z prohlížeče. Toho lze dosáhnout pomocí jazyka PHP, pokud to nastavení zabezpečení umožňuje. Tuto funkci jsem implementoval do souboru shell.php (je k dispozici na Githubu). Na výše uvedeném snímku obrazovky vidíte, jak funguje přístup do shellu z prohlížeče. Skript umožňuje nahrávat, stahovat, zobrazovat upravovat a odstraňovat soubor, rozbalovat a zazipovat adresář a procházet adresáře na serveru pomocí myši, ale můžete také zadávat vlastní příkazy pomocí klávesnice.
Upozornění k zabezpečení a zřeknutí se odpovědnosti
Skript spouštějte pouze na počítačích, které vlastníte (nebo během autorizovaného pentestu). Ujistěte se také, že je stroj řádně zabezpečen firewallem (port 80 by neměl být dosažitelný z internetu). Nepoužívejte jej ke škodlivým účelům! Více informací o zneužití shellových skriptů najdete zde.
Známé problémy
Pokud skript nefunguje, může to být proto, že funkce PHP „passthru“, na kterou se spoléhá, je vypnutá. Chcete-li vypsat zakázané funkce PHP, spusťte následující kód PHP:
var_dump(ini_get('safe_mode'));var_dump(explode(',',ini_get('disable_functions')));var_dump(explode(',',ini_get('suhosin.executor.func.blacklist')));
Na out-of-the-box Ubuntu 14.04, který vypíše:
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( =>)
Příkazy pro spuštění shellu PHP
Pokud se skript nespustí pomocí passthru()
, vyzkouší několik dalších příkazů. Následující příkazy jsou podobné:
-
exec()
Vrátí poslední řádek výstupu příkazů -
passthru()
Předá výstup příkazů přímo prohlížeči -
system()
Předá výstup příkazů přímo prohlížeči a vrátí poslední řádek -
shell_exec()
Vrátí výstup příkazů -
popen()
Otevře rouru pro čtení nebo zápis do procesu příkazu -
proc_open()
Podobně jako popen(), ale s větším stupněm kontroly -
pcntl_exec()
Spustí program
Zpevnění serveru pomocí open_basedir
Pokud se vám výše uvedený skript zdá děsivý, pak možná budete chtít zabránit jeho spuštění na vašem serveru. Toho můžete dosáhnout zapnutím nouzového režimu (deprecated), použitím proměnné „disable_functions“ v php.ini a/nebo blacklistu pro spouštění funkcí Suhosin.
Našel jsem dobře napsaný příspěvek o zabezpečení instalace PHP, podívejte se na něj! Kromě omezení spouštěných funkcí doporučují také konfigurační proměnnou „open_basedir“ php.ini. Ta omezuje soubory, ke kterým může PHP přistupovat, na zadaný adresářový strom. Věřím, že je to mocný nástroj.
Také by mohlo být dobré zabezpečit adresář „/tmp“ pomocí příznaků „nodev“, „nosuid“ a „noexec“, jak je popsáno zde.
Nemůžete najít Suhosin?
Všimněte si, že balíček „php5-suhosin“ (bezpečnostní rozšíření PHP) již není nainstalován ani dostupný v systémech založených na Debianu. Některá bezpečnostní vylepšení byla začleněna do nejnovějších verzí PHP (5.4 a 5.5). Pokud chcete nainstalovat Suhosin (z Githubu) na Ubuntu 14.04 (PHP 5.5.9), můžete postupovat podle tohoto návodu.
Více o kontroverzích kolem odstranění Suhosinu si můžete přečíst na LWN.net.
Oddělení oprávnění
Pokud je v systému více uživatelů, „oddělení oprávnění“ je MUSÍ. To znamená spouštět kód PHP v kontextu uživatele (např. jako uživatel „maurits“) a ne jako uživatel „www-data“. Našel jsem skvělý článek, který vysvětluje, jak toho lze dosáhnout. Nejjednodušší řešení je spustit:
sudo apt-get install libapache2-mpm-itk
A pak do každé konfigurace „VirtualHost“ přidat direktivu „AssignUserID“. Všimněte si, že to nemusí být nejbezpečnější řešení, ale funguje dobře a snadno se instaluje.
Závěr
Vždy byste měli aktualizovat a opravovat PHP na nejnovější verzi, abyste zabránili zneužití známých bezpečnostních děr. Nástroje jako „disable_functions“, „open_basedir“, Suhosin a příznaky souborového systému snižují plochu útoku a zabraňují zneužití neznámých bezpečnostních děr. Můžete je použít k vytvoření implementace strategie vrstveného zabezpečení. Nezapomínejte také na oddělení oprávnění.
.
Napsat komentář