Le fourre-tout à Geo

Aller au contenu | Aller au menu | Aller à la recherche

dimanche, août 23 2009

Trojan.PWS.Legmir.AD / W32.Ahlem.A@mm: not really a virus for me

Today, I got the scary message:



Virus alert: Run antivirus software on your computer This problem was caused by Trojan.PWS.Legmir.AD / W32.Ahlem.A@mm, a known computer virus.

To prevent this problem from occurring again, install and run an up-to-date antivirus program on your computer.

Oh, crap! I'm infected, what should I do? Quick, quick, run the AV. What, it didn't find anything? OHCRAPOHCRAPOHCRAP!

Well, let's calm down and look up the issue... W32.Ahlem.A@mm is a mass-mailing worm written in VB. It sends itself to all the contacts in the Windows address book, with an e-mail and its attachment, "a.exe".

Mmmmh, wait a minute... I create plenty of those a.exe, because I'm often too lazy to add a "-o name" to my gcc command line. Let's click on "View all problems this applies to"... Here it is, a small crashing program that I wrote, named "a.exe".

*sounds of head smashing against the keyboard*

If anyone runs into the same problem, check if you're not a developer using gcc, it helps :)

mardi, mai 19 2009

Boucher les trous du htaccess passoire

Il n'y a pas que Limit pour protéger du contenu dans un htaccess. Il y a aussi LimitExcept. Pourquoi? Parce que. L'article a plus d'un an, oui. Et pourtant, ça marche encore...

La faille

Vous venez de faire votre site web. Trop cool, vous avez votre espace à vous. Mais vous voulez peut-être une partie privée, où vous pourrez stocker, euuuuh, ce que vous voulez. Vous avez consulté les tutoriels sur internet (enfin, les premiers qui apparaissent sur google quoi...), et vous obtenez à peu près ceci:

AuthType Basic

AuthName "Accès restreint"

AuthUserFile /chemin/vers/.htpasswd

AuthGroupFile /dev/null

<Limit GET POST>

Require valid-user

</Limit>

(ceci étant dit, si votre .htaccess n'est pas dans le dossier restreint, vous pouvez jouer avec Location). Vous êtes content, vous avez restreint toutes les requêtes vers votre dossier privé. Toutes? Non! Un énorme ensemble (dénombrable) de requêtes peut encore passer: il suffit de mettre une suite de caractères sans signification à la place de GET ou POST, et Apache interprétera ça comme un GET. Et devinez quoi? Les règles de Limit ne s'appliquent qu'aux requêtes indiquées, donc GET ou POST ici. Si quelqu'un de (forcément) mal intentionné cherche à rentrer sur votre site, il n'aura qu'à envoyer "POUET /partie_privee/" au lieu de "GET /partie_privee/",et n'aura aucun mal à naviguer dans votre dossier et consulter tout votre... enfin bref.

La solution

Utilisez LimitExcept. Cette directive Apache applique les règles à toutes les requêtes sauf celles mentionnées. Donc, pour protéger votre dossier, il vous suffit d'écrire:

AuthType Basic

AuthName "Accès restreint"

AuthUserFile /chemin/vers/.htpasswd

AuthGroupFile /dev/null

<LimitExcept GET POST>

Deny from all

</LimitExcept>

<Limit GET POST>

Require valid-user

</Limit>

Et voilà! Ce htaccess enverra bouler ceux qui ne font pas des requêtes correctes.

Bon, y avait plus simple

Si vous mettez le htaccess directement dans le dossier concerné, au lieu de jouer avec Location, il suffit de mettre "require valid-user" sans s'embêter avec Limit, et toutes les requêtes devront être authentifiées.

Note: le Geo cité sur la page de GITS, c'est pas moi. Raaah, les collisions de pseudos...

vendredi, mars 27 2009

3ème forum international sur la cybercriminalité: buzzwords, FUD and boredom

Le 24 Mars a eu lieu à Lille un forum sur la cybercriminalité. Sous ce joli nom se cache en fait un rassemblement d'intervenants pour la plupart sérieux, venant apprendre aux chefs d'entreprise plein de nouveaux mots comme DoS, chiffrement ou firewall, pour qu'ils puissent ensuite taper sur leur DSI ou RSSI pour lui dire "oh, look, it's shiny, I want it, I want it!"

Plus sérieusement, la plupart des conférences n'étaient pas vraiment techniques (ça, je m'y attendais), mais on peut en retenir quelques idées:

  • L'armée française commence plus ou moins à reconnaître Internet comme étant un lieu de "bataille", comme l'air, la terre et la mer. Beaucoup d'intervenants ont insisté sur le fait qu'avant de pouvoir attaquer dans ce domaine, il faut pouvoir se défendre. Faut pas avoir fait Normale Sup' pour penser ça, mais c'est vrai qu'il y a beaucoup de travail à faire, et les ressources vont être surtout dirigées dans ce sens pour les prochaines années.
  • En fin de journée, la conférence qui m'a plu: "Biométrie, quelles applications pour l'entreprise?" La présence d'une personne de la CNIL a rendu le débat intéressant: ce n'est pas tout de mettre en place un système de reconnaissance d'empreintes digitales, iris, il faut le déclarer à la CNIL qui peut refuser si la solution est démesurée. Exemple cité par l'intervenant: une entreprise de 50 personnes ne gagne pas grand chose en remplaçant des clefs ou des cartes pour la porte d'entrée par une reconnaissance des empreintes digitales. Et garder une base des informations biométriques de tous ses employés quelque part pose bien évidemment des problèmes de vie privée. C'est pour ce genre de raisons que la CNIL a des critères assez stricts en matière de biométrie. En gros: il faut que l'utilisation soit justifiée (pas comme dans certaines cantines).
  • J'ai découvert l'existence de Dhimyotis, une autorité de certification française, située à deux pas de ma résidence étudiante.

La mention spéciale va à Websense, qui m'a bien fait rire. Globalement, ils animaient une conférence pour vendre leur solution de filtrage de contenu. Leurs arguments de vente se basaient sur des statistiques sorties du chapeau, des études qu'ils essayaient de faire passer pour des travaux de Gartner, et des killer features comme la possibilité pour l'employé de consulter Facebook depuis son poste (bah oui, Facebook, c'est Web 2.0, donc le contenu diffère entre les utilisateurs pour une même url, alors c'est dur à monitorer, qu'ils disent). Et ils ne s'arrêtent pas là! Leur système de filtrage du web utilise une base de données qui est mise à jour par leurs bots, qui explorent le web constamment. Cette base de données est envoyée dans les petites boîtes firewall qu'ils installent chez le client. Là où ça devient marrant, c'est que ces petite boîtes aident à remplir la base de données à partir du contenu filtré. Et au passage, ils ont bien réfléchi, et se sont dits que le traffic SSL, c'était embêtant, parce qu'à cause du chiffrement, on ne peut pas monitorer le traffic et protéger l'employé des menaces du web. Ils ont donc trouvé une solution très astucieuse, qui consiste à déchiffrer le contenu dans la boî-boîte, le vérifier, puis le rechiffrer pour l'envoyer sur le web. Ye who enter here, abandon all privacy.

A côté de ça, ils ont un autre produit qui, lui, est intéressant: un système fait pour empêcher la fuite de données de l'entreprise. Il suffit d'indiquer les contenus "sensibles", et le logiciel se chargera de vérifier si les données sont présentes à chaque communication, quelqu'en soit la forme (HTTP, FTP, mail, plain text, PDF, imprimante, et même SSL *hem*). Le logiciel vérifie alors si la personne recevant les informations a le droit de les consulter, et notifie l'utilisateur en cas de problème de droits.

Ca reste du monitoring sauvage des communications des employés, mais bon, si des entreprises sont capables de l'assumer et leurs employés de vivre avec, pourquoi pas. Mais ça me fait quand même rire de voir un type vendre un système comme ça avec l'argument massue "vous ne pouvez pas monitorer le contenu reçu par les employés sur Facebook, sauf avec notre système" quand on sait que Facebook n'a pas vraiment de justification comme outil de travail...

mardi, novembre 4 2008

Firegpg and character encoding

FireGPG is a Firefox extension providing GnuPG support. With it, you can encrypt, decrypt, sign, etc. inf your web browser. One of the most interesting features is the Gmail interface: you can use it to sign and verify all the mails you send through the Gmail webmail. It works great, except for a few bugs, like the problem with character encoding:

If you want to write a mail in plain (and boring) english, you use ASCII. You can sign the mail directly in the mail form, and it is sent with the 7bit encoding(ASCII). Now, if you use a bright, shiny and attractive language using accents -let's say, for the example, French- you have a problem. By default, for French talking people, Gmail will use the ISO-8859-1 charset for all the mails (and WINDOWS-1252 if I use the euro character) and will change the encoding according to the message:

  • 7bit if I don't use any accent
  • quoted printable if I use them (all the accents are escaped)

And there lies the problem: the encoding of the message changes between the moment you sign it (when you can see an "à") and the moment it is sent as quoted-printable (then, you see a "=E0"). Then, the signature doesn't match the message. In short, whenever I want to use an accent, I can't sign my mails...

BUT, Gmail developers provided a workaround (I don't think they intended it) wtih the "Outgoing message encoding" option. You just have to go in your Gmail settings, and set this option to "Use Unicode (UTF-8) encoding for outgoing messages". Now, Gmail will send all your messages in UTF-8 charset, and base64 encoding. That's magic, it works! I can sign all my mails. I must admit I don't know clearly why it would work with UTF-8 but not with other charsets, but frankly, I don't care, it works \o/

Just a small thing to note: the friend who helped me to test these encoding issues uses Claws Mail, and it looks like he can't search in the body of base64-encoded mails. But I don't care either, who would like to search for the crap I write ;)

lundi, septembre 22 2008

Get your Squid logs with logwatch

Squid is a popular web cache proxy, used to limit bandwidth usage, and monitor web access. It is really powerful and widely used (at least by me, I didn't check the statistics :P). There are many squid log analyzers around here, but it seems no one ever bothered to do a Logwatch (a generic scriptable logs analyzer) filter for Squid. Yeah, I know: "Code it!"

This article is a first try, my squid filter will surely improve over time :)

How to write a logwatch filter

The files needed

First source of information: the Logwatch website. That's not the main site, because I have admins that forbid port 81... Ok, this is what you need to write the new filter (using /etc/logwatch as root for the new files) :

  • conf/logfiles/squid.conf: the log files that will be parsed
  • conf/services/squid.conf: this is where you define the configuration options of your script
  • script/services/squid: the script to parse log files. This is where the work will be done

As always, Logwatch is really easy to use: you copy the files in your directory, you chose what log files will be analyzed, and you configure your filter.

What do you put in the files?

conf/logfiles/squid.conf

I don't know for you, but on my system, the squid logfiles are in /var/log/squid. Put this in your file:

########################################################
#   Define log file group for squid                    #
########################################################

LogFile = squid/access.log
LogFile = squid/access.log.1
#LogFile = squid/cache.log
#LogFile = squid/cache.log.1

Archive = squid/access.log.*.gz
#Archive = squid/cache.log.*.gz

I know, I'm a lazy bastard, I didn't use the cache and store log. It's a first draft, I said... A few comments:

  • access.log logs all the requests that go through Squid, and their informations (time, IP, found a file in the cache or not...)
  • cache.log contains configuration information, errors encountered, etc. It may be useful to add support for this log in my script
conf/services/squid.conf

Here is the (simple) configuration file I use:

########################################################
# Configuration file for squid filter                  #
########################################################

Title = "squid"

LogFile = squid

I'm still a lazy bastard, so I didn't define a LogFormat option. I should really add it, the logformat of access.log is tunable in the squid configuration.

script/services/squid

And then, the big ugly script which filters the logs:

#!/usr/bin/perl

use strict;
use Logwatch ':all';

my $Debug = $ENV{'LOGWATCH_DEBUG'} || 0;
my $Detail = $ENV{'LOGWATCH_DETAIL_LEVEL'} || 0;
my $DebugCounter = 0;

if ( $Debug >= 5 ) 
{
    print STDERR "\n\nDEBUG: Inside SquidCache Filter \n\n";
    $DebugCounter = 1;
} 

my %httpstatus = (
    100 => 'Continue',
    101 => 'Switching Protocols',
    102 => 'Processing',                      # WebDAV
    200 => 'OK',
    201 => 'Created',
    202 => 'Accepted',
    203 => 'Non-Authoritative Information',
    204 => 'No Content',
    205 => 'Reset Content',
    206 => 'Partial Content',
    207 => 'Multi-Status',                    # WebDAV
    300 => 'Multiple Choices',
    301 => 'Moved Permanently',
    302 => 'Found',
    303 => 'See Other',
    304 => 'Not Modified',
    305 => 'Use Proxy',
    307 => 'Temporary Redirect',
    400 => 'Bad Request',
    401 => 'Unauthorized',
    402 => 'Payment Required',
    403 => 'Forbidden',
    404 => 'Not Found',
    405 => 'Method Not Allowed',
    406 => 'Not Acceptable',
    407 => 'Proxy Authentication Required',
    408 => 'Request Timeout',
    409 => 'Conflict',
    410 => 'Gone',
    411 => 'Length Required',
    412 => 'Precondition Failed',
    413 => 'Request Entity Too Large',
    414 => 'Request-URI Too Large',
    415 => 'Unsupported Media Type',
    416 => 'Request Range Not Satisfiable',
    417 => 'Expectation Failed',
    422 => 'Unprocessable Entity',            # WebDAV
    423 => 'Locked',                          # WebDAV
    424 => 'Failed Dependency',               # WebDAV
    500 => 'Internal Server Error',
    501 => 'Not Implemented',
    502 => 'Bad Gateway',
    503 => 'Service Unavailable',
    504 => 'Gateway Timeout',
    505 => 'HTTP Version Not Supported',
    507 => 'Insufficient Storage',            # WebDAV
);

#squidstatus=>{[nb,byte,time]}

my @squidresult = (
    'TCP_HIT',
    'TCP_MISS',
    'TCP_REFRESH_HIT',
    'TCP_REF_FAIL_HIT',
    'TCP_REFRESH_MISS',
    'TCP_CLIENT_REFRESH_MISS',
    'TCP_IMS_HIT',
    'TCP_SWAPFAIL_MISS',
    'TCP_NEGATIVE_HIT',
    'TCP_MEM_HIT',
    'TCP_DENIED',
    'TCP_OFFLINE_HIT',
    'UDP_HIT',
    'UDP_MISS',
    'UDP_DENIED',
    'UDP_INVALID',
    'UDP_MISS_NOFETCH',
    'NONE',
);

my %squidstatus;

my %BWbyIP = ();
my $i = 0; 

while (defined(my $ThisLine = <STDIN>)) 
{
     if ( $Debug >= 5 ) 
    {
         print STDERR "DEBUG($DebugCounter): $ThisLine";
	 $DebugCounter++;
    }
   
   chomp($ThisLine);

    $ThisLine =~ /(\d+\.\d+)\s+(\d+) (\d+\.\d+\.\d+\.\d+) (\D+)\/(\d{3}) (\d+) (\D+) (\S+) - (\S+) (\S+)/;
    my $b = localtime($1);
    #print "time $b duration:$2  from $3 resultcode:$4 httpresult:$5 bytes:$6 method:$7 uri:$8 ident:$9 filetype: $10\n";

    $BWbyIP{$3}+=$6;
    $squidstatus{$4}[0]++;
    $squidstatus{$4}[1]+=$6;
    $squidstatus{$4}[2]+=$2;
    $i++;
}

my @BWbyIPsorted = reverse sort { $BWbyIP{$a} <=> $BWbyIP{$b} } keys %BWbyIP;

for(my $j = 0; $j <= 20; $j++)
{
    print "IP: $BWbyIPsorted[$j] => $BWbyIP{$BWbyIPsorted[$j]} bytes \n";
}

print "\nResult codes:\n\n";
foreach my $k (keys(%squidstatus))
{
    print "$k : $squidstatus{$k}[0] reqs,    $squidstatus{$k}[1] bytes,     $squidstatus{$k}[0] time\n";
}

exit(0);

That's really simple (and badly written). The script here shows the bandwidth usage by IP and statistics on the result codes(WARNING: it may not be legal to use it on your network, I only show it as an example). See the output of this script:

################### Logwatch 7.3.1 (09/15/06) ####################
       Processing Initiated: Mon Sep 22 20:01:08 2008
       Date Range Processed: yesterday
                             ( 2008-Sep-21 )
                             Period is day.
     Detail Level of Output: 5
             Type of Output: unformatted
          Logfiles for Host: eclip4
 ##################################################################

 squid Begin 

IP: *.*.*.* => 8043309 bytes
IP: *.*.*.* => 6675804 bytes
IP: *.*.*.* => 2884992 bytes
IP: *.*.*.* => 668433 bytes
...

Result codes:

TCP_REFRESH_MISS : 177 reqs,    7007 bytes,     177 time
TCP_MISS : 731 reqs,    5487253 bytes,     6731 time
TCP_HIT : 547 reqs,    7656 bytes,     47 time
TCP_DENIED : 18 reqs,    67195 bytes,     18 time
TCP_REFRESH_HIT : 89 reqs,    277882 bytes,     589 time
TCP_MEM_HIT : 12 reqs,    2074 bytes,     812 time
TCP_CLIENT_REFRESH_MISS : 39 reqs,    66520 bytes,     39 time
TCP_IMS_HIT : 2078 reqs,    33792 bytes,     078 time
TCP_NEGATIVE_HIT : 82 reqs,    8064 bytes,     82 time

squid End 


###################### Logwatch End #########################

The values displayed here are intented to be crap, don't worry, my proxy works fine! Now, if someone finds it interesting, I can improve this script, add features, etc. This was a really quick and dirty attempt to do a Logwatch filter for Squid. The base for future improvements is already here: I have something like a logformat, and tables corresponding to request types. Some features that could be useful: number of requests and bandwidth used by hour/day/month, most visited pages, cache efficiency...

- page 1 de 3