Páginas

lunes, 15 de agosto de 2011

¿de quien carajo es este socket?

En su día estuve bastantes horas hasta que descubrí como se podía obtener información de un determinado socket en una determinada aplicación para Linux, por lo que dejo aquí mi experiencia para quien pueda ser de utilidad o para quien pueda corregirme en mis errores.

Lo primero es saber con que herramientas podemos trabajar para obtener esa información, lo primero si queremos saber que sockets hay abiertos en nuestro sistema de una manera rápida, yo optaría por

#lsof -i

Lo cual nos generaría una salida parecida a esta:

COMMAND    PID      USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
firefox-b 3743 usuario   65u  IPv4 144930      0t0  TCP nuestropc:50449->209.222.128.176:www (ESTABLISHED)

Veamos que nos ha dicho este comando y que hace este comando.

Por definición lsof nos muestra los archivos abiertos que hay actualmente en nuestro sistema, entendiendo por archivo copiando literalmente del man de lsof "a regular file, a directory, a block special file, a character special file, an executing text reference, a library, a stream or a network file  (Internet  socket,  NFS  file  or  UNIX  domain socket.)"

De toda esta lista solo nos interesa los últimos tipos, por lo que le decimos a lsof la opción -i la cual nos da los sockets con datos ip que le indiquemos, en nuestro caso no le aportamos nada, para que nos de todas las conexiones.

La salida nos ofrece la siguiente información:

COMMAND    

firefox-b
Aplicación propietaria del socket.

PID      
3743
pid de la aplicación propietaria. 

USER   
usuario
usuario que lanzo la aplicación.

FD
65u
es el numero del descriptor de fichero, seguido de los permisos.

TYPE
IPv4
tipo de servicio.

DEVICE
144930
el numero del dispositivo asociado al socket.

SIZE/OFF
0t0
tamaño u offset, en nuestro caso "0t" nos indica offset.

NODE 
TCP
protocolo del socket.

NAME
nuestropc:50449->209.222.128.176:www (ESTABLISHED)
información del socket: source:port->dest:port(Estado).

Ya sabemos que sockets tenemos abiertos, si queremos saber información sobre el socket y su contenido, tenemos a nuestro gran amigo tcpdump, el cual nos dirá toda la información que queramos sobre el. una posible ejecucion con los datos obtenidos seria.

#tcpdump -vvv -A -i eth1 src host nuestropc and src port 50449 and dst host 209.22.128.176 and dst port www

Con este comando obtenemos los paquetes de los sockets, recomiendo pasar la salida a un archivo ya que esto manda un chorrazo por pantalla bastante dificil de seguir.

En el lanzamiento del comando podemos diferenciar dos zonas, la primera de opciones las cuales nos indican:

-vvv: esto es para obtener el maximo de informacion posible, tambien se puede obtener menos quitandole uves, hasta el minimo omientiendolas.

-A: nos ofrece la informacion en formato ascii.

-i eth1: sirve para indicarle por que tarjeta debemos escuchar.

La segunda parte, de parametros es para indicarle las especificaciones que debe tener el socket, la sintaxis y opciones disponibles las podemos encontrar ejecutando "man pcap-filter".

Bueno ya podemos elegir que socket escuchar y asi saber que esta comunicando nuestro pc al mundo.

En la proxima entrada hablare sobre "/proc/net/tcp", "/proc/net/udp" y "/proc/PID/fd", desde donde tambien podremos obtener informacion para su posterior captacion con tcpdump.

Espero vuestras aportaciones a mi primer post :).

No hay comentarios:

Publicar un comentario