Accès à la ligne de commande depuis votre navigateur en utilisant shell.php
On janvier 5, 2022 by adminParfois, vous voulez un accès au shell depuis le navigateur. Cela peut être réalisé en utilisant PHP si les paramètres de sécurité le permettent. J’ai implémenté cette fonctionnalité dans shell.php (disponible sur Github). Dans la capture d’écran ci-dessus, vous voyez comment fonctionne l’accès au shell depuis un navigateur. Le script vous permet de télécharger, d’afficher, de modifier et de supprimer un fichier, de compresser et de décompresser un répertoire et de parcourir les répertoires du serveur à l’aide de la souris, mais vous pouvez également taper des commandes personnalisées à l’aide du clavier.
Avertissement de sécurité et clause de non-responsabilité
Veuillez exécuter ce script uniquement sur des machines que vous possédez (ou pendant un pentest autorisé). Assurez-vous également que la machine est correctement pare-feu (le port 80 ne doit pas être joignable depuis Internet). Ne l’utilisez pas à des fins malveillantes ! Lisez plus sur l’abus des scripts shell ici.
Problèmes connus
Si le script ne fonctionne pas, c’est peut-être parce que la fonction PHP « passthru » sur laquelle il repose est désactivée. Pour lister les fonctions PHP désactivées, exécutez le code PHP suivant :
var_dump(ini_get('safe_mode'));var_dump(explode(',',ini_get('disable_functions')));var_dump(explode(',',ini_get('suhosin.executor.func.blacklist')));
Sur une Ubuntu 14.04 prête à l’emploi, cela donnera :
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( =>)
Commandes d’exécution du shell PHP
Si le script ne s’exécute pas en utilisant passthru()
, il essaiera quelques autres commandes. Les commandes suivantes sont similaires :
-
exec()
Renvoie la dernière ligne de sortie des commandes -
passthru()
Passe la sortie des commandes directement au navigateur -
system()
Passe la sortie des commandes directement au navigateur et renvoie la dernière ligne -
shell_exec()
Renvoie la sortie des commandes - .
popen()
Ouvre un tuyau de lecture ou d’écriture au processus d’une commande -
proc_open()
Similaire à popen() mais un plus grand degré de contrôle -
pcntl_exec()
Exécute un programme
Durcir votre serveur avec open_basedir
Si le script ci-dessus vous semble effrayant, alors vous pouvez vouloir l’empêcher de s’exécuter sur votre serveur. Vous pouvez le faire en activant le mode sans échec (déprécié), en utilisant la variable php.ini « disable_functions » et/ou la liste noire d’exécution des fonctions de Suhosin.
J’ai trouvé un post bien écrit sur la sécurisation de votre installation PHP, consultez-le ! En plus de limiter les fonctions exécutables, ils recommandent également la variable de configuration php.ini « open_basedir ». Elle limite les fichiers auxquels PHP peut accéder à l’arborescence de répertoires spécifiée. Je crois que c’est un outil puissant.
Ce pourrait être aussi une bonne idée de sécuriser votre répertoire « /tmp » avec les drapeaux « nodev », « nosuid » et « noexec » comme décrit ici.
Pas pu trouver Suhosin?
Notez que le paquet « php5-suhosin » (une extension de sécurité PHP) n’est plus installé ni disponible sur les systèmes basés sur Debian. Certaines des améliorations de sécurité ont été intégrées dans les dernières versions de PHP (5.4 et 5.5). Si vous souhaitez installer Suhosin (à partir de Github) sur Ubuntu 14.04 (PHP 5.5.9), vous pouvez suivre ce tutoriel.
Vous pouvez en savoir plus sur la controverse autour de la suppression de Suhosin sur LWN.net.
Séparation des privilèges
S’il y a plusieurs utilisateurs sur le système, la « séparation des privilèges » est un MUST. Cela signifie exécuter le code PHP dans le contexte de l’utilisateur (par exemple, en tant qu’utilisateur « maurits ») et non en tant qu’utilisateur « www-data ». J’ai trouvé un excellent article expliquant comment cela peut être réalisé. La solution la plus simple est d’exécuter:
sudo apt-get install libapache2-mpm-itk
Et ensuite d’ajouter la directive « AssignUserID » à chaque configuration « VirtualHost ». Notez que cette solution n’est peut-être pas la plus sûre, mais elle est performante et facile à installer.
Conclusion
Vous devriez toujours mettre à jour et patcher PHP à la dernière version pour empêcher l’exploitation des failles de sécurité connues. Des outils comme « disable_functions », « open_basedir », Suhosin et les drapeaux du système de fichiers réduisent la surface d’attaque et empêchent l’exploitation de failles de sécurité inconnues. Vous pouvez les utiliser pour mettre en œuvre une stratégie de sécurité en couches. N’oubliez pas non plus la séparation des privilèges.
Laisser un commentaire