Hoy algo de carne, una chuleta sobre las variables superglobales (woh!) no fiables, donde el cliente puede meter mano:
Mostrando entradas con la etiqueta seguridad. Mostrar todas las entradas
Mostrando entradas con la etiqueta seguridad. Mostrar todas las entradas
miércoles, 2 de marzo de 2011
jueves, 30 de septiembre de 2010
De heuristicas, antivirus y malware
Antes de nada, ningun ordenador fue infectado por malware en el proceso y lo que viene a continuación se hizo con el único fin de pasar el rato, si lees esto con la esperanza de saber como infectar más ordenadores o algo por el estilo, lo siento (... en realidad no) pero no estas en el lugar indicado, ve con root.
Pues presento un programa que genera otros programas ensamblando componentes (una shell inversa, un proxy SOCKS4 , un bot IRC... ), al principio no tenía ningun propósito pero parece que los módulos por separado pueden servir para echarle un vistazo a la euristica de los antivirus.
Pues presento un programa que genera otros programas ensamblando componentes (una shell inversa, un proxy SOCKS4 , un bot IRC... ), al principio no tenía ningun propósito pero parece que los módulos por separado pueden servir para echarle un vistazo a la euristica de los antivirus.
Etiquetas:
C,
pasando el rato,
pascal,
seguridad
martes, 14 de septiembre de 2010
SniperlCat 0.2, detección de SYN scan's
Actualización: por algun extraño motivo se vuelve paranoico con los paquetes cuando se suspende el ordenador y se vuelve a iniciar (¿?), estoy trabajando para resolver eso.
Hoy traigo la segunda versión del SniperlCat [SniperlCat 0.2], los cambios no son muchos, pero creo que pueden resultar interesantes:
- Detecta los paquetes SYN de sockets raw (típicos de un SYN scan), aunque para esto necesita permisos de root para levantar un sniffer, básicamente se aprovecha esta [http://danielmiessler.com/study/synpackets/] idea, aunque con scanners modernos se puede hacer que no exista diferencia, unicamente avisa de paquetes con un tamaño menor de 60 bytes (suelen ser de 58) y sin el flag DF de IP activado.
- Permite llevar un log aparte de las notificaciones... no es gran cosa pero puede ser útil.
- Las alertas se reunieron en una función llamada "show_alert" para poder modificar el sistema más facilmente.
Las dependencias quedarían en "libgtk2-notify-perl" para las notificaciones, y "libnet-pcap-perl" y "libnetpacket-perl" para buscar paquetes sospechosos.
Y la sintaxis del comando sería:
Sniperlcat 0.2
sniperlcat [-h]|[-d | -v ] [-nf] [-c] [-n <red>] [-f <descriptor de red>] [-p|-np] [-dv <interfaz>][-l <log>][-s <tiempo>]
-h (--help): Muestra este mensaje
-d (--daemonize): Se ejecuta de fondo
-nf (--no-fill): No llena la tabla de hosts (con nmap) antes de leerla
-c (--cansino): Repite los avisos, aún los ya emitidos, en cada iteración
-v (--verbose): Muestra más información por pantalla
-n (--network): Especifica la red donde se ejecuta, por defecto 192.168.1.0/24
-dv (--device): Especifica la interfaz de red que se monitoreará
-p (--privileged): Se asumirán que es un usuario con privilegios
-np (--no-privileged): Se asumirán que es un usuario sin privilegios
-l (--log): Se guardarán los avisos en un archivo
-s (--sleep): Especifica el tiempo en segundos de "descanso" entre iteraciones (por defecto 60)
Eso es todo, otro día... más.
[Referencias]
http://seclists.org/pen-test/2007/Oct/44
http://www.perlmonks.org/index.pl?node_id=170648
http://search.cpan.org/~saper/Net-Pcap-0.16/Pcap.pm
Hoy traigo la segunda versión del SniperlCat [SniperlCat 0.2], los cambios no son muchos, pero creo que pueden resultar interesantes:
- Detecta los paquetes SYN de sockets raw (típicos de un SYN scan), aunque para esto necesita permisos de root para levantar un sniffer, básicamente se aprovecha esta [http://danielmiessler.com/study/synpackets/] idea, aunque con scanners modernos se puede hacer que no exista diferencia, unicamente avisa de paquetes con un tamaño menor de 60 bytes (suelen ser de 58) y sin el flag DF de IP activado.
- Permite llevar un log aparte de las notificaciones... no es gran cosa pero puede ser útil.
- Las alertas se reunieron en una función llamada "show_alert" para poder modificar el sistema más facilmente.
Las dependencias quedarían en "libgtk2-notify-perl" para las notificaciones, y "libnet-pcap-perl" y "libnetpacket-perl" para buscar paquetes sospechosos.
Y la sintaxis del comando sería:
Sniperlcat 0.2
sniperlcat [-h]|[-d | -v ] [-nf] [-c] [-n <red>] [-f <descriptor de red>] [-p|-np] [-dv <interfaz>][-l <log>][-s <tiempo>]
-h (--help): Muestra este mensaje
-d (--daemonize): Se ejecuta de fondo
-nf (--no-fill): No llena la tabla de hosts (con nmap) antes de leerla
-c (--cansino): Repite los avisos, aún los ya emitidos, en cada iteración
-v (--verbose): Muestra más información por pantalla
-n (--network): Especifica la red donde se ejecuta, por defecto 192.168.1.0/24
-dv (--device): Especifica la interfaz de red que se monitoreará
-p (--privileged): Se asumirán que es un usuario con privilegios
-np (--no-privileged): Se asumirán que es un usuario sin privilegios
-l (--log): Se guardarán los avisos en un archivo
-s (--sleep): Especifica el tiempo en segundos de "descanso" entre iteraciones (por defecto 60)
Eso es todo, otro día... más.
[Referencias]
http://seclists.org/pen-test/2007/Oct/44
http://www.perlmonks.org/index.pl?node_id=170648
http://search.cpan.org/~saper/Net-Pcap-0.16/Pcap.pm
Etiquetas:
Perl,
redes,
seguridad,
sniperlcat
lunes, 23 de agosto de 2010
SniperlCat, un guardian de red
Hoy traigo un script en perl que vigila la red en busca de nuevos hosts o de ataques de ARP spoofing (buscando cambios en la tabla arp). El nombre, Sniperlcat es (obviamente) una mezcla entre snipercat y perl, lenguaje en el que esta programado.
Simplemente hay que ejecutarlo y avisa de los cambios usando el libnotify de GTK2 (puede que sea necesario instalar las librerias Gtk para perl, libdesktop-notify-perl, o libgtk2-notify-perl ).
Por ejemplo, para un nuevo host en la red:
Si el nuevo host está spoofeado desde otro (si coinciden sus MAC):
Si cambia una MAC:
O si cambia la MAC de uno a través de un ARP spoof:
Hay que tener en cuenta algunas cosas:
./sniperlcat [-h]|[-d | -v ] [-nf] [-c] [-n <red>] [-f <descriptor de red>] [-s <tiempo>]
Creo que solo necesitan explicación un par de cosas:
El script [sniperlcat.pl] :
#!/usr/bin/env perl
#
# SniperlCat
#
##############################################################################
# Copyright (C) 2010 Kenkeiras <kenkeiras (arroba) gmail (punto) com>
#
# This program is free software. It comes without any warranty, to
# the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms of the Do What The Fuck You Want
# To Public License, Version 2, as published by Sam Hocevar.
#
# See http://sam.zoy.org/wtfpl/COPYING for more details.
##############################################################################
my $appname = "Sniperlcat";
$app_icon = "";
$network = "192.168.1.*";
$verbose = 0;
$cansino = 0;
my $go_back = 0;
my $arp_fill = 1;
my $file = "";
my $sltime = 60;
use Gtk2::Notify -init, "Sniperlcat";
# Se va al fondo
sub daemonize{
$verbose = 0;
umask 0;
open STDIN, "</dev/null" || die $!;
open STDOUT,">>/dev/null" || die $!;
open STDERR, ">>/dev/null" || die $!;
defined ($pid=fork) || die $!;
exit if $pid;
setsid || die $!;
}
sub show_help{
print "$appname\n";
print "./sniperlcat [-h]|[-d | -v ] [-nf] [-c] [-n <red>] [-f <descriptor de red>] [-s <tiempo>]\n";
print "-h (--help): Muestra este mensaje\n";
print "-d (--daemonize): Se ejecuta de fondo\n";
print "-nf (--no-fill): No llena la tabla de hosts (con nmap) antes de leerla\n";
print "-c (--cansino): Repite los avisos, aun los ya emitidos, en cada iteración\n";
print "-v (--verbose): Muestra más información por pantalla\n";
print "-n (--network): Especifica la red donde se ejecuta, por defecto 192.168.1.0/24\n";
print "-f (--file): Especifica el archivo de red inicial (se obtiene con arp -an)\n";
print "-s (--sleep): Especifica el tiempo en segundos de \"descanso\" entre iteraciones (por defeto 60)\n";
}
# Comprueba los parámetros
my $i = 0;
while ($i <= $#ARGV){
if (($ARGV[$i] eq "-d") || ($ARGV[$i] eq "--daemonize")){
$go_back = 1;
}
elsif (($ARGV[$i] eq "-h") || ($ARGV[$i] eq "--help")){
show_help;
exit 0;
}
elsif (($ARGV[$i] eq "-v") || ($ARGV[$i] eq "--verbose")){
$verbose = 1;
}
elsif (($ARGV[$i] eq "-c") || ($ARGV[$i] eq "--cansino")){
$cansino = 1;
}
elsif (($ARGV[$i] eq "-nf") || ($ARGV[$i] eq "--no-fill")){
$arp_fill = 0;
}
elsif (($ARGV[$i] eq "-n") || ($ARGV[$i] eq "--network")){
$i++;
if ($i > $#ARGV){
print "No se ha especificado la red\n";
show_help;
exit 1;
}
$network = $ARGV[$i];
}
elsif (($ARGV[$i] eq "-f") || ($ARGV[$i] eq "--file")){
$i++;
if ($i > $#ARGV){
print "No se ha especificado el archivo de red\n";
show_help;
exit 1;
}
$file = $ARGV[$i];
}
elsif (($ARGV[$i] eq "-s") || ($ARGV[$i] eq "--sleep")){
$i++;
if ($i > $#ARGV){
print "No se ha especificado el tiempo\n";
show_help;
exit 1;
}
$sltime = $ARGV[$i];
}
$i++;
}
daemonize if $go_back;
# LLena la tabla arp con nmap
sub fill_arp_table{
`nmap $network -sP 2>/dev/null 1>/dev/null`;
}
# Carga la tabla arp de un archivo
sub load_arp_desc{
my %tmplist = ();
my $arp = $_[0];
my @lines = split(/\n/,$arp);
my $ip,$mac,$i = 0;
my $max = @lines;
while ($i < $max){
# Extrae la IP
@line = split(/ /,@lines[$i]);
@ip = split(/\(/,$line[1]);
@ip = split(/\)/,@ip[1]);
$ip = @ip[0];
# Y la MAC
$mac = $line[3];
# Y se introduce en la lista si es una MAC válida
if (substr("$mac", 0, 1) ne "<"){
$tmplist{"$ip"} = "$mac";
}
$i++;
}
return %tmplist;
}
# Carga la tabla arp
sub load_arp_list{
my $arp = `arp -an`;
return load_arp_desc($arp);
}
# Hace las comprobaciones
sub check_list{
my $ip_list = $_[0];
my $tmplist = $_[1];
my $lastlist = $_[2];
foreach my $ip (keys %$tmplist){
my $mac = $tmplist->{$ip};
# Si es un host nuevo
if (!exists $ip_list->{$ip} ) {
if ((!exists $lastlist->{$ip}) || ($cansino)){
my $message = "Equipo desconocido en la red: $ip [$mac]";
if ($mac ne "00:00:00:00:00"){ # Se suele utilizar para tapar
# despues de arp spoofing.
# No aporta nada
# Si la MAC está repetida, probablemente haya spoofing
foreach my $tmpip (keys %$ip_list){
if (($ip_list->{$tmpip} eq $mac) && ($tmpip ne $ip)){
$message .= ", posiblemente spoofeado desde $tmpip";
}
}
}
print "$message\n" if $verbose;
my $notification = Gtk2::Notify->new("$appname", "$message","$app_icon");
$notification->show();
}
}
else{
# Si cambio la MAC
if ($ip_list->{$ip} ne $mac){
if (($lastlist->{$ip} ne $mac)||($cansino)){
my $message = "La MAC de $ip ha cambiado de [".$lastlist->{$ip}."] a [".$mac."]";
if ($mac ne "00:00:00:00:00"){ # Se suele utilizar para tapar
# despues de arp spoofing.
# No aporta nada
# Si la MAC está repetida, probablemente haya spoofing
foreach my $tmpip (keys %$ip_list){
if (($ip_list->{$tmpip} eq $mac) && ($tmpip ne $ip)){
$message .= ", posiblemente spoofeado desde $tmpip";
}
}
}
print "$message\n" if $verbose;
my $notification = Gtk2::Notify->new("$appname", "$message","$app_icon");
$notification->show();
}
}
}
}
}
my %ip_list;
if ($file eq ""){
if ($arp_fill){
print STDERR "LLenando lista arp... " if $verbose;
fill_arp_table;
print STDERR "[OK]\n" if $verbose;
}
print STDERR "Leyendo tabla arp... " if $verbose;
%ip_list = load_arp_list;
}
else{
local $/=undef;
open MYFILE, "$file" or die "Couldn't open file: $!";
binmode MYFILE;
$arp = <MYFILE>;
close MYFILE;
%ip_list = load_arp_desc("$arp");
}
print STDERR "[OK]\n" if $verbose;
my $lastlist = \%ip_list;
while (1){
if ($arp_fill){
fill_arp_table;
}
my %tmplist = load_arp_list;
check_list(\%ip_list,\%tmplist,$lastlist);
$lastlist = \%tmplist;
sleep $sltime;
}
El script se puede descargar aquí [sniperlcat.pl], o al final coloreado.
Simplemente hay que ejecutarlo y avisa de los cambios usando el libnotify de GTK2 (puede que sea necesario instalar las librerias Gtk para perl, libdesktop-notify-perl, o libgtk2-notify-perl ).
Por ejemplo, para un nuevo host en la red:
Si el nuevo host está spoofeado desde otro (si coinciden sus MAC):
Si cambia una MAC:
O si cambia la MAC de uno a través de un ARP spoof:
Hay que tener en cuenta algunas cosas:
- El script no hace nada para evitar los ataques ARP spoof, solo los detecta
- Si no se lanza con una configuración, utilizará como tal la tabla ARP en ese momento, si hay entonces un ARP spoof en marcha, lo tomará como el estado base.
Los parámetros aceptados son:
./sniperlcat [-h]|[-d | -v ] [-nf] [-c] [-n <red>] [-f <descriptor de red>] [-s <tiempo>]
-h (--help): Muestra este mensaje
-d (--daemonize): Se ejecuta de fondo
-nf (--no-fill): No llena la tabla de hosts (con nmap) antes de leerla
-c (--cansino): Repite los avisos, aun los ya emitidos, en cada iteración
-v (--verbose): Muestra más información por pantalla
-n (--network): Especifica la red donde se ejecuta, por defecto 192.168.1.0/24
-f (--file): Especifica el archivo de red inicial (se obtiene con arp -an)
-s (--sleep): Especifica el tiempo en segundos de "descanso" entre iteraciones (por defeto 60)
Creo que solo necesitan explicación un par de cosas:
- Antes de leer la tabla ARP, para llenarla con todos los host de la red se hace un `nmap $red -sP` , si consideras que no es necesario, usa -nf
- Si la red es distinta de 192.168.1.0/24 (o 192.168.1.*), la puedes cambiar con -n red, como solo lo usa nmap, la sintaxis es la misma que este.
Hasta otra.
El script [sniperlcat.pl] :
#!/usr/bin/env perl
#
# SniperlCat
#
##############################################################################
# Copyright (C) 2010 Kenkeiras <kenkeiras (arroba) gmail (punto) com>
#
# This program is free software. It comes without any warranty, to
# the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms of the Do What The Fuck You Want
# To Public License, Version 2, as published by Sam Hocevar.
#
# See http://sam.zoy.org/wtfpl/COPYING for more details.
##############################################################################
my $appname = "Sniperlcat";
$app_icon = "";
$network = "192.168.1.*";
$verbose = 0;
$cansino = 0;
my $go_back = 0;
my $arp_fill = 1;
my $file = "";
my $sltime = 60;
use Gtk2::Notify -init, "Sniperlcat";
# Se va al fondo
sub daemonize{
$verbose = 0;
umask 0;
open STDIN, "</dev/null" || die $!;
open STDOUT,">>/dev/null" || die $!;
open STDERR, ">>/dev/null" || die $!;
defined ($pid=fork) || die $!;
exit if $pid;
setsid || die $!;
}
sub show_help{
print "$appname\n";
print "./sniperlcat [-h]|[-d | -v ] [-nf] [-c] [-n <red>] [-f <descriptor de red>] [-s <tiempo>]\n";
print "-h (--help): Muestra este mensaje\n";
print "-d (--daemonize): Se ejecuta de fondo\n";
print "-nf (--no-fill): No llena la tabla de hosts (con nmap) antes de leerla\n";
print "-c (--cansino): Repite los avisos, aun los ya emitidos, en cada iteración\n";
print "-v (--verbose): Muestra más información por pantalla\n";
print "-n (--network): Especifica la red donde se ejecuta, por defecto 192.168.1.0/24\n";
print "-f (--file): Especifica el archivo de red inicial (se obtiene con arp -an)\n";
print "-s (--sleep): Especifica el tiempo en segundos de \"descanso\" entre iteraciones (por defeto 60)\n";
}
# Comprueba los parámetros
my $i = 0;
while ($i <= $#ARGV){
if (($ARGV[$i] eq "-d") || ($ARGV[$i] eq "--daemonize")){
$go_back = 1;
}
elsif (($ARGV[$i] eq "-h") || ($ARGV[$i] eq "--help")){
show_help;
exit 0;
}
elsif (($ARGV[$i] eq "-v") || ($ARGV[$i] eq "--verbose")){
$verbose = 1;
}
elsif (($ARGV[$i] eq "-c") || ($ARGV[$i] eq "--cansino")){
$cansino = 1;
}
elsif (($ARGV[$i] eq "-nf") || ($ARGV[$i] eq "--no-fill")){
$arp_fill = 0;
}
elsif (($ARGV[$i] eq "-n") || ($ARGV[$i] eq "--network")){
$i++;
if ($i > $#ARGV){
print "No se ha especificado la red\n";
show_help;
exit 1;
}
$network = $ARGV[$i];
}
elsif (($ARGV[$i] eq "-f") || ($ARGV[$i] eq "--file")){
$i++;
if ($i > $#ARGV){
print "No se ha especificado el archivo de red\n";
show_help;
exit 1;
}
$file = $ARGV[$i];
}
elsif (($ARGV[$i] eq "-s") || ($ARGV[$i] eq "--sleep")){
$i++;
if ($i > $#ARGV){
print "No se ha especificado el tiempo\n";
show_help;
exit 1;
}
$sltime = $ARGV[$i];
}
$i++;
}
daemonize if $go_back;
# LLena la tabla arp con nmap
sub fill_arp_table{
`nmap $network -sP 2>/dev/null 1>/dev/null`;
}
# Carga la tabla arp de un archivo
sub load_arp_desc{
my %tmplist = ();
my $arp = $_[0];
my @lines = split(/\n/,$arp);
my $ip,$mac,$i = 0;
my $max = @lines;
while ($i < $max){
# Extrae la IP
@line = split(/ /,@lines[$i]);
@ip = split(/\(/,$line[1]);
@ip = split(/\)/,@ip[1]);
$ip = @ip[0];
# Y la MAC
$mac = $line[3];
# Y se introduce en la lista si es una MAC válida
if (substr("$mac", 0, 1) ne "<"){
$tmplist{"$ip"} = "$mac";
}
$i++;
}
return %tmplist;
}
# Carga la tabla arp
sub load_arp_list{
my $arp = `arp -an`;
return load_arp_desc($arp);
}
# Hace las comprobaciones
sub check_list{
my $ip_list = $_[0];
my $tmplist = $_[1];
my $lastlist = $_[2];
foreach my $ip (keys %$tmplist){
my $mac = $tmplist->{$ip};
# Si es un host nuevo
if (!exists $ip_list->{$ip} ) {
if ((!exists $lastlist->{$ip}) || ($cansino)){
my $message = "Equipo desconocido en la red: $ip [$mac]";
if ($mac ne "00:00:00:00:00"){ # Se suele utilizar para tapar
# despues de arp spoofing.
# No aporta nada
# Si la MAC está repetida, probablemente haya spoofing
foreach my $tmpip (keys %$ip_list){
if (($ip_list->{$tmpip} eq $mac) && ($tmpip ne $ip)){
$message .= ", posiblemente spoofeado desde $tmpip";
}
}
}
print "$message\n" if $verbose;
my $notification = Gtk2::Notify->new("$appname", "$message","$app_icon");
$notification->show();
}
}
else{
# Si cambio la MAC
if ($ip_list->{$ip} ne $mac){
if (($lastlist->{$ip} ne $mac)||($cansino)){
my $message = "La MAC de $ip ha cambiado de [".$lastlist->{$ip}."] a [".$mac."]";
if ($mac ne "00:00:00:00:00"){ # Se suele utilizar para tapar
# despues de arp spoofing.
# No aporta nada
# Si la MAC está repetida, probablemente haya spoofing
foreach my $tmpip (keys %$ip_list){
if (($ip_list->{$tmpip} eq $mac) && ($tmpip ne $ip)){
$message .= ", posiblemente spoofeado desde $tmpip";
}
}
}
print "$message\n" if $verbose;
my $notification = Gtk2::Notify->new("$appname", "$message","$app_icon");
$notification->show();
}
}
}
}
}
my %ip_list;
if ($file eq ""){
if ($arp_fill){
print STDERR "LLenando lista arp... " if $verbose;
fill_arp_table;
print STDERR "[OK]\n" if $verbose;
}
print STDERR "Leyendo tabla arp... " if $verbose;
%ip_list = load_arp_list;
}
else{
local $/=undef;
open MYFILE, "$file" or die "Couldn't open file: $!";
binmode MYFILE;
$arp = <MYFILE>;
close MYFILE;
%ip_list = load_arp_desc("$arp");
}
print STDERR "[OK]\n" if $verbose;
my $lastlist = \%ip_list;
while (1){
if ($arp_fill){
fill_arp_table;
}
my %tmplist = load_arp_list;
check_list(\%ip_list,\%tmplist,$lastlist);
$lastlist = \%tmplist;
sleep $sltime;
}
viernes, 20 de agosto de 2010
Detectando DNS y ARP spoofing
Pues eso, hoy, unas formas de detectar el spoofing de DNS (falseamiento de un nombre de dominio) y de ARP (que puede servir para suplantar una IP).
DNS
La forma de detectar un DNS spoofing es bastante simple, pero sigue siendo bastante efectiva para entornos de red local, el script es este o descargado aquí [dns.sh]:
#!/usr/bin/env bash
if [ "$2" == "" ]
then
echo "$0 <dirección a resolver> <servidor DNS a probar>"
exit 1
fi
echo -n "Velocidad: ";((time ping -c 1 "$2" >> /dev/null) 2>> /dev/stdout )|head -n 2|tail -n 1|cut -f2
echo -n "DNS: ";((time nslookup "$1" "$2" >> /dev/null) 2>> /dev/stdout )|head -n 2|tail -n 1|cut -f2
( ./script <dirección a resolver> <servidor DNS a probar> )
La idea es que compara el tiempo que se tarda en hacer un ping a un servidor DNS y el tiempo que tarda el mismo servidor en resolver una dirección, obviamente un servidor que no esta en la red local (como estaría el supuesto intruso), tardaría mas que el intruso, en la red local.
Por ejemplo, suponiendo que los resultados normales (sin spoofing) fueran estos:
Velocidad: 0m0.068s
DNS: 0m0.075s
Velocidad: 0m0.061s
DNS: 0m0.066s
Velocidad: 0m0.060s
DNS: 0m0.067s
Velocidad: 0m0.061s
DNS: 0m0.070s
Velocidad: 0m0.060s
DNS: 0m0.066s
Los valores con un DNS spoofing podrian ser:
Velocidad: 0m0.060s
DNS: 0m0.015s
Velocidad: 0m0.065s
DNS: 0m0.014s
Velocidad: 0m0.061s
DNS: 0m0.014s
Velocidad: 0m0.066s
DNS: 0m0.014s
Velocidad: 0m0.061s
DNS: 0m0.014s
La diferencia es obvia, el tiempo para resolver sin spoofing es ligeramente mayor que el tiempo de ping, mientras que el tiempo para resolver con spoofing es menos de la mitad del tiempo de ping.
ARP
La forma de detectar un ARP spoofing tambien es bastante simple, si al comprobar la tabla ARP hay MAC's repetidas, significa que (alguna de las repetidas) está spoofeada. Quizá sea necesario llenar la tabla con los host de la red para poder comprobar las MAC de todo la red, se puede hacer simplemente con:
nmap 192.168.0.* -sP
(El 192.168.0.* habría que cambiarlo por el adecuado para la red)
El script es (o aquí [arp.sh]):
#!/usr/bin/env bash
mip=""
t=0
for a in $(arp -a|sed -e "s/ /_/g" ); do
ip=`echo $a|cut "-d_" -f2|cut -d\( -f2|cut -d\) -f1`
mac=`echo $a|cut "-d_" -f4`
if [ ${mac,0,1}"" != "<" ]
then
# echo "IP: $ip MAC: $mac"
t=$(($t + 1))
i=0
lip=""
for tmp in $mip ; do
if [ `echo $tmp|cut -d_ -f2` == "$mac" ]
then
echo "MAC duplicada $ip - "`echo $tmp|cut -d_ -f1`" [$mac]"
fi
done
mip="$mip $ip"_"$mac"
fi
done
Simplemente comprueba las MAC duplicadas, y avisa de ello, no requiere interpretación por parte del administrador como el script de DNS (no hay que ver que indican los datos, hay spoof o no).
Y eso es todo, hasta otra.
DNS
La forma de detectar un DNS spoofing es bastante simple, pero sigue siendo bastante efectiva para entornos de red local, el script es este o descargado aquí [dns.sh]:
#!/usr/bin/env bash
if [ "$2" == "" ]
then
echo "$0 <dirección a resolver> <servidor DNS a probar>"
exit 1
fi
echo -n "Velocidad: ";((time ping -c 1 "$2" >> /dev/null) 2>> /dev/stdout )|head -n 2|tail -n 1|cut -f2
echo -n "DNS: ";((time nslookup "$1" "$2" >> /dev/null) 2>> /dev/stdout )|head -n 2|tail -n 1|cut -f2
( ./script <dirección a resolver> <servidor DNS a probar> )
La idea es que compara el tiempo que se tarda en hacer un ping a un servidor DNS y el tiempo que tarda el mismo servidor en resolver una dirección, obviamente un servidor que no esta en la red local (como estaría el supuesto intruso), tardaría mas que el intruso, en la red local.
Por ejemplo, suponiendo que los resultados normales (sin spoofing) fueran estos:
Velocidad: 0m0.068s
DNS: 0m0.075s
Velocidad: 0m0.061s
DNS: 0m0.066s
Velocidad: 0m0.060s
DNS: 0m0.067s
Velocidad: 0m0.061s
DNS: 0m0.070s
Velocidad: 0m0.060s
DNS: 0m0.066s
Los valores con un DNS spoofing podrian ser:
Velocidad: 0m0.060s
DNS: 0m0.015s
Velocidad: 0m0.065s
DNS: 0m0.014s
Velocidad: 0m0.061s
DNS: 0m0.014s
Velocidad: 0m0.066s
DNS: 0m0.014s
Velocidad: 0m0.061s
DNS: 0m0.014s
La diferencia es obvia, el tiempo para resolver sin spoofing es ligeramente mayor que el tiempo de ping, mientras que el tiempo para resolver con spoofing es menos de la mitad del tiempo de ping.
ARP
La forma de detectar un ARP spoofing tambien es bastante simple, si al comprobar la tabla ARP hay MAC's repetidas, significa que (alguna de las repetidas) está spoofeada. Quizá sea necesario llenar la tabla con los host de la red para poder comprobar las MAC de todo la red, se puede hacer simplemente con:
nmap 192.168.0.* -sP
(El 192.168.0.* habría que cambiarlo por el adecuado para la red)
El script es (o aquí [arp.sh]):
#!/usr/bin/env bash
mip=""
t=0
for a in $(arp -a|sed -e "s/ /_/g" ); do
ip=`echo $a|cut "-d_" -f2|cut -d\( -f2|cut -d\) -f1`
mac=`echo $a|cut "-d_" -f4`
if [ ${mac,0,1}"" != "<" ]
then
# echo "IP: $ip MAC: $mac"
t=$(($t + 1))
i=0
lip=""
for tmp in $mip ; do
if [ `echo $tmp|cut -d_ -f2` == "$mac" ]
then
echo "MAC duplicada $ip - "`echo $tmp|cut -d_ -f1`" [$mac]"
fi
done
mip="$mip $ip"_"$mac"
fi
done
Simplemente comprueba las MAC duplicadas, y avisa de ello, no requiere interpretación por parte del administrador como el script de DNS (no hay que ver que indican los datos, hay spoof o no).
Y eso es todo, hasta otra.
domingo, 28 de febrero de 2010
Peligros en el e-Mail
Hoy vamos a ver uno de los "peligros" del correo electronico, y no, no me refiero a el malware, ni al spam ni a nada asi (aunque lleva tanto tiempo ahi como ellos, o aun mas) , sino a algo que incluso se utiliza en correos legitimos (o al menos eso parecen)
Esto es, los correos con HTML
En un principio se podria pensar que esto no tiene nada de malo, se usa HTML en paginas web y no hay ningun problema, ¿verdad?... el problema esta en que se puede utilizar para obtener informacion que no suele ser bueno hacer publica, como la direccion IP utilizada
Veamos como funciona:
Mandamos un correo electronico a una direccion... usuario@example.org , cuando se abra el correo se mostrara el contenido en HTML (a menos que se configure el cliente de correo para que no lo haga) y al mostrar una imagen (por ejemplo), el cliente se conecta al servidor donde esta la imagen, que puede capturar informacion interesante del cliente como la IP, el navegador/cliente utilizado, etc...
Vamos alla, para esto usamos dos archivos, uno PHP (o lo que se utilize en el servidor web que se va a utilizar) y una imagen (o cualquier cosa que haga que el cliente se comunique con nuestro servidor, la imagen es lo mas sencillo y encaja perfectamente en un correo)
El archivo PHP solo tiene que hacer una cosa, guardar los datos del cliente y mandarle la imagen, un ejemplo seria:
Y ya esta, le enviamos el correo a alguien y...

El primero es abriendolo con el Thunderbird (como se puede ver en Navegador), y la segunda con un webmail (el navegador es Firefox)
Y ya tenemos la IP de a quien se le envio el correo
La siguiente vuelta de tuerca es hacer que en los logs tambien aparezcan las direcciones asociadas a cada IP, solo hay que añadir otra variable
Ahora ademas no se puede simplemente usar la imagen como antes (simplemente indicando su URL) ahora ademas hay que añadir ?mail=usuario@correo.aaa, por ejemplo, para mandarselo a "joe@gmail.com", utilizando la imagen http://aaa.com/imagen.php, habria que indicar http://aaa.com/imagen.php?mail=joe@gmail.com en la direccion de la imagen, el resultado es este:

Y en los dos casos el email parece completamente inofensivo:

Si, vale, no hay texto y la imagen que envie es de otro post, pero para mostrar la idea sirve
Tambien esta la opcion de incluir una imagen que solo tenga un pixel y que ademas es 100% transparente, asi que no se puede ver sin comprobar el codigo del mensaje
La solucion
La forma mas facil de evitar el problema (aparte de no abrir correos que no sean fiables) es deshabilitar el HTML en el cliente de correo (o en el webmail), Thunderbird, por ejemplo, pide confirmacion para leer HTML por defecto
Hasta otra!!
Esto es, los correos con HTML
En un principio se podria pensar que esto no tiene nada de malo, se usa HTML en paginas web y no hay ningun problema, ¿verdad?... el problema esta en que se puede utilizar para obtener informacion que no suele ser bueno hacer publica, como la direccion IP utilizada
Veamos como funciona:
Mandamos un correo electronico a una direccion... usuario@example.org , cuando se abra el correo se mostrara el contenido en HTML (a menos que se configure el cliente de correo para que no lo haga) y al mostrar una imagen (por ejemplo), el cliente se conecta al servidor donde esta la imagen, que puede capturar informacion interesante del cliente como la IP, el navegador/cliente utilizado, etc...
Vamos alla, para esto usamos dos archivos, uno PHP (o lo que se utilize en el servidor web que se va a utilizar) y una imagen (o cualquier cosa que haga que el cliente se comunique con nuestro servidor, la imagen es lo mas sencillo y encaja perfectamente en un correo)
El archivo PHP solo tiene que hacer una cosa, guardar los datos del cliente y mandarle la imagen, un ejemplo seria:
<?php
$fname="log.txt"; // archivo donde se guardan los logs
$f=fopen("$fname","a"); // Abrimos el archivo y lo preparamos
// para seguir escribiendo
fwrite($f,"IP: ".$_SERVER['REMOTE_ADDR']."\n"); // Guardamos la IP del cliente
fwrite($f,"Navegador: ".$_SERVER['HTTP_USER_AGENT']."\n"); // y tambien la
//informacion del cliente
fwrite($f,"---------------------\n"); // Para hacer el archivo mas facil de leer
fclose($f);
// Imagen a mostrar
$img="esfera.png";
// Redireccionamos al cliente a la imagen
header("Location: $img");
?>
Como se puede ver, el codigo es bastante simple, abrir un archivo, escribir un par de variables interesantes (en este caso, la IP y el cliente), y redireccionar el cliente a la imagen, se podria hacer que lea la imagen y la envie al cliente, que seria una solucion mas fiable (si alguien sigue la direccion de la imagen se dara cuenta del truco)Y ya esta, le enviamos el correo a alguien y...

El primero es abriendolo con el Thunderbird (como se puede ver en Navegador), y la segunda con un webmail (el navegador es Firefox)
Y ya tenemos la IP de a quien se le envio el correo
La siguiente vuelta de tuerca es hacer que en los logs tambien aparezcan las direcciones asociadas a cada IP, solo hay que añadir otra variable
<?php
$fname="log.txt"; // archivo donde se guardan los logs
$f=fopen("$fname","a"); // Abrimos el archivo y lo preparamos
// para seguir escribiendo
fwrite($f,"Direccion: ".$_REQUEST['mail']."\n");
fwrite($f,"IP: ".$_SERVER['REMOTE_ADDR']."\n"); // Guardamos la IP del cliente
fwrite($f,"Navegador: ".$_SERVER['HTTP_USER_AGENT']."\n"); // y tambien la
//informacion del cliente
fwrite($f,"---------------------\n"); // Para hacer el archivo mas facil de leer
fclose($f);
// Imagen a mostrar
$img="esfera.png";
// Redireccionamos al cliente a la imagen
header("Location: $img");
?>
Ahora ademas no se puede simplemente usar la imagen como antes (simplemente indicando su URL) ahora ademas hay que añadir ?mail=usuario@correo.aaa, por ejemplo, para mandarselo a "joe@gmail.com", utilizando la imagen http://aaa.com/imagen.php, habria que indicar http://aaa.com/imagen.php?mail=joe@gmail.com en la direccion de la imagen, el resultado es este:

Y en los dos casos el email parece completamente inofensivo:

Si, vale, no hay texto y la imagen que envie es de otro post, pero para mostrar la idea sirve
Tambien esta la opcion de incluir una imagen que solo tenga un pixel y que ademas es 100% transparente, asi que no se puede ver sin comprobar el codigo del mensaje
La solucion
La forma mas facil de evitar el problema (aparte de no abrir correos que no sean fiables) es deshabilitar el HTML en el cliente de correo (o en el webmail), Thunderbird, por ejemplo, pide confirmacion para leer HTML por defecto
Hasta otra!!
lunes, 8 de febrero de 2010
SSH: Conexiones seguras para tod@s
Seguramente muchos conozcais telnet, una forma de conseguir una consola de comandos en un ordenador remoto, igualmente muchos sabreis que es inseguro por que va "en plano" por la red (un ordenador cualquiera de la red podria ver lo que pasa en el pc remoto, secuestrar la sesion o incluso capturar las contraseñas), por eso desde hace unos años (desde el 99) se utiliza SSH (secure shell), que utiliza conexiones seguras, peroo... sabiais que ademas de utilizarlo como una consola de comandos se puede utilizar para:
- Transferencias de archivos al estilo FTP
- Copia de archivos en red
- Cifrar casi cualquier tipo de conexion (todo lo que se pueda a traves de SOCKS: web, correo, mensajeria instantanea,... )
- Acceder a sistemas de archivos remotos como si fuesen locales (SSHFS)
- VPN (aunque mientras se escribe esto solo es posible con el cliente y el servidor de OpenSSH)
Para las pruebas se utilizo un servidor OpenSSH_5.3p1 y un cliente OpenSSH, el servidor puede necesitar alguna configuracion, pero la mayoria de las veces las distros/flavours ya lo traen listo para usar, ademas algunas cosas solo se pueden hacer con este servidor en concreto (OpenSSH)
Para intentar hacer todo mas claro, los comandos usaran
este tipo de letra, lo que vaya etiquetado <asi> es una campo ( por ejemplo <direccion del servidor> podria ser ssh.pruebas.com o 192.168.1.17 ), por ultimo lo que va entre ´[´ y ´]´ es opcional (se usa, entre otras cosas, para activar opciones adicionales)Empezando por lo basico:
Para abrir una consola de comandos en el servidor se utilizara el siguiente comando:
ssh [<usuario>@]<servidor> [-p <puerto>]La parte de
<usuario>@ solo es necesaria si se va a usar un usuario distinto al de la maquina local, y -p <puerto> se usa para acceder por un puerto no estandar (que es el 22).Este es un ejemplo posible:
Desde el pc 'vBox' el usuario 'kenkeiras' hace ssh al servidor 'sleepless' (
ssh sleepless), aqui en vez de haber utilizado el nombre del servidor se puede utilizar su ip... si es la primera vez que se conecta a este servidor se pedira al usuario que confirme que el fingerprint de la clave del servidor coincida con la real (para evitar que se produzca un ataque Man-in-the-middle, por ejemplo)Y despues la ejecucion seguiria como antes, pide la contraseña y abre la sesion del usuario.
Este comando (
ssh sleepless) es el mismo que ssh $USERNAME@sleepless -p 22 ya que se presupone que el usuario va a ser el mismo en el servidor que en el pc local y que el puerto va a ser el estandar (el 22).Manejando archivos:
Transferencia de archivos por SFTP (Secure File Transfer Protocol, Protocolo Seguro de Transferencia de Archivos) :
El uso de sftp es bastante sencillo, el comando de inicio es como el de ssh:
sftp [<usuario>@]servidor [-oPort=<puerto>]La unica diferencia es que para especificar un puerto diferente (el estandar sigue siendo 22, todo funciona a traves de ssh) se utiliza
-oPort , en vez de -pSe utliza como un cliente ftp normal, pero siempre se usa binary para las transferencias (para los que no lo entiendan, esto ultimo da igual)
Por ejemplo:
Los comandos basicos son:
cd <directorio>: Cambia al directorio especificado-
put <archivo local> [<archivo remoto>]: Envia un archivo 'archivo local' al servidor (si no se especifica el 'archivo remoto' se utilizara como nombre el de 'archivo local') get <archivo remoto> [<archivo local>]: Envia del servidor el 'archivo remoto' al pc local (si no se especifica el 'archivo local' se utiliza como nombre el de 'archivo remoto')mkdir <directorio>: Crea un directorio en el servidorls [<ruta>]: Muestra los contenidos del directorio actual (o si se especifica una ruta, de esa)rm <archivo>: Elimina el archivo 'archivo'rmdir <directorio>: Elimina el directorio 'directorio'exit: Salir!: Volver a la consola del pc local (cuando se salga de la consola se volvera a el SFTP)
SCP (Secure Copy, Copia Segura):
El comando basico de
scp es el siguiente scp [[<usuario>@]<servidor>:]<archivo origen> [[<usuario>@]<servidor>:]<archivo destino 1> [ [[<usuario>@]<servidor>:]<archivo destino 2> ... ] Es decir, el comando es
scp y en cada opcion se utiliza la siguiente notacion para definir un archivo:[[<usuario>@]<servidor>:]<archivo> Si el archivo esta (o se va a copiar) a otro pc, se escribe <servidor> : <archivo> , si el archivo es local, solo el nombre del archivo, y si el archivo esta en otro pc, pero se accede a traves de otro usuario, <usuario> @ <servidor> : <archivo> El primer archivo es el que se va a copiar y los demas es a donde se va a copiar, por ejemplo:
Aqui se copia un archivo ('example') del servidor 'sleepless', a el archivo local 'example'.
Las opciones son parecidas a la del programa
cp de unix, por ejemplo permite copiar directiorios enteros:Cifrando conexiones:
Si conoces el protocolo SOCKS sabras que sirve para hacer servidores proxy y clientes para cualquier protocolo que funcione sobre TCP/IP (con SOCKS5 tambien sobre UDP/IP, pero en este caso concreto no), ssh permite utilizarlo para cifrar conexiones entre el cliente y el servidor, para proteger los datos en la red que hay entre los dos (y que puede ser insegura), la idea es algo asi:
[Cliente SSH] ~~~~~~~~~> [Servidor SSH] --------------> [Destino]
Red insegura Red segura
(Cifrado) (sin cifrar)
Esto sirve por ejemplo para un portatil que esta conectado a una wifi y que tiene (ya dentro de la red con cable, protegida, ...) un servidor SSH, se tunelan los paquetes hasta el servidor (a la aplicacion lo trata como un simple proxy SOCKS), donde ya no es posible un ataque tan sencillo como usar un sniffer en una red WEP.
Para hacer esto usaremos
ssh -D [<ip de enlace>:]<puerto de enlace> [<usuario>@]< servidor> [-p <puerto para ssh>]Como se puede ver es igual que un comando
ssh con la diferencia de que se añade -D [<ip de enlace>:]<puerto de enlace>La opcion
-D significa que el tunelado sera dinamico (hay otras opciones que usan tunelado estatico, siempre al mismo pc y en el mismo puerto), sobre SOCKS.La
ip del enlace es opcional y sirve para concretar que interfaz de red se va a utilizar para la conexion, si no se especifica (o se usa un '*') cualquier pc en la red podra utilizar el tunel (esto puede ser util o no, dependiendo de las circunstancias), si no hay motivos para dejarlo abierto recomendaria utilizar 'localhost' (o '127.0.0.1') para permitir solo las conexiones locales.Y
puerto de enlace es el puerto que se proporcionara a los programas para que se conecten al tunelPor ejemplo:
ssh -D localhost:1234 sleeplessAbrira una conexion SSH con 'sleepless' y un tunel SSH que se puede acceder por 'localhost' y por el puerto '1234' (normalmente solo el superusuario tiene permiso para abrir puertos con un numero menor que 1024)
Y esto es todo por ahora... (proximamente el SSHFS y las VPN)
[Referencias]
http://www.openssh.org/
http://www.lucianobello.com.ar/openssh/
http://tuxpepino.wordpress.com/2007/05/11/ssh-el-dios-de-la-administracion-remota/
Hasta otra.
Suscribirse a:
Entradas (Atom)









