SMB
Last updated
Last updated
SMB es un protocolo cliente-servidor que regula el acceso a archivos y directorios, así como otros recursos de red como impresoras, routers o interfaces disponibles en la red. También permite el intercambio de información entre procesos de sistema distintos. SMB se hizo disponible al público en general, por ejemplo, como parte del sistema operativo de red OS/2 LAN Manager y LAN Server. Desde entonces, su aplicación principal ha sido en los sistemas operativos Windows, cuyos servicios de red soportan SMB de manera compatible hacia atrás, lo que significa que los dispositivos con versiones más recientes pueden comunicarse fácilmente con dispositivos que tengan un sistema operativo Microsoft más antiguo. Con el proyecto de software libre Samba, también hay una solución que permite el uso de SMB en distribuciones de Linux y Unix, facilitando la comunicación entre plataformas a través de SMB.
El protocolo SMB permite que el cliente se comunique con otros participantes en la misma red para acceder a archivos o servicios compartidos en la red. El otro sistema también debe haber implementado el protocolo de red y procesado la solicitud del cliente usando una aplicación de servidor SMB. Antes de eso, ambas partes deben establecer una conexión, por lo que primero intercambian mensajes correspondientes.
En redes IP, SMB utiliza el protocolo TCP para esto, el cual proporciona un apretón de manos de tres vías entre el cliente y el servidor antes de que se establezca finalmente una conexión. Las especificaciones del protocolo TCP también regulan el transporte de datos posterior. Veamos 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 en el servidor. Los derechos de acceso se definen mediante Listas de Control de Acceso (ACL). Estas pueden ser controladas de manera detallada basándose en atributos como ejecutar, leer y acceso total para usuarios individuales o grupos de usuarios. Las ACL se definen basándose en los recursos compartidos y, por lo tanto, no corresponden a los derechos asignados localmente en el servidor.
Como se mencionó anteriormente, existe una variante alternativa del servidor SMB llamada Samba, desarrollada para sistemas operativos basados en Unix. Samba implementa el protocolo de red Common Internet File System (CIFS). CIFS es un "dialecto" de SMB. En otras palabras, CIFS es una implementación muy específica del protocolo SMB, que a su vez fue creado por Microsoft. Esto permite que Samba se comunique con sistemas Windows más recientes. Por lo tanto, generalmente se refiere a SMB/CIFS. Sin embargo, CIFS es una extensión del protocolo SMB. Así que cuando enviamos comandos SMB a través de Samba a un servicio NetBIOS más antiguo, generalmente se conecta al servidor Samba a través de los puertos TCP 137, 138, 139, pero CIFS usa únicamente el puerto TCP 445. Existen varias versiones de SMB, incluidas versiones obsoletas que todavía se usan en infraestructuras específicas.
Con la versión 3, el servidor Samba adquirió la capacidad de ser un miembro completo de un dominio de Active Directory. Con la versión 4, Samba incluso proporciona un controlador de dominio Active Directory. Contiene varios llamados daemons para este propósito, que son programas en segundo plano de Unix. 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 funcionalidades. El servicio SMB controla estos dos programas en segundo plano.
Sabemos que Samba es adecuado tanto para sistemas Linux como Windows. En una red, cada host participa en el mismo grupo de trabajo. Un grupo de trabajo es un nombre de grupo que identifica una colección arbitraria de computadoras y sus recursos en una red SMB. Puede haber múltiples grupos de trabajo en la red en cualquier momento. IBM desarrolló una interfaz de programación de aplicaciones (API) para redes de computadoras llamada Network Basic Input/Output System (NetBIOS). La API NetBIOS proporcionó un esquema para que una aplicación se conectara y compartiera datos con otras computadoras. En un entorno NetBIOS, cuando una máquina se conecta a la red, necesita un nombre, lo cual se realiza a través del llamado procedimiento de registro de nombres. Cada host reserva su nombre de host en la red o se utiliza el NetBIOS Name Server (NBNS) para este propósito. También se ha mejorado a Windows Internet Name Service (WINS).
Como podemos imaginar, Samba ofrece una amplia gama de configuraciones que podemos ajustar. Estas configuraciones se definen a través de un archivo de texto donde podemos obtener una visión general de algunos de los ajustes. Estos ajustes lucen de la siguiente manera cuando se filtran:
Vemos configuraciones globales y dos recursos compartidos destinados a impresoras. Las configuraciones globales son la configuración del servidor SMB disponible que se utiliza para todos los recursos compartidos. En los recursos compartidos individuales, sin embargo, las configuraciones globales pueden ser sobrescritas, lo que puede configurarse con alta probabilidad de manera incorrecta. Veamos algunos de los ajustes para entender cómo se configuran los recursos compartidos en Samba.
Algunas de las configuraciones anteriores ya presentan opciones sensibles. Sin embargo, si cuestionamos las siguientes configuraciones y analizamos lo que los empleados y los atacantes podrían obtener de ellas, veremos las ventajas y desventajas que presentan. Tomemos como ejemplo la configuración browseable = yes
. Si los administradores adoptan esta configuración, los empleados de la empresa tendrán la comodidad de poder ver las carpetas individuales con el contenido. Muchas carpetas se usan eventualmente para una mejor organización y estructura. Si el empleado puede explorar los recursos compartidos, el atacante también podrá hacerlo después de obtener acceso exitoso.
Vamos a crear un recurso compartido llamado [notes]
y algunos otros para ver cómo afectan nuestros procesos de enumeración. Usaremos todas las configuraciones anteriores y las aplicaremos a este recurso compartido. Por ejemplo, esta configuración se aplica a menudo, incluso solo con fines de prueba. Si se trata de una subred interna de un pequeño equipo en un gran departamento, esta configuración a menudo se conserva o se olvida reiniciar. Esto lleva a que podamos explorar todos los recursos compartidos y, con alta probabilidad, incluso descargarlos e inspeccionarlos.
Es altamente recomendable consultar las páginas del manual de Samba y configurar por nosotros mismos y experimentar con los ajustes. Así descubriremos aspectos potencialmente interesantes para nosotros como testers de penetración. Además, cuanto más familiarizados estemos con el servidor Samba y SMB, más fácil será orientarnos en el entorno y utilizarlo para nuestros propósitos. Una vez que hayamos ajustado /etc/samba/smb.conf
según nuestras necesidades, debemos reiniciar el servicio en el servidor.
Para reiniciar el servicio Samba, ejecutamos el siguiente comando:
Ahora podemos mostrar una lista (-L) de los recursos compartidos del servidor usando el comando smbclient
desde nuestro host. Utilizamos la llamada sesión nula (-N), que es un acceso anónimo sin la necesidad de introducir usuarios existentes o contraseñas válidas.
Resultado:
Vemos que ahora tenemos cinco recursos compartidos diferentes en el servidor Samba. print$
e IPC$
están incluidos por defecto en la configuración básica, como ya hemos visto. Dado que estamos tratando con el recurso compartido [notes]
, iniciemos sesión e inspeccionemos el recurso usando el mismo programa cliente. Si no estamos familiarizados con el programa cliente, podemos usar el comando help
después de iniciar sesión con éxito, para listar todos los comandos posibles que podemos ejecutar.
[notes]
Resultado:
Comandos disponibles:
Para ver el contenido del recurso compartido, usamos el comando ls
:
Resultado:
Una vez que descubrimos archivos o carpetas interesantes, podemos descargarlos usando el comando get
. smbclient
también permite ejecutar comandos del sistema local usando un signo de exclamación al principio (!<cmd>) sin interrumpir la conexión.
Resultado:
Para verificar los archivos descargados localmente:
Resultado:
Para ver el contenido del archivo:
Resultado:
Desde el punto de vista administrativo, podemos verificar 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 ingresado a una subred (quizás incluso una aislada) a la que otros aún pueden acceder.
Resultado:
Volvamos a una de nuestras herramientas de enumeración. Nmap también tiene muchas opciones y scripts NSE que pueden ayudarnos a examinar el servicio SMB del objetivo con más detalle y obtener más información. Sin embargo, la desventaja es que estos escaneos pueden tardar mucho tiempo. Por lo tanto, también se recomienda revisar el servicio manualmente, principalmente porque podemos encontrar muchos más detalles de los que Nmap podría mostrar. Primero, veamos qué puede encontrar Nmap en nuestro servidor Samba, donde creamos el recurso compartido [notes]
para fines de prueba.
Resultado:
Podemos ver que los resultados de Nmap no ofrecen mucha información. Por lo tanto, deberíamos recurrir a otras herramientas que nos permitan interactuar manualmente con el SMB y enviar solicitudes específicas para obtener información. Una de las herramientas útiles para esto es rpcclient
, que es una herramienta para realizar funciones MS-RPC.
El Remote Procedure Call (RPC) es un concepto y también una herramienta central para realizar estructuras operativas y de trabajo en redes y arquitecturas cliente-servidor. El proceso de comunicación a través de RPC incluye el paso de parámetros y el retorno de un valor de función.
Para usar rpcclient
, ejecutamos el siguiente comando:
Resultado:
El rpcclient
nos ofrece muchas solicitudes diferentes con las que podemos ejecutar funciones específicas en el servidor SMB para obtener información. A continuación, una lista de algunas de estas funciones:
Consultas
Resultado:
Resultado:
Resultado:
Resultado:
Resultado:
Estos ejemplos muestran qué información puede ser filtrada a usuarios anónimos. Una vez que un usuario anónimo tiene acceso a un servicio de red, solo se necesita un error para darle demasiados permisos o demasiada visibilidad y poner toda la red en un riesgo significativo.
Lo más importante es que el acceso anónimo a tales servicios también puede llevar al descubrimiento de otros usuarios, quienes pueden ser atacados con fuerza bruta en el caso más agresivo. Los humanos son más propensos a cometer errores que los procesos informáticos correctamente configurados, y la falta de conciencia de seguridad y la pereza a menudo conducen a contraseñas débiles que pueden ser fácilmente descifradas. Veamos cómo podemos enumerar usuarios usando rpcclient
.
Para enumerar los usuarios usando rpcclient
, se utilizan los siguientes comandos:
Resultado:
Para obtener más detalles sobre un usuario específico, usamos el comando queryuser <RID>
:
Resultado:
Resultado:
Para obtener información sobre el grupo al que pertenecen los usuarios, usamos el siguiente comando:
Resultado:
Si no conocemos los RIDs asignados, podemos realizar una fuerza bruta de los RIDs para obtener información. Aquí hay un ejemplo usando un bucle en Bash:
Resultado:
samrdump.py
Otra herramienta útil es el script samrdump.py
de Impacket, que puede proporcionar información de usuarios:
Resultado:
SMBMap
Para enumerar los recursos compartidos y sus permisos:
Resultado:
CrackMapExec
Para enumerar los recursos compartidos con CrackMapExec:
Resultado:
Una herramienta adicional que vale la pena mencionar es enum4linux-ng
, que automatiza muchas de las consultas y puede proporcionar una gran cantidad de información sobre servicios SMB.
Para instalar enum4linux-ng
, sigue estos pasos:
Para realizar una enumeración completa, utiliza el siguiente comando:
Resultado:
Nota: Es importante usar más de una herramienta para la enumeración, ya que puede suceder que diferentes herramientas proporcionen información variada. Por lo tanto, no debes confiar únicamente en herramientas automatizadas sin comprender cómo están programadas.
Consulta | Descripción |
---|---|
Versión SMB
Soportado en
Características
CIFS
Windows NT 4.0
Comunicación a través de la interfaz NetBIOS
SMB 1.0
Windows 2000
Conexión directa a través de TCP
SMB 2.0
Windows Vista, Windows Server 2008
Mejoras en el rendimiento, firma de mensajes mejorada, función de almacenamiento en caché
SMB 2.1
Windows 7, Windows Server 2008 R2
Mecanismos de bloqueo
SMB 3.0
Windows 8, Windows Server 2012
Conexiones multicanal, cifrado de extremo a extremo, acceso a almacenamiento remoto
SMB 3.0.2
Windows 8.1, Windows Server 2012 R2
-
SMB 3.1.1
Windows 10, Windows Server 2016
Verificación de integridad, cifrado AES-128
Configuración
Descripción
[sharename]
El nombre del recurso compartido en la red.
workgroup = WORKGROUP/DOMAIN
Grupo de trabajo que aparecerá cuando los clientes consulten.
path = /path/here/
El directorio al que se debe 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 UNIX con la contraseña 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 no coincide con un usuario UNIX válido?
browseable = yes
¿Debería mostrarse este recurso compartido en la lista de recursos disponibles?
guest ok = yes
¿Permitir conectar al servicio sin usar una contraseña?
read only = yes
¿Permitir que los usuarios solo lean archivos?
create mask = 0700
¿Qué permisos deben asignarse a los archivos recién creados?
Configuración
Descripción
browseable = yes
¿Permitir listar los recursos compartidos disponibles en el recurso 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 conectar al servicio sin usar una contraseña?
enable privileges = yes
¿Honrar los privilegios asignados a SID específicos?
create mask = 0777
¿Qué permisos deben asignarse a los archivos recién creados?
directory mask = 0777
¿Qué permisos deben asignarse a los directorios recién creados?
logon script = script.sh
¿Qué script debe ejecutarse al iniciar sesión del usuario?
magic script = script.sh
¿Qué script debe ejecutarse cuando se cierre el script?
magic output = script.out
¿Dónde se debe almacenar la salida del script mágico?
srvinfo
Información del servidor.
enumdomains
Enumera todos los dominios desplegados en la red.
querydominfo
Proporciona información sobre dominio, servidor y usuario de los dominios desplegados.
netshareenumall
Enumera todos los recursos compartidos disponibles.
netsharegetinfo <share>
Proporciona información sobre un recurso compartido específico.
enumdomusers
Enumera todos los usuarios del dominio.
queryuser <RID>
Proporciona información sobre un usuario específico.