> For the complete documentation index, see [llms.txt](https://emeges.gitbook.io/emeges/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://emeges.gitbook.io/emeges/tryhackme/mr-robot.md).

# Mr Robot

Mr. Robot: 1 es una máquina Linux inspirada en la serie Mr. Robot de la plataforma Tryhackme

Mr. Robot: 1 es una máquina Linux inspirada en la serie *Mr. Robot* con un sitio WordPress como único vector de entrada. El acceso inicial se logra enumerando un usuario válido y sus credenciales a través de dos archivos filtrados en `robots.txt`, para luego conseguir ejecución remota de código editando una plantilla PHP desde el panel de administración. La escalada a root explota un binario `nmap` con el bit SUID activo y una versión antigua que expone un modo interactivo.<br>

| Campo                 | Detalle                                                                           |
| --------------------- | --------------------------------------------------------------------------------- |
| **Plataforma**        | TryHackMe                                                                         |
| **Dificultad**        | Media                                                                             |
| **Sistema operativo** | Linux                                                                             |
| **IP objetivo**       | `10.130.182.58`                                                                   |
| **Fecha**             | 22/07/2026                                                                        |
| **Autor**             | Emeges                                                                            |
| **Tags**              | `wordpress` `enumeración-usuarios` `base64` `reverse-shell` `suid` `nmap-privesc` |

<figure><img src="https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2FiWoIZ3OjqOgdC0RbpsjY%2Findex_html0.png?alt=media&amp;token=34f1142b-f51e-4c3f-b261-61a2046f2c02" alt=""><figcaption></figcaption></figure>

### &#x20; 1. Reconocimiento

#### 1.1 Enumeración de puertos

```
sudo nmap -sS 10.130.182.58 -p- -Pn -n --min-rate 5000 -oG allPorts
```

Lanzamos un reconocimiento de puertos disponibles con `nmap -sS --min-rate 5000 -p- -Pn -n -oG allports`\
`donde :`

* `-sS` envía paquetes SYN para iniciar una conexión TCP, pero no completa el handshake, lo que lo hace más sigiloso y rápido para detectar puertos abiertos.
* `--min-rate 5000`  Establece una tasa mínima de envio de 5000 paquetes por segundo ,    acelerando el escaneo , aunque en un entorno real aumenta la posibilidad de ser detectado.
* `-p-`  Hace escaneo a todos los puertos (65535)
* `-Pn` Indica a nmap que no realice ping previo para detectar si el host está activo.
* `-n` Evita la resolución DNS, es decir no intenta traducir las Ips a nombre de dominio , además acelera el escaneo.
* `-oN` Guarda el resultado en formato nmap .

<figure><img src="https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2F31oIzqMPqVb6ES0fjYRN%2Fallports.png?alt=media&amp;token=15db3e95-87e2-4161-a181-c54578a8bd93" alt=""><figcaption></figcaption></figure>

```
Starting Nmap 7.99 ( https://nmap.org ) at 2026-07-22 20:01 +0200
Nmap scan report for 10.130.182.58
Host is up (0.029s latency).
Not shown: 65532 filtered tcp ports (no-response)
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
443/tcp open  https
```

Ejecutamos un conjunto de scripts básicos de nmap para detectar las versiones detallada de los servicios a los puertos que están abiertos.\
\
`nmap -sCV 10.130.182.58 -p22,80,443 -oN targeted`

<figure><img src="https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2FDXQaCo5UmVXWE8qVk8en%2Ftargeted.png?alt=media&amp;token=e7445429-156a-43fa-a459-2cc387f81d74" alt=""><figcaption></figcaption></figure>

Solo tres puertos abiertos: SSH y dos servicios web (HTTP y HTTPS). Con esto ya sabemos que el vector de entrada casi seguro va a estar en el servicio web, ya que no tenemos credenciales para probar contra SSH todavía.

```

PORT    STATE SERVICE  VERSION
22/tcp  open  ssh      OpenSSH 8.2p1 Ubuntu 4ubuntu0.13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 71:e3:ef:8a:67:f1:d5:b6:fd:8d:76:9d:13:39:eb:fe (RSA)
|   256 fd:37:95:27:cd:09:a4:bd:ff:dc:9e:93:cb:ce:91:dd (ECDSA)
|_  256 74:6e:9c:49:7f:a0:4e:c2:06:d2:14:8e:0c:57:86:21 (ED25519)
80/tcp  open  http     Apache httpd
|_http-server-header: Apache
|_http-title: Site doesn't have a title (text/html).
443/tcp open  ssl/http Apache httpd
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=www.example.com
| Not valid before: 2015-09-16T10:45:03
|_Not valid after:  2025-09-13T10:45:03
|_http-server-header: Apache
|_http-title: Site doesn't have a title (text/html).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 18.22 seconds
```

\
Nos fijamos que hay en el puerto https para ver si encontramos alguna web o información para seguir enumerando  y no es encuentra nada .\ <br>

<figure><img src="https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2FTRx43LZdoPSevfU3NSTx%2Fbad_request.png?alt=media&amp;token=4558ebbd-9335-4bd6-ad19-c2e4370ac4ec" alt=""><figcaption></figcaption></figure>

```
No hay banners con versión en el Apache ni título en la web, así que toca enumerar a mano.
```

***

### 2. Enumeración web

#### 2.1 Fuerza bruta de directorios

Como escaneo principal utilizaremos gobuster, que sirve para realizar **fuzzing** y encontrar archivos, directorios ocultos o subdominios en un servidor web mediante ataques de fuerza bruta con diccionarios\ <br>

`gobuster dir -u http://mrrobot.thm/ -w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt -t 64 -b 404,403 -x txt,php,html -o dire`

<figure><img src="https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2F7bhuAsaJgfj0WQMJoYsC%2Fgobuster_dir1.png?alt=media&amp;token=b54af252-2222-478f-a874-8513f69df791" alt=""><figcaption></figcaption></figure>

Donde&#x20;

* `dir`  Indica que hace busca de directorio
* `-u`  para indicar la URL
* `-w`  donde está el diccionario que vamos a utilizar para realizar el fuzzing.
* `-t 64`  indica la cantidad de hilos para que haga esa acción&#x20;
* `-b` excluir el status code 404,403(errores) para que nos de un reporte más limpio
* `-x`  Extensiones de archivo a buscar en el modo `dir`
* `-o` para que nos guarde el output en el archivo

\
Nos llama la atención el directorio  robots.txt

{% hint style="info" %}
Entre los resultados aparece `robots.txt`, que en cualquier auditoría web vale la pena revisar primero: al estar pensado para indexadores, muchas veces expone rutas que el administrador no quiere que Google indexe, pero que tampoco están realmente protegidas.
{% endhint %}

<figure><img src="https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2FGAvrFGMBnP1tP2lqnXSB%2Frobots_03.png?alt=media&amp;token=6fe3a1df-7360-4120-9998-4dd731e6855c" alt=""><figcaption></figcaption></figure>

Abrimos ese directorio de la primera pregunta <br>

<figure><img src="https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2FmkNSMSO4DYKZvlECuQ7Q%2Fkey_1.png?alt=media&amp;token=902f8178-606c-4653-b0fc-caf616b39908" alt=""><figcaption></figcaption></figure>

Dos archivos interesantes: una wordlist (`fsocity.dic`) y la primera flag.

\
Pregunta 1 : What is key 1?\
**073403c8a58a1f80d943455fb30724b9**<br>

***

#### 2.3 Descubrimiento de WordPress

![](https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2FUV8R4dMT7sAyb9dJZmVW%2Fwp_login_4.png?alt=media\&token=62075a18-8b36-4f66-8bb7-e8d05636c6d1)\
\
Gobuster revela también  un `wp-login.php`\
\
[`http://mrrobot.thm/wp-login.php`\ <br>](http://10.129.183.81/wp-login.php)Como no tenemos credenciales, aprovechamos un comportamiento típico de WordPress: el formulario de login devuelve un mensaje distinto según si el **usuario** existe o no (`ERROR: Invalid username` vs. `ERROR: The password you entered is incorrect`). Eso lo convierte en un oráculo de enumeración de usuarios por lo tanto hacemos un ataque de estilo Automate poniendo el diccionario que encontramos en robots.txt.

<figure><img src="https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2Fct53xpCpqALkFN6rwhyZ%2Fbruteforce_Automate2.png?alt=media&amp;token=2ee5bc22-1c50-4b88-95bf-5496b759bee3" alt=""><figcaption></figcaption></figure>

Con Caido (equivalente al Intruder de Burp Suite) montamos un ataque tipo *Automate* contra `wp-login.php`, usando `fsocity.dic` como diccionario de posibles usuarios y comparando el mensaje de error de cada intento.

<figure><img src="https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2FFtOmSXSgzwT7ELtWaoLi%2Fbruteforce_result3.png?alt=media&amp;token=624a5b70-7674-40ac-b4dd-b7b6b1a03dd1" alt=""><figcaption></figcaption></figure>

Al realizar ataque nos fijamos según su *Length* el usuario `Elliot` es diferente al resto.&#x20;

{% hint style="info" %}
Intenté además fuerza bruta de contraseña con Hydra y wpscan, pero con `fsocity.dic` completa (miles de líneas con duplicados) el ataque es extremadamente lento — no es el camino.
{% endhint %}

#### &#x20;2.4 Credenciales filtradas en /license

<figure><img src="https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2FYDFfXKRuLLnHHUNwCTkV%2Fgobuster_license5.png?alt=media&amp;token=22f818a9-9e38-495b-90fc-58ff3ef859cd" alt=""><figcaption></figcaption></figure>

\
Volviendo a los resultados de gobuster, aparece una ruta `/license`, que al abrirla muestra al final una cadena en Base64:\
\
`ZWxsaW90OkVSMjgtMDY1Mgo=` esto está encodeado en base 64<br>

Desde nuestra terminal  lanzamos\
`echo "ZWxsaW90OkVSMjgtMDY1Mgo=" | base64 -d`\
`elliot:ER28-0652`

***

### 3. Acceso inicial (WordPress)

#### &#x20;3.1 Vector de ataque

<figure><img src="https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2FDYzf9pKncMzLaZrsWXPh%2Fwp_admin_5.png?alt=media&amp;token=71141116-b461-4b98-b43a-60957284a88d" alt=""><figcaption></figcaption></figure>

\
\
Nos logueamos y ya estamos dentro del panel de control.\
\
sanitizamos la shell para no tener problemas a futuro<br>

#### 3.2 Vector de ataque

{% hint style="info" %}
Un administrador de WordPress tiene permiso para editar directamente el código PHP de las plantillas del tema activo desde **Apariencia → Editor de temas**. Eso equivale a ejecución remota de código: cualquier PHP que guardemos ahí se ejecuta en el servidor la próxima vez que esa plantilla se cargue.
{% endhint %}

Uno de los métodos que podemos llegar a conectarnos a la maquina es editar alguna página php e insertar nuestra reverse shell , en este caso utilicé la reverse shell de [pentestmonkey](https://github.com/pentestmonkey/php-reverse-shell/blob/master/php-reverse-shell.php)\
\
Editamos una plantilla poco usada (por ejemplo `404.php`, para no romper la página principal del sitio) e insertamos la reverse shell de [pentestmonkey](https://github.com/pentestmonkey/php-reverse-shell/blob/master/php-reverse-shell.php), apuntando `$ip` y `$port` a nuestra máquina atacante.

<figure><img src="https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2F5hQt5WdG9rExBP7M1Cmm%2Freverse_shell6.png?alt=media&amp;token=65504436-1e92-4311-85f9-3f48d85bc603" alt=""><figcaption></figcaption></figure>

En nuestra máquina, antes de guardar la plantilla:\
`nc -nlvp  PUERTO`\
\
Al visitar la ruta correspondiente a esa plantilla, se dispara la conexión y recibimos la shell (normalmente como el usuario `daemon`, con el que corre el proceso de Apache/WordPress).

<figure><img src="https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2FgKcEu8Vf0bEuU6rBQIIn%2Fnc_nlvp.png?alt=media&amp;token=27b2891e-38d6-46b6-94b8-2400fa99bef3" alt=""><figcaption></figcaption></figure>

#### &#x20;3.3 Estabilización de la shell

```
script /dev/null -c bash
# Ctrl+Z en tu terminal
stty raw -echo; fg
reset
export TERM=xterm
stty size   # anotá el resultado, ej: 38 116
stty rows 53 columns 226
```

### 4. Post-explotación y movimiento lateral

#### &#x20;4.1 Enumeración de /home

```
ls -la /home
```

```
drwxr-xr-x 2 root   root   4096 Nov 13  2015 robot
drwxr-xr-x 4 ubuntu ubuntu 4096 Jun  2  2025 ubuntu
```

#### 4.2 Credenciales del usuario robot

dentro de robot encontramos un archivo llamado  password.raw-md5\ <br>

<figure><img src="https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2FHPJegvJ050Hu6kN3qHSW%2Ftorobotpassword_7.png?alt=media&amp;token=febee246-a441-45a3-ad5a-07a23390249a" alt=""><figcaption></figcaption></figure>

***robot:c3fcd3d76192e4007dfb496cca67e13b***

El nombre del archivo ya adelanta que es un hash MD5. Dos caminos para crackearlo:\
\
\### Forma con John ripper

#### Forma con John ripper

{% code overflow="wrap" %}

```
john --format=raw-md5 --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
```

{% endcode %}

<br>

<figure><img src="https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2FefRhHnojgCmWZBpwf1ta%2Fjohnripper_crack6.png?alt=media&amp;token=bebef023-7b41-4b8f-8507-d66aa958c251" alt=""><figcaption></figcaption></figure>

#### &#x20;Forma con crackStation

<figure><img src="https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2Fwp6m0FFr11A0mMbNmEZd%2Fcrackstation_7.png?alt=media&amp;token=2f5dcd15-d53b-4c5a-881d-ad93278d3344" alt=""><figcaption></figcaption></figure>

\
\
<https://crackstation.net/> ponemos nuestro  hash y obtenemos el mismo resultado

Nos logueamos a usuario robot y obtenemos la key 2-3\
\
Ambos métodos coinciden en la contraseña:

`abcdefghijklmnopqrstuvwxyz`

#### &#x20;4.3 Acceso como robot

```
python3 -c 'import pty; pty.spawn("/bin/bash")'
su robot
# Password: abcdefghijklmnopqrstuvwxyz
```

[Sanitizamos nuevamente como en el punto 3.3](#id-3.3-estabilizacion-de-la-shell)

<figure><img src="https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2FyERmt0W1LMLtbqToFOJC%2Fkey_2_7.png?alt=media&amp;token=2e768be0-dfee-4664-bf2c-44d937bdf884" alt=""><figcaption></figcaption></figure>

Ahora podemos leer el archivo y obtener la key 2\
**822c73956184f694993bede3eb39f959**<br>

### Escalada de privilegios

#### 5.1 Búsqueda de binarios SUID

{% code overflow="wrap" %}

```
find / -perm -4000 2>/dev/null
```

{% endcode %}

<figure><img src="https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2F9CDtRY1IAKAIma8kUJ5y%2Fsuid_10.png?alt=media&amp;token=e15b5a74-6b2d-40b1-a7db-7a4dcfb0d82d" alt=""><figcaption></figcaption></figure>

Buscamos en la pagina GTFOBIN si hay una posible escala

<figure><img src="https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2FSum6JlwKjv4s0otRqlrI%2Fsuid_privesc_11.png?alt=media&amp;token=72c7998d-639f-4278-bd2c-17b417b7153c" alt=""><figcaption></figcaption></figure>

```
/usr/local/bin/nmap --version
# Nmap version 3.81
```

{% hint style="info" %}
Las versiones de Nmap entre la 2.02 y la 5.21 incluyen un modo interactivo (`--interactive`) pensado para uso administrativo, que permite ejecutar comandos de shell desde dentro del propio Nmap. Al estar el binario con SUID root, ese modo interactivo hereda esos privilegios.
{% endhint %}

#### &#x20;5.3 Explotación

<figure><img src="https://2840659045-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwJReu2GEsedonaw2K23F%2Fuploads%2FHXMVJDEAfEwjJUzlzhQW%2Frooted.png?alt=media&amp;token=324b6760-bfb0-4853-8352-7ad4315af44d" alt=""><figcaption></figcaption></figure>

Sanitizamos nuevamente y luego\_<br>

```
cd /root
cat key-3-of-3.txt
# 04787ddef27c3dee1ee161b21670b4e4
```

***

### 6. Flags Capturadas

| Flag  | Ubicación                                     | Valor                              |
| ----- | --------------------------------------------- | ---------------------------------- |
| Key 1 | `/key-1-of-3.txt` (expuesta vía `robots.txt`) | 073403c8a58a1f80d943455fb30724b9   |
| Key 2 | `/home/robot/key-2-of-3.txt`                  | `822c73956184f694993bede3eb39f959` |
| Key 3 | `/root/key-3-of-3.txt`                        | `04787ddef27c3dee1ee161b21670b4e4` |

### Vulnerabilidades identificadas

<table><thead><tr><th width="61.33331298828125">#</th><th>Vulnerabilidad</th><th>Tipo</th><th>Severidad</th><th width="342.333251953125">Recomendación</th></tr></thead><tbody><tr><td>1</td><td>Archivos sensibles referenciados en <code>robots.txt</code></td><td>Exposición de información / CWE-200</td><td>Media</td><td>No depender de <code>robots.txt</code> para "ocultar" rutas; restringir acceso real vía autenticación o control de acceso en el servidor</td></tr><tr><td>2</td><td>Enumeración de usuarios por mensajes de error diferenciados en <code>wp-login.php</code></td><td>CWE-203 (User Enumeration)</td><td>Media</td><td>Usar mensajes de error genéricos ("credenciales inválidas") independientemente de si el usuario existe</td></tr><tr><td>3</td><td>Credenciales en texto (codificadas en Base64, no cifradas) accesibles públicamente en <code>/license</code></td><td>Exposición de credenciales / CWE-522</td><td>Alta</td><td>Nunca almacenar credenciales, ni siquiera "ofuscadas", en archivos accesibles públicamente</td></tr><tr><td>4</td><td>Editor de temas de WordPress habilitado para cuentas administrativas</td><td>RCE por diseño / CWE-94</td><td>Alta</td><td>Deshabilitar el editor de archivos con <code>DISALLOW_FILE_EDIT</code> en <code>wp-config.php</code>; aplicar el principio de mínimo privilegio en cuentas admin</td></tr><tr><td>5</td><td>Binario <code>nmap</code> con bit SUID y versión desactualizada</td><td>Escalada de privilegios / CWE-269</td><td>Crítica</td><td>Nunca asignar SUID a binarios con funcionalidad interactiva o de ejecución de comandos; mantener el software actualizado</td></tr></tbody></table>

### 8. Lecciones aprendidas

En esta máquina aprendí a  como lanzar  reverse shell en un archivo php del Wordpress ,también repasé el uso de joh the ripper a la hora de crackear la contraseña .<br>

### 9. Herramientas utilizadas

* Nmap
* Gobuster
* Caido (equivalente a Burp Suite Intruder)
* php-reverse-shell (pentestmonkey)
* John the Ripper / CrackStation
* Netcat


---

# 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://emeges.gitbook.io/emeges/tryhackme/mr-robot.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.
