GNU/Linux >> Linux Esercitazione >  >> Linux

Utilizzo dei risultati di Nmap per rafforzare i sistemi Linux

La sicurezza del sistema non è un'attività da eseguire. Piuttosto, ci sono numerosi livelli nell'approccio di un'organizzazione alla sicurezza. Alcuni di questi livelli sono la sicurezza fisica dei data center, l'applicazione di patch e la manutenzione regolari dell'infrastruttura, la formazione continua della consapevolezza degli utenti e la scansione dei sistemi per rilevare eventuali problemi. Questo articolo illustra come utilizzare nmap e nc comandi per eseguire la scansione di un sistema in modo da poter determinare i passaggi successivi appropriati. Uso alcuni sistemi nei miei esempi qui. Il sistema che esegue la scansione è il mio computer locale Red Hat Enterprise Linux (RHEL) 8.3, opendemo.usersys.redhat.com è il sistema Red Hat Satellite 6.8 utilizzato perché ha diverse porte aperte e ho diversi sistemi di destinazione.

[ Potrebbe piacerti anche: Sicurezza Sysadmin:8 controlli di blocco di Linux ]

Scansioni di base

Per vedere le porte in uso sul mio server Satellite, accedo al server tramite SSH e poi utilizzo 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 ~]#

Tuttavia, alcuni di questi sono limitati all'host locale, 127.0.0.1. Per vedere quali porte sono pubblicamente visibili, inizio utilizzando un nmap predefinito scansiona dal mio sistema locale:

[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 ~]$

Questo output mostra che il mio sistema locale può vedere meno porte pubbliche di quelle che potevo vedere quando ero SSH nel server. Alcune di queste porte non pubbliche sono 25, utilizzate da master e 8005, 8140, 8443 e 61613, utilizzati da java . Guardando ps output e grepping per il PID di master da quel netstat output, master è il postfisso mittente:

[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 ~]#

That (master) è in esecuzione localmente in modo che la posta possa essere inviata a indirizzi interni ma non sta ascoltando la posta in arrivo, né sta inviando nulla a nessun altro host.

Le altre porte menzionate erano per java . Quando guardi netstat output, due diversi java i processi sono responsabili di tali porte:

[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 ~]#

Quando guardi ps output per PID 1135, è utilizzato da 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 ~]#

Quando guardo in /usr/share/tomcat/conf/server.xml file, ha contenuti come:

<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"
....

Questo mostra come vengono definite le porte che verranno utilizzate nel file di configurazione.

Quando guardo l'altro java processo che ho menzionato, PID 2101 per la porta 8140, vedo che questo è usato da 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 ~]#

Basato su netstat output, la porta 8140 dovrebbe essere visibile al pubblico, ma nmap dal mio sistema locale non lo ha segnalato nei suoi risultati. Anche qui c'è il netstat output dal server Satellite:

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

e la nmap dal mio server locale:

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

Tuttavia, posso forzare nmap per controllare una porta o un intervallo di porte specifico:

[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 ~]$

Forzando nmap per controllare quelle porte, sono stato in grado di vedere la porta :8140 che è un nmap di base la scansione non ha riportato. Questo mostra che un predefinito nmap la scansione senza argomenti aggiuntivi potrebbe essere sufficiente per dare una prima occhiata al sistema, ma potrebbe mancare le porte che sono effettivamente aperte.

Queste informazioni sono importanti nei test di sicurezza in modo che gli amministratori di sistema possano identificare potenziali vulnerabilità. Da nmap scansione dell'output, eseguito localmente sul mio sistema, hai visto le porte aperte pubblicamente. Le versioni precedenti di Satellite avevano tomcat configurato in modo che alcune di queste porte fossero pubbliche quando non era necessario. Per leggere alcune delle discussioni su quel problema, puoi leggere il Bugzilla in cui è stato risolto.

Verifica certificati

Un altro problema che nmap può aiutare è verificare i certificati utilizzati su quelle varie porte. Usando nmap , hai visto le porte aperte. Usando quelle porte, puoi usare OpenSSL per vedere il certificato usato sulla porta. Alcune di queste porte utilizzano certificati autofirmati. Per usare nmap e OpenSSL insieme per controllare le porte su un sistema remoto, potresti fare qualcosa del tipo:

$ 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`

Nel mio opendemo.certs.txt.20210127 file, avrebbe contenuti come:

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

Utilizza quel file di output per verificare che i certificati in uso siano la versione TLS corretta.

Se usi nc (o ncat ), potresti visualizzare più informazioni di quelle presentate nell'interfaccia utente web. Per questo esempio, ho usato nc per connettersi a un server 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>

Da quell'output, posso vedere la versione di Apache che è stata installata. Con queste informazioni, un utente malintenzionato potrebbe scoprire a quali exploit era vulnerabile il server. Per questo motivo, un server web dovrebbe limitare la quantità di informazioni visualizzate:

[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 ~]$

Nota che in questo output non ci sono informazioni sulla versione per Apache.

In questo prossimo esempio, utilizzo nc per connettermi alla porta 21 sul mio sistema client, che posso vedere è aperta:

[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)

Quella versione 3.0.3 viene confermata quando accedo al sistema tramite SSH e utilizzo il 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>

Ancora una volta, proprio come con l'apprendimento della versione di Apache sul dispositivo, è importante essere in grado di effettuare ricognizioni nel tuo ambiente in modo da sapere cosa può imparare un potenziale aggressore sui tuoi sistemi.

Scansione da Kali

Nella prossima sezione, mostro alcuni risultati della scansione di un sistema da un server Kali. In questo esempio, so che il server di destinazione ha distccd in esecuzione sulla porta 3632, ma, come in precedenza, nmap non rileva quella porta per impostazione predefinita, quindi ho dovuto verificarla in modo specifico:

Ora che conosci distccd è aperto, puoi utilizzare le funzionalità integrate di nmap per determinare dove potrebbe essere potenzialmente sfruttato:

Se avessi usato solo una semplice nmap scan, ti saresti perso quella vulnerabilità sfruttabile. Nel mio esempio, ho eseguito uname -a sul sistema remoto, ma avrei potuto eseguire qualsiasi comando.

Identificazione dei servizi

Un ultimo modo per usare nmap è con il -sV opzione, che analizza le porte aperte e determina le informazioni sul servizio o sulla versione. Per questo esempio, ho cambiato la porta su cui gira Apache da 80 a 90 e quindi ho riavviato il servizio. Di seguito puoi vedere la differenza tra un semplice nmap eseguire la scansione e quindi utilizzare il -sV opzione, che ha determinato correttamente il servizio come httpd anziché 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

[ Vuoi saperne di più sulla sicurezza? Consulta la checklist di sicurezza e conformità IT. ] 

Concludi

Ora che sei stato in grado di ottenere un rapporto dettagliato di ciò che è in esecuzione sui tuoi sistemi, cosa fai dopo? La prima cosa è assicurarsi che non ci siano porte impreviste aperte. Per questo, verifica con il team delle applicazioni, i team di sicurezza e i tuoi colleghi potrebbe essere appropriato. Il passo successivo consiste nell'assicurare che i servizi esposti siano adeguatamente protetti. Ciò significa adottare misure come assicurarsi che tutto il software sia aggiornato, che i codici aggiornati siano supportati, che non siano in uso protocolli non sicuri e che le password predefinite per i servizi siano state modificate.

Questo articolo è un'introduzione all'analisi dei server. Usa nc e nmap per verificare quali porte sono aperte e utilizza ps comando per risalire ai processi utilizzando quelle porte. Ho anche fornito un esempio di come puoi usare nmap con il --script argomento per testare i tuoi sistemi. Per continuare questo percorso di apprendimento, un possibile passo successivo è la ricerca utilizzando nmap come motore di attacco esaminando gli script predefiniti in /usr/share/nmap/scripts/ .


Linux
  1. Esegui il debug di Linux usando ProcDump

  2. Utilizzo di AppImage per la gestione dei pacchetti Linux

  3. Introduzione a Nmap su Kali Linux

  4. Abilita i servizi in Linux

  5. logname Esempi di comandi in Linux

Come migliorare la sicurezza dei sistemi Linux utilizzando Firejail

Come eseguire Linux e altri sistemi operativi nel browser utilizzando JSLinux

Installa MongoDB usando Vagrant in Linux

Come identificare i demoni di rete potenzialmente vulnerabili sui tuoi sistemi Linux

Utilizzo del comando Watch in Linux

Utilizzo di cut su terminale Linux