martes, 2 de abril de 2013

Limpiar la entrada estándar en C en Linux, fflush(stdin)

Uno de los problemas que surgen a la hora de programar en C en Linux es que no podemos limpiar los caracteres no deseados que quedan almacenados en ocasiones en la entrada estándar, ya que al ejecutar la función fflush(stdin) no tiene efecto al usarse sobre el flujo de entrada.

Podemos solucionar este problema usando una función como la siguiente:


void fflushin()
{

 int d, i=0;

 d = stdin->_IO_read_end - stdin->_IO_read_ptr;

 for(i=0; i<d; i++)
  getchar();
}


La operación stdin->_IO_read_end - stdin->_IO_read_ptr nos permite calcular el número de caracteres que quedan almacenados en la entrada estándar a partir de la posición actual del puntero (osea, los caracteres sobrantes), después solo tenemos que ejecutar la función getchar() tantas veces como caracteres haya, para limpiar así la entrada estándar y deshacernos de esos caracteres no deseados.


EJEMPLO DE USO

Una situación muy habitual en la que es necesario usar una función como la anterior es la siguiente:

#include <stdio.h>

main()
{

 int num;

 printf("\nInserta un numero: ");
 
 scanf("%d", &num);

 printf("numero insertado: %d", num);

 printf("\n\nPulsa enter para continuar\n\n");

 getchar();
}


En el programa anterior tenemos la intención de usar la función getchar() para pausar la ejecución del programa hasta que el usuario pulse la tecla enter, pero debido a la función scanf se queda un caracter sin leer en la entrada estándar (el caracter de nueva linea), caracter que leerá la función getchar() sin detenerse como teníamos previsto.

Para solucionarlo lo único que tenemos que hacer es limpiar los caracteres no deseados que se han quedado en la entrada estándar usando la función fflushin() que hemos definido:



#include <stdio.h>

void fflushin()
{

 int d, i=0;

 d = stdin->_IO_read_end - stdin->_IO_read_ptr;

 for(i=0; i<d; i++)
  getchar();
}

main()
{

 int num;

 printf("\nInserta un numero: ");
 
 scanf("%d", &num);

 printf("numero insertado: %d", num);

 printf("\n\nPulsa enter para continuar\n\n");

 fflushin();

 getchar();
}




Y de esta manera el programa funciona tal y como habíamos planeado ya que la función fflushin() ha limpiado esos caracteres no deseados de la entrada estándar y por lo tanto la función getchar() detiene la ejecución del programa hasta que el usuario pulse la tecla enter.

Saludos =)


domingo, 3 de marzo de 2013

Netstat, ¿Quién está conectado a mi ordenador?

Buenas, en muchas ocasiones queremos saber si algún programa de nuestro ordenador se está conectando con otro programa en otro ordenador a través de la red, o dicho de otra manera, queremos saber si algún programa está haciendo uso de la red (conectándose a internet o a otro ordenador de nuestra propia red).

En esta entrada os enseñaré como ver las conexiones de red que tiene establecidas vuestro ordenador usando netstat. Gracias a esto podréis saber que programas están haciendo uso de la red, lo cual os puede servir además de para saber que programas en cuestión están haciendo uso de la red también para detectar posibles programas no autorizados que estén haciendo uso de la red en vuestro ordenador.

Bien, para saber que programas tienen alguna conexión establecida usaremos netstat, este programa viene en todos los sistemas linux (no necesitáis instalar nada), el programa lo ejecutaremos desde la línea de comandos.

Nota: Usando este método solo veremos los programas que usen una transmisión TCP, ya que UDP no está orientado a conexión (por lo tanto no existe ninguna conexión), de todos modos la gran mayoría de los programas usan TCP y no UDP.

El programa lo podemos ejecutar sin mas, osea, simplemente abrimos una shell y tecleamos netstat pero este método no es muy eficiente, ya que la salida de datos que nos dará el programa es demasiado grande y será demasiado liosa como para sacar conclusiones, así que os daré un par de opciones para usar con el programa para que produzca una salida mas limpia y fácil de interpretar.

Algunas de las opciones que podemos incluir son las siguientes:

-n: muestra la dirección y el puerto de manera numérica, esta opción en ocasiones puede interesarnos quitarla, para que se nos muestre el nombre de dominio y el nombre del puerto.

-t: muestra las conexiones TCP.

-p: muestra el nombre del proceso (programa) relacionado con la conexión.

Ejecutamos netstat con estas opciones:


netstat -ntp


y obtenemos una salida tal que así:





Nota: La salida ha sido truncada con el fin de que no rompa la estructura del blog, de todos modos la salida real es prácticamente la misma, solo he dejado los campos que me interesa comentar.

Los datos que nos muestra netstat son los siguientes:

Local Address: dirección de origen, con el formato IP:PUERTO.

Foreign Address: dirección de destino, con el formato IP:PUERTO.

State: Existen varios estados para las conexiones, pero principalmente los que veremos mas comúnmente son ESTABLISHED que indica que hay una conexión establecida, TIME_WAIT que indica que hay una comunicación en proceso de ser cerrada y CLOSE_WAIT que indica que hay una comunicacion cerrada por el extremo remoto y esperando a que el extremo local la finalice.

PID/Program name: indica el PID (identificador de proceso) y el nombre del proceso que esta participando en esa conexión.

En esta ocasión podemos observar que hay dos programas que tienen alguna conexión establecida, uno de ellos es telnet, y el otro es ftp, en este caso podemos ver que telnet esta conectado a través del puerto 23 con la dirección 192.168.120.30, osea que esta conectado a un dispositivo que esta en mi red, y el ftp esta conectado a través del puerto 21 con la dirección 208.118.235.20 que se corresponde con la dirección ip de ftp.gnu.org, en esta ocasión podría habernos beneficiado el quitar la opción -n para poder ver el nombre de dominio.

En el ejemplo anterior la salida se ve muy clara, ya que los programas solo establecen una conexión cada uno, pero por otra parte tendremos que tener cuidado con otros programas, como por ejemplo navegadores web o programas P2P, ya que estos programas suelen establecer varias conexiones y a la hora de hacer una consulta con netstat puede resultar un poco confuso y extraño, pero en realidad es algo normal, ya que por ejemplo cuando un navegador solicita una pagina web tiene que realizar varias conexiones a distintos sitios para poder obtener algunos elementos de la pagina web, como pueden ser imágenes o vídeos por ejemplo.

Si tenemos un navegador web abierto podríamos obtener una salida tal que así:





Como podemos ver en este caso el navegador tiene 3 conexiones establecidas, dos de ella son a través de https (puerto 443) y otra a través de http (puerto 80).

En caso de que queramos detectar algún programa no autorizado haciendo uso de la red podemos cerrar todos los programas que nosotros sabemos que realmente están haciendo uso de la red, como pueden ser el navegador web, un cliente ftp, programas p2p, cliente de correo...etc. una vez cerrados todos los programas, al ejecutar netstat nos debería de mostrar una salida vacía tal que así:





Si se nos mostrase algo, tendríamos que analizar exactamente de que programa se trata.

Nota: OJO! si acabáis de cerrar programas quizás se sigan mostrando con el netstat, probablemente con el estado TIME_WAIT o CLOSE_WAIT, en este caso solo tendríais que esperar a que las conexiones finalizasen del todo.

Quizá podría tratarse simplemente de algo inofensivo, como un programa del sistema buscando actualizaciones o algo parecido, de todos modos en caso de que se muestre algo y no sepáis exactamente de que programa se trata os recomiendo que primero busquéis información en Google sobre el nombre del proceso, si aun así no conseguís resolver las dudas os recomiendo matar el proceso, podéis hacerlo usando el comando kill y el numero identificador de proceso (PID) que muestra el netstat, de manera que si por ejemplo el proceso tuviese el PID 5430 lo mataríamos usando:


kill -s 9 5430


la opción -s 9 se usa para matar directamente el proceso.


y hasta aquí por ahora, espero que os haya gustado

Saludos :D


Número áureo (cálculo alternativo)

Holas, hace unas semanas publiqué una entrada en la que explicaba lo que era el número áureo y como se calculaba a partir de la secuencia de Fibonacci.

En esta entrada os mostraré una manera alternativa de calcular el número áureo, lo cierto es que esta manera de calcularlo me parece super curiosa, mas que nada por las operaciones que se realizan...

El cálculo en cuestión es el siguiente:


1+(1/1+(1/1+(1/1+(1/1+(1/1+(1/1))))))


La operación a simple vista puede parecer un poco engorrosa, pero realmente es una operación muy sencilla, lo único que estamos haciendo es sumar uno mas uno, y después dividir el segundo operando de la suma (el segundo uno) entre uno mas uno, y así seguido, la operación se puede repetir hasta el infinito, de manera que cuantos mas bucles realicemos mas preciso será el número áureo que obtengamos.

Y al igual que con el otro método, en esta ocasión también he diseñado un código para calcular el número áureo usando este método, os lo dejo a continuación:



#include <stdio.h>

int main(int argc, char *argv[])
{

 if(argc<2)
 {
  printf("\nSe necesita un argumento\n\n");
 
  return -1;
 }

 if(!(atoi(argv[1]) > 0 && atoi(argv[1]) <=37))
 {
  printf("\nEl argumento debe estar entre 0 y 37\n\n");

  return -1; 
 }

 int max, i=0;

 double inc = 1;

 max = atoi(argv[1]);

 for(i=0; i < max; i++)
 {
  inc=(double)1/((double)1+inc);

 }

printf("\nNumero Aureo: %.50lf\n\n", (double)1+inc);


}


Para usar el programa solo hay que indicarle como argumento el número de bucles que realizará el programa para calcular el número áureo.

y esto es todo por ahora.

Saludos =)


domingo, 27 de enero de 2013

Visor hexadecimal

Buenas, en esta entrada os traigo algo que tenía ganas de hacer hace tiempo, un programa para ver los datos de un archivo en formato hexadecimal.

Este tipo de programas es algo que suelo usar bastante, así que ademas de servirme como práctica de programación también es algo a lo que le voy a dar bastante uso.

La verdad es que me gusta la simplicidad con la que he diseñado el programa. De momento el programa solo visualiza los datos, pero probablemente modifique el programa para que también permita editarlos.

Cuando ejecutéis el programa os saldrán dos columnas, a la izquierda os aparecerán los datos en hexadecimal y a la derecha los caracteres ASCII imprimibles.

En la columna de la derecha, donde se visualizan los caracteres imprimibles, he decidido poner solo los caracteres básicos, del ASCII 33 al 126, y no los extendidos, ya que varían según la codificación que se use.

Os dejo el código a continuación:

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
 FILE *arc;

 int i=0, k=0, h=0, j=0, m=0, x=0;
 int **car = NULL;


 if(argc<2)
 {
  printf("\nFaltan un argumento\n\nModo de uso: %s \n\n", argv[0]);
 
  exit(-1);
 }


 if((arc = fopen(argv[1], "r")) == NULL)
 {
  printf("\nError al abrir el archivo\n\n");
 
  exit(-1);
 }


 while(!ferror(arc) && !feof(arc))
 {

  if ((car = (int **)realloc(car, (i+1) * sizeof(int *))) == NULL)
  {
   printf("\nError al asignar memoria\n\n");
   exit(-1);
  }


  if((car[i] = (int *)malloc(16 * sizeof(int))) == NULL)
  {
   printf("\nError al asignar memoria\n\n");

   exit(-1);
  }


  for(k=0; k<16; k++)
  {
  
   car[i][k] = fgetc(arc);

  }

  i++;

 }

 if(ferror(arc))
 {
  perror("\nSe ha producido un error durante la lectura\n\n");
 }


 printf("\n\n");


 for(h=0; h<i; h++)
 {
  for(j=0; j<16; j++)
  {
  
   if(car[h][j]==-1)
   {
    for(x=0; x < (16-j); x++)
     printf("   ");

    break;
   }
   else
   {
    if(car[h][j]<16)
    {
     printf("0%X ",car[h][j]);
    }
    else
    {
   
     printf("%X ", car[h][j]);
    }
   
   
   }

  }

  printf("\t");

  for(j=0; j<16; j++)
  {
 
   if(car[h][j]==-1)
   {
    break;
   }
   else
   {
   
    if((car[h][j] > 32) && (car[h][j] < 127))
    {
    
     printf("%c",car[h][j]);
   
    }
    else
    {
    
     printf(".");

    }
   }
  }


 printf("\n");
 
 }

 printf("\n\n");


 for(m=0; m<i; m++)
  free(car[m]);


 free(car);

 fclose(arc);


 return 0;

}
 


lo compilamos con:


cc hexa.c -o hexa


Para ejecutarlo solo tenemos que indicar como argumento el nombre de archivo que queremos visualizar:


./hexa <nombre_archivo>


Si el archivo a visualizar es demasiado grande probablemente el shell os trunque el principio de los datos, en esos casos os recomiendo redireccionar la salida del programa a un archivo tal que así:


./hexa archivo.jpg > prueba


y a continuación visualizar el archivo resultante desde un editor de texto.

espero que os haya gustado

Saludos =)



domingo, 20 de enero de 2013

La proporción áurea y la secuencia de Fibonacci

La proporción áurea es una proporción que se encuentra en la naturaleza y que tiene una característica especial, todos los objetos que tienen una proporción áurea nos resultan mas agradables a la vista.



El rectángulo anterior tiene una proporción áurea, ya que si dividimos su largo por su alto nos da 1,6 que es aproximadamente la proporción áurea.

Dada esta característica, la proporción áurea es habitualmente usada en el mundo del arte y en muchos objetos cotidianos, para que nos parezcan "mas bonitos".

Una de las maneras de calcular el número áureo es usando la secuencia de Fibonacci, que es una secuencia de números que también se encuentra en la naturaleza.

Para calcular la secuencia de Fibonacci solo tenemos que realizar la suma de un número de la secuencia mas el número anterior a ese en la secuencia, siendo los dos primeros números de la secuencia el 0 y el 1, de manera que los primeros números de la secuencia son:


0 1 1 2 3 5 8 13...


y para calcular el número áureo solo tenemos que dividir un número de la secuencia entre el número anterior a ese en la secuencia, teniendo en cuenta que el número áureo sera mas preciso cuanto mas avanzada esté la secuencia de Fibonacci, de manera que obtendremos un número áureo mas preciso si dividimos por ejemplo 13/8 que si dividimos 8/5.

Aprovechando la ocasión he creado un programa que calcula la secuencia de Fibonacci y opcionalmente muestra el número áureo calculado con los dos últimos números de la secuencia.

Os dejo el código a continuación:


#include <stdio.h>
#include <stdlib.h>

int fibonacci(unsigned long **, long);

int main(int argc, char *argv[])
{
unsigned long *num, i=0, max;
double aur;

if(argc==1)
{
printf("\nFalta tamaño de la secuencia\n\n");
printf("Modo de uso: %s <tamaño secuencia> [a]\n\n",argv[0]);
exit(-1);
}

max = atoi(argv[1]);

if(max>=95)
{
 printf("\nEl tamaño maximo es 94\n\n");

 exit(-1);
}


printf("\n");

fibonacci(&num, max);

i=0;

for(i=0;i<max;i++)
 printf("%lu\n\n",num[i]);


if(argc==3 && argv[2][0]=='a')
{
aur = (double)num[i-1]/(double)num[i-2];

printf("\nNumero aureo: %.50lf\n\n", aur);
}

free(num);

}


int fibonacci(unsigned long **num, long max)
{
  int i=0;
  
  *num = (unsigned long *)malloc(max * sizeof(long));

 for(i=0; i<max; i++)
 {
  if(i==0)
  {
   (*num)[i]=0;
  }
  else if(i==1)
  {
   (*num)[i]=1;
  }
  else
  {
  (*num)[i] = ((*num)[i-1]+(*num)[i-2]);

  }
 }
}



El programa lo compilamos usando:


gcc fibonacci.c -o fibonacci


Para ejecutar el programa tenemos que indicar un parámetro, que es la cantidad de números que queremos que tenga la secuencia, por ejemplo


./fibonacci 7


El ejemplo anterior nos mostrara los 7 primeros números de la secuencia de Fibonacci

Opcionalmente podemos indicar un segundo parámetro para que el programa calcule el número aureo usando los dos últimos números de la secuencia, para ello solo tenemos que indicar la letra 'a' como segundo parámetro, por ejemplo:


./fibonacci 7 a


Espero que os haya gustado

Saludos =)



sábado, 12 de enero de 2013

Cifrado del César

La criptografía es algo que me llama bastante la atención, es una de esas cosas en las que me gustaría profundizar en un futuro (preferiblemente un futuro cercano jeje).

Así que en base a esto se me ocurrió hacer un programa que usase un cifrado simple para cifrar cadenas de caracteres, y que mejor para un novato que usar una de las técnicas criptograficas mas simples que existen, el cifrado del César.

Para los que no lo conozcáis, el cifrado del Cesar es un algoritmo criptografico que consiste simplemente en coger una cadena de caracteres y desplazar cada uno de sus caracteres una cantidad fija de posiciones en el alfabeto, probablemente sea el algoritmo criptografico mas simple que existe.

Poniendo un ejemplo, si cogiésemos la cadena "hola" y desplazásemos todos sus caracteres 5 posiciones hacia adelante en el alfabeto nos quedaría la cadena "mtqf", en el caso de que quisiésemos descifrar la cadena para obtener de nuevo la cadena original pues tendríamos que hacer el proceso inverso y desplazar todos los caracteres 5 posiciones hacia atrás.

Antes de ni siquiera empezar a pensar en el código del programa pensé que me llevaría bastantes lineas de código realizarlo, pero para mi sorpresa cuando me puse a programarlo me di cuenta de que el programa se podía realizar con una pequeña cantidad de lineas de codigo, es curioso como a veces algo que piensas que puede ser complicado al final resulta sencillo.

Os dejo el código del programa a continuación:


#include <stdio.h>

int main(int argc, char *argv[])
{
char c;

if(argc==1)
{
 printf("\nModo de uso: %s \n\n",argv[0]);

 return 0;
}

while((c=getchar()) != EOF)
{
if(c=='\n')
{
 printf("\n");
}
else if(c==' ')
{
 printf(" ");
}
else
{
 printf("%c",c+atoi(argv[1]));

}
}
return 0;
}



Para compilar el programa simplemente lo guardáis en un archivo "cesar.c" y ejecutáis el compilador tal que así:


gcc cesar.c -o cesar


Para usar el programa tendréis que ejecutarlo con un parámetro, este parámetro es el numero de cifrado que queréis usar (lo que equivaldría al desplazamiento de las letras en el alfabeto)

Imaginaros que queremos realizar el ejemplo que os ponía antes, pues lo haríamos de la siguiente manera, primero ejecutamos el programa tal que así:


./cesar 5


Después de ejecutarlo, el programa se queda a la espera de que introduzcamos una cadena de caracteres, así que introducimos "hola" y pulsamos enter y el programa a continuación nos muestra el resultado encriptado:



Si lo deseamos podemos seguir introduciendo cadenas de caracteres y el programa las ira traduciendo una a una, cuando queramos finalizar la ejecución del programa podemos hacerlo con control+c o control+d.

Para desencriptar este mensaje seguiríamos el mismo proceso, pero esta vez en vez de poner 5 como parámetro pondríamos -5, así desharíamos la encriptacion:



El numero de cifrado puede oscilar entre 0 y 255, en este aspecto podríamos decir que es una mejora del cifrado del César ya que no solo usa los caracteres del alfabeto sino que uso todos los caracteres ASCII.

También podéis usar el programa para cifrar archivos (archivos de texto plano), podéis hacerlo usando una doble redirección en el shell tal que así:


./cesar 24 < prueba > prueba_cifrado


Donde prueba es el archivo que queremos cifrar y prueba_cifrado es el archivo resultante ya cifrado.

Para descifrar el archivo lo haríamos así:


./cesar -24 < prueba_cifrado > prueba_descifrado


Donde prueba_cifrado es el archivo que ciframos anteriormente y prueba_descifrado el archivo ya descifrado, osea el archivo original.

Espero que os haya gustado, Saludos =D


jueves, 8 de noviembre de 2012

Como detectar y evitar un ARP Spoofing

Holas, hoy os traigo otra de esas entradas que está relacionada con otra entrada.

En este caso está relacionada con el manual de ARP Spoofing que subí hace un tiempo, así que en esta ocasión os contare como detectar y evitar un ARP Spoofing.


¿CÓMO DETECTAR UN ARP SPOOFING?

Esta es quizá la parte mas complicada, ya que es muy difícil detectarlo, de hecho una persona que sepa hacerlo muy bien puede hacer un ARP Spoofing prácticamente indetectable.

El primer método para detectar un ARP Spoofing es mirar la tabla ARP y comprobar que todas las direcciones MAC son distintas, si hay alguna repetida quiere decir que estamos siendo víctimas de un ARP Spoofing, ya que las direcciones MAC son únicas para cada dispositivo, además es muy probable que la dirección mac duplicada sea la que hace referencia a vuestra puerta de enlace (gateway), ya que casi siempre se intenta redirigir el tráfico que se envía hacia internet.

para mirar la tabla ARP podéis hacerlo con este comando (se necesitan permisos de root para ejecutar el comando arp):


arp -v




como se puede ver en la imagen aparecen dos direcciones IP con la misma dirección MAC. La dirección MAC que aparece es la del ordenador al que estamos siendo redirigidos (por lo general suele ser el pc del atacante).

La segunda manera de detectar un ARP Spoofing es ejecutando un sniffer (como wireshark) en nuestro ordenador, de manera que tenemos que fijarnos en los paquetes ARP reply que recibimos (podemos poner un filtro en el wireshark para facilitar la visualización), si vemos que recibimos varios paquetes indicando una dirección IP y distintas direcciones MAC, quiere decir que estamos siendo victimas de un ARP Spoofing.



Como se puede ver en la imagen, se están recibiendo varios paquetes ARP reply indicando la dirección 192.168.120.30, pero las direcciones MAC con la que vienen asociados son distintas, lo cual es una incongruencia, ya que una tarjeta de red no puede tener más de una dirección MAC, lo cual indica que hay un atacante enviándonos paquetes ARP reply falsos y por otra parte está el dispositivo verdadero que también nos esta enviando sus paquetes ARP reply.

Por lo general en estos casos los paquetes ARP mas abundantes serán los falsos y los menos abundantes serán los verdaderos.


¿CÓMO BLOQUEAR O EVITAR UN ARP SPOOFING?

Bien, lo que veremos a continuación es como evitar ser víctimas de un ARP Spoofing, el procedimiento a seguir es bastante fácil.

Lo único que tenemos que hacer para evitar un ARP Spoofing es poner las entradas de la tabla ARP, estáticas (en vez de dinámicas que es como se crean por defecto).

Para introducir entradas estáticas en la tabla ARP lo haremos de la siguiente manera:


arp -s <direccion IP> <direccion MAC>


donde <direccion IP> es la dirección IP del ordenador que queramos introducir en la tabla ARP y <direccion MAC> es la dirección MAC que tenga dicho ordenador.

Ahora viene la pregunta ¿qué ordenadores tengo que meter en la tabla ARP?, realmente el más importante de todos es la puerta de enlace (gateway) ya que el ARP Spoofing casi siempre se hace con el objetivo de conseguir interceptar el tráfico que va dirigido hacia internet, pero si te sueles conectar a ordenadores de tu red (y no solo a internet) también es recomendable poner estos ordenadores en la tabla.

Nota: para saber la dirección MAC de los ordenadores que vas a introducir en la tabla puedes fiarte de las direcciones que ya están en la tabla (como dinámicas) siempre y cuando estés 100% seguro de que nadie te esta realizando un ARP Spoofing en ese momento, de todas maneras lo mas seguro es que las mires directamente en los ordenadores que quieras meter en la tabla (usando el comando ifconfig en cada uno de ellos por ejemplo), en el caso del router puedes mirar la dirección MAC en la página de configuración del mismo.

En este caso yo solo voy a poner la entrada para mi puerta de enlace (gateway), de manera que lo haría así:


arp -s 192.168.120.30 d0:ae:ec:ec:0a:44




Como podemos ver ahora en el campo "Flags" aparece una "M" indicando que la entrada ha sido introducida de manera manual en la tabla.

Nota: la entrada manual se borrará al reiniciar el sistema, así que, si queremos, podemos crear un script que se inicie en el arranque del sistema para que se introduzca la entrada manual automáticamente.

Tal y como está la tabla ARP ahora mismo sería imposible que se modificase la entrada del router enviando paquetes ARP reply, de manera que es imposible que nos hagan un ARP Spoofing para suplantar a nuestro router (puerta de enlace / gateway).


Espero os haya gustado =)

Cualquier duda dejádmela en comentarios

Saludos =D


sábado, 3 de noviembre de 2012

[Manual] SSH Tunneling

holap, aquí os traigo otro de mis manuales, este en concreto creo que fue uno de los últimos (sino el último) que escribí.

Este manual trata sobre como crear un túnel a través de un protocolo seguro como lo es ssh, la verdad es que me parece algo realmente interesante, ya que te permite convertir una transmisión de datos insegura en segura, ya que ssh cifra los datos que envía.

Por otra parte esta técnica también puede emplearse para hacer una redirección de puertos lo cual puede ser bastante útil en ciertas ocasiones.

El manual en si es bastante escueto, pero creo que el contenido merece la pena.

Os dejo el manual a continuación: SSH Tunneling

Saludos =)

viernes, 2 de noviembre de 2012

¿Cómo saber quien está en mi red? PARTE 2

Buenassssss.... esta entrada es una continuación de una que publiqué hace unas semanas, os la dejo AQUI.

Bien, como mencioné en la otra entrada, a veces los paquetes ICMP pueden ser bloqueados, de manera que no podemos confirmar realmente si hay o no un dispositivo en una dirección concreta, ya que si bloquea lo paquetes ICMP no recibimos ninguna respuesta a pesar de que SI hay alguien en la dirección ip a la cual enviamos la solicitud ICMP.

Ok, aquí es donde entra en juego el protocolo ARP. Resumiendo mucho el tema: en una red de área local los ordenadores se comunican con direcciones físicas (MAC), y el protocolo ARP se encarga de hacer una asociación entre las direcciones IP y las direcciones MAC. Resumiendo del todo, si un ordenador quiere estar conectado a una red tendrá que responder a las solicitudes ARP que se le manden, así que nosotros usaremos esto para descubrir que dispositivos están conectados realmente a nuestra red.

Nota: si un ordenador bloquease los paquetes ARP no se podría conectar a la red, ya que no podría ni enviar ni recibir paquetes al no poder recibir información del protocolo ARP, lo cual nos asegura que al realizar solicitudes ARP nos responderán todos los dispositivos que están realmente en nuestra red.

perfecto, ahora ya sabemos el truco definitivo para saber quien están en nuestra red, pero.... ¿cómo lo ponemos en práctica? pues bien, podemos hacerlo de varias maneras:

La primera manera de hacerlo es haciendo un ping con nmap tal y como hacíamos en la parte 1 y a continuación mirar la tabla ARP de nuestro equipo, para mirar la tabla ARP se necesitan privilegios de root, asi que la secuencia de comandos sería así:

Nota: yo uso la red 192.168.120.0 porque es la dirección de mi red, pero cada uno deberá de usar la dirección de su propia red, si tienes configurado el router por defecto probablemente la dirección de tu red sea 192.168.1.0


nmap -sP 192.168.120.0-255




su

arp -v




Como podemos ver se muestran un montonazo de entradas en la tabla ARP, pero casi todas nos marcan que están incompletas, las que nos interesan son las que están completas, osea, las que se nos muestran con una dirección MAC, si queremos podemos ejecutar el comando de la siguiente manera para que se nos muestren solo las entradas completas:


arp -v | grep C




estas entradas son los ordenadores que están conectados a nuestra red, en mi caso se muestran dos entradas, que corresponden a la dirección 192.168.120.30 (mi router) y 192.168.120.29 (otro ordenador de mi red), como podéis observar cuando se realiza el sondeo ICMP no se muestra esta ultima dirección (192.168.120.29) ya que en este ordenador hay un firewall que bloquea los paquetes ICMP, pero en cambio cuando consultamos la tabla arp vemos que esta ahí porque SI que responde a la solicitud ARP que hace el sistema.

Nota: en el sondeo icmp sale la dirección 192.168.120.21 que es la dirección de mi propio ordenador, por eso no sale después en la tabla ARP.

La segunda manera es la mas factible, ya que solo usamos nmap, de hecho usamos nmap exactamente de la misma manera que antes, lo único que cambia es que lo haremos con permisos de root:


su

nmap -sP 192.168.120.0-255




Como podemos ver en esta ocasión también se nos muestra la dirección 192.168.120.29 que antes no se mostraba.

El tema es que nmap siempre hace un sondeo ARP, lo que pasa es que, por decirlo de alguna manera, nmap necesita permisos de root para poder acceder a la información del protocolo ARP, así que cuando lo ejecutamos sin permisos de root solo nos muestra el resultado del sondeo ICMP, pero cuando lo ejecutamos con permisos de root nos muestra también el sondeo ARP (que es mas fiable).

De todas maneras también podemos indicarle a nmap que haga un sondeo exclusivamente ARP de la siguiente manera:


nmap -PR 192.168.120.0-255


Esta opción ademas del sondeo ARP también hará un escaner de los puertos mas habituales, si queremos evadir un poco el escaner de puertos, podemos ejecutar el programa de la siguiente manera:


nmap -p 0 -PR 192.168.120.0-255


Conclusión final:

Para saber quien esta en tu red lo único que tienes que hacer es ponerte como root en un shell (usando el comando su) y después simplemente usar nmap con la opción -sP y el rango de direcciones de tu red.

Cualquier duda que tengáis dejádmela en los comentarios

Saludos =)


domingo, 28 de octubre de 2012

Instalar nemesis, resolución de errores

Hola de nuevo, hace tiempo puse una entrada acerca de ARP Spoofing, en dicha entrada hablaba de un programa llamado nemesis (un inyector de paquetes), resulta que el otro día estuve intentado instalarlo y me encontré con que hay un problema al instalar el programa en un ordenador de 64 bits, así que ,enlazando un poco con la entrada anterior, en esta entrada os enseñare a instalar nemesis y como solventar esos pequeños problemas al instalarlo en un ordenador de 64 bits.

Bien, lo primero que necesitamos es el programa en si, ademas de la librería libnet-1.0.2a, podéis descargar ambos en los siguientes enlaces:

Descargar libnet-1.0.2a

Descargar nemesis

Primero vamos a instalar la librería, así que primero la extraemos con tar:


tar xvf libnet-1.0.2a.tar.gz


Después entramos en la carpeta que se ha extraído:


cd Libnet-1.0.2a/


y ejecutamos el script configure:


./configure


compilamos:


make


y realizamos la instalación:


sudo make install


aquí es donde encontramos el primer problema, cuando intentamos instalar nos da un error el programa make, no estoy seguro pero creo que este error solo sale dependiendo de la versión del make que tengas, de todas maneras es fácil de arreglar, editamos el archivo Makefile y cambiamos la siguiente línea:


MAN_PREFIX =


dejándola así:


MAN_PREFIX = /usr/share/man/man3



esta opción solo indica en que lugar se pondrá el manual de la librería. A continuación guardamos el Makefile con los cambios realizados y volvemos a ejecutar el sudo make install.

Bien, ya tenemos instalada la librería libnet, ahora instalaremos el nemesis

Extraemos los archivos:


tar xvf nemesis-1.4.tar.gz


Entramos en la carpeta que se ha extraído:


cd nemesis-1.4/


y ejecutamos el script configure, pero en este caso si lo ejecutáis normal os dirá que falta la librería libnet, a pesar de que la acabamos de instalar, ya que el script buscará la librería en un lugar distinto al que se instala por defecto, así que tendremos que indicarle en donde están los archivos de cabecera y la librería, lo haremos de la siguiente manera:


./configure --with-libnet-includes=/usr/include/ --with-libnet-libraries=/usr/lib/


ahora debería de ejecutarse el configure sin ningún problema.

A continuación lanzaremos el programa make para compilar el programa:


make



Aquí viene un nuevo problema, el compilador da error en una línea concreta (la línea 342) de uno de los archivo de código fuente (nemesis-functions.c situado en la carpeta src), resulta que el compilador de 64 bits no acepta esa línea en concreto, por suerte no es una función importante, así que podemos comentarla para que no se ejecute, esto no afectara al rendimiento del programa.

Podemos abrir el archivo (src/nemesis-functions.c) con un editor que nos marque el número de líneas para saber exactamente cual es la linea 342, yo lo haré con vi. Una vez encontremos la linea simplemente la comentamos poniendo "//" al principio de la linea, quedado así:



Bien, ahora ya podemos ejecutar make para compilar el programa.

A continuación instalamos el programa:


sudo make install


y listo, ya tenemos nemesis instalado en nuestro equipo. Si tenéis un equipo de 32 bits no debería de daros estos errores (quizá si que os de el error al instalar libnet pero los otros no debería), así que simplemente ejecutar todos los pasos de manera normal y os debería de instalar sin problemas.


Espero os sirva, cualquier duda dejarla en comentarios

Saludos =)


Instalar programas desde las fuentes

Hola, hoy os enseñaré algo bastante interesante, como instalar un programa desde las fuentes en linux.

NOTA: la mayoría de programas de linux están escritos en C, así que la gran mayoría de veces que tengamos que instalar un programa desde las fuentes es casi seguro que será un programa escrito en C, por eso solo mostrare ejemplos de programas en C.

Empezaremos por algo simple, si tuviésemos un programa muy simple en el cual todo su código esta en un solo fichero sería bastante fácil instalarlo, solo tendríamos que lanzar el compilador C y posteriormente moverlo a la carpeta que quisiésemos, podríamos moverlo a /usr/bin para tenerlo siempre a mano.

Por ejemplo, si tuviésemos el siguiente programa hello.c:


#include <stdio.h>

main()

{
printf("Hello world\n");
}



para instalarlo podríamos hacerlo asi:


gcc hello.c -o hello

mv hello /usr/bin


Este es un ejemplo muy simple, en el que solo compilaríamos el único archivo de código que tiene el programa y posteriormente lo moveríamos a /usr/bin para tener acceso al programa desde cualquier directorio.

Normalmente los programas se suelen dividir en varios archivos de código fuente, ademas de que también suelen usar varias librerías de código. Para poder realizar todas las operaciones de compilación se suele usar un archivo llamado Makefile, en el cual están todas las instrucciones que se le deben pasar al compilador para poder compilar el programa de una manera ordenada.

Cuando descargamos un programa para instalarlo desde las fuentes normalmente se suele bajar un archivo con extensión ".tar.gz" esto quiere decir que el programa esta archivado y comprimido con tar y gzip, dentro de este archivo estará todo el código fuente del programa.

Lo primero que tenemos que hacer es extraer los archivos que hay dentro del archivo ".tar.gz" para ello usaremos tar (desde el shell) de la siguiente manera:


tar xvf programa.tar.gz


donde "programa.tar.gz" es el nombre completo del archivo que tengamos que extraer.

Una vez tengamos extraídos todos los archivos en muchos casos podemos encontrarnos archivos de texto plano en los cuales tenemos una serie de instrucciones para instalar el programa, es recomendable pararse un momento a leer estas instrucciones (estos archivos suelen tener nombres como README, INSTALL...etc)

Vale, en este momento ya tenemos nuestro programa con todos los archivos extraídos, ahora lo que tendríamos que hacer es ejecutar un archivo llamado configure, este archivo es un script encargado de realizar una comprobación de nuestro sistema para asegurarse de que tenemos todas las librerías y programas necesarios para llevar a cabo la compilación e instalación del programa, ademas configure se encarga de crear el archivo Makefile que he mencionado anteriormente, pero solo lo creara cuando se asegure de que tenemos todo lo necesario para realizar la instalación del programa, podemos ejecutar el script configure desde el shell usando:


./configure


Una vez ejecutado veremos en pantalla una serie de comprobaciones, tenemos que asegurarnos de que el programa finaliza la ejecución sin dar ningún error, en caso de que se nos muestre algún error tendremos que solucionarlo, configure nos indicara a que se debe el error, por lo general suelen ser errores indicando la falta de alguna librería, en este caso tendríamos que instalar dicha librería para poder continuar la instalación, una vez hayamos solucionado el error tendremos que ejecutar de nuevo configure para que nos certifique que no hay mas errores y nos cree el Makefile.

Una vez ejecutado el script configure de manera satisfactoria es hora de compilar el programa usando el Makefile, para ello haremos lo siguiente (desde el shell):


make


el programa make se encarga de buscar el archivo Makefile en nuestro directorio actual y de realizar las operaciones indicadas en el archivo. No os preocupéis si veis que la compilación dura mucho tiempo, en algunos programas un poco grandes es normal.

Una vez compilado el programa tendríamos que instalarlo, para ello lo haríamos con el siguiente comando (por lo general casi siempre se necesitan permisos de root, por eso se añade el sudo al principio):


sudo make install


Este ultimo comando no es realmente necesario, ya que el programa ya lo tenemos compilado y listo para funcionar en la carpeta en la cual lo hemos compilado, lo único que hace el comando make con el argumento install, es mover algunos archivos (como el binario ejecutable o algunos archivos de configuración) a algunas carpetas de nuestro sistema para que podamos ejecutar el programa desde cualquier sitio y no tengamos que ir estrictamente a la carpeta en la que lo compilamos.

De hecho hay algunos programas que carecen de la opción install, en este caso por lo general tendremos que cojer nosotros el binario ejecutable y moverlo manualmente a alguna carpeta como /bin o /usr/bin, que nos permitan la ejecución desde cualquier directorio del sistema


Resumiendo, lo único que necesitamos para instalar un programa desde las fuentes es:

-Extraer los archivos:

tar xvf <nombre_archivo>

-Comprobar que tenemos todo lo necesario:

./configure

-Compilar

make

-Instalar

sudo make install

Espero que os haya gustado este mini-tutorial, si tenéis alguna pregunta no dudéis en dejármela en los comentarios.

Saludos :D

sábado, 27 de octubre de 2012

Wikeando

Hola a todos, hoy traigo buenas y malas noticias... empecemos por lo bueno.

Mis compañeros de clase y yo hemos decidido empezar un wiki para poder documentar todo lo que podamos relacionado con la informática, es un proyecto que realmente me entusiasma, os dejo la dirección del wiki: http://leliadouratic.sytes.net

Bien, ahora viene la parte mala, el wiki me esta comiendo mucho, mucho, muuuuuuuucho tiempo, llevo toda la semana a tope con el wiki, lo cual me ha impedido hacer muchas cosas, entre ellas publicar aquí en el blog... esta semana tenía pensado publicar un par de entradas en el blog durante la semana y quizá otro par de entradas durante el fin de semana, pero estamos a sabado y todavía no he publicado nada (esta entrada no cuenta...), así que ni siquiera sé si podré llegar a ese mínimo de dos entradas que me había propuesto.

Lo que mas me fastidia es que tengo muchas ideas para publicar entradas aquí en el blog, pero literalmente me quedo sin tiempo físico para poder hacerlo, de hecho he tenido que empezar a apuntar las entradas que quiero hacer en el blog, porque sino se me olvidan xD.

y por otra parte tampoco estoy muy satisfecho con el rendimiento que he llevado en el wiki, a pesar de que he estado toda la semana con el wiki, apenas he podido publicar unas 8 entradas, lo cual esta bastante por debajo de las expectativas que tenía en un principio, creo que podría haber publicado casi el doble de contenido pero bueno...

El tema es que no quiero dejar de lado ninguno de los dos proyectos, ni el blog ni el wiki, así que no se como lo haré, pero tendré que optimizar mas mi tiempo para poder llevarlo todo de manera mas regular.

y hasta aquí todo por ahora, espero poder publicar algo por aquí esta tarde =)

Saludos.

domingo, 21 de octubre de 2012

[Script] Buscador de texto en archivos

Buenas, hoy os traigo algo que tenía ganas de hacer hace mucho tiempo, se trata de un programa (bueno, en este caso es un script) cuya función es buscar cadenas de caracteres (ya sean letras o palabras) dentro de varios archivos de texto plano.

Resumiendo, tu le das dos argumentos al script, la carpeta en la que quieres buscar y la cadena de caracteres que quieres buscar, y el programa se encarga de buscar dicha cadena de caracteres dentro de todos los archivos que hay en la carpeta que le has indicado.

Esta idea me surgió hace muchísimo tiempo, cuando me pasaba en varias ocasiones que tenía una serie de archivos (por lo general eran archivos de código fuente) y no recordaba en que archivo en concreto estaba la información que buscaba, lo cual me obligaba a abrir todos los archivos y realizar una búsqueda individual en cada uno de ellos.

En realidad la idea original la tenia pensado realizar en C, pero por unas cosas y otras, nunca llegué a realizarla. Este script hace uso de 4 programas: cat, wc, grep y test. Los 4 vienen por defecto en todos los linux, así que no tendréis que instalar nada adicional.

Bueno, hablemos de problemas. El script tiene un par de problemas, el primero es el tiempo de ejecución, si en la carpeta que indicáis solo hay archivos de texto plano pues no hay mucho problema, el script debería de ejecutarse en un par de segundos, pero si la carpeta contiene otros archivos de gran tamaño ademas de los de texto plano pues la ejecución puede ser bastante larga, lo he probado con una carpeta que contenía algunos archivos de varios GiB y ha tardado varios minutos en ejecutarse, pero bueno, en condiciones normales con archivos no muy pesados no debería de presentar problemas. El segundo problema es que el programa no es recursivo, esto quiere decir que si dentro de la carpeta que indicáis para la búsqueda existe otra carpeta pues el script no entrara en esta nueva carpeta, solo examinara la carpeta que le habéis indicado.

Si algún día llego a realizar la versión en C del programa, probablemente pueda solucionar estos problemas.

A continuación os dejo el código del script:


#!/bin/bash

if test -z $2
then

        echo
        echo "ERROR !!! Faltan argumentos."
        echo
        echo "Modo de uso: $0 <Directorio> <Cadena de caracteres a buscar>"
        echo


else

max=`ls $1 | wc -l`

for ((i=1; i<=$max; i++))
do

cat "$1/`ls $1 | head -n $i | tail -n 1`" 2> /dev/null\
        | grep -n -i $2 > /dev/null

if test $? -eq 0

then

        echo

        echo ----------------

        echo

        ls $1 | head -n $i | tail -n 1

        echo

        cat "$1/`ls $1 | head -n $i | tail -n 1`" 2> /dev/null\
                | grep -n -i $2

fi

done

fi

echo
echo ----------------
echo




Para guardar el script lo guardáis como un archivo de texto plano y le dais permisos de ejecución, después si queréis, podéis ponerlo en la carpeta /usr/bin/ para poder ejecutarlo desde cualquiera carpeta aunque el script no esté en ella.

Bien, el script toma dos parámetros que son de uso obligado, el primer parámetro es la carpeta donde queréis realizar la búsqueda, y el segundo parámetro es la cadena de caracteres a buscar. De manera que un ejemplo podria ser el siguiente (yo le he llamado bsc al script, pero podéis llamarle como queráis):

./bsc Documentos/ valencia

con este comando el script buscaria en la carpeta "Documentos" todos los archivos que contengan la palabra "valencia"

ACLARACIÓN: si tenéis el script en /usr/bin/ no hace falta poner el "./" inicial para ejecutar el script, ademas el script acepta rutas relativas a vuestra posición actual en el shell, osea que en el caso anterior puedo poner simplemente como carpeta "Documentos" en vez de /home/usuario/Documentos/ ya que en ese momento me encuentro en la carpeta usuario.

La salida que produce el script tiene el siguiente formato: cada archivo en el que encuentra una coincidencia lo muestra entre una serie de lineas salteadas como esta "----------------", después la primera linea que muestra es el nombre del archivo, y las lineas siguientes son las lineas del archivo en las que hay coincidencia, mostrando al comienzo de la linea el numero de linea en la que se encuentra.

Ejemplo:



Como podemos ver en este ejemplo, le hemos dicho al programa que busque en los archivos de la carpeta "test" la cadena "prueba" y en este caso se nos muestra un único resultado, el cual ha sido encontrado en el archivo "texto1.txt" y podemos ver que la linea en la que se ha encontrado la cadena es la linea numero 3 y a continuación se nos muestra la linea en cuestión.


ALGUNOS EJEMPLOS INTERESANTES

Cuando terminé el script no tenia necesidad de buscar nada en concreto, pero como tenía que probarlo pues decidí hacer algunas búsquedas en los archivos de configuración del sistema y me salieron algunos resultados interesantes, como por ejemplo los siguientes:

bsc /etc/ runlevel

Al buscar "runlevel" en los archivos de la carpeta "/etc/" se muestra en una de las coincidencias que funcionalidades están activas en cada uno de los niveles de ejecución, por ejemplo se nos indica que en el nivel 5 esta activada la red y la interfaz gráfica, y en el nivel 3 por ejemplo no esta la interfaz gráfica pero si la red.



otro ejemplo:

bsc /etc/sysconfig/ autologin



En este caso se nos indica una de las opciones del archivo "displaymanager" que indica si el sistema esta configurado para iniciar el sistema de manera automática con un usuario concreto, en mi caso esta opción la tengo vacía, así que no se hace ningún autologin.

Bueno y creo que eso es todo, si tenéis alguna duda o pregunta no dudéis en dejármela en los comentarios.

Saludos =)

sábado, 20 de octubre de 2012

Saber que servicios se están ejecutando en linux

Hola, hoy os enseñaré como comprobar que servicios tenéis en ejecución en vuestro linux.

NOTA: lo que voy a exponer a continuación no funciona en ubuntu ni debian, ya que no permiten mirar el estado de los servicios. Lo he probado personalmente en openSuSE y funciona, y también debería de funcionar en otras distros como Fedora o Mandriva

Primero, si queréis ver una lista de los servicios que hay en vuestro sistema podéis verla con el siguiente comando (debemos ejecutarlo como root):


chkconfig -l


Usando este comando obtendremos un resultado como el siguiente:




bien, aquí podemos ver a la izquierda el nombre del servicio y a la derecha podemos ver una serie de datos que indican un numero y a su derecha "on" o "off", NO OS DEJÉIS ENGAÑAR, esto no es el estado actual del servicio, lo que nos indica es el estado que tendrá el servicio al iniciar un determinado nivel de ejecución del sistema, por ejemplo "SuSEfirewall2_init" estará activo cuando se inicie el nivel de ejecución 3 o 5, pero si yo mas tarde decido desactivar el servicio manualmente (aun estando en nivel de ejecución 3 o 5) y ejecuto el chkconfig -l , me seguirá apareciendo como "on" a pesar de que realmente el servicio esta desactivado. Hay que tener cuidado con esto ya que puede inducir a error y pensar que tenemos un servicio activado o desactivado cuando realmente no es así.

Para mirar el estado real de un servicio lo que tenemos que hacer es irnos a la carpeta /etc/init.d/ dentro de esta carpeta nos aparecerán distintos archivos, los cuales muchos de ellos hacen referencia a servicios, si queremos por ejemplo ver el estado del servicio "SuSEfirewall2_init" tendríamos que ejecutar dicho archivo con el argumento "status" tal que así (una vez mas tenemos que hacerlo como root):

./SuSEfirewall2_init status





como podemos ver en la imagen en mi caso se muestra que el servicio esta ejecutándose.

Vale, ahora ya sabemos como poder ver en que estado están los servicios, pero el problema viene cuando queremos echar un vistazo a todos los servicios, en tal caso tendríamos que ir ejecutando uno por uno todos los archivos con el argumento "status" para poder ver el estado, lo cual es algo engorroso... Así que he creado un script que automatizara esta tarea y nos mostrara el estado de todos los servicios.

A continuación os dejo el código del script:



#!/bin/bash

DIR=/etc/init.d/
max=`ls $DIR | wc -l`

for (( i=1; $max >= i; i++))
do

if test $i -eq `ls $DIR | grep -n halt | cut -f 1 -d ":" | head -n 1`\
 -o $i -eq `ls $DIR | grep -n reboot | cut -f 1 -d ":" | head -n 1`
then
:
else

 echo "------------------------------"
 echo
 echo "`ls $DIR  | head -n $i | tail -n 1`"
 echo
 cd $DIR
 ./`ls $DIR | head -n $i | tail -n 1` status
 echo
fi

done



Para ejecutarlo simplemente coger el código, lo guardáis en un archivo de texto plano y le dais permisos de ejecución (yo le he llamado services al archivo, pero podeis llamarle como querais):



después para ejecutarlo tenéis que hacerlo de nuevo como root, y se os mostraran todos los servicios con su respectivo estado:




En mi caso por ejemplo podemos ver como tengo el firewall activo (servicios "SuSEfirewall2_init" y "SuSEfirewall2_setup") y también por ejemplo tengo el ssh (servicio sshd) desactivado.

En caso de que queráis activar o desactivar los servicios lo único que tenéis que hacer es ir de nuevo a la carpeta /etc/init.d/ y en vez de usar el argumento "status" al ejecutar los archivos, tenéis que usar "start" para activarlo o "stop" para desactivarlo.

Saludos :)

viernes, 19 de octubre de 2012

Una semana bien aprovechada

wenasssss !!!! ya estamos a viernes, otra semana que vuela, pero esta semana no ha sido una semana normal debido a los 3 días que hubo de huelga, a la cual no fui (ya que me parecía muy  heavy perder unas 20 horas de clase).

En principio sabia que la mayoría de gente no iba a ir a clase, pero no pensé que al final iría yo solo xD, la verdad es que me quede bastante sorprendido. Bueno, obviamente los profesores no me iban a dar clase a mi solo, cosa que ya había previsto, así que llevaba en mi mente algunas cosas preparadas para hacer durante las clases y así poder aprovechar el tiempo al máximo.

Al final la verdad es que las cosas salieron muchísimo mejor de lo que esperaba, ya que solo tenia pensado probar un par de cosas durante los 3 días de huelga, y después me dedicaría a repasar todo lo que habíamos dado de materia en todas las asignaturas, pero por un lado y por otro se me fueron ocurriendo un montón de cosas que hacer sobre un montón de temas como: pruebas de seguridad, administración y configuración de linux, resolución de problemas, experimentos de redes.... y quizá lo mas sorprendente es que dado un momento incluso me puse a programar (hacia un montón que no programaba), hice un par de experimentos en C (mas que nada para repasar algunas cosas y probar otras) y otro par en shell script.

En definitiva me fastidio bastante perder las 20 horas de clase (en las cuales habríamos dado bastante materia probablemente), pero por otro lado  creo que me ha beneficiado bastante, ya que con todo lo que he podido probar durante los 3 días he sacado un montonazo de conclusiones sobre cosas que no sabia y que gracias a algunos experimentos que hice ahora las entiendo muchísimo mejor =D, en definitiva ha sido una semana muy bien aprovechada.

Ademas por otra parte todas las pruebas que hice y los datos que saqué de ellas me servirán para hacer varias entradas en el blog, las iré poniendo según las vaya redactando.

Bueno y hablando del blog... me he propuesto poner como mínimo dos entradas por semana, la verdad es que quiero mantener el blog activo, pero me cuesta bastante encontrar tiempo para redactar las entradas y ademas durante la semana apenas tengo tiempo, así que casi siempre escribo durante el fin de semana, lo cual no me gusta mucho porque me gustaría publicar las entradas mas periódicamente (cada 2 o 3 días por ejemplo estaría bien), pero bueno, intentare hacer todo lo posible para mantener el ritmo.

Saludos :D


sábado, 13 de octubre de 2012

¿Cómo saber quien esta en mi red?

Buenas otra vez, en esta nueva entrada os traigo un mini-tutorial que creo que le puede resultar muuuyy interesante a bastantes personas, os enseñare como saber quien esta conectado en vuestra red. Sobre todo es interesante para las personas que tienen wi-fi (la mayoria vamos) y que quiere comprobar si hay alguien no autorizado que esta utilizando su red.

Bien, empezamos, para saber que ordenadores estan conectados a tu red usaremos el protocolo ICMP, quizá no os resulte familiar, pero si hablo del programa ping seguro que a mas de uno le suena. Resumiendo... lo que hace el ping es enviar una solicitud a una dirección IP en concreto, si hay un pc en esa dirección este respondera a la solicitud y obtendremos una respuesta, en caso de que no haya ningun pc simplemente no obtendremos respuesta.

Vale, ahora queremos poner esto en práctica, si quisiésemos comprobar que dispositivos hay conectados a nuestra red, tendríamos que hacer ping a todas y cada una de las direcciones de nuestra red de la siguiente manera:

- Abrimos una shell y escribimos :

ping 192.168.120.1

ping 192.168.120.2

ping 192.168.120.3

...etc, etc, etc

 NOTA: en el ejemplo puse la red 192.168.120.0 que es la que uso yo personalmente, normalmente por defecto los routers usan la red 192.168.0.1 o 192.168.1.1, si tienes el router configurado por defecto probablemente tengas una de esas dos redes.

Esto es demasiado engorroso, ademas de que nos llevaría mucho tiempo, ya que la máscara de subred que se suele usar es la 255.255.255.0 lo que indica que hay 254 direcciones útiles en la red, osea que tendríamos que usar el comando ping 254 veces para comprobar cuantos dispositivos hay conectados a nuestra red. Una solución posible seria escribir un script que ejecutase el comando ping con todas las diversas direcciones ip, (aunque la salida de datos que nos daría sería demasiado larga y el script tambien tardaría bastante en ejecutarse).

Otra solución posible sería la de hacer un ping a la dirección broadcast para que la solicitud ICMP se envíe a todos los ordenadores de la red, se haría de la siguiente manera:

ping -b 192.168.120.255

la dirección broadcast siempre es la ultima de la red, en este caso 192.168.120.255. El flag -b nos indica que la solicitud se debe de enviar como broadcast. Pero con este metodo a pesar de que parece bastante bueno tenemos otro problema y es que algunos dispositivos tienen desactivado por defecto la posibilidad de responder a una solicitud broadcast, de manera que en algunos casos puede ser que haya diversos dispositivos conectados a nuestra red y no responda a nuestra solicitud ICMP.


NMAP LA SOLUCIÓN DEFINITIVA

Bien, hasta ahora teníamos dos problemas, el primero es que si queríamos enviar solicitudes ping individualmente sería demasiado tedioso y nos llevaría mucho tiempo, y el segundo es que con la solicitud ICMP broadcast algunos dispositivos no nos responderían a pesar de estar en la red. Para poner solucion a estos problemas usaremos NMAP.

NMAP es un escaner de red, que nos permite emplear diferentes tipos de protocolos para realizar diversos tipos de escaneado en una red (es una herramienta realmente útil).

Podeis conseguir NMAP en su web oficial: http://nmap.org

Bien, una vez tengamos NMAP en nuestro pc abrimos una shell y ponemos lo siguiente (NMAP se puede usar con interfaz grafica, pero prefiero usarlo desde una shell):

nmap -sP 192.168.120.0-255

repasemos los flags:

-sP sirve para enviar solicitudes ICMP

192.168.120.0-255 es la direccion IP a la que queremos hacer ping, pero fijaros que en este caso he puesto el rango completo al que quiero hacer ping en el último byte de la direccion, de manera que asi se hará ping a todas las direcciones de mi red desde la 192.168.120.0 hasta la 192.168.120.255

veamos el resultado que da en mi caso:



Como se puede ver en mi caso salen 3 IPs, una es la del ordenador que estoy usando ahora mismo, otra es de mi router y otra es de mi smartphone, de esta manera sé que hay tres dispositivos conectados a mi red y que son tres dispositivos que me pertenecen a mi, ya que yo les he asignado esas IPs, si en este caso me apareciese una nueva IP que yo nunca he asignado querría decir que hay alguien ajeno conectado a mi red.

Esta técnica debería de funcionar en la mayoría de los casos, pero a veces puede ser que no funcione debido a que hay un bloqueo de los paquetes ICMP, en este caso habria que usar otro tipo de técnicas...

CLICK AQUÍ PARA IR A LA 2ª PARTE

Espero os haya gustado este mini-tutorial.

Saludos =D

[Manual] Como conseguir contraseñas Wi-Fi

Wolap !!!, hoy os traigo un nuevo manual de mi cosecha, en principio no tenía ninguna intención de subir este manual, pero ya que el tema salio en clase pues he decidido subirlo por si a alguien le interesa.

El manual trata sobre descifrar claves WEP, WPA/WPA2, para poder obtener acceso a puntos de acceso wi-fi de los cuales no tenemos la contraseña.

El manual (al igual que el de ARP Spoofing) lo escribí hace unos 5 años (este manual en concreto es un poco mas antiguo que el del ARP Spoofing), pero las técnicas que explico en el manual siguen funcionando igual de bien.

A continuación os dejo el manual: WEP,WPA-WPA2 Cracking

[ACTIVIDAD] Historia de los Hackers

Buenas, hoy os traigo un documental sobre la historia de los hackers que personalmente me parece muy interesante, el documental cuenta un poco el principio de todo y como con la aparición de las primeras lineas telefónicas ya había personas con la curiosidad suficiente y los conocimientos necesarios como para poder vulnerar el sistema y poder conseguir por ejemplo llamadas gratis.

Personalmente la primera parte del documental, en donde se habla de la vulneración de las líneas telefónicas me parece de lo mas increíble.

Bueno y sin más os dejo el documental:


jueves, 4 de octubre de 2012

[Manual] ARP Spoofing

Buenas, enlazando un poco con la actividad anterior de direcciones IP y MAC, he decidido subir un manual que escribí hace unos 5 años, en el cual explico como hacer un ARP Spoofing (algo que digamos esta bastante relacionado con direcciones IP y MAC), técnica que nos permite visualizar todo el trafico de un ordenador ajeno al nuestro que estea en nuestra misma red sin que este se entere...

El manual tiene muuuuuuuchísimas faltas de ortografía (lo siento, antes no tenía la manía de escribir bien xD), pero bueno, no os centreis en eso y centraros en el contenido en si, que es realmente interesante.

Por cierto, para entender el manual se deberían de tener ciertos conocimientos previos sobre redes, de todas maneras os recomiendo leer el manual para haceros una idea de como y con que facilidad alguien puede violar vuestra privacidad dentro de una red local.

A continuación os dejo el enlace al manual: ARP Spoofing

[ACTIVIDAD] Conversión de direcciones IP y MAC a binario

En esta entrada convertiremos una dirección IP y MAC a sus correspondientes en binario, primero para saber la dirección IP y MAC del equipo haremos lo siguiente:

Linux: accedemos a una shell de sistema, ya sea un terminal emulado como xterm o un terminal físico pulsado las teclas crtl+alt+F? siendo ? un numero entre 2 y 6, cuando esteamos en la shell tecleamos el siguiente comando:

ifconfig 

y nos aparecerán todos los datos de todas las interfaces, si queremos especificar una interfaz en concreto solo tenemos que indicarla como atributo, ifconfig [interfaz]. EJ: ifconfig eth0.

En linux tambien podriamos consultar la información desde la interfaz grafica, pero la manera de hacerlo varia dentro de cada distribución.

Windows: accedemos a una shell de sistema, para ello desde el menu de ejecucion tecleamos cmd, despues dentro del shell tecleamos el siguiente comando:

ipconfig /all

y nos aparecerán todos los datos relativos a las interfaces de redes. Si queremos hacerlo desde la interfaz gráfica desde el menu de ejecucion tecleamos ncpa.cpl para acceder al panel de configuracion de interfaces, despues solo tenemos que hacer click derecho encima de la interfaz de la cual queremo saber los datos y clicar en propiedades.

A continuación traduciremos una direccion IP y una MAC a binario, extraida de un equipo ubuntu:



Dirección MAC: 00:24:1D:9E:D7:34

Binario:00000000:00100100:00011101:10011110:11010111:00110100


Dirección IP: 69.51.65.19

Binario: 01000101.00110011.01000001.00010011