Webmeeting sobre OSSEC

Saturday, 30. January 2010 14:09

Para todos aquellos que estén interesados en conocer OSSEC HIDS, he organizado una charla el Viernes 12 de Febrero a la 16:20 hora española. Sólo tenéis que apuntaros:



Thema: OSSEC, Seguridad | Kommentare (1)

Malware Hash Checker

Monday, 7. December 2009 18:29

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

Thema: Malware, Perl | Kommentare (0)

Cambio de blog

Sunday, 29. November 2009 21:27

Pues eso, que me he mudado por problemas con serendipity. Al final he caído en las garras de wordpress. Esperemos que me vaya mejor.

En los próximos días intentaré ir posteando. Ya sabéis que esto va por rachas :P

Saludos

Thema: Personal | Kommentare (2)

Extraer tabla de un dump en MySQL

Friday, 22. May 2009 13:46

Una pequeña receta que nos ha tocado hoy hacer en el curro. A veces necesitamos recuperar de un dump de mysql, los datos de una tabla. En este caso, el script que nos ocupa, recupera de un full dump, una tabla completa, con su definición, aunque sería relativamente sencillo recuperar solo los datos (INSERT):

#!/bin/sh
if [ $# -lt 1 ]; then
echo "Use: $0 table_name [filename]"
exit 1
fi

sed -n "/structure for table \`$1\`/,/UNLOCK TABLES/p" $2

Se puede invocar de dos formas:

extract_table.sh nombre_de_tabla fichero_con_el_dump

o

cat fichero_con_el_dump | extract_table.sh nombre_de_tabla
zcat fichero_con_el_dump.gz | extract_table.sh nombre_de_tabla

Un saludo

Thema: Linux, MySql, Receta | Kommentare (0)

Mi correo no es un ftp

Friday, 22. May 2009 13:23

Existe una creciente oleada de personas dispuestas a quejarse porque cuando mandan ficheros de tropecientos megas, el servidor de correo no va bien. Señores, señoras, el correo no es un ftp. Uno al final se cansa de recibir mensajes enormes y muchos de ellos, inútiles. Así que os dejo una pequeñ receta de procmail para evitar saturaros la cuenta con ppt y demás familia:

# MAXMSG = bytes del mail
MAXMSG=14680064
NL="
"
:0
* $ > $MAXMSG
{
LOG="Mi correo no es un ftp${NL}"
EXITCODE=69
HOST
}

Saludos

Thema: Linux, Receta | Kommentare (0)

Habí­a que hacerlo

Thursday, 16. April 2009 18:44

Cuando un gobierno se empeña en criminalizar a su pueblo, cuando son gente del propio pueblo los que parece que gobiernan, cuando los intereses personales de un colectivo, en su mayorí­a, acaudalado, se anteponen a las libertades… hay que hacerlo. Hay que alzar la voz. Por eso ahora junto a la publicidad de google, he puesto un banner para enseñarle la puerta a nuestra recién y denostada ministra de cultura.

Parece un sin sentido que nuestro gobierno siga desoyendo el clamor popular. Pero aún más ridí­culo parece que desoiga a los jueces. Cuándo se van a dar cuenta que las descargas no son ilegales. Cuánto tiempo tendremos que soportar las campañas producidas con el erario público para llamarnos delincuentes, terroristas, instigadores. Nos relacionan con las mafias, soportamos que hagan comparaciones ridí­culas. Compartir no es robar, es una cuestión puramente matemática. Y aún, cuando compras un dvd, cuando vas al videoclub, el dichoso anuncio te recuerda que, pese a todo, sigues siendo un delincuente, un ser abducido por la oscuridad de tu cuarto y la pantalla de un ordenador.

La verdad, yo sigo sin entender la polí­tica. ¿Esta gente no tiene un gabinete de asesores? A lo mejor están todos descargándose algo ilegal, como Linux. De verdad, por favor, Sr. Zapatero, la cultura es importante, no es sólo una baza electoral. Seguro que se acuerda de muchas de sus promesas con respecto al software libre. O seguro que no. Tómese un café de los suyos, es posible que la memoria se le refresque. Y de paso, vaya ampliando las cárceles porque, visto lo visto, todos vamos a ir a una, desde los que, como yo, usamos aplicaciones P2P hasta los que especulan, urbanizan, malgastan, asesinan, mienten, roban o filman. Porque puestos a criminalizar, al final en este paí­s, no se libre ni el tato.

Nos vemos en la cárcel.

Thema: Personal | Kommentare (0)

MySQL CMDBA – Certificándose

Wednesday, 15. April 2009 16:20

Hace tiempo comenté que estaba detrás de la certificación y por fin le pude dedicar tiempo. El resultado, por fin tengo mi certificación y va en camino la de clustering (CMCDBA). Y cómo no, el honor de aparecer en la web de MySQL

Para no repetir contenido, os dejo un enlace comentando un poco el examen (el DBA I, porque el DBA II fue igual). Os animo a sacaros la certificación, la verdad es que aprendí bastante cosas que no sabía. No sé cómo serán los cursos, en mi caso, dado que necesitaba esta certificación para acceder a la de clustering, lo hice por libre, pero si podéis permitíroslo (que lo paga la empresa, hombre) seguro que os podrán ayudar a pasarlo sin problemas.

Ahora, unas semanas de “relax” y a por la de clustering. Y si alguno va a ir al curso de alta disponibilidad que organiza Warp, allí nos veremos.

Saludos

Thema: Linux, MySql | Kommentare (0)

Packers y Yara

Saturday, 31. January 2009 22:59

Desde hace poco, estoy metiéndome un poco en el mundo del reversing, malware,… Y buscando, encontré una herramienta muy curiosa. Yara. Esta herramienta busca patrones en ficheros. Por defecto, no hay ninguno, por lo que cada cual tendrá que hacerse los suyos. Ahora mismo lo estoy usando para descubrir binarios empaquetados y para ello, recurrí a la lista de patrones de PEiD, que es pública.

Pero antes había que pasarla al formato de reglas de yara. Total, que recurrí a un pequeño script que hice. Os lo cuelgo por si a alguien le fuera de utilidad:

http://virtualminds.es/uploads/scripts/yararules.pl

Y el fichero de reglas:

http://virtualminds.es/uploads/scripts/packers.sig.gz -> Fichero de reglas

http://virtualminds.es/uploads/scripts/rules.db.gz -> Correspondencia con los packers

Thema: Malware | Kommentare (0)

Consultar virustotal.com desde la lí­nea de comandos

Tuesday, 20. January 2009 17:16

Estoy haciendo unos scripts para mantener limpios (en la medida de lo posible) nuestros servidores windows. Buscando la mejor manera de hacerlo me dije… Y si en vez de instalar un antivirus, instalo 38. Alguien podría decir que es una locura a la par que un imposible. Pero llega Hispasec con su Virustotal.com y nos pone de forma totálmente gratuita 38 antivirus.

Y aquí es donde nos aprovechamos un poco de ellos. Tengo que decir que antes de publicar el código, consulté con su soporte si había alguna limitación de uso. La única limitación es el número de consultas por ip así que si alguna vez no os funciona, ya sabéis por qué es :P

El código es bastante simple. Virustotal.com tiene una base de datos de hashes ya procesados y es posible consultar un determinado hash. El código no sube el fichero a virustotal, solo consulta esta base de datos por lo que os podéis encontrar que piezas de malware no son detectadas como tales:

#!/usr/bin/perl

use strict;
use LWP;
use Digest::MD5;
use Getopt::Long;

my $md5 = Digest::MD5->new;
my $virhash;
my $file;
my $hash;

GetOptions  (	"file=s" => \$file,
				"hash=s" => \$hash
			);

if($file && $hash) {
	usage();
	exit 100;
}

if(!$file && !$hash) {
	usage();
	exit 100;
}

if(-f $file) {
	open FILE,$file;
	binmode(FILE);
	$virhash = $md5->addfile(*FILE)->hexdigest;
	print "[HASH] Using MD5 hash $virhash\n";
}
elsif ($hash) {
	$virhash = $hash;
	print "[HASH] Using hash $virhash\n";
}

my $ua = LWP::UserAgent->new;
push @{$ua->requests_redirectable }, 'POST';

my $resp = $ua->post('http://www.virustotal.com/vt/en/consultamd5',[ "hash" =>  $virhash , "x" => 138 , "y" => 24 ]);

if($resp->is_success) {
	my $data = $resp->content;

	$data =~ m,(
),m; my $virdata = $1; $virdata =~ m,>(\d+)/(\d+) ,; if($1 > 0) { print "Virus Found ($1/$2)\n"; exit 1; } else { print "Virus Not Found\n"; exit 0; } } else { print $resp->status_line; exit 100; } sub usage () { print "$0 (--file fichero | --hash hash)\n"; }

Si puedo y me dejan, dentro de unos días publicaré el código algo más avanzado. Pero para los que tengan iniciativa, diré que Win32::Process::Info es un gran comienzo para sacar la lista de procesos y la ruta del ejecutable asociado.

Hasta pronto!

Thema: Malware | Kommentare (0)

Explain e índices de dos campos

Monday, 17. November 2008 19:04

Hoy preguntaban por el canal #MySQL de freenode si era necesario usar un índice en una tabla que usaba para buscar a qué grupos pertenecía un usuario. Vamos, algo como esto:


mysql> desc t1\G
*************************** 1. row ***************************
Field: id
Type: int(11)
Null: NO
Key:
Default: NULL
Extra:
*************************** 2. row ***************************
Field: id2
Type: int(11)
Null: NO
Key:
Default: NULL
Extra:

No tiene índices intencionádamente. Así es como estaba la tabla del sujeto en cuestión. Por lo general, nunca es mala idea añadir algún índice salvo que andes mal de espacio y no solventes en gran medida el tiempo de búsqueda de un registro, cosa poco habitual. Vamos a recrear la situación.

Lo primero es crear las tablas y alimentarlas. Vamos a nuestra consola (mi opción preferida):


mysql> show create table t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) NOT NULL,
`id2` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1

Ahora toca añadir datos a la tabla. He usado http://www.generatedata.com/#generator, una aplicación web para generar valores de prueba. Tiene una limitación de 200 registros, aunque cabe la posibilidad de bajarse la aplicación para montárselo uno mismo o dar un donativo. Yo me lo bajé para generar 5000 registros. Vamos a ver lo que tarda en devolverme los 5000 registros:


mysql> select /*SQL_NO_CACHE*/ id,id2 from t1;

...

5000 rows in set (0.01 sec)

Vale, ahora veremos lo que tarda en devolver los registros de un determinado id:


mysql> select /*SQL_NO_CACHE*/ id,id2 from t1 where id=37;

...

53 rows in set (0.00 sec)

Perfecto. Para que fuera aún más real, tendríamos que meter muchos más registros. Dejo a cada cual que haga sus pruebas. De todas formas, no nos hacen falta los datos para saber cómo actúa Mysql. Y aquí viene en nuestra ayuda el comando EXPLAIN (http://dev.mysql.com/doc/refman/5.0/es/explain.html). Con él conocemos el plan de ejecución del optimizador de MySQL. Vemos un ejemplo:


mysql> explain select id,id2 from t1 where id = 37\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t1
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 38389
Extra: Using where

En este artículo no voy a explicar cada uno de los campos, ya haré otro sobre el tema, pero básicamente esto nos dice que la select no tiene ningún tipo de optimización porque:

– No hay índices posibles
– Por lo tanto, no se aplica ninguno
– El número de registros aproximados a ver son 38389, vamos, todos. Esto es lo que se llama un full scan de la tabla.

Por lo tanto, está claro que esta tabla es optimizable. Creamos un índice con el campo id, que es el que usamos en la búsqueda:


mysql> alter table t1 add index idx_id (id);
Query OK, 38389 rows affected (0.20 sec)
Records: 38389 Duplicates: 0 Warnings: 0

Y volvemos a hacer la query con el EXPLAIN


mysql> explain select id,id2 from t1 where id = 37\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t1
type: ref
possible_keys: idx_id
key: idx_id
key_len: 4
ref: const
rows: 50
Extra:
1 row in set (0.00 sec)

La cosa cambia, ya hay índices posibles e índices aplicados, el número de registros ha cambiado y el campo Extra está vacío. Pero vamos a ver una curiosidad:


mysql> select count(id) from t1 where id = 37\G
*************************** 1. row ***************************
count(id): 53
1 row in set (0.01 sec)

En valor de rows es 50 sin embargo la query devuelve 53 registros. Ya comentaba antes que ese valor es aproximativo. Pero aún se puede optimizar más:


mysql> alter table t1 add index idx_id_id2 (id,id2);

Esto crea otro índice agrupando los dos campos de la tabla. Por lo que si ahora usamos el analizador:


mysql> explain select id,id2 from t1 where id = 37\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t1
type: ref
possible_keys: idx_id,idx_id_id2
key: idx_id_id2
key_len: 4
ref: const
rows: 50
Extra: Using index
1 row in set (0.00 sec)

El índice usado ha pasado de ser idx_id a idx_id_id2 y en Extra ahora aparece “Using index”. Lo que hemos conseguido es que MySQL no tenga que ir a buscar los datos a la tabla, sino que los coja diréctamente del fichero de índices. Al final los ficheros quedan así:


-rw-rw---- 1 mysql mysql 338K 2008-11-17 18:55 t1.MYD
-rw-rw---- 1 mysql mysql 923K 2008-11-17 18:55 t1.MYI

Y después de elimiar el primer índice que creamos:


-rw-rw---- 1 mysql mysql 338K 2008-11-17 18:59 t1.MYD
-rw-rw---- 1 mysql mysql 538K 2008-11-17 18:59 t1.MYI

Como os comentaba, la contrapartida es el uso de espacio en disco pero en aplicaciones con altos volúmenes de datos, la velocidad de búsqueda puede ser más importante que el espacio usado.

Thema: MySql | Kommentare (0)