Previse
Última actualización
¿Te fue útil?
Última actualización
¿Te fue útil?
Previse
es una máquina sencilla que muestra Ejecución después de redirección (EAR) que permite a los usuarios recuperar el contenido y realizar solicitudes a accounts.php
sin estar autenticado, lo que lleva a abusar de la función exec()
de PHP ya que las entradas del usuario no se desinfectan, lo que permite la ejecución remota de código contra el objetivo, después de obtener un privilegio de shell www-data, la escalada comienza con la recuperación y el descifrado de un hash MD5Crypt personalizado que consiste en una sal Unicode y una vez descifrado permite a los usuarios obtener acceso SSH al objetivo y luego abusar de un script ejecutable sudo que no incluye rutas absolutas de las funciones que utiliza, lo que permite a los usuarios realizar el secuestro de PATH en el objetivo para comprometer la máquina.
Realizaremos un reconocimiento con nmap
para ver los puertos que están expuestos en la máquina Previse
. Este resultado lo almacenaremos en un archivo llamado allPorts
.
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Apache
y el servicioSSH
.
Transformaremos el archivo generado targetedXML
para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
Realizaremos a través de la herramienta de whatweb
un reconocimiento inicial de las tecnologías que utiliza la aplicación web.
Intentamos de acceder con credenciales básicas como admin/admin
pero se nos indica el mensaje de Invalid Username or Password
.
Interceptaremos la solicitud de una de las páginas PHP
obtenidas en la enumeración de directorios y páginas, una vez interceptado enviaremos la solicitud al Repeater
.
En un principio, esta página llamada accounts.php
aplicaba una redirección a login.php
, pero al enviar la solicitud en BurpSuite
en la respuesta por parte del servidor se comprueba el contenido de accounts.php
antes de realizar la redirección.
En el contenido HTML de la página web, se comprueba que la página web tramita una petición por POST
la creación de nuevas cuentas de usuario.
La vulnerabilidad mencionada anteriormente, es conocida como Execution After Redirect (EAR)
, ya que la página accounts.php
es mostrada al usuario cuando se realiza la redirección. Esta página no deberíamos disponer de acceso principalmente, pero por una mala configuración en la redirección hemos sido capaces de ver su contenido.
A continuación, se muestra el siguiente ejemplo de EAR
que nos indica OWASP
.
El código siguiente comprobará si el parámetro “loggedin” es verdadero. Si no lo es, utiliza JavaScript para redirigir al usuario a la página de inicio de sesión. Si se utiliza la sección “Cómo comprobar las vulnerabilidades de EAR” o se desactiva JavaScript en el navegador, se repite la misma solicitud sin seguir la redirección de JavaScript y se puede acceder a la sección “Administrador” sin autenticación.
Por defecto, BurpSuite
solamente intercepta las solicitud pero no las respuestas. Así que activaremos la siguiente opción para lograr también interceptar la respuesta.
Confirmamos también que en la respuesta nos aparece otro tipo de contenido y no el del login.php
, con lo cual confirmamos nuevamente la vulnerabilidad de EAR
.
Modificaremos el código de estado de la respuesta de 302 Found
a 200 OK
. Una vez modificado, le daremos a Forward
nuevamente para que la peti
Comprobamos en nuestro navegador que ha cargado correctamente la página, debido que la página se ejecuta y hemos logrado cambiarle el estado a 200 OK
.
Para no tener que modificar el 302 Found
por 200 OK
en cada solicitud que hagamos, lo que realizaremos es crear una regla en BurpSuite
que reemplace el Response header
y realice automáticamente el reemplazo.
Por lo tanto, podremos intentar comprobar las diferentes páginas web en la que se aplicaba esta redirección vulnerable.
accounts.php
status.php
index.php
download.php
logs.php
files.php
etc
Probaremos de crear un nuevo usuario llamado gzzcoo
.
Verificamos que al parecer se ha realizado correctamente el registro del nuevo usuario aprovechando la vulnerabilidad inicial del EAR
.
También podemos crear el usuario a través de BurpSuite
pasándole los parámetros y realizando la solicitud por el método POST
.
Dado que en un principio hemos logrado crear un nuevo usuario, probaremos de acceder con este mismo a la página web para verificar si disponemos de algún acceso a cierto contenido.
Revisando las diferentes secciones de la página web, nos encontramos en la página llamada files.php
que contiene un archivo subido llamado SITEBACKUP.ZIP
. Nos lo descargaremos a través de su enlace.
Revisaremos que se ha descargado correctamente el archivo comprimido, el cual posteriormente descomprimiremos. En el resultado obtenido, comprobamos que al parecer se trata de una copia de seguridad de la aplicación web. Revisaremos las diferentes páginas PHP
en busca de credenciales, etc.
Entre los archivos que logramos comprobar su contenido, nos encontramos con config.php
el cual contiene las credenciales en texto plano del usuario para acceder a la base de datos MySQL
.
Por otro lado, nos encontramos con el siguiente archivo logs.php
el cual nos llamada bastante la atención debido al comentario que ha indicado el desarrollador de la aplicación web y de la manera en que se está empleando la función exec
.
Esta función exec
realiza la ejecución de un script de Python ubicado en /opt/scripts/log_process.py
y recibe un valor por POST
de una variable llamada delim
. Lo grave de estepunto es que esta función exec
no está realizando ningún tipo de sanitización ni validación del contenido, con lo cual podríamos llegar a intentar realizar un Command Injection
.
comma
space
tab
Le daremos a SUBMIT
e interceptaremos la solicitud con BurpSuite
, comprobamos que la petición delexport
de los logs se realiza sobre logs.php
y en la respuesta por parte del servidor se muestra el output
dependiendo del limitador seleccionado.
Tal y como hemos mencionado anteriormente, en la página logs.php
comprobamos que lo que se ejecutaba por detrás era la siguiente ejecución de código a través de la función exec
de PHP
. Pero esta ejecución no era validada ni sanitizada en ninguna parte del código.
En el primer ejemplo, se muestra como espera el valor de delim
en el archivo logs.php
para ejecutar el script, pero debido que no se sanitiza, una atacante podría llegar a ejecutar otro comando a través de ;
logrando ejecutar ambos comandos y obtener un Command Injection
.
Para confirmar la vulnerabilidad de Command Injection
que hemos pensado, lo que realizaremos es levantar un servidor web para ver si logramos recibir una petición por el método GET
de la solicitud que intentará realizar la máquina víctima hacia nuestro servidor a un recurso inexistente.
Realizaremos la siguiente inyección de código para que se ejecute el cURL
hacia un recurso inexistente de nuestro servidor web que hemos levantado.
Comprobamos que en nuestro servidor web, hemos logrado obtener la petición por GET
desde la máquina víctima al recurso inexistente. Con lo cual, queda confirmada la existencia de la vulnerabilidad de Command Injection
presente en la aplicación web.
El siguiente paso será lograr obtener acceso al sistema. Para ello, crearemos un script en Bash
llamado shell.sh
que contendrá la Reverse Shell. Este script lo compartiremos a través de un servidor web.
En otra terminal, nos pondremos en escucha para recibir la Reverse Shell.
Realizaremos la siguiente ejecución de código para que realice un cURL
hacía nuestro script y se ejecute en una bash
.
Verificamos que logramos obtener acceso al sistema y nos encontramos como el usuario www-data
.
Al obtener la reverse shell, mejoramos la calidad de la shell con los siguientes pasos para obtener una TTY interactiva.
Volviendo a revisar el directorio donde nos encontramos, volvemos a encontrar el archivo config.php
el cual contiene de las credenciales de acceso al MySQL
.
Nos conectaremos al MySQL
con las credenciales encontradas y utilizaremos la base de datos previse
que se mencionaba en el archivo de configuración.
Enumerando la base de datos, nos encontramos con una tabla llamada accounts
la cual revisando el contenido de dicha tabla, logramos encontrar la contraseña hasheada del usuario m4lwhere
.
Intentaremos crackear el hash obtenido anteriormente, después de un tiempo logramos crackear el hash obtenido con hashcat
.
Nos conectamos mediante SSH
a través del usuario m4lwhere
y las credenciales obtenidas en el punto anterior. Finalmente, accedemos al equipo y comprobamos la flag user.txt.
Revisando si el usuario m4lwhere
dispone de algun permiso de sudoers
, nos encontramos que puede ejecutar como el usuario root
un script ubicado en /opt/scripts/access_backup.sh
.
Este script tiene como objetivo comprimir archivos de registro de acceso de Apache y otros registros de acceso a archivos y almacenarlos como copias de seguridad en un directorio específico (/var/backups/
). Utiliza gzip
para comprimir los archivos de log y les da un nombre basado en la fecha de ayer. El script también está configurado para ejecutarse con cron y tiene permisos de sudo
, lo que le permite ser ejecutado como root para realizar las tareas programadas.
gzip -c /var/log/apache2/access.log > /var/backups/$(date --date="yesterday" +%Y%b%d)_access.gz
:
Comprime el archivo de log de Apache (access.log
) en un archivo con fecha de ayer en el directorio de copias de seguridad.
gzip -c /var/www/file_access.log > /var/backups/$(date --date="yesterday" +%Y%b%d)_file_access.gz
:
Comprime otro archivo de log (file_access.log
) de acceso a archivos y lo guarda en el mismo directorio con un nombre similar.
La vulnerabilidad de Path Hijacking
ocurre cuando un atacante manipula el entorno del sistema para hacer que un programa como gzip
use rutas maliciosas o archivos falsificados, en lugar de los archivos legítimos que el sistema debería utilizar. En el contexto de este script, un atacante podría aprovechar esta vulnerabilidad de la siguiente manera:
Manipulación del $PATH
: Si un atacante logra modificar la variable de entorno $PATH
antes de que se ejecute el script, podría colocar una versión maliciosa de gzip
en un directorio que esté antes del directorio legítimo en el $PATH
(por ejemplo, en /tmp
o en un directorio controlado por el atacante). Esto haría que el script ejecute esa versión maliciosa de gzip
en lugar de la versión legítima.
Ejecución de código malicioso: La versión maliciosa de gzip
podría ejecutar comandos no deseados, robar información o incluso sobrescribir archivos críticos en el sistema.
Antes de analizar cualquier posible vulnerabilidad, verificamos el entorno de ejecución para entender cómo están configurados los directorios en los que el sistema busca los comandos ejecutables. El resultado muestra que gzip
se encuentra en la ubicación /bin/gzip
, lo cual es una ruta estándar y segura en sistemas Unix.
A continuación, verificamos la variable de entorno $PATH
que define los directorios donde el sistema busca los comandos ejecutables. En este caso, podemos observar que los directorios están bien definidos y no hay rutas sospechosas ni directorios controlados por el atacante antes de las ubicaciones críticas como /bin
o /usr/bin
.
Durante el análisis de la vulnerabilidad Path Hijacking
, hemos creado un script malicioso llamado gzip
en un directorio controlado por el atacante (/tmp
). Este script reemplaza la ejecución legítima de gzip
con un comportamiento malicioso, ejecutando el siguiente código.
Copia de bash: Copia el binario legítimo de bash
desde /bin/bash
a un archivo llamado /tmp/gzzcoo
.
SUID (Set User ID): Establece el bit SUID
en el archivo /tmp/gzzcoo
, lo que le da privilegios de superusuario a cualquier persona que ejecute ese archivo. Esto permite al atacante ejecutar el comando bash
con privilegios de root, lo que comprometería completamente el sistema.
Si la variable $PATH
de la víctima se ve comprometida y /tmp
aparece antes de /bin
en la secuencia de búsqueda de comandos, cualquier intento de ejecutar gzip
podría invocar el script malicioso en lugar del binario legítimo. Esto permitiría al atacante ejecutar comandos arbitrarios con privilegios de superusuario, como en el caso de la ejecución de /tmp/gzzcoo
con permisos de root.
Para explotar la vulnerabilidad de Path Hijacking
, manipulamos temporalmente la variable de entorno $PATH
para anteponer el directorio /tmp
, donde se encuentra nuestro script malicioso gzip
.
Al ejecutar este comando, logramos que el sistema buscara primero el script malicioso ubicado en /tmp
en lugar del binario legítimo de gzip
que reside en /bin/gzip
. Como resultado, el script malicioso fue ejecutado, lo que provocó la creación del archivo /tmp/gzzcoo
con privilegios de root
debido al bit SUID
configurado.
Finalmente a través de /tmp/gzzcoo -p
logramos obtener acceso como el propietario del binario (root
) debido que esta copia dispone de permisos de SUID
. Logramos obtener acceso a la flag root.xt.
Este comportamiento demuestra cómo una configuración incorrecta del $PATH
, donde directorios no confiables como /tmp
tienen prioridad, puede permitir la ejecución de scripts maliciosos que otorguen acceso con privilegios elevados.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap
. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y comprobaremos el contenido de la aplicación web, en el cual nos ofrece un panel de autenticación.
Realizaremos una enumeración de páginas PHP
y directorios de la aplicación web. En el resultado obtenido, verificamos diferentes páginas web PHP
que analizaremos más adelante, muchas de ellas realizan una redirección a , lo cual sugiere que deberemos iniciar sesión para visualizar el contenido.
Al volver a interceptar la página principal de , le daremos a Forward
y comprobamos que BurpSuite
ha logrado interceptar la respuesta también.
Accedemos a y comprobamos que realiza automáticamente el cambio de 302 Found
a 200 OK
. Logramos visualizar el contenido de la página web el cual no teníamos acceso previamente.
Accedemos a y comprobamos el siguiente contenido de la página web. Según indica la página web, esta página solamente debería ser visible por los Admins
.
Accederemos a y comprobaremos la siguiente página web en la cual realiza un export
de los logs y nos ofrece el resultado en diferentes delimitadores: