¿Cómo saber qué proceso tiene un puerto específico abierto en Linux?

32

Ejecuté nmap en mi servidor y encontré un puerto extraño abierto. Estoy tratando de averiguar si hay una manera de asignar ese puerto a un proceso específico, pero no tengo idea de si existe tal herramienta.

¿Alguna sugerencia?

jnman
fuente
Voto a favor por ser la respuesta n. ° 1 en Gogle en junio de 2018.
SDsolar

Respuestas:

57

Además de Netstat, mencionado en otras publicaciones, el comando lsof debería poder hacerlo bien. Solo usa esto:

lsof -i :<port number>

y todos los procesos deberían aparecer. Lo uso en OS X con bastante frecuencia.

Artículo de la Administración de Debian para lsof

bjtitus
fuente
interesante. Yo no sabía sobre esto. Sin embargo, estoy investigando esto como resultado de un intento de pirateo. La máquina es de un amigo. puede hacer telnet al puerto ofensivo PERO lsof AND netstat no revelan que el puerto está abierto.
jnman
el puerto es 5631 que según / etc / services es pcanywheredata muy sospechoso.
jnman
Ahora, eso es bueno, ¡no lo sabía! Siempre usó netstat. Gracias
buster
44
Si ni netstat ni lsof muestran el puerto como utilizado, pero la máquina responde, es probable que haya instalado un kit raíz. Recomiendo mover cualquier dato de la máquina a otro lugar y luego eliminarlo.
Kamil Kisiel
66
Este es de hecho un rootkit. He visto este comportamiento antes, y siempre es un rootkit. Su sistema está comprometido y no se puede confiar en las herramientas que está utilizando. Inicie en un Live CD (que tiene binarios confiables de solo lectura) y úselo para extraer sus datos, configuraciones, etc. Cualquier programa que tenga, cualquier script que tenga, abandónelos. No los traigas. Trate al sistema como si tuviera lepra, porque / hace /. Una vez que haya terminado, destrúyalo desde la órbita. Haz esto tan pronto como sea posible. Ah, y desconecte su conexión de red: niegue el acceso a su atacante.
Avery Payne
23

Advertencia: su sistema está comprometido.

La herramienta que necesita es lsof, que enumerará los archivos (y sockets y puertos). Es probable que esté instalado, y es muy probable que sea la versión del atacante, lo que significa que te mentirá .

Este es de hecho un rootkit. He visto este comportamiento antes, y siempre es un rootkit. Su sistema está comprometido y no se puede confiar en las herramientas que está utilizando que se originan en la misma máquina. Inicie en un Live CD (que tiene binarios confiables de solo lectura) y úselo para extraer sus datos, configuraciones, etc. Cualquier programa que tenga, cualquier script que tenga, abandónelos . No los traigas . Trátelos a ellos y al sistema como si tuvieran lepra, porque lo tienen .

Una vez que haya terminado, destrúyalo desde la órbita .

Se acabó el juego, se acabó el juego.

Haz esto tan pronto como sea posible. Ah, y desconecte su conexión de red: niegue el acceso a su atacante.

Avery Payne
fuente
1
Esto lo dice todo realmente. Averigua qué salió mal, aplana el servidor, restaura desde la última copia de seguridad buena conocida. La vida es demasiado corta para jugar.
Rob Moir
2
Solo agregue: asegúrese de saber la fecha del robo, ya que puede estar restaurando el mismo rootkit que acaba de eliminar. De lo contrario, sí, restaurar desde / antes / esa fecha.
Avery Payne
1
Eso es un gracioso gráfico. Sé que el sistema está comprometido (afortunadamente no es mío). La pregunta sobre la que tenía más curiosidad era rastrear cómo entró en primer lugar. Sospecho a través de php / joomla, pero quería entender cómo / por qué este puerto permanecía abierto cuando ninguna de las herramientas de detección del kit raíz mostraba ese puerto.
jnman
1
lol @ "Oh, y desconecta tu conexión de red"
theman_on_osx
66
Antes de llegar a esa conclusión , hay otras posibles explicaciones para abrir puertos inesperados; como un paquete que instaló pero que olvidó.
David J.
14
sudo netstat -lnp  

Enumera los puertos que escuchan las conexiones entrantes y el proceso asociado que tiene el puerto abierto.

Joe
fuente
4

netstat -anp

El "-p" le dice que enumere el ID de proceso que tiene el puerto abierto. El -an le dice que enumere los puertos de escucha y no resuelva los nombres. En sistemas ocupados que pueden acelerar enormemente la rapidez con la que regresa.

netstat -anp | grep "LISTA"

Eso solo te dará los puertos abiertos.

sysadmin1138
fuente
4

Si no puede ver el puerto abierto con las herramientas del sistema operativo y sospecha una intrusión, podría ser que se haya instalado un rootkit.

El rootkit podría haber cambiado las herramientas del sistema para evitar ciertos procesos y puertos o cambiar los módulos del núcleo.

Puede verificar el rootkit con varias herramientas automatizadas. 'apt-cache search rootkit' muestra lo siguiente en Ubuntu:

chkrootkit - rootkit detector
rkhunter - rootkit, backdoor, sniffer and exploit scanner
unhide - Forensic tool to find hidden processes and ports

Si tiene un rootkit, puede revertir el 'cambio' a su sistema, pero le recomiendo que descubra cómo se hizo la intrusión y endurezca el sistema para que no se repita.


No son exclusivos de Ubuntu, también puedes usarlos en CentOS. Simplemente busque el paquete o descárguelo de su página.


Según la salida de ese puerto, parece que está ejecutando pcanywhere de hecho: " Ы <Enter>" es muy similar a "Presione <Enter>", que es el mensaje de bienvenida de pcanywhere. No sé por qué el proceso no aparece en la lista de procesos. ¿Eres root?

También puede intentar reiniciar para ver si se está ejecutando un proceso único.

chmeee
fuente
alguna sugerencia para centos?
jnman
curiosamente, unhide-tcp no muestra ningún puerto sospechoso. chkrootkit / rkhunter informó todo despejado (pero principalmente porque eliminé los directorios sospechosos antes de hacer esta pregunta)
jnman
FWIW, el rootkit se había instalado como apache en / var / tmp / ... y /var/tmp/.ICE-Unix/* El segundo fue astuto ya que no lo noté la primera vez y me preguntaba cómo De todos modos, un proceso de golpe se generó después de ser asesinado.
jnman
Resulta que el cracker instaló un trabajo cron.
jnman
0

Para exponer la respuesta de @bjtitus, puede obtener información muy detallada, por ejemplo:

$ lsof -i :8000
COMMAND  PID  USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
squid3  1289 proxy   15u  IPv6 14810490      0t0  TCP *:8000 (LISTEN)

$ ps -fp 1289
UID        PID  PPID  C STIME TTY          TIME CMD
proxy     1289     1  0 09:48 ?        00:00:00 /usr/sbin/squid3 -N -f /etc/squid-deb-proxy/squid-deb-proxy.conf

Puedo ver que el calamar es el proceso, pero en realidad es mi el squid-deb-proxyque está tomando el puerto.

Otro buen ejemplo de una aplicación de Java:

$ lsof -i :4242
COMMAND  PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
java    3075 root   86u  IPv4    12019      0t0  TCP *:4242 (LISTEN)

$ ps -fp 3075
UID        PID  PPID  C STIME TTY          TIME CMD
root      3075     1 15 May24 ?        3-16:07:25 /usr/local/crashplan/jre/bin/java -Dfile.encoding=UTF-8 -Dapp=CrashPlanService -DappBaseName=CrashPl

Puedes ver en lsof(LiSt Open Files) que es Java, lo que no es útil. Al ejecutar el pscomando con el PID podemos ver de inmediato que se trata de CrashPlan.

ErebusBat
fuente