Perfection
Last updated
Last updated
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
.
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.
Al visitar el sitio web encontraremos con el siguiente contenido:
Navegando entre las pestañas encontraremos una calculadora de grado ponderado
Esta petición la intercepte con burpSuite y trate de inyectar algún comando, pero me daba un respuesta de Malicious input...
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 ;/=...
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
BurpSuite
UrlEncode - Web Site:
Luego de tener en url encode podemos enviar la petición y veremos que efectivamente funciona:
Ahora intentaremos enviarnos una revershell
urlEncode:
Enumerando e directorio del usuario actual (susan
) podremos encontrar un archivo pupilpath_credentials.db
en donde encontraremos credenciales
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.
Siguiendo enumerando observaremos un correo de Susan
, en la que nos da una pista de cual es la contraseña en texto plano.
Haciendo uso de hashcat podremos crackear el hash del usuario susan
:
Logramos obtener las credenciales de susan
:
Luego podemos usar el urlencode del mismo burpsuite o el sitio web de
Luego de tener nuestra revershell en urlencode podemos enviar la petición y debemos de obtener una shell.