Underc0de

[In]Seguridad Informática => Seguridad web y en servidores => Mensaje iniciado por: vjnario en Enero 31, 2013, 07:00:21 AM

Título: Buscar el puerto de escucha mediante el /proc
Publicado por: vjnario en Enero 31, 2013, 07:00:21 AM
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) [Seleccionar]
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) [Seleccionar]
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) [Seleccionar]
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) [Seleccionar]
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) [Seleccionar]
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 !!!!

Título: Re: Buscar el puerto de escucha mediante el /proc
Publicado por: jadcode en Enero 31, 2013, 10:07:32 AM
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.



Título: Re: Buscar el puerto de escucha mediante el /proc
Publicado por: vjnario en Enero 31, 2013, 10:28:50 AM
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....
Título: Re: Buscar el puerto de escucha mediante el /proc
Publicado por: Alex en Febrero 01, 2013, 12:39:22 PM
muy pero muy interesante, se agradece el aporte!
saludos!
Título: Re: Buscar el puerto de escucha mediante el /proc
Publicado por: neobits en Febrero 04, 2013, 11:09:22 PM
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:

#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!!!
Título: Re: Buscar el puerto de escucha mediante el /proc
Publicado por: Alex en Febrero 04, 2013, 11:20:23 PM
gracias neobits por complementar el post

+1karma para ambos.

saludos!
Título: Re: Buscar el puerto de escucha mediante el /proc
Publicado por: Adastra en Marzo 03, 2013, 02:37:52 PM
Muy buen aporte. Le pongo chincheta!
Un Saludo.