Accesso alla riga di comando dal tuo browser usando shell.php
Il Gennaio 5, 2022 da adminA volte vuoi l’accesso alla shell dal browser. Si può ottenere usando PHP se le impostazioni di sicurezza lo permettono. Ho implementato questa funzionalità in shell.php (disponibile su Github). Nello screenshot qui sopra vedete come funziona l’accesso alla shell da un browser. Lo script ti permette di caricare, scaricare, visualizzare, modificare e rimuovere un file, zippare e decomprimere una directory e attraversare le directory sul server usando il mouse, ma puoi anche digitare comandi personalizzati usando la tastiera.
Avviso di sicurezza e disclaimer
Si prega di eseguire questo script solo su macchine di tua proprietà (o durante un pentest autorizzato). Assicuratevi anche che la macchina sia adeguatamente firewalled (la porta 80 non dovrebbe essere raggiungibile da Internet). Non usatelo per scopi malevoli! Leggi di più sull’abuso degli script di shell qui.
Problemi noti
Se lo script non funziona potrebbe essere perché la funzione PHP “passthru” su cui si basa è disabilitata. Per elencare le funzioni PHP disabilitate esegui il seguente codice PHP:
var_dump(ini_get('safe_mode'));var_dump(explode(',',ini_get('disable_functions')));var_dump(explode(',',ini_get('suhosin.executor.func.blacklist')));
Su una Ubuntu 14.04 out-of-the-box che darà come 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( =>)
Comandi di esecuzione della shell PHP
Se lo script non funziona usando passthru()
, proverà alcuni altri comandi. I seguenti comandi sono simili:
-
exec()
Restituisce l’ultima riga dei comandi in uscita -
passthru()
Passa i comandi in uscita direttamente al browser -
system()
Passa i comandi in uscita direttamente al browser e restituisce l’ultima riga -
shell_exec()
Restituisce i comandi in uscita -
popen()
Apre pipe di lettura o scrittura al processo di un comando -
proc_open()
Simile a popen() ma con un maggior grado di controllo -
pcntl_exec()
Esegue un programma
Indurisce il tuo server con open_basedir
Se lo script sopra ti sembra spaventoso, allora potreste voler evitare che venga eseguito sul vostro server. Puoi farlo abilitando il safe mode (deprecato), usando la variabile php.ini “disable_functions” e/o la blacklist di esecuzione delle funzioni di Suhosin.
Ho trovato un post ben scritto su come rendere sicura la tua installazione PHP, guardalo! Oltre a limitare le funzioni eseguibili, raccomandano anche la variabile di configurazione php.ini “open_basedir”. Essa limita i file a cui PHP può accedere all’albero di directory specificato. Credo che questo sia uno strumento potente.
Inoltre potrebbe essere una buona idea proteggere la tua directory “/tmp” con i flag “nodev”, “nosuid” e “noexec” come descritto qui.
Non riesci a trovare Suhosin?
Nota che il pacchetto “php5-suhosin” (un’estensione di sicurezza di PHP) non è più installato né disponibile sui sistemi basati su Debian. Alcuni dei miglioramenti alla sicurezza sono stati incorporati nelle ultime versioni di PHP (5.4 e 5.5). Se vuoi installare Suhosin (da Github) su Ubuntu 14.04 (PHP 5.5.9) puoi seguire questo tutorial.
Puoi leggere di più sulla controversia sulla rimozione di Suhosin su LWN.net.
Se ci sono più utenti sul sistema la “separazione dei privilegi” è un MUST. Questo significa eseguire il codice PHP nel contesto utente (ad esempio come utente “maurits”) e non come utente “www-data”. Ho trovato un ottimo articolo che spiega come questo può essere ottenuto. La soluzione più semplice è eseguire:
sudo apt-get install libapache2-mpm-itk
E poi aggiungere la direttiva “AssignUserID” ad ogni configurazione “VirtualHost”. Si noti che questa potrebbe non essere la soluzione più sicura, ma funziona bene ed è facile da installare.
Conclusione
Si dovrebbe sempre aggiornare e patchare PHP all’ultima versione per prevenire lo sfruttamento di falle di sicurezza note. Strumenti come “disable_functions”, “open_basedir”, Suhosin e i flag del filesystem riducono la superficie di attacco e prevengono lo sfruttamento di falle di sicurezza sconosciute. Potete usarli per creare una strategia di sicurezza a più livelli. Inoltre non dimenticare la separazione dei privilegi.
Lascia un commento