SMB
Last updated
Last updated
Server Message Block
( SMB
) es un protocolo cliente-servidor que regula el acceso a archivos, directorios completos y otros recursos de red, como impresoras, enrutadores o interfaces disponibles para la red. El intercambio de información entre diferentes procesos del sistema también se puede gestionar mediante el protocolo SMB. se puso a disposición del público en general, por ejemplo, como parte del sistema operativo de red OS/2, LAN Manager y LAN Server. Desde entonces, el principal ámbito de aplicación del protocolo ha sido, en particular, la serie de sistemas operativos Windows, cuyos servicios de red admiten SMB con compatibilidad descendente, lo que significa que los dispositivos con ediciones más recientes pueden comunicarse fácilmente con dispositivos que tengan instalado un sistema operativo Microsoft anterior. Con el proyecto de software libre Samba, también existe una solución que permite el uso de SMB en distribuciones Linux y Unix y, por lo tanto, la comunicación entre plataformas a través de SMB.
El protocolo SMB permite al cliente comunicarse con otros participantes de la misma red para acceder a archivos o servicios compartidos. El otro sistema también debe haber implementado el protocolo de red y haber recibido y procesado la solicitud del cliente mediante una aplicación de servidor SMB. Sin embargo, antes de eso, ambas partes deben establecer una conexión, por lo que primero intercambian los mensajes correspondientes.
En redes IP, SMB utiliza el protocolo TCP para este propósito, que permite un protocolo de enlace de tres vías entre el cliente y el servidor antes de que se establezca la conexión. Las especificaciones del protocolo TCP también rigen el transporte posterior de datos. Podemos ver algunos ejemplos .
Un servidor SMB puede proporcionar partes arbitrarias de su sistema de archivos local como recursos compartidos. Por lo tanto, la jerarquía visible para un cliente es parcialmente independiente de la estructura del servidor. Los derechos de acceso se definen mediante Access Control Lists
( ACL
). Pueden controlarse de forma detallada según atributos como execute
, read
y full access
para usuarios individuales o grupos de usuarios. Las ACL se definen en función de los recursos compartidos y, por lo tanto, no corresponden a los derechos asignados localmente en el servidor.
Como se mencionó anteriormente, existe una implementación alternativa del servidor SMB llamada Samba, desarrollada para sistemas operativos Unix. Samba implementa el CIFS
protocolo de red Common Internet File System (CIFS). es un dialecto de SMB, es decir, una implementación específica del protocolo SMB creado originalmente por Microsoft. Esto permite a Samba comunicarse eficazmente con los sistemas Windows más recientes. Por lo tanto, a menudo se le conoce como SMB/CIFS.
Sin embargo, CIFS
se considera una versión específica del protocolo SMB, que se alinea principalmente con [nombre del protocolo SMB version 1
]. Cuando los comandos SMB se transmiten por Samba a un servicio NetBIOS antiguo, las conexiones suelen realizarse a través de los puertos TCP 137
[ nombre del 138
protocolo] 139
. En cambio, CIFS opera 445
exclusivamente a través del puerto TCP. Existen varias versiones de SMB, incluyendo versiones más recientes como [nombre del protocolo ] SMB 2
y [ nombre del protocolo] SMB 3
, que ofrecen mejoras y son las preferidas en infraestructuras modernas, mientras que versiones anteriores como SMB 1
[ CIFS
nombre del protocolo] se consideran obsoletas, pero aún pueden utilizarse en entornos específicos.
Con la versión 3, el servidor Samba pudo integrarse plenamente en un dominio de Active Directory. Con la versión 4, Samba incluso proporciona un controlador de dominio de Active Directory. Para ello, contiene varios daemons, que son programas Unix en segundo plano. El daemon del servidor SMB ( smbd
) de Samba proporciona las dos primeras funcionalidades, mientras que el daemon del bloque de mensajes NetBIOS ( nmbd
) implementa las dos últimas. El servicio SMB controla estos dos programas en segundo plano.
Sabemos que Samba es compatible con sistemas Linux y Windows. En una red, cada host participa en el mismo [nombre workgroup
de host]. Un grupo de trabajo es un nombre de grupo que identifica un conjunto arbitrario de computadoras y sus recursos en una red SMB. Puede haber varios grupos de trabajo en la red simultáneamente. IBM desarrolló un application programming interface
[ API
nombre de host] para la conexión de computadoras en red llamado Network Basic Input/Output System
[ nombre NetBIOS
de host]. La API NetBIOS proporcionó un modelo para que una aplicación se conectara y compartiera datos con otras computadoras. En un entorno NetBIOS, cuando una máquina se conecta, necesita un nombre, lo cual se realiza mediante el name registration
procedimiento [nombre de host]. Cada host reserva su nombre de host en la red o se utiliza el [ nombre de host NBNS
] para este propósito. También se ha mejorado a [nombre de host] ( Windows Internet Name Service WINS
).
Como podemos imaginar, Samba ofrece una amplia gama de de configuración. De nuevo, las definimos mediante un archivo de texto donde podemos obtener una visión general de algunas de ellas. Estas opciones se ven así una vez filtradas:
Configuración
Descripción
[sharename]
El nombre del recurso compartido de red.
workgroup = WORKGROUP/DOMAIN
Grupo de trabajo que aparecerá cuando los clientes realicen consultas.
path = /path/here/
El directorio al que se le dará acceso al usuario.
server string = STRING
La cadena que aparecerá cuando se inicie una conexión.
unix password sync = yes
¿Sincronizar la contraseña de UNIX con la contraseña de SMB?
usershare allow guests = yes
¿Permitir que usuarios no autenticados accedan al recurso compartido definido?
map to guest = bad user
¿Qué hacer cuando una solicitud de inicio de sesión de usuario no coincide con un usuario UNIX válido?
browseable = yes
¿Esta acción debería aparecer en la lista de acciones disponibles?
guest ok = yes
¿Permitir conectarse al servicio sin usar una contraseña?
read only = yes
¿Permitir a los usuarios leer sólo archivos?
create mask = 0700
¿Qué permisos deben configurarse para los archivos recién creados?
Algunas de las configuraciones anteriores ya incluyen opciones sensibles. Sin embargo, supongamos que cuestionamos las configuraciones que se enumeran a continuación y nos preguntamos qué podrían obtener de ellas tanto los empleados como los atacantes. En ese caso, veremos sus ventajas y desventajas. Tomemos esta configuración browseable = yes
como ejemplo. Si nosotros, como administradores, adoptamos esta configuración, los empleados de la empresa podrán consultar fácilmente cada carpeta con su contenido. Muchas carpetas se utilizan para una mejor organización y estructura. Si el empleado puede explorar los recursos compartidos, el atacante también podrá hacerlo tras acceder con éxito.
Configuración
Descripción
browseable = yes
¿Permitir listar acciones disponibles en el share actual?
read only = no
¿Prohibir la creación y modificación de archivos?
writable = yes
¿Permitir a los usuarios crear y modificar archivos?
guest ok = yes
¿Permitir conectarse al servicio sin usar una contraseña?
enable privileges = yes
¿Se asignan privilegios de honor a un SID específico?
create mask = 0777
¿Qué permisos se deben asignar a los archivos recién creados?
directory mask = 0777
¿Qué permisos se deben asignar a los directorios recién creados?
logon script = script.sh
¿Qué script debe ejecutarse al iniciar sesión el usuario?
magic script = script.sh
¿Qué script debe ejecutarse cuando se cierra el script?
magic output = script.out
¿Dónde debe almacenarse la salida del script mágico?
Ahora podemos mostrar una lista ( -L
) de los recursos compartidos del servidor con el smbclient
comando de nuestro host. Usamos el comando null session
( -N
), que permite anonymous
acceder sin necesidad de introducir usuarios ni contraseñas válidas.
Para iniciar sesión e inspeccionarlo con el mismo programa cliente. Si no estamos familiarizados con el programa cliente, podemos usar el help
comando "al iniciar sesión correctamente", que lista todos los comandos posibles que podemos ejecutar.
Una vez que hayamos descubierto archivos o carpetas interesantes, podemos descargarlos mediante el get
comando. Smbclient también nos permite ejecutar comandos del sistema local usando un signo de exclamación al principio ( !<cmd>
) sin interrumpir la conexión.
Desde el punto de vista administrativo, podemos comprobar estas conexiones usando smbstatus
. Además de la versión de Samba, también podemos ver quién, desde qué host y a qué recurso compartido está conectado el cliente. Esto es especialmente importante una vez que hemos accedido a una subred (quizás incluso aislada) a la que los demás aún pueden acceder.
Por ejemplo, con seguridad a nivel de dominio, el servidor Samba actúa como miembro de un dominio de Windows. Cada dominio tiene al menos un controlador de dominio, generalmente un servidor Windows NT que proporciona autenticación de contraseñas. Este controlador de dominio proporciona al grupo de trabajo un servidor de contraseñas definitivo. Los controladores de dominio registran los usuarios y las contraseñas en sus propios [nombre del dominio] NTDS.dit
y [nombre del dominio] Security Authentication Module
( SAM
), y autentican a cada usuario cuando inicia sesión por primera vez y desea acceder al recurso compartido de otra máquina.
Volvamos a una de nuestras herramientas de enumeración. Nmap también cuenta con numerosas opciones y scripts NSE que nos permiten examinar el servicio SMB del destino con mayor detalle y obtener más información. Sin embargo, la desventaja es que estos análisis pueden tardar bastante. Por lo tanto, también se recomienda examinar el servicio manualmente, principalmente porque podemos encontrar muchos más detalles de los que Nmap podría mostrarnos. Sin embargo, primero veamos qué puede encontrar Nmap en nuestro servidor Samba de destino, donde creamos el [notes]
recurso compartido para realizar pruebas.
Los resultados muestran que Nmap no nos proporcionó mucha información. Por lo tanto, debemos recurrir a otras herramientas que nos permitan interactuar manualmente con el SMB y enviar solicitudes específicas para obtener la información. Una herramienta útil para esto es [Nombre del servidor] rpcclient
. Esta herramienta realiza funciones MS-RPC.
Consulta
Descripción
srvinfo
Información del servidor.
enumdomains
Enumerar todos los dominios que están implementados en la red.
querydominfo
Proporciona información de dominio, servidor y usuario de los dominios implementados.
netshareenumall
Enumera todas las acciones disponibles.
netsharegetinfo <share>
Proporciona información sobre una acción específica.
enumdomusers
Enumera todos los usuarios del dominio.
queryuser <RID>
Proporciona información sobre un usuario específico.
Estos ejemplos nos muestran qué información puede filtrarse a usuarios anónimos. Una vez que un anonymous
usuario accede a un servicio de red, basta con un error para otorgarle demasiados permisos o demasiada visibilidad y poner en riesgo significativamente toda la red.
Y lo que es más importante, el acceso anónimo a dichos servicios también puede permitir el descubrimiento de otros usuarios, quienes pueden ser atacados mediante fuerza bruta en el caso más agresivo. Los humanos son más propensos a errores que los procesos informáticos correctamente configurados, y la falta de concienciación sobre la seguridad y la pereza a menudo resultan en contraseñas débiles que se pueden descifrar fácilmente. Veamos cómo podemos enumerar usuarios usando el rpcclient
.
Luego podemos usar los resultados para identificar el RID del grupo, que luego podemos usar para recuperar información de todo el grupo.
Sin embargo, también puede ocurrir que no todos los comandos estén disponibles y que existan ciertas restricciones según el usuario. No obstante, la consulta queryuser <RID>
se permite principalmente según el RID. Por lo tanto, podemos usar rpcclient para forzar los RID y obtener información. Dado que es posible que no sepamos a quién se le ha asignado cada RID, sabemos que obtendremos información al respecto en cuanto consultemos un RID asignado. Existen varias maneras y herramientas para esto. Para continuar con la herramienta, podemos crear un For-loop
using Bash
donde enviamos un comando al servicio usando rpcclient y filtramos los resultados.
La ( RPC
RPC) es un concepto y, por lo tanto, una herramienta fundamental para implementar estructuras operativas y de trabajo compartido en redes y arquitecturas cliente-servidor. El proceso de comunicación mediante RPC incluye el paso de parámetros y la devolución de un valor de función.
Nos ofrece rpcclient
diversas solicitudes con las que podemos ejecutar funciones específicas en el servidor SMB para obtener información. Puede encontrar una lista completa de todas estas funciones en la de rpcclient.
Una alternativa a esto sería un script de Python de llamado .
La información que ya hemos obtenido rpcclient
también puede obtenerse con otras herramientas. Por ejemplo, las herramientas y también son ampliamente utilizadas y útiles para la enumeración de servicios SMB.
Otra herramienta que vale la pena mencionar es , basada en una herramienta más antigua, enum4linux. Esta herramienta automatiza muchas de las consultas, pero no todas, y puede devolver una gran cantidad de información.