<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>VirtualMinds &#187; Perl</title>
	<atom:link href="http://virtualminds.es/blog/index.php/category/perl/feed" rel="self" type="application/rss+xml" />
	<link>http://virtualminds.es/blog</link>
	<description>Think Virtually</description>
	<lastBuildDate>Mon, 07 Jun 2010 09:31:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Using OSSEC &amp; SEC for Malware Detection</title>
		<link>http://virtualminds.es/blog/index.php/2010/03/using-ossec-sec-for-malware-detection.html</link>
		<comments>http://virtualminds.es/blog/index.php/2010/03/using-ossec-sec-for-malware-detection.html#comments</comments>
		<pubDate>Fri, 12 Mar 2010 18:07:25 +0000</pubDate>
		<dc:creator>Iñaki</dc:creator>
				<category><![CDATA[Malware]]></category>
		<category><![CDATA[OSSEC]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[virus]]></category>

		<guid isPermaLink="false">http://virtualminds.es/blog/?p=108</guid>
		<description><![CDATA[Hi all, this is my first english post so&#8230; excuse me I will try to show how we can use OSSEC and SEC for detect malware in our servers. We need a working installation of ossec (local or server mode), mhc, this small perl script and SEC. After installing (copy) mhc and the perl script [...]]]></description>
			<content:encoded><![CDATA[<p>Hi all, this is my first english post so&#8230; excuse me <img src='http://virtualminds.es/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  I will try to show how we can use OSSEC and SEC for detect malware in our servers.<br />
We need a working installation of <a href="http://www.ossec.net/main/downloads/">ossec</a> (local or server mode), <a href="http://code.google.com/p/virtualminds/downloads/list">mhc</a>, this <a href="http://www.virtualminds.es/uploads/scripts/sec-virustotal">small perl script</a> and <a href="http://simple-evcorr.sourceforge.net/">SEC</a>. After installing (copy) mhc and the perl script (do it in /usr/local/bin, for example), open a new file with your favorite text editor:</p>
<pre class="brush:plain">
#
# New syscheck event - Store agent name
#
type=Single
pattern= (\S+)->syscheck
ptype=regexp
desc=$0
action=create OSSEC_SYSCHECK; assign %agent $1

#
# Integrity checking - Store filename
#
type=Single
ptype=regexp
context=OSSEC_SYSCHECK
desc=$0
pattern=Integrity checksum changed for: '(\S+)'
action=assign %file $1;

#
# Integrity checking - New event for SingleWithScript (I can't use %vars with script directive)
#
type=Single
ptype=regexp
context=OSSEC_SYSCHECK
pattern=New md5sum is : '(\S+)'
desc=OSSEC: Filename: %file - md5sum: $1
action=event OSSEC: Filename: %file - md5sum: $1

#
# Integrity checking - Check againts Virustotal.com
#
type=SingleWithScript
desc=$0
ptype=regexp
context=OSSEC_SYSCHECK
pattern=^OSSEC: Filename: (\S+) - md5sum: (\S+)
script=/usr/local/bin/sec-virustotal $2 $1
action=none
action2=eval %a \
({	use Sys::Syslog; \
	openlog('sec-virustotal','','user'); \
	syslog('info', "%agent: File %file ($1) is tagged as VIRUS by virustotal.com"); \
	closelog; \
	1;  \
};); delete OSSEC_SYSCHECK
</pre>
<p>Save this file under /etc/sec directory (I used ossec.sec as filename). Then we must define a new ossec rule:</p>
<pre class="brush:plain">
<rule id="100002" level="12">
<program_name>sec-virustotal</program_name>
	<match>VIRUS</match>
	<description>Virus Found!!</description>
</rule>
</pre>
<p>Be sure to use an unused id for your new rule. You can add a group directive for correlating with another event if you want. Before start SEC, we can change sec-virustotal script to scan only those files with a desired extension:</p>
<pre class="brush:perl">
#!/usr/bin/perl

use strict;
my $virus_script = '/usr/local/bin/mhc';
my @extensions = qw/exe dll/; # Use * for all extensions
my $filename;
my $hash;
my $ext;
my @tmp;

if($#ARGV != 1) {
    print "usage: $0 md5hash filename\n";
    exit 100;
}

$filename = $ARGV[1];
$hash = $ARGV[0];
my @tmp=split(/\./,$filename);
$ext = lc($tmp[$#tmp]);

foreach (@extensions) {
    if($ext eq $_ || $_ eq '*') { # Extension found, scanning...
        my $res = qx/$virus_script --hash $hash --no-cache/;
        exit ($? >> 8);
    }
}
exit 0;
</pre>
<p>We can change @extensions variable to scan &#8216;.scr&#8217; files, for example. Now we have our new rule, restart ossec and launch SEC:</p>
<pre class="brush:plain">
 # /var/ossec/bin/ossec-control restart
 # /usr/bin/perl -w /usr/bin/sec -conf=/etc/sec/ossec.sec -quoting -input=/var/ossec/logs/alerts/alerts.log -detach
</pre>
<p>I leave to the reader the step of launching SEC at startup. But for Debian edit /etc/default/sec:</p>
<pre class="brush:plain">
#Defaults for sec
RUN_DAEMON="yes"
DAEMON_ARGS="-conf=/etc/sec/ossec.sec -input=/var/ossec/logs/alerts/alerts.log -pid=/var/run/sec.pid -detach -quoting"
</pre>
<p>I hope you find this useful. </p>
]]></content:encoded>
			<wfw:commentRss>http://virtualminds.es/blog/index.php/2010/03/using-ossec-sec-for-malware-detection.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Malware Hash Checker</title>
		<link>http://virtualminds.es/blog/index.php/2009/12/malware-hash-checker.html</link>
		<comments>http://virtualminds.es/blog/index.php/2009/12/malware-hash-checker.html#comments</comments>
		<pubDate>Mon, 07 Dec 2009 17:29:53 +0000</pubDate>
		<dc:creator>Iñaki</dc:creator>
				<category><![CDATA[Malware]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[virus malware mhc]]></category>

		<guid isPermaLink="false">http://virtualminds.es/blog/?p=97</guid>
		<description><![CDATA[Buenas a todos/as, he creado una versión del script que consulta virustotal.com desde la línea de comando, aunque lo he diseñado para que pueda ir integrando otros buscadores. De esta idea, nace Malware Hash Checker. Podéis descargarlo desde http://code.google.com/p/virtualminds/ Espero vuestros comentarios y sugerencias]]></description>
			<content:encoded><![CDATA[<p>Buenas a todos/as,</p>
<p>he creado una versión del script que consulta virustotal.com desde la línea de comando, aunque lo he diseñado para que pueda ir integrando otros buscadores. De esta idea, nace Malware Hash Checker. Podéis descargarlo desde <a href="http://code.google.com/p/virtualminds/">http://code.google.com/p/virtualminds/</a></p>
<p>Espero vuestros comentarios y sugerencias</p>
]]></content:encoded>
			<wfw:commentRss>http://virtualminds.es/blog/index.php/2009/12/malware-hash-checker.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perla: Contar palabras en un texto</title>
		<link>http://virtualminds.es/blog/index.php/2008/09/perla-contar-palabras-en-un-texto.html</link>
		<comments>http://virtualminds.es/blog/index.php/2008/09/perla-contar-palabras-en-un-texto.html#comments</comments>
		<pubDate>Fri, 05 Sep 2008 10:53:54 +0000</pubDate>
		<dc:creator>Iñaki</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Receta]]></category>

		<guid isPermaLink="false">http://virtualminds.es/wordpress/?p=13</guid>
		<description><![CDATA[Hace un par de días, estaba programando un filtro para Spamassassin y necesitaba contar el número de palabras que contenía el mail. El caso es que me dije, esto tiene que estar programado y requeteprogramado ya, por lo que me lancé a buscar ese pedazo de código. Lo bueno de esta mente virtual llamada Internet, [...]]]></description>
			<content:encoded><![CDATA[<p>Hace un par de días, estaba programando un filtro para Spamassassin y necesitaba contar el número de palabras que contenía el mail. El caso es que me dije, esto tiene que estar programado y requeteprogramado ya, por lo que me lancé a buscar ese pedazo de código. Lo bueno de esta mente virtual llamada Internet, es la disparidad de ideas que llevan al mismo sitio, así que decidí poner unas cuantas funciones que hacen lo mismo:</p>
<p>Esta es cosecha propia</p>
<pre class="brush:perl">
sub wc {
	my $words = shift;

	$words =~ s/[;|,|\.|\:|\?|\!|\/|\)|\=]/ /g;
	$words =~ s/\s{2,}/ /g;
	return scalar split(/ /,$words);
}
</pre>
<p>Visto en <a href="http://askville.amazon.com/find-code-sample-Perl-word-count-script/AnswerViewer.do?requestId=1037856 "  title="http://askville.amazon.com/find-code-sample-Perl-word-count-script/AnswerViewer.do?requestId=1037856 ">http://askville.amazon.com/find-code-sample-Perl-word-count-script/AnswerViewer.do?requestId=1037856<br />
</a></p>
<pre class="brush:perl">
#!/usr/bin/perl
use strict;
use warnings;

my %count_of;
while (my $line = <>) { #read from file or STDIN
foreach my $word (split /\s+/, $line) {
$count_of{$word}++;
}
}
print "All words and their counts: \n";
for my $word (sort keys %count_of) {
print "'$word': $count_of{$word}\n";
}
</pre>
<p>Visto en<a href=" http://dada.perl.it/shootout/wc.perl.html "  title=" http://dada.perl.it/shootout/wc.perl.html "> http://dada.perl.it/shootout/wc.perl.html<br />
</a></p>
<pre class="brush:perl">
use strict;

my($nl, $nw, $nc);

while(<STDIN>) {
    $nc += length;
    $nw += scalar(split);
    $nl += 1;
    # print "$nl $nw $nc\n";
}
print "$nl $nw $nc\n";
exit(0);
while (read(STDIN, $_, 4095)) {
    $_ .= <STDIN>;
    $nl += scalar(split(/\n/));
    $nc += length;
    $nw += scalar(split);
}
print "$nl $nw $nc\n";
</pre>
<p> &#8211; La forma más completa: <a href="http://folk.uio.no/einarro/Comp/download.php?file=texcount.pl"  title="http://folk.uio.no/einarro/Comp/download.php?file=texcount.pl">http://folk.uio.no/einarro/Comp/download.php?file=texcount.pl</a><br />
 &#8211; Otro más: <a href="http://foundationstone.com.au/HtmlSupport/WebPage/wordcount.html"  title="http://foundationstone.com.au/HtmlSupport/WebPage/wordcount.html">http://foundationstone.com.au/HtmlSupport/WebPage/wordcount.html</a><br />
 &#8211; Y otro con explicaciones: <a href="http://foundationstone.com.au/HtmlSupport/WebPage/wordcount.html"  title="http://foundationstone.com.au/HtmlSupport/WebPage/wordcount.html">http://en.literateprograms.org/Word_count_(Perl)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://virtualminds.es/blog/index.php/2008/09/perla-contar-palabras-en-un-texto.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Registrando robots de búsqueda en Apache</title>
		<link>http://virtualminds.es/blog/index.php/2007/10/registrando-robots-de-busqueda-en-apache.html</link>
		<comments>http://virtualminds.es/blog/index.php/2007/10/registrando-robots-de-busqueda-en-apache.html#comments</comments>
		<pubDate>Wed, 03 Oct 2007 12:56:15 +0000</pubDate>
		<dc:creator>Iñaki</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Receta]]></category>
		<category><![CDATA[apache]]></category>

		<guid isPermaLink="false">http://virtualminds.es/wordpress/?p=4</guid>
		<description><![CDATA[Hace unos días, un cliente me comentó su necesidad de loguear las entradas de los robots de búsqueda en un fichero aparte, para después procesarlas. Como me resultó novedoso el tema (en tanto que nunca he hecho algo parecido) me decidí a escribir un post. También han ayudado factores como recordarme que si me pagan [...]]]></description>
			<content:encoded><![CDATA[<p>Hace unos días, un cliente me comentó su necesidad de loguear las entradas de los robots de búsqueda en un fichero aparte, para después procesarlas. Como me resultó novedoso el tema (en tanto que nunca he hecho algo parecido) me decidí a escribir un post. También han ayudado factores como recordarme que si me pagan el dominio, lo podría ir usando. Melón.</p>
<p>Vamos a ponernos en faena. Apache tiene una directiva para definir variables de entorno en función de una serie de condiciones. Me refiero a la directiva <a href="http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#setenvif">SetEnvIf</a>. Para nuestro ejemplo también nos valdría <a href="http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#browsermatch">BrowserMatch</a> pero opté por la primera por ser más genérica. Simplificaré un poco el montaje (mi cliente tenía varios dominios virtuales). En nuestro caso lo vamos a hacer con mi dominio, por ejemplo.</p>
<p>Lo primero que tenemos que hacer es abrir el fichero donde definimos nuestro virtualhost. Sobre la línea que define el CustomLog escribimos:</p>
<p />
<code>SetEnvIf User-Agent bot is_a_robot<br />
CustomLog /var/log/apache2/robots_access.log combined env=is_a_robot
</pre>
<p>Estas dos líneas sirven para definir la variable is_a_robot y activar el log en caso de que esa variable de entorno exista (con el tipo de log combined)</p>
<p>Fácil ¿no? Ya para terminar y rizar el rizo, hice un pequeño script en perl para separar cada bot en un fichero. Os lo pego aquí mismo (<a href="http://www.virtualminds.es/uploads/scripts/split-robots.pl">y os incluyo un enlace de paso aquí)</a></p>
<pre class="brush:perl">
#!/usr/bin/perl

#
# Iñaki Rodriguez (2007)
#
# Split robots in separate files (using md5 as filename)
#
# License: GPL

use Digest::MD5 'md5_hex';

my $robot_log = '/var/log/apache2/robots_access.log';
my $output_dir = '/var/log/apache2/robots/';
my %bots;

open BOTLOG, "<$robot_log" or die ("$robot_log: I can't open it");
open INDEX, "<".$output_dir."index.txt";

while(<INDEX>) {
    chomp();
    my ($md5,$ua) = split(/\t/);
    $bots{$md5} = $ua;
}
close(INDEX);

while(<BOTLOG>) {

    chomp();
    m/^(.+?) (.+?) (.+?) (\[.+?\]) (".+?") (\d\d\d) (.+?) (".+?") (".*")$/;
    my $md5 = md5_hex($9);
    my $tmpf = $output_dir.$md5.".log";
    open LOG,">> $tmpf" or die ("$tmpf: I can't write it");
    print "Adding entry to $tmpf ($9)\n" if ($ARGV[0] ne '-q');
    $bots{$md5} = $9 if (!$bots{$md5});
    print LOG $_."\n";
    close(LOG);
}

close(BOTLOG);

open INDEX, ">".$output_dir."index.txt" or die($output_dir."index.txt: I can't create it");
foreach $md5 (keys %bots) {
    print INDEX $md5."\t".$bots{$md5}."\n";
}
close(INDEX);
</pre>
<p>Solo comentar un par de cosas del script. La variable $output_dir especifica el directorio donde va a guardar los logs por separado. En este mismo directorio se creará un fichero index.txt que guarda la correspondencia de cada log con su user agent. El nombre del fichero es la suma md5 del campo User Agent del log. Por último la variable $robot_log es la que establece el fichero donde se almacenan los registros de todos los robots.</p>
<p>Se podría mejorar. Invito al lector a añadir:</p>
<ul>
<li>Registro de la última entrada para no duplicarlas</li>
<li>Exclusiones</li>
</ul>
<p>Y hasta aquí el post del día. </p>
<p>Nota Mental: Arreglar el css que se descuadra (el theme no es mío)</p>
<p />
<p />
]]></content:encoded>
			<wfw:commentRss>http://virtualminds.es/blog/index.php/2007/10/registrando-robots-de-busqueda-en-apache.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
