Realizamos Command Injection en la pagina web lo que nos guió a certificados los cuales utilizamos para generar uno nuevo y acceder a una nueva pagina restringida, la que nos permitía generar claves SSH para Authpf, con este ultimo encontramos el puerto NFS que nos permitió obtener acceso por SSH. Finalmente encontramos y crackeamos un hash de una base de datos para escalar privilegios.
Informacion de la Maquina
Nombre | Fortune |
---|---|
OS | Other |
Puntos | 50 |
Dificultad | Insane |
IP | 10.10.10.127 |
Maker | |
|
NMAP
Al realizar un escaneo con nmap.
|
|
HTTPS
Al visitar la pagina nos encontramos con lo siguiente, por lo que no podemos hacer nada por ahora.
HTTP
Con gobuster encontramos la siguiente ruta.
|
|
Utilizamos firefox para ver las peticiones que hace cuando enviamos una solicitud a una de las opciones, en cada opcion si se hace una peticion este nos devuelve de manera aleatoria un mensaje.
Y encontramos que, al editar las peticiones (POST db=fortunes
), encontramos que podemos ejecutar comandos (RCE):
Al realizar una enumeracion de carpeta y archivos encontramos en la carpeta del usuario bob
(/home/bob/
) certificados que pueden pertenecen a la pagina web https.
|
|
La razon por la cual no podamos acceder a la pagina https es porque no tenemos el certificado de la misma, esta es una grafica de como funciona un certificado.
Para poder acceder a la pagina debemos de crear nuestro archivo pkc12
el cual contiene el certificado y la clave, copiamos a nuestra maquina local los archivos intermediate.cert.pem
e intermediate.key.pem
, utilizando openssl generamos el certificado con el siguiente comando:
|
|
Obtenemos el certificado y lo importamos a nuestro navegador en las configuraciones de certificado.
Visitamos la pagina en https y nos muestra lo siguiente:
Al visitar la pagina /generate
nos muestra una clave publica agregada al los archivos de autorizacion ssh de la maquina y una clave privada con la cual nos podemos conectar al mismo.
Nos conectamos al servicio ssh con la clave generada y el usuario nfsuser
, nos muestra el siguiente mensaje, pero nuestra shell no es interactiva:
Al revisar los procesos que corren en la maquina nos muestra un servicio de authpf:
Segun la documentacion de openbsd sobre Authpf nos dice que “es un intérprete (shell) para pasarelas de autenticación. Una pasarela de autenticación es como una pasarela de red normal (también llamada enrutador), con la diferencia que “los usuarios se deben autenticar ante la pasarela” antes de que se permita que pase el tráfico a través de ésta”.
Las reglas de authpf /etc/authpf/authpf.rules
nos muestran que cualquier usuario ip ($user_ip
) en este caso nfsuser
le de paso o permiso en los protocolos tcp udp.
|
|
Sabiendo que tenemos acceso a los protocolos tcp y udp volvemos a hacer un escaneo de puertos y encontramos los siguientes puertos abiertos:
|
|
Encontramos que hay un servicio rpcbind y nfs que estan corriendo en la maquina, escaneamos el servicio rpcbind
:
RPCBIND
Encontramos que el servicio NFS esta corriendo tanto en tcp y udp, por lo que podemos montar los share name de la maquina localmente.
|
|
NFS
Al revisar los puntos compartidos obtenemos que /home
puede ser montado
|
|
ACCESO a /home
Para acceder a la carpeta /home
debemos montarlo localmente y asi poder acceder a las carpetas y archivos que se encuentran dentro.
|
|
Observamos que hay tres usuarios de los cuales bob ya conocemos su interior, mas no el de charlie y nfsuser:
|
|
Podemos ver que a la carpeta del usuario charlie no tenemos acceso, para ello vamos a crear un usuario localmente y un grupo para poder acceder al interior, utilizamos stat para ver informacion de la carpeta, con lo cual vemos que /home/charlie
tiene propiedades uid: 1000 y gid:1000
.
|
|
Creamos un usuario y grupo local para charlie:
|
|
Con ello logramos acceder y obtener tambien nuestra bandera user.txt
.
Ahora que tenemos acceso a la carpeta de charlie podemos agregar nuestra clave ssh a authorized_keys
para poder logearnos con el servicio ssh como charlie.
De la misma forma para el usuario bob:
ESCALACION DE PRIVILEGIOS
Dentro de la carpeta charlie nos encontramos con un archivo mbox
, que contiene un mensaje de bob para charlie.
Nos dice que bob cambio la contraseña para el usuario dba es la misma que la del usuario root, haciendo una enumeracion de carpetas y archivos nos encontramos un archivo pgadmin4.db
que contiene tablas que le pertenecen a pgadmin3.4
, utilizando sqlite db browser, dentro de este archivo encontramos una contraseña y usuario dba
especificamente en la tabla de server
, tambien una tabla que contiene usuario y contraseña de bob y charlie.
Ruta del archivo:
|
|
Tambien encontramos la ruta donde se encuentran los documentos de pgadmin dentro del archivo pgadmin4.ini
:
dba
bob y charlie
Usuario ROOT
En la ruta de pgadmin4 local (/usr/local/pgadmin4/pgadmin4-3.4/web/utils/)
, encontramos un archivo llamado crypto.py, en su interior encontramos funciones las cuales encriptan y desencriptan contraseñas (encrypt(), decrypt(), pad(), pqencryptpassword()
), la funcion de encrypt()
necesita un texto y una clave, la funcion decrypt()
el texto encriptado (ciphertext
) anteriormente con la funcion encrypt()
y la clave, con estas dos funciones y la contraseña que se encuentra en la tabla de server del usuario dba
, podemos intentar desencriptarla solo nos falta la clave (key).
Dentro de la base de datos (pgadmin4.db) encontramos algunas claves (tabla -> keys) que podriamos utilizar para la funcion decrypt(), de igual forma los usuarios (tabla -> users) y contraseñas (tabla -> users).
Localmente agregamos el siguiente codigo a nuestro archivo crypto.py:
|
|
Esta porcion de codigo contiene una lista de las claves (keys) probables para la contraseña (pass_dba
) del usuario dba que corresponde igualmente para el usuario root, dentro de las claves tambien encontramos usuarios, ya que una key podria ser o no el nombre de un usuario, de igual manera agregamos las contraseñas de la base de datos de los usuarios bob y charlie. En resumen agregamos a la lista todas las posibles claves que encontramos dentro de la maquina. Al correr nuestro script obtenemos el siguente resultado:
Nuestra contraseña para el usuario dba y para root es R3us3-0f-a-P4ssw0rdl1k3th1s?_B4D.ID3A!
, la clave que fue satisfactoria fue una contraseña en este caso la contraseña de bob que se encuentra en la base de datos. Asi obtenemos nuestra bandera root.txt
.