Mostrando entradas con la etiqueta Linux. Mostrar todas las entradas
Mostrando entradas con la etiqueta Linux. Mostrar todas las entradas

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 =)


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


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, 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 :)