IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual C++ Discussion :

Le protocole SMB/CIFS sur NBT (Netbios)


Sujet :

Visual C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Par défaut Le protocole SMB/CIFS sur NBT (Netbios)
    Bonjour à tous,

    depuis 2j (sans rire) j'écume internet dans l'espoir de trouver des infos véritablement intéressantes, mieux des exemples de code pour requêter un serveur en SMB.
    Mon objectif est tout bête, je veux faire une requête d'ouverture de session sur un serveur SMB afin d'obtenir le nom du serveur, son OS et les quelques informations qui sont transmises dans la réponse du serveur SMB à la requête de négo.
    Je n'ai RIEN trouvé ! Ou plutôt si j'ai des tas d'infos sur le protocole SMB, je sais exactement ce qu'il faut faire, mais je ne sais pas comment faire.
    Ce qui me trouble le plus c'est d'arriver à ouvrir une session NetBios sur NBT. Quelle est l'API à utiliser ? Quelle est la méthode ? etc... Microsoft est très peu loquace sur le sujet.
    Je veux :
    1 - ouvrir une socket (a priori c'est OK avec WSA)
    2 - ouvrir une session NetBios NBT avec le serveur
    3 - ouvrir une session SMB (a priori c'est OK aussi).

    Il me manque donc l'étape 2. Je sais comment formater les paquets SMB et je n'ai même pas besoin d'aller jusqu'au bout de l'ouverture de session, seulement récupérer le 2ème paquet SMB.

    Bref j'ai vraiment besoin d'aide pour faire ca sous Windows...

    Merci à celui qui saura m'aider !!
    Tristan

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Bonjour,

    Citation Envoyé par esteban Voir le message
    Ce qui me trouble le plus c'est d'arriver à ouvrir une session NetBios sur NBT. Quelle est l'API à utiliser ? Quelle est la méthode ? etc... Microsoft est très peu loquace sur le sujet.
    Je veux :
    1 - ouvrir une socket (a priori c'est OK avec WSA)
    2 - ouvrir une session NetBios NBT avec le serveur
    3 - ouvrir une session SMB (a priori c'est OK aussi).

    Il me manque donc l'étape 2. Je sais comment formater les paquets SMB et je n'ai même pas besoin d'aller jusqu'au bout de l'ouverture de session, seulement récupérer le 2ème paquet SMB.
    En qui concerne l'API, c'est simple: il n'y en a pas. Si tu veux dialoguer avec un serveur SMB, il faut tout réimplémenter toi-même.

    En ce qui concerne ta question à propos de NetBIOS, en fait tu n'as pas réellement besoin "d'ouvrir une session NetBIOS" pour communiquer avec un serveur SMB.

    Si ce qui t’ennuie est de savoir ce que tu dois implémenter "sous" (au niveau inférieur) SMB, la réponse est simple: Implémente uniquement NBSS (NetBIOS session service).

    Depuis Windows 2000, SMB (et SMB2) est quasiment uniquement utilisé sur TCP. Au dessus de TCP tu as l'en-tête NBSS suivi du paquet SMB.

    NBSS (Dans le cadre de SMB over TCP) est réduit à sa plus simple expression: C'est un simple mot de 32 bits qui donne la taille du paquet SMB (taille donné en big endian, octet de poids fort à 0, donc taille réelle donnée sur 24 bits). C'est défini dans la spécification officielle de SMB au chapitre 2.1 (Transport) bien que la doc ne fasse pas mention explicite de NBSS.

    J'ai attaché une capture pour que ce soit plus explicite. Il s'agit d'un paquet SMB Nego sur TCP. NBSS est montré dans la capture (sur 32 bits) c'est le mot à 0x0000009B. La paquet SMB suit directement.

    Note que tu peux très bien envoyer un paquet SMB Nego sur le port 445 directement, sans passer par le 139. L'avantage du port 139 est qu'il répond par la négative si le service SMB n'est pas disponible (sur le 445), mais c'est vraiment très rare d'avoir SMB complétement désactivé. Au pire tu le verras par le fait que ton socket ne se connecte pas.

    N'hésites pas si tu as d'autres questions, ayant pas mal travaillé sur SMB (et SMB2) je devrais pouvoir t'aider.
    Images attachées Images attachées  

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Par défaut
    Salut Neitsa,

    je te remercie beaucoup pour ta réponse. J'ai réussi à bricoler un truc depuis mais grâce à ton aide je vais pouvoir faire quelque chose de beaucoup plus propre.
    Aurais-tu des fichiers d'en-tête à me fournir décrivant l'en-tête SMB pour la négo ?
    J'ai un problème en particulier c'est que je n'arrive pas à situer de manière fiable le début de la partie Security blob et les messages sur l'identification du serveur et de la machine. Certaines longueurs sont variables et les descriptions de la doc MS sont un peu floues je trouve.

    Je te remercie.

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Bonjour,

    Citation Envoyé par esteban Voir le message
    Aurais-tu des fichiers d'en-tête à me fournir décrivant l'en-tête SMB pour la négo ?
    Je suis désolé, je ne dispose pas d'en-tête librement disponible. Par conte, si jamais tu commences une implémentation je serais ravi de bosser avec toi-dessus ou de t'aider si tu coinces.

    J'ai un problème en particulier c'est que je n'arrive pas à situer de manière fiable le début de la partie Security blob et les messages sur l'identification du serveur et de la machine. Certaines longueurs sont variables et les descriptions de la doc MS sont un peu floues je trouve.
    Le paquet de réponse SMB_COM_NEGOTIATE est, dans sa version de base, disponible au chapitre 2.2.4.52.2 de la spécification MS-CIFS.

    Ceci dit, c'est le paquet de "base". Bien souvent c'est le paquet en "extended security" qui est utilisé.

    "Extended security" est utilisé si:
    - Le champs Flags2 du SMB_HEADER indique que "Extended Security" doit être utilisé (SMB_FLAGS2_EXTENDED_SECURITY).
    - Le dialecte choisi est de type "NT LAN MAN"

    En réalité c'est souvent le cas, mais mieux vaut prévoir les deux possibilités. Note que tu n'as un blob de sécurité que si "Extended Security" est choisi.

    Le paquet de réponse SMB_COM_NEGOTIATE dans sa version étendue est disponible au chapitre 2.2.4.5.2.1 de la spécification MS-SMB.

    Pour trouver le security blob:
    - Tu sautes d'abord le SMB_HEADER, tu es alors à la base du paquet SMB_COM_NEGOTIATE.
    - Tu prends le champ WordCount et tu le multiplie par sizeof(USHORT). Le résultat est un offset (depuis la base du paquet SMB_COM_NEGOTIATE, pas depuis le SMB_HEADER) vers les données SMB_Data.
    -SMB_Data est composé d'un champ ByteCount qui donne le nombre d'octets dans le payload (la "charge" intéressante).
    - Depuis la base de SMB_Data tu ajoutes: sizeof(USHORT) + sizeof(GUID).
    - sizeof(USHORT): taille du bytecount
    - sizeof(GUID): taille du GUID (c'est un UUID, donc 0x10 octets).
    - Maintenant tu es sur le champ "blob".

    Le blob est un paquet GSS-API documenté dans la RFC 2743. C'est peut être un peu compliqué à mettre en place puisqu'il faudra un parseur ASN.1 BER si tu désires le parser correctement. La majorité du paquet est constituée d'OIDs (encapsulés dans du ASN.1 BER)

    Note que déjà, avec cette réponse, tu peux avoir l'heure du serveur et son "timezone". Ce qui est déjà intéressant pour un "ping SMB". Pour avoir le type de la machine il faut passer au paquet suivant, la requête SMB_COM_SESSION_SETUP_ANDX, où tu pourra récupérer le type d'OS, son LAN Manager et son nom de domaine.

    N'hésites pas si tu veux des précisions ou si je n'ai pas été très clair. Bon code

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Par défaut
    Salut Neitsa,

    désolé je n'avais pas été averti que tu m'avais répondu ! Ta réponse est super, je me replonge immédiatement dans tout ca avec les docs qui vont bien !

    Mon but est assez précis et lié directement à un besoin précis. Je dois récupérer le nom d'hôte et le type d'OS de la machine, à la manière dont smbclient le fait, sauf qu'il n'y a rien de documenté chez samba et je galère trop avec la libsmbclient.

    Donc je fais du socket pour un échange de 3 ou 4 paquets et m'arrêter une fois que j'aurai les infos que je cherche.

    Si ca t'intéresse je pourrai te donner mes fichiers d'en-tête.

    @+Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Copier un fichier sur un serveur distant (SMB/CIFS)
    Par jacko842 dans le forum VB.NET
    Réponses: 1
    Dernier message: 16/01/2012, 16h20
  2. Protocole SD embarqué sur MCU
    Par pegase.90 dans le forum C
    Réponses: 3
    Dernier message: 04/10/2011, 20h29
  3. Réponses: 0
    Dernier message: 02/07/2009, 21h23
  4. Montage smb/cifs
    Par big1 dans le forum Réseau
    Réponses: 7
    Dernier message: 25/02/2009, 09h09
  5. module "protocol point à point" sur un réseau intranet
    Par guillaume2104 dans le forum Développement
    Réponses: 0
    Dernier message: 21/08/2008, 10h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo