Negociando la Variante de Protocolo
En este punto, existe ya un canal abierto entre el cliente y el servidor. A continuación, el cliente envía un mensaje al servidor para negociar un protocolo SMB. Como ya mencionamos antes, el cliente establece su campo identificador de árbol o "tree identifier" (TID) a cero, ya que no sabe todavía qué TID usar. Un identificador de árbol o TID es un número que representa una conexión a un recurso compartido en un servidor.
El comando en el mensaje es SMBnegprot, una petición para negociar una variante de protocolo que será usada durante toda la sesión. Advierte que el cliente envía al servidor una lista con todas las variantes que este puede hablar, y no vicecersa.
El servidor responde a la petición SMBnegprot con la lista de variantes que el cliente ofrece ordenada, comenzando por el índice 0, o el valor 0xFF si ninguno de los protocolos es aceptable. Continuando con nuestro ejemplo, el servidor responde con el valor 5, lo cual indica que el dialecto NT LM 0.12 es el que será usado para el resto de la sesión:
>>> NBT Packet
NBT Session
Packet Flags=0x0
Length=154
SMB PACKET: SMBnegprot (REQUEST)
SMB Command = 0x72
Error class = 0x0
Error code = 0
Flags1 = 0x0
Flags2 = 0x0
Tree ID = 0
Proc ID = 5371
UID = 0
MID = 385
Word Count = 0
Dialect=PC
NETWORK PROGRAM 1.0
Dialect=MICROSOFT NETWORKS 3.0
Dialect=DOS LM1.2X002
Dialect=DOS LANMAN2.1
Dialect=Windows for Workgroups 3.1a
Dialect=NT LM 0.12
>>> NBT Packet
NBT Session
Packet Flags=0x0
Length=69
SMB PACKET: SMBnegprot (REPLY)
SMB Command = 0x72
Error class = 0x0
Error code = 0
Flags1 = 0x0
Flags2 = 0x1
Tree ID = 0
Proc ID = 5371
UID = 0
MID = 385
Word Count = 02 [000] 05 00
Estableciendo los Parámetros de Sesión y de Logeado
El siguiente paso es transmitir los parámetros de sesión y de logeado para la sesión. Esto incluye el nombre de cuenta y contraseña (si la hay), el nombre del grupo de trabajo, el tamaño máximo de datos que se pueden transmitir, y el núemro de peticiones pendientes que pueden admitirse en situación de espera al mismo tiempo.
En el siguiente ejemplo, el comando "Session Setup" permite añadirle un comando SMB adicional. La letra X al final del nombre del comando indica esto, y el código hexadecimal del segundo comando es dado en el campo Com2. En este caso el comando es 0x75, el cual es el comando "Tree Connect" y el comando X. El mensaje SMBtconX busca el nombre del recurso en el búfer smb_buf. (Este es el último campo listado en la siguiente petición). En este ejemplo, smb_buf contiene la cadena \\ESCRIME\PUBLIC, la cual es la ruta completa a un directorio compartido en el nodo ESCRIME. Usar los comandos del tipo "y X" acelera cada transacción, ya que el servidor no tiene que esperar a que el cliente haga una segunda petición.
Advierte que el TID sigue valiendo cero todavía. El servidor proporcionará un TID al cliente una vez que la sesión haya sido establecida y una conexión haya sido realizada para el recurso solicitado. En adición, advierte que la contraseña es enviada en la apertura. Podremos cambiar esto más adelante usando contraseñas encriptadas.
>>> NBT Packet
NBT Session
Packet Flags=0x0
Length=139
SMB PACKET: SMBsesssetupX (REQUEST)
SMB Command = 0x73
Error class = 0x0
Error code = 0
Flags1 = 0x10
Flags2 = 0x0
Tree ID = 0
Proc ID = 5371
UID = 1
MID = 385
Word Count = 13
Com2=0x75
Res1=0x0
Off2=106
MaxBuffer=2920
MaxMpx=2
VcNumber=0
SessionKey=0x1FF2
CaseInsensitivePasswordLength=1
CaseSensitivePasswordLength=1
Res=0x0
Capabilities=0x1
Pass1&Pass2&Account&Domain&OS&LanMan= KRISTIN PARKSTR Windows 4.0 Windows 4.0
PassLen=2
Passwd&Path&Device=
smb_bcc=22
smb_buf[]=\\ESCRIME\PUBLIC
Relizando Conexiones a un Recurso
Como paso final, el servidor retorna un TID al cliente, indicando que el usuario tiene acceso autorizado y que el recurso está listo para ser usado. También establece el campo ServiceType al valor "A" para indicar que esto es un servicio de ficheros.Los tipos de servicios disponibles son:
- ``A para una unidad de disco o ficheros.
- ``LPT1 para un servicio de impresoras.
- ``COMM para una conexión directa a una impresora o modem.
- ``IPC para un nombre de tubería.
La salida es:
>>> NBT Packet
NBT Session
Packet Flags=0x0
Length=78
SMB PACKET: SMBsesssetupX (REPLY)
SMB Command = 0x73
Error class = 0x0
Error code = 0
Flags1 = 0x80
Flags2 = 0x1
Tree ID = 121
Proc ID = 5371
UID = 1
MID = 385
Word Count = 3
Com2=0x75
Off2=68
Action=0x1
[000] Unix Samba 1.9.1
[010] PARKSTR
SMB PACKET: SMBtconX (REPLY) (CHAINED)
smbvwv[]=
Com2=0xFF
Off2=78
smbbuf[]=
ServiceType=A:
Ahora que un TID ha sido asignado, el cliente puede proporcionar cualquier tipo de comando que sea posible usar sobre una unidad de disco. Puede abrir ficheros, leer y escribir en ellos, eliminarlos, crear nuevos, realizar búsquedas por nombre de fichero, etc.