GNU/Linux >> Tutoriales Linux >  >> Linux

Uso de los resultados de Nmap para ayudar a fortalecer los sistemas Linux

La seguridad del sistema no es una tarea de una sola vez. Más bien, hay numerosas capas en el enfoque de seguridad de una organización. Algunas de esas capas son la seguridad física de los centros de datos, la aplicación regular de parches y el mantenimiento de la infraestructura, la educación continua de los usuarios y el análisis de los sistemas en busca de problemas. Este artículo explica cómo usar el nmap y nc Comandos para escanear un sistema para que pueda determinar los siguientes pasos apropiados. Utilizo algunos sistemas en mis ejemplos aquí. El sistema que realiza el escaneo es mi computadora local Red Hat Enterprise Linux (RHEL) 8.3, opendemo.usersys.redhat.com es el sistema Red Hat Satellite 6.8 utilizado porque tiene varios puertos abiertos y tengo varios sistemas de destino.

[ También te puede interesar: Seguridad de administrador de sistemas:8 controles de bloqueo de Linux]

Escaneos básicos

Para ver los puertos en uso en mi servidor Satélite, I SSH al servidor y luego use netstat :

[root@opendemo ~]# netstat -tlpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      1443/mongod        
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      1197/redis-server 1
tcp        0      0 0.0.0.0:5646            0.0.0.0:*               LISTEN      1132/qdrouterd     
tcp        0      0 127.0.0.1:8751          0.0.0.0:*               LISTEN      1194/python        
tcp        0      0 0.0.0.0:5647            0.0.0.0:*               LISTEN      1132/qdrouterd     
tcp        0      0 127.0.0.1:19090         0.0.0.0:*               LISTEN      1237/cockpit-ws    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1175/sshd          
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      1242/postmaster    
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1396/master        
tcp        0      0 0.0.0.0:9090            0.0.0.0:*               LISTEN      1138/ruby          
tcp        0      0 127.0.0.1:45285         0.0.0.0:*               LISTEN      28650/Passenger Rack
tcp        0      0 127.0.0.1:5671          0.0.0.0:*               LISTEN      1140/qpidd         
tcp        0      0 0.0.0.0:8008            0.0.0.0:*               LISTEN      1240/ruby          
tcp        0      0 127.0.0.1:5672          0.0.0.0:*               LISTEN      1140/qpidd         
tcp6       0      0 :::8140                 :::*                    LISTEN      2101/java          
tcp6       0      0 127.0.0.1:61613         :::*                    LISTEN      1135/java          
tcp6       0      0 :::5646                 :::*                    LISTEN      1132/qdrouterd     
tcp6       0      0 :::5647                 :::*                    LISTEN      1132/qdrouterd     
tcp6       0      0 :::80                   :::*                    LISTEN      1131/httpd         
tcp6       0      0 :::22                   :::*                    LISTEN      1175/sshd          
tcp6       0      0 ::1:5432                :::*                    LISTEN      1242/postmaster    
tcp6       0      0 :::3128                 :::*                    LISTEN      1258/(squid-1)     
tcp6       0      0 ::1:25                  :::*                    LISTEN      1396/master        
tcp6       0      0 127.0.0.1:8443          :::*                    LISTEN      1135/java          
tcp6       0      0 :::443                  :::*                    LISTEN      1131/httpd         
tcp6       0      0 :::9090                 :::*                    LISTEN      1138/ruby          
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      1135/java          
tcp6       0      0 ::1:5671                :::*                    LISTEN      1140/qpidd         
tcp6       0      0 :::8008                 :::*                    LISTEN      1240/ruby          
tcp6       0      0 ::1:5672                :::*                    LISTEN      1140/qpidd         
tcp6       0      0 :::5000                 :::*                    LISTEN      1131/httpd         
[root@opendemo ~]#

Sin embargo, algunos de ellos están limitados al host local, 127.0.0.1. Para ver qué puertos son visibles públicamente, empiezo usando un nmap predeterminado. escanear desde mi sistema local:

[pgervase@pgervase ~]$ nmap opendemo.usersys.redhat.com
Starting Nmap 7.70 ( https://nmap.org ) at 2021-01-07 20:28 EST
Nmap scan report for opendemo.usersys.redhat.com (10.19.47.240)
Host is up (0.041s latency).
Not shown: 993 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
443/tcp  open  https
3128/tcp open  squid-http
5000/tcp open  upnp
8008/tcp open  http
9090/tcp open  zeus-admin

Nmap done: 1 IP address (1 host up) scanned in 3.81 seconds
[pgervase@pgervase ~]$

Este resultado muestra que mi sistema local puede ver menos puertos públicos de los que pude ver cuando estaba SSH en el servidor. Algunos de esos puertos no públicos son 25, que utiliza master y 8005, 8140, 8443 y 61613, que son utilizados por java . Mirando ps salida y grepping para el PID de maestro de ese netstat salida, maestro es el postfijo correo:

[root@opendemo ~]# ps auxww | grep 1396
root      1396  0.0  0.0  89740  2188 ?        Ss   Jan05   0:00 /usr/libexec/postfix/master -w
root     29665  0.0  0.0 112816   968 pts/0    R+   20:32   0:00 grep --color=auto 1396
[root@opendemo ~]#

Ese (maestro) se ejecuta localmente para que el correo se pueda enviar a direcciones internas, pero no escucha el correo electrónico entrante ni envía nada a ningún otro host.

Los otros puertos mencionados eran para java . Cuando miras el netstat salida, dos java diferentes los procesos son responsables de esos puertos:

[root@opendemo ~]# netstat -tlpn | grep java
tcp6       0      0 :::8140                 :::*                    LISTEN      2101/java          
tcp6       0      0 127.0.0.1:61613         :::*                    LISTEN      1135/java          
tcp6       0      0 127.0.0.1:8443          :::*                    LISTEN      1135/java          
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      1135/java          
[root@opendemo ~]#

Cuando miras ps salida para PID 1135, lo usa tomcat :

[root@opendemo ~]# ps auxww | grep 1135
tomcat    1135  0.3  3.5 12409252 2165668 ?    Ssl  Jan05   9:25 /usr/lib/jvm/jre/bin/java -Xms1024m -Xmx4096m -Djava.security.auth.login.config=/usr/share/tomcat/conf/login.config -classpath /usr/share/tomcat/bin/bootstrap.jar:/usr/share/tomcat/bin/tomcat-juli.jar:/usr/share/java/commons-daemon.jar -Dcatalina.base=/usr/share/tomcat -Dcatalina.home=/usr/share/tomcat -Djava.endorsed.dirs= -Djava.io.tmpdir=/var/cache/tomcat/temp -Djava.util.logging.config.file=/usr/share/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager org.apache.catalina.startup.Bootstrap start
root     31507  0.0  0.0 112816   968 pts/0    S+   20:53   0:00 grep --color=auto 1135
[root@opendemo ~]#

Cuando miro en /usr/share/tomcat/conf/server.xml archivo, tiene contenido como:

<Server port="8005" shutdown="SHUTDOWN">
...
    <Connector port="8443"
               address="localhost"
               protocol="HTTP/1.1"
               SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="want"
               sslProtocols="TLSv1.2"
               sslEnabledProtocols="TLSv1.2"
....

Esto muestra cómo se definen los puertos que se utilizarán en el archivo de configuración.

Cuando miro al otro java proceso que mencioné, PID 2101 para el puerto 8140, veo que esto es utilizado por puppet :

[root@opendemo ~]# ps auxww | grep 2101
puppet    2101  0.2  2.5 9787492 1545188 ?     Sl   Jan05   7:14 /usr/bin/java -Xms2G -Xmx2G -Djruby.logger.class=com.puppetlabs.jruby_utils.jruby.Slf4jLogger -XX:OnOutOfMemoryError="kill -9 %p" -XX:ErrorFile=/var/log/puppetlabs/puppetserver/puppetserver_err_pid%p.log -cp /opt/puppetlabs/server/apps/puppetserver/puppet-server-release.jar:/opt/puppetlabs/puppet/lib/ruby/vendor_ruby/facter.jar:/opt/puppetlabs/server/data/puppetserver/jars/* clojure.main -m puppetlabs.trapperkeeper.main --config /etc/puppetlabs/puppetserver/conf.d --bootstrap-config /etc/puppetlabs/puppetserver/services.d/,/opt/puppetlabs/server/apps/puppetserver/config/services.d/ --restart-file /opt/puppetlabs/server/data/puppetserver/restartcounter
root     31696  0.0  0.0 112816   968 pts/0    S+   20:55   0:00 grep --color=auto 2101
[root@opendemo ~]#

Basado en netstat salida, el puerto 8140 debería ser visible para el público, pero nmap de mi sistema local no lo informó en sus resultados. Aquí nuevamente, está el netstat salida del servidor Satélite:

[root@opendemo ~]# netstat -tunap| grep 8140
tcp6       0      0 :::8140                 :::*                    LISTEN      2101/java          
[root@opendemo ~]#

y el nmap desde mi servidor local:

[pgervase@pgervase ~]$ nmap opendemo.usersys.redhat.com | grep 8140
[pgervase@pgervase ~]$

Sin embargo, puedo forzar nmap para verificar un puerto específico o un rango de puertos:

[pgervase@pgervase ~]$ nmap -p 8140 opendemo.usersys.redhat.com
Starting Nmap 7.70 ( https://nmap.org ) at 2021-01-07 21:07 EST
Nmap scan report for opendemo.usersys.redhat.com (10.19.47.240)
Host is up (0.039s latency).

PORT     STATE SERVICE
8140/tcp open  puppet

Nmap done: 1 IP address (1 host up) scanned in 0.39 seconds
[pgervase@pgervase ~]$ nmap -p 8000-9000 opendemo.usersys.redhat.com
Starting Nmap 7.70 ( https://nmap.org ) at 2021-01-07 21:07 EST
Nmap scan report for opendemo.usersys.redhat.com (10.19.47.240)
Host is up (0.040s latency).
Not shown: 999 closed ports
PORT     STATE SERVICE
8008/tcp open  http
8140/tcp open  puppet

Nmap done: 1 IP address (1 host up) scanned in 2.12 seconds
[pgervase@pgervase ~]$

Al forzar nmap para verificar esos puertos, pude ver el puerto:8140 que es un nmap básico el escaneo no reportó. Esto muestra que un nmap predeterminado escanear sin argumentos adicionales puede ser lo suficientemente bueno para echar un primer vistazo al sistema, pero puede pasar por alto los puertos que están realmente abiertos.

Esta información es importante en las pruebas de seguridad para que los administradores de sistemas puedan identificar posibles vulnerabilidades. Desde el nmap escaneo de salida, ejecutar localmente en mi sistema, vio los puertos que estaban abiertos públicamente. Las versiones anteriores de Satellite tenían tomcat configurado para que algunos de esos puertos fueran públicos cuando eso no era necesario. Para leer parte de la discusión sobre ese problema, puede leer Bugzilla donde se resolvió.

Verificar certificados

Otro problema que nmap puede ayudar es verificar los certificados que se utilizan en esos diversos puertos. Usando nmap , viste los puertos abiertos. Usando esos puertos, puede usar OpenSSL para ver el certificado usado en el puerto. Varios de esos puertos utilizan certificados autofirmados. Para usar nmap y OpenSSL juntos para verificar los puertos en un sistema remoto, podría hacer algo como:

$ for port in `nmap -p 1-5000 opendemo.usersys.redhat.com | grep " open " | cut -d "/" -f 1`
> do echo checking on port: $port
> echo | openssl s_client -showcerts -connect opendemo.usersys.redhat.com:$port
> done &> opendemo.certs.txt.`date +%Y%m%d`

En mi opendemo.certs.txt.20210127 archivo, tendría contenido como:

checking on port: 443
depth=1 C = US, ST = North Carolina, L = Raleigh, O = Katello, OU = SomeOrgUnit, CN = opendemo.usersys.redhat.com
verify return:1
depth=0 C = US, ST = North Carolina, O = Katello, OU = SomeOrgUnit, CN = opendemo.usersys.redhat.com
verify return:1
CONNECTED(00000003)
….
SSL handshake has read 3476 bytes and written 463 bytes
Verification: OK
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported

Use ese archivo de salida para verificar que los certificados en uso sean la versión TLS correcta.

Si usa nc (o ncat ), es posible que vea más información de la que se presenta en la interfaz de usuario web. Para este ejemplo, usé nc para conectarse a un servidor web:

$ nc 10.19.47.242 80
asdf
HTTP/1.1 400 Bad Request
Date: Sat, 09 Jan 2021 01:25:40 GMT
Server: Apache/2.4.37 (Red Hat Enterprise Linux)
Content-Length: 226
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
</body></html>

A partir de ese resultado, puedo ver la versión de Apache que se instaló. Con esa información, un atacante podría saber a qué exploits era vulnerable el servidor. Debido a esto, un servidor web debe limitar la cantidad de información que se muestra:

[pgervase@pgervase ~]$ nc opendemo.usersys.redhat.com 443
GET / HTTP/1.1
HTTP/1.1 400 Bad Request
Date: Fri, 08 Jan 2021 02:33:08 GMT
Server: Apache
Content-Length: 362
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Reason: You're speaking plain HTTP to an SSL-enabled server port.<br />
 Instead use the HTTPS scheme to access this URL, please.<br />
</p>
</body></html>

[pgervase@pgervase ~]$

Tenga en cuenta que en este resultado no hay información de la versión de Apache.

En el siguiente ejemplo, uso nc para conectarme al puerto 21 en mi sistema cliente, que puedo ver que está abierto:

[pgervase@pgervase ~]$ nmap 10.19.47.242
Starting Nmap 7.70 ( https://nmap.org ) at 2021-01-08 21:02 EST
Nmap scan report for 10.19.47.242
Host is up (0.039s latency).
Not shown: 996 closed ports
PORT    STATE SERVICE
21/tcp  open  ftp
22/tcp  open  ssh
80/tcp  open  http
111/tcp open  rpcbind

Nmap done: 1 IP address (1 host up) scanned in 0.83 seconds
[pgervase@pgervase ~]$ nc 10.19.47.242 21
220 (vsFTPd 3.0.3)

Esa versión 3.0.3 se confirma cuando hago SSH al sistema y uso el rpm comando:

[root@vulnerable ~]# rpm -q vsftpd
vsftpd-3.0.3-32.el8.x86_64
[root@vulnerable ~]# rpm -qi vsftpd
Name        : vsftpd
Version     : 3.0.3
Release     : 32.el8
<snipped>

Una vez más, al igual que con el aprendizaje de la versión de Apache en el dispositivo, es importante poder realizar un reconocimiento en su entorno para que sepa lo que un atacante potencial puede aprender sobre sus sistemas.

Escaneo desde Kali

En la siguiente sección, muestro algunos resultados de escanear un sistema desde un servidor Kali. En este ejemplo, sé que el servidor de destino tiene distccd ejecutándose en el puerto 3632, pero, como antes, nmap no detecta ese puerto de manera predeterminada, por lo que tuve que verificarlo específicamente:

Ahora que sabes distccd está abierto, puede usar las capacidades integradas de nmap para determinar dónde podría explotarse:

Si hubieras usado solo un nmap simple escanear, se habría perdido esa vulnerabilidad explotable. En mi ejemplo, ejecuté uname -a en el sistema remoto, pero podría haber ejecutado cualquier comando.

Identificación de servicios

Una forma final de usar nmap es con el -sV opción, que sondea los puertos abiertos y determina el servicio o la información de la versión. Para este ejemplo, cambié el puerto en el que se ejecuta Apache de 80 a 90 y luego reinicié el servicio. A continuación puede ver la diferencia entre un nmap simple escanear y luego usar -sV opción, que determinó correctamente el servicio como httpd en lugar de dnsix :

[root@pgervase ~]# nmap 10.19.47.242

Starting Nmap 7.70 ( https://nmap.org ) at 2021-01-09 19:57 EST
Nmap scan report for 10.19.47.242
Host is up (0.043s latency).

Not shown: 996 closed ports

PORT    STATE SERVICE
21/tcp  open  ftp
22/tcp  open  ssh
90/tcp  open  dnsix
111/tcp open  rpcbind

Nmap done: 1 IP address (1 host up) scanned in 1.80 seconds

[root@pgervase ~]# nmap -sV 10.19.47.242
Starting Nmap 7.70 ( https://nmap.org ) at 2021-01-09 19:52 EST
Nmap scan report for 10.19.47.242
Host is up (0.040s latency).

Not shown: 996 closed ports

PORT    STATE SERVICE VERSION
21/tcp  open  ftp     vsftpd 3.0.3
22/tcp  open  ssh     OpenSSH 8.0 (protocol 2.0)
90/tcp  open  http    Apache httpd 2.4.37 ((Red Hat Enterprise Linux))
111/tcp open  rpcbind 2-4 (RPC #100000)
Service Info: OS: Unix

[ ¿Quiere obtener más información sobre seguridad? Consulte la lista de verificación de cumplimiento y seguridad de TI. ] 

Resumir

Ahora que ha podido obtener un informe detallado de lo que se está ejecutando en sus sistemas, ¿qué debe hacer a continuación? Lo primero es asegurarse de que no haya puertos abiertos inesperados. Para esto, verifique con el equipo de aplicaciones, los equipos de seguridad y sus compañeros de trabajo podrían ser apropiados. Lo siguiente es asegurarse de que los servicios expuestos estén debidamente protegidos. Esto significa tomar medidas como asegurarse de que todo el software esté actualizado, que se admitan cifrados actualizados, que no se utilicen protocolos inseguros y que se hayan cambiado las contraseñas predeterminadas de los servicios.

Este artículo es una introducción a la investigación de sus servidores. Usa nc y nmap para verificar qué puertos están abiertos y use el ps comando para rastrear los procesos que usan esos puertos. También proporcioné un ejemplo de cómo puede usar nmap con el --script argumento para probar sus sistemas. Para continuar en este camino de aprendizaje, un posible siguiente paso es investigar usando nmap como motor de ataque investigando los scripts predeterminados en /usr/share/nmap/scripts/ .


Linux
  1. Depurar Linux usando ProcDump

  2. Introducción a Nmap en Kali Linux

  3. 13 tutoriales de seguridad de Linux

  4. Habilitar servicios en Linux

  5. Ejemplos de uso del comando dmsetup en Linux

Cómo mejorar la seguridad de los sistemas Linux usando Firejail

Cómo ejecutar Linux y otros sistemas operativos en su navegador usando JSLinux

Instale MongoDB usando Vagrant en Linux

Cómo identificar demonios de red potencialmente vulnerables en sus sistemas Linux

Usando el comando Watch en Linux

Usando cut en Linux Terminal