¿Cómo funciona la firma SMB? [cerrado]

2

La firma SMB se utiliza para evitar la modificación ilegítima en los paquetes SMB. También se usa para prevenir ataques como el relevo SMB.

No hay mucha documentación sobre la firma de SMB. Lo único que entiendo de esto es que se utiliza una clave de sesión para cifrar estos paquetes, pero no sé cómo se genera y qué se cifra realmente.

¿Tienes más información al respecto?

Gracias.

    
pregunta Duke Nukem 20.02.2017 - 10:14
fuente

1 respuesta

0

Uno de los proyectos de iOS en los que he estado trabajando en la comunicación requerida con impresoras a través de SMB. Como resultado, iOS no tiene absolutamente ningún soporte para SMB. Existen soluciones para Linux y Android, pero la conversión de cualquiera de ellas a iOS parece ser una tarea difícil. Después de varios intentos, terminé implementando SMB yo mismo. Luego extraje ese código como un proyecto separado (smb4ios). Aquí hay algo de documentación, en caso de que esté interesado en cómo funciona SMB.

En primer lugar, ¿qué es SMB. Inicialmente (como en la década de 1980) era un protocolo para acceder a archivos compartidos. Desde entonces, los recursos compartidos de archivos evolucionaron mucho, pero SMB no lo hizo. ¿Por qué sigue siendo relevante entonces, preguntas? Porque es una parte integral de Windows. No hay un "estándar SMB", solo hay "la forma en que funciona SMB en Windows". Entonces, cuando hablamos de SMB, estamos interesados no solo en SMB (capa del sistema de archivos), sino también en NetBIOS (capa de transporte), NTLM (autenticación) y RPC. A estas alturas ya están unidas entre sí, formando una monstruosa criatura de cebolla antigua en capas. Por lo tanto, desde la perspectiva de la implementación, tendrá que lidiar con todos ellos simultáneamente.

Comencemos con TCP. TCP es un protocolo de red de bajo nivel. Cuando desee enviar algunos datos a la red y a otras computadoras, cree un socket TCP, conéctelo a una dirección y atasque los datos allí. El zócalo se encarga del embalaje y la entrega.

SMB es un protocolo de transporte, algo así como HTTP. Debe saber que HTTP es básicamente cuando enviamos información adicional a través de TCP para describir qué tipo de contenido se intercambiará. SMB es el mismo, pero sobre NetBIOS.

NetBIOS es básicamente una versión muy antigua de TCP. OSX y iOS no tienen una implementación para ello. Afortunadamente, es simple y se puede implementar sobre TCP. Por lo tanto, este código es SMB sobre NetBIOS sobre TCP (también conocido como NBT).

SMB también se llamaba CIFS en algún punto, son lo mismo. También hay SMB 2, que no funciona en Windows XP, por lo que es irrelevante para mí.

Ahora, lo primero que necesitamos es encontrar los servidores SMB en nuestra red. Eso se hace por consultas de nombres NetBIOS. Básicamente, envía una transmisión UDP a una dirección de transmisión (como 255.255.255.255) y pregunta "¿Quién tiene este nombre?". Entonces alguien en la red puede responder con su IP. Hay un tipo principal en la red NetBIOS con un nombre predefinido "navegador maestro", primero le pedimos su IP. Luego podemos preguntarle a quién más sabe, y así es como obtenemos los dominios y grupos y las direcciones IP de los servidores.

Ahora que tenemos una IP, podemos conectarle un socket TCP y ejecutar mensajes SMB.

Lo primero que querrá el servidor es que iniciemos sesión con algún usuario. Usted hace el inicio de sesión enviando paquetes NTLM dentro de los mensajes de la sesión SMB.

NTLM es cuando se utiliza una criptografía extremadamente complicada para codificar y descodificar el nombre de usuario, la contraseña, etc. Para eso usé una biblioteca de terceros (vea el enlace a continuación).

Después de iniciar sesión, básicamente ha abierto una sesión remota con una máquina con Windows y puede ejecutar las funciones de la API de Windows como lo haría normalmente, si fuera una aplicación de Windows C ++. Lo haces enviando comandos RPC dentro de los mensajes de Transacción SMB.

En resumen: RPC es un código de función de la API de Windows más un búfer de parámetros, que se ajusta en el mensaje SMB. Puede llamar a funciones como EnumAll, OpenPrinter, etc.

Más detalles: Normalmente, para llamar a una función con ciertos parámetros, debe empujar estos parámetros para apilarlos. Lo que lógicamente significa todas las estructuras y variables de C ordenadas con las que usted, el humano, trabaja, están empaquetadas en un búfer de memoria y luego ese búfer se desempaqueta en el mismo patrón de estructuras y cosas dentro de la función (no es lo que realmente sucede). En RPC, simplemente proporciona el código de función y el búfer. Lo que para algunas personas significa que debe replicar las estructuras C y luego empacarlas de la misma manera. Pero en mi opinión, nada le impide simplemente descargar sus datos directamente en bytes, siempre que el resultado binario final sea el mismo.

Y así es como funciona: usted encuentra IP con NetBIOS, se conecta a través de SMB, envía la autenticación NTLM y luego ejecuta los comandos RPC. Use Wireshark, es una gran ayuda y no estaría en ninguna parte sin él.

Referencias:

SMB: [MS-SMB] en enlace RAP: [MS-RAP] en enlace DCE-RPC: enlace NetBIOS: RFC 1001 y 1002 (te animo a que lo leas y no te vuelvas loco), enlace NTLM: enlace (la biblioteca que utilicé)

    
respondido por el kaplangoz 20.02.2017 - 11:41
fuente

Lea otras preguntas en las etiquetas