Buscar el puerto de escucha mediante el /proc

Iniciado por vjnario, Enero 31, 2013, 07:00:21 AM

Tema anterior - Siguiente tema

0 Miembros y 2 Visitantes están viendo este tema.

Enero 31, 2013, 07:00:21 AM Ultima modificación: Junio 05, 2015, 02:54:49 AM por EPSILON
Mediante el /proc podemos obtener la misma información que obtenemos con muchos binarios, únicamente que tenemos la información más esparcida y sin tratar.
Vamos a ver cómo obtener la información de conexiones y puertos en escucha mediante el /proc.

Vamos a usar de ejemplo el puerto de escucha de ssh.

Código: bash
netstat -ntpl | grep ssh

tcp        0      0 0.0.0.0:22              0.0.0.0:*               ESCUCHAR    551/sshd

Una vez conocido el PID, mediante el listado de descriptores de fichero podemos ver que esta escuchando mediante un socket:

Código: bash
ls -l /proc/551/fd

lrwx------ 1 root root 64 dic 10 10:15 4 -> socket:[7168]

En este caso, sabemos que es TCP, por lo que buscamos el identificador de socket en el /proc/net/tcp:

Código: bash
cat /proc/net/tcp | grep 7168

3: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 7168 1 efd14000 100 0 0 10 -1

Podemos ver el identificador que hemos buscado hacia el final, los dos primeros campos nos muestran origen y destino de la conexión. Podemos traducir el puerto de hexadecimal a decimal con:

Código: bash
echo $((0x0016))

22

Podemos encontrar que significa cada dato de esta linea en la documentación del kernel, en el fichero Documentation/networking/proc_net_tcp.txt.
Para poder obtener el estado de la conexión (campo después de la dirección destino) deberemos buscar en el fichero include/net/tcp_states.h, dónde encontramos:


TCPF_ESTABLISHED = (1 = 1)
TCPF_SYN_SENT    = (1 = 2)
TCPF_SYN_RECV    = (1  = 3)
TCPF_FIN_WAIT1    = (1 = 4)
TCPF_FIN_WAIT2    = (1 = 5)
TCPF_TIME_WAIT    = (1  = 6)
TCPF_CLOSE    = (1  = 7)
TCPF_CLOSE_WAIT    = (1 = 8)
TCPF_LAST_ACK    = (1  = 9)
TCPF_LISTEN    = (1  = 10)
TCPF_CLOSING    = (1  = 11)

Por lo que si hacemos:

Código: bash
echo $((0x0A)) 

10

Si miramos la tabla, el puerto esta en Listen.

Por lo que podemos resumir en que:
Si la conexión esta en estado ESTABLISHED, obtendremos un 01 como estado.
Si la conexión esta en estado TIME_WAIT, obtendremos un 06 como estado.
Si la conexión esta en estado LISTEN, como en el caso del ejemplo, el estado que marca indica 0A
Por lo tanto, mediante el /proc y mucha paciéncia, podemos obtener los mismos datos que obtenemos mediante netstat o ss.

Espero que os guste el aporte !!!!


Buen aporte.

Nunca lo hubiera pensado, pero a la final quedo con una duda, si con el netstat sacamos casi los mismos datos para que hacer todo este procedimiento que se hace un poco tedioso si bien el comienzo del procedimiento es invocando este comando.

Saludos y me gusto el aporte.




imagina que no va bien el servidor, imagina que en el servidor han cambiado el servicio por ejemplo ssh por ftp ,, imagina que han puesto un rootkit en (netstat), si estudias sistemas necesitas saber el funcionaminto del sistema. Si no sabes el funcionamiento del sistema como vas a saber como funciona una aplicacion,,, si no sabes el funcionamiento de los puertos nunca sabras los secretos que traen... es muy facil hacer click y que todo te lo hagan,, pero si sabes como funciona siempre sera una ventaja....

muy pero muy interesante, se agradece el aporte!
saludos!

vjnario me encanto!!

De lo mejor que he visto en el foro ^_^

Te aporto!!! Estuve viendo y probando lo que decías y se me ocurrio otra forma y nos ahorramos dos pasos en uno ;)

En ves de usar netstat y agarrar el PID y luego buscar el PID para encontrar el socket que se abre, podemos hacer esto:

Código: php
#lsof | grep ssh | grep IPv4
#cat /proc/net/tcp  | grep <[b][i]NumeroDeSocket[/i][/b]>


lsof que nos muestra los archivos usados por el sistema, le pedimos nos muestre lo que tenga que ver con SSH y como ssh crea un socket, pues le pedimos lo que use en IPv4 y ahi aparece el socket luego luego  y ya despues buscarlo como dices en /proc/net/tcp y convertirlo como dices =)

Creo es mas rapidin ;)

Saludos!!!

gracias neobits por complementar el post

+1karma para ambos.

saludos!

Muy buen aporte. Le pongo chincheta!
Un Saludo.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

"Nunca discutas con un idiota, podria no notarse la diferencia"
Kant.