Perfection

20240717221111.png

Perfection es una sencilla máquina Linux que cuenta con una aplicación web con funcionalidad para calcular las puntuaciones de los estudiantes. Esta aplicación es vulnerable a la inyección de plantillas del lado del servidor (SSTI) mediante la omisión del filtro de expresiones regulares. Se puede obtener un punto de apoyo explotando la vulnerabilidad SSTI. Al enumerar al usuario se revela que forma parte del grupo sudo. Una enumeración posterior descubre una base de datos con hashes de contraseñas y el correo electrónico del usuario revela un posible formato de contraseña. Mediante un ataque de máscara en el hash, se obtiene la contraseña del usuario, que se aprovecha para obtener acceso root.

Enumeración

Iniciamos con la enumeración de los puertos.

Encontraremos que se tiene el 22 y 80 como puertos abierto y ejecutandose el servicio ssh y http en cada uno respectivamente.

Puerto 80

Al visitar el sitio web encontraremos con el siguiente contenido:

20240717231524.png

Navegando entre las pestañas encontraremos una calculadora de grado ponderado

20240718145215.png

Esta petición la intercepte con burpSuite y trate de inyectar algún comando, pero me daba un respuesta de Malicious input...

20240718145236.png

Estuve variando las petición y me di cuenta que no es el comando lo que realmente bloquea, lo que bloquea es el carácter ;/=...

20240718145258.png

Explotación

Antes debemos de revisar algunos payloads, además de que estamos ante el lenguaje de ruby. Teniendo en cuenta esto proseguimos con la explotación.

Ruby Regex

  • Expresión regular: ^[a-zA-Z]+$

    • ^ indica el comienzo de la cadena.

    • [a-zA-Z] indica que la cadena puede contener cualquier letra (mayúscula o minúscula).

    • + indica una o más ocurrencias de la clase de caracteres anterior.

    • $ indica el final de la cadena.

  • Cadena: "test"

  • Resultado: 0

    • La cadena "test" coincide completamente con la expresión regular.

    • 0 indica que la coincidencia se encuentra al principio de la cadena (índice 0).

  • Expresión regular: ^[a-zA-Z]+$

  • Cadena: "test\n{{}}"

  • Resultado: 0

    • Aunque la cadena contiene caracteres adicionales (\n{{}}), la coincidencia todavía devuelve 0. Esto se debe a que en Ruby, las expresiones regulares por defecto no funcionan en modo multilinea y sólo evalúan hasta la primera línea de texto por defecto.

    • 0 indica que la coincidencia se encuentra al principio de la cadena, es decir, "test" coincide con la expresión regular.

    • Nota: Este comportamiento no es el esperado generalmente y sugiere que el regex no está en modo multlinea, que se puede activar usando la bandera /m.

  • Expresión regular: ^[a-zA-Z]+$

  • Cadena: "test{{}}"

  • Resultado: nil

    • La cadena "test{{}}" no coincide con la expresión regular.

    • Esto se debe a que la expresión regular requiere que la cadena contenga solo letras (mayúsculas o minúsculas) desde el principio (^) hasta el final ($).

    • Los caracteres {{}} no están permitidos por la expresión regular, por lo tanto, no hay coincidencia.

La expresión regular ^[a-zA-Z]+$ se utiliza para verificar si una cadena consiste únicamente de letras (mayúsculas y minúsculas) desde el principio hasta el final. En los ejemplos dados:

  • "test" coincide completamente con la expresión regular.

  • "test\n{{}}" coincide solo hasta la primera línea debido al comportamiento por defecto de las expresiones regulares en Ruby.

  • "test{{}}" no coincide debido a la presencia de caracteres no permitidos por la expresión regular.

Luego de entender como puede funcionar podemos hacer uso del siguiente payload

A esto antecediendo un salto de linea

20240718144916.png

Luego podemos usar el urlencode del mismo burpsuite o el sitio web de url encodearrow-up-right

BurpSuite

UrlEncode - Web Site:

Luego de tener en url encode podemos enviar la petición y veremos que efectivamente funciona:

20240718145408.png

Ahora intentaremos enviarnos una revershell

urlEncode:

Luego de tener nuestra revershell en urlencode podemos enviar la petición y debemos de obtener una shell. 20240718150602.png

Escalada de privilegios

Usuario susan

20240718150538.png

Enumerando e directorio del usuario actual (susan) podremos encontrar un archivo pupilpath_credentials.db en donde encontraremos credenciales

20240718161405.png

Estas credenciales estan encriptadas

También observamos que pertenecemos al grupo de sudo, esto nos viene bien ya que si logramos obtener las credenciales del usuario actual podremos escalar privilegios directamente.

20240718161324.png

Siguiendo enumerando observaremos un correo de Susan, en la que nos da una pista de cual es la contraseña en texto plano.

20240718161342.png

Haciendo uso de hashcat podremos crackear el hash del usuario susan:

20240718161624.png

Logramos obtener las credenciales de susan:

Usuario : root

20240718161726.png

Last updated