Previous Contents Next

12   Corrigé du DS du 22 janvier 2003

La durée de ce contrôle est de deux heures, tous les documents sont autorisés (y compris ordinateurs).

Le barème probable est de 8 points pour les questions sur X11 et de 12 points pour l'exercice sur XDMCP. Attention si les questions sur X11 ont le même poid, les questions de l'exercice valent 2 points sauf la quatrième question comptant, elle, pour 4 points.

12.1   Questions sur X11

Le contexte des questions est le suivant : vous souhaitez lancer un serveur X11 de type Xnest sur la machine gayant05 avec son affichage déporté sur la machine lyderic03 et quémandant une session à la machine phinaert12. Voici les questions :
  1. Que faut-il faire pour permettre le déport d'affichage (donnez les commandes à taper) ?
    La méthode la moins sécurisée consiste à taper la commande xhost +gayant05 sur la machine lyderic03. Le gros défaut de cette méthode est qu'elle autorise tous les utilisateurs de gayant05 à utiliser le serveur X11 de lyderic03. La méthode à préférer est de taper xauth list sur lyderic03 sous votre compte et de récupérer la ligne correspondant à l'écran X11 de nom lyderic03:0. Il faut alors faire un xauth add sous votre compte sur la machine gayant05 en ajoutant en fin de commande ce que vous avez récupéré de la précédente commande. Le plus simple est d'utiliser le copier-coller d'une fenêtre de commandes de gayant05 vers une connexion ssh sur la machine lyderic03 (ou inversement). Dans les deux cas, il faut avertir les applications X11 de gayant05 que l'affichage doit se faire sur le serveur X11 de lyderic03. Le mieux est d'utiliser la commande Bourne Shell suivante :
    gayant05$ export DISPLAY=lyderic03:0
    
  2. Quelle est la ligne de commande à taper pour lancer le serveur Xnest ?
    Un exemple de commande est :
    gayant05$ Xnest :2 -query phinaert12
    
  3. On suppose que vous vous connectez dans ce nouvel écran X11 sous le même compte que votre compte courant. Comment devez-vous vous y prendre pour vous autoriser à lancer un client X11 sur le serveur Xnest à partir d'une machine clodion10 sous laquelle vous vous connectez également avec votre compte classique de l'école ?
    En fait il n'y a rien à faire pour que la permission vous soit accordée, en effet les autorisations X11 sont écrites dans le fichier .Xauthority sous votre racine. Comme vous avez le même répertoire principal sous le serveur Xnest et sous la machine clodion10 (montage NFS) les deux autorisations se trouvent dans le même fichier .Xauthority. Du coup vous avez les permissions pour les deux écrans dans les deux environnements.
  4. Comment faites vous pour envoyer le client X11 xeyes sur l'écran du serveur Xnest à partir de la machine clodion10 ? Sur quel écran physique cette application s'affiche-t-elle ?
    Il suffit de taper la commande :
    clodion10$ xeyes -display gayant05:2
    
    Les yeux vont s'afficher sur l'écran de la machine lyderic03.
  5. Quel est le résultat de la commande hostname tapée dans une fenêtre de commandes du serveur Xnest ? Comment faire, à partir de la même fenêtre, pour détruire les yeux qui vous zyeutent ?
    Le serveur X11 Xnest est sous le contrôle du serveur de session de la machine phinaert12, donc le résultat de la commande sera aussi phinaert12. Pour détruire l'application il faut se connecter par ssh sur la machine clodion10 et, par exemple, taper killall xeyes.

12.2   Exercice sur le protocole XDMCP

Voici un paquet capturé sur le réseau :
      13:03:59.635186 0:10:b5:44:a9:5 0:10:b5:3:88:44 ip 94:
      172.26.16.4.xdmcp > 172.26.17.55.33039: udp 52 (DF)
        4500 0050 0000 4000 4011 c141 ac1a 1004
        ac1a 1123 00b1 810f 003c 89ff 0001 0008
        002e 16f8 5f03 0000 0000 0012 4d49 542d
        4d41 4749 432d 434f 4f4b 4945 2d31 0010
        11a0 5f2b ae44 8633 75cd 8a73 733a 6907
Répondez aux questions suivantes :
  1. Donnez les rôles des deux machines impliquées dans cet échange en regardant uniquement les commentaires donnés par tcpdump et sans regarder les octets du paquet.
    La machine émettrice (adresse IP 172.26.16.4) utilise le port UDP XDMCP, il s'agit donc d'un serveur de sessions. La machine réceptrice (adresse IP 172.26.17.55) est un quémandeur de session.
  2. Pouvez-vous dire sur quelle machine se situe le serveur X11 concerné par ce paquet ? Justifiez-vous !
    Non, c'est impossible, il y a quelques chances que le serveur se trouve aussi sur 172.26.17.55 mais ce n'est pas certain. Les adresses IP du serveur X11 se trouvent dans le paquet XDMCP REQUEST.
  3. Décortiquez le paquet (uniquement le protocole véhiculé comme donnée UDP).
    Il s'agit d'un paquet XDMCP ACCEPT (8) indiquant que le serveur de session accepte de prendre le contrôle de l'écran X11 décrit dans le paquet REQUEST précédent. L'identifiant de session généré par le serveur de session est 0x16f85f03. Il n'y a pas de protocole d'identification entre le serveur de session et l'écran X11 par contre une méthode d'autorisation est sélectionnée pour les communications entre les clients X11 et le serveur X11. Il s'agit de la méthode MIT-MAGIC-COOKIE-1 et le cookie est 0x11a05f2bae44863375cd8a73733a6907.
  4. En supposant que l'identifiant de session, la méthode d'autorisation, la valeur d'autorisation et la taille de la valeur d'autorisation sont passées en paramètres, donnez la procédure permettant de générer le paquet décrit ci-dessus. Vous devez bien sûr utiliser les fonctions décrites dans le fichier d'entêtes xdmcp.h.
    Voici un exemple de procédure :
    XdmcpBufferPtr buildAccept(CARD32 sessionID,char *name,void *data,int size){
    XdmcpBufferPtr buffer;
    XdmcpHeader header;
    ARRAY8 authenName,authenData;
    ARRAY8 authorName,authorData;
    
    /* Allocation de mémoire pour le tampon du paquet */
    buffer=allocXDMCPBuffer();
    
    /* On commence par l'entête XDMCP */
    header.version=XDM_PROTOCOL_VERSION;
    header.opcode=(CARD16)ACCEPT;
    header.length=12+strlen(name)+size;
    XdmcpWriteHeader(buffer,&header);
    
    /* On continue par l'identifiant de session */
    XdmcpWriteCARD32(buffer,sessionID);
    
    /* On poursuit par l'identification */
    authenName.length=authenData.length=0;
    XdmcpWriteARRAY8(buffer,&authenName);
    XdmcpWriteARRAY8(buffer,&authenData);
    
    /* Le plus difficile : l'autorisation */
    authorName.length=strlen(name);
    authorName.data=(CARD8Ptr)name;
    authorData.length=size;
    authorData.data=(CARD8Ptr)data;
    XdmcpWriteARRAY8(buffer,&authorName);
    XdmcpWriteARRAY8(buffer,&authorData);
    
    /* On retourne le paquet */
    return buffer;
    }
    
    Deux points de plus pour le premier qui essaye ce code et qui me donne les éventuelles erreurs qu'il contient.
  5. En supposant que le paquet donné est récupéré sur le réseau de l'école en fonctionnement normal, donnez la marche à suivre pour pirater l'écran du pauvre malheureux ITEC1 à l'origine du paquet.
    En fonctionnement normal un tel paquet ne peut être récupéré que sur l'interface loopback d'une machine de TP. En effet sur ces machines tournent, à la fois, un serveur de sessions et un quémandeur de session (intégré au serveur X11). On doit donc trouver un paquet avec l'émetteur identique au récepteur. Pour exploiter le paquet, il suffit de récupérer les données de l'autorisation (les 16 derniers octets) et de l'ajouter à son propre fichier .Xauthority en utilisant la commande xauth add. Comme numéro d'écran X11 il faut prendre l'adresse IP de la machine où le paquet a été récupéré et le suffixer de :0. Comme type d'autorisation il faut utiliser MIT-MAGIC-COOKIE-1.

Previous Contents Next