safe_mode de PHP es una función obsoleta que estaba destinada a resolver el problema de seguridad del servidor compartido en el nivel de PHP. Esto nunca fue una buena idea y, por lo tanto, la función quedó obsoleta y se eliminó a partir de PHP 5.4 (su objetivo es ejecutar PHP 5.3.10, que es antiguo). Esta respuesta demostrará por qué safe_mode no fue una gran idea para comenzar y contendrá dos partes: omitir el modo seguro de PHP y elevar los privilegios. Sin más preámbulos, pongámonos a trabajar.
Bypassing safe_mode
Al abordar el problema de safe_mode, lo primero que se debe tener en cuenta es que no hay una solución canónica, y realmente depende de la configuración de destino (y un poco de suerte). A continuación se presenta una descripción general de las técnicas que podrían funcionar.
-
pcntl_exec - Si tiene un poco de suerte, la extensión PCNTL es habilitado. Si lo es, puede usarlo para obtener ejecución de código, ya que no está afectado por la directiva safe_mode. Para verificar si está habilitado, puede ejecutar el siguiente comando:
echo function_exists('pcntl_exec');
.
- El truco LD_PRELOAD: un hecho poco conocido es que mientras safe_mode restringe las variables de entorno accesibles, para que esta configuración sea efectiva, la directiva
safe_mode_allowed_env_vars
debe establecerse (puede verificar su valor ejecutando var_dump(ini_get('safe_mode_allowed_env_vars'));
si hay una cadena vacía le devolvemos su suerte: esto significa que las restricciones de safe_mode en el entorno están efectivamente deshabilitadas y el truco LD_Preload se puede usar como se describe here para obtener la ejecución del código sin pasar por safe_mode.
- Otra opción para omitir safe_mode es cargar un shell que use tecnología del lado del servidor que esté disponible en el destino y que no sea PHP. El candidato más común es Perl, que ya mencionaste no está disponible. También puede verificar si Python o Ruby están disponibles. Si ninguno de los dos está disponible, es hora de sacar su shell SSI y compruebe si funcionará .
- Por último, pero no menos importante: explote una vulnerabilidad que permita la ejecución de código fuera del intérprete de PHP. Hay muchas de estas vulnerabilidades que se publicaron últimamente, y como su objetivo es ejecutar una versión anterior, es muy probable que pueda encontrar una vulnerabilidad como CVE-2016-9137 que puede explotar para obtener la ejecución de código.
Elevación de privilegios
Si tiene un poco de suerte, la falta de privilegios de escritura es el efecto de la directiva safe_mode y, por lo tanto, como se ha anulado, ahora tiene permiso de escritura. Pero si no tiene esa suerte, deberá aumentar los privilegios en el nivel del sistema operativo. Hay un par de maneras de realizar esta escalada:
- El método de la vieja escuela: encuentre un SUID que queda en el sistema y aprovéchelo para obtener privilegios de root (que le permitirán, entre otras cosas, tener un permiso de escritura en cualquier lugar que desee). Se puede encontrar un buen artículo de demostración de este esfuerzo here .
- Use una vulnerabilidad del kernel: de la captura de pantalla en su pregunta, parece que su objetivo usa una versión bastante antigua, lo que significa que podría ser vulnerable a una vulnerabilidad pública del kernel como DirtyCOW o algún otro exploit
.
Enhorabuena si has seguido hasta aquí, y todo salió bien hasta este punto: ahora has comprometido completamente tu objetivo y tienes un shell de nivel raíz, es hora de una revisión. Además, con todo su nuevo conocimiento adquirido, debe recordar que con gran poder conlleva una gran responsabilidad.