Acceso a la línea de comandos desde el navegador usando shell.php
On enero 5, 2022 by adminA veces se quiere acceder al shell desde el navegador. Se puede lograr usando PHP si la configuración de seguridad lo permite. He implementado esta funcionalidad en shell.php (disponible en Github). En la captura de pantalla de arriba se ve cómo funciona el acceso al shell desde un navegador. El script permite subir, descargar, ver editar y eliminar un archivo, comprimir y descomprimir un directorio y recorrer los directorios del servidor usando el ratón, pero también se pueden escribir comandos personalizados usando el teclado.
Advertencia de seguridad y descargo de responsabilidad
Por favor, ejecute este script sólo en máquinas de su propiedad (o durante un pentest autorizado). Asegúrese también de que la máquina tiene un firewall adecuado (el puerto 80 no debe ser accesible desde Internet). No lo utilice con fines maliciosos. Lea más sobre el abuso de los scripts de shell aquí.
Problemas conocidos
Si el script no funciona puede ser porque la función «passthru» de PHP en la que se basa está deshabilitada. Para listar las funciones PHP deshabilitadas ejecute el siguiente código PHP:
var_dump(ini_get('safe_mode'));var_dump(explode(',',ini_get('disable_functions')));var_dump(explode(',',ini_get('suhosin.executor.func.blacklist')));
En un Ubuntu 14.04 out-of-the-box que dará como resultado:
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( =>)
Comandos de ejecución del shell de PHP
Si el script no se ejecuta usando passthru()
, intentará algunos otros comandos. Los siguientes comandos son similares:
-
exec()
Devuelve la última línea de salida de comandos -
passthru()
Pasa la salida de comandos directamente al navegador -
system()
Pasa la salida de comandos directamente al navegador y devuelve la última línea -
shell_exec()
Devuelve la salida de comandos -
popen()
Abre una tubería de lectura o escritura al proceso de un comando -
proc_open()
Similar a popen() pero con mayor grado de control -
pcntl_exec()
Ejecuta un programa
Aguanta tu servidor con open_basedir
Si el script anterior te parece aterrador, entonces es posible que desee evitar que se ejecute en su servidor. Puedes hacerlo habilitando el modo seguro (obsoleto), usando la variable «disable_functions» php.ini y/o la lista negra de ejecución de funciones de Suhosin.
He encontrado un post muy bien escrito sobre cómo asegurar tu instalación de PHP, ¡consúltalo! Además de limitar las funciones ejecutables también recomiendan la variable de configuración «open_basedir» php.ini. Limita los archivos a los que puede acceder PHP al árbol de directorios especificado. Creo que es una herramienta poderosa.
También podría ser una buena idea asegurar su directorio «/tmp» con las banderas «nodev», «nosuid» y «noexec» como se describe aquí.
¿No encuentra Suhosin?
Tenga en cuenta que el paquete «php5-suhosin» (una extensión de seguridad de PHP) ya no está instalado ni disponible en los sistemas basados en Debian. Algunas de las mejoras de seguridad han sido incorporadas en las últimas versiones de PHP (5.4 y 5.5). Si quieres instalar Suhosin (desde Github) en Ubuntu 14.04 (PHP 5.5.9) puedes seguir este tutorial.
Puedes leer más sobre la controversia en torno a la eliminación de Suhosin en LWN.net.
Separación de privilegios
Si hay varios usuarios en el sistema la «separación de privilegios» es un MUST. Esto significa ejecutar el código PHP en el contexto del usuario (por ejemplo, como usuario «maurits») y no como usuario «www-data». He encontrado un gran artículo que explica cómo se puede lograr esto. La solución más fácil es ejecutar:
sudo apt-get install libapache2-mpm-itk
Y luego añadir la directiva «AssignUserID» a cada configuración de «VirtualHost». Tenga en cuenta que esta puede no ser la solución más segura, pero funciona bien y es fácil de instalar.
Conclusión
Siempre debe actualizar y parchear PHP a la última versión para evitar la explotación de agujeros de seguridad conocidos. Herramientas como «disable_functions», «open_basedir», Suhosin y filesystem flags reducen la superficie de ataque y previenen la explotación de agujeros de seguridad desconocidos. Puedes utilizarlas para crear una estrategia de seguridad por capas. Tampoco olvides la separación de privilegios.
Deja una respuesta