GNU/Linux >> Tutoriels Linux >  >> Linux

Utilisation des résultats de Nmap pour aider à renforcer les systèmes Linux

La sécurité du système n'est pas une tâche unique. Au contraire, il existe de nombreuses couches dans l'approche d'une organisation en matière de sécurité. Certaines de ces couches sont la sécurité physique des centres de données, les correctifs et la maintenance réguliers de l'infrastructure, la sensibilisation continue des utilisateurs et l'analyse des systèmes pour détecter les problèmes. Cet article explique comment utiliser le nmap et nc commandes pour analyser un système afin que vous puissiez déterminer les prochaines étapes appropriées. J'utilise ici quelques systèmes dans mes exemples. Le système qui effectue l'analyse est mon ordinateur local Red Hat Enterprise Linux (RHEL) 8.3, opendemo.usersys.redhat.com est le système Red Hat Satellite 6.8 utilisé car il a plusieurs ports ouverts et j'ai plusieurs systèmes cibles.

[ Vous pourriez également aimer : Sécurité de l'administrateur système :8 contrôles de verrouillage Linux ]

Analyses de base

Pour voir les ports utilisés sur mon serveur Satellite, je me connecte en SSH au serveur, puis j'utilise 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 ~]#

Cependant, certains d'entre eux sont limités à l'hôte local, 127.0.0.1. Pour voir quels ports sont visibles publiquement, je commence par utiliser un nmap par défaut numériser depuis mon système 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 ~]$

Ce résultat montre que mon système local peut voir moins de ports publics que ce que je pouvais voir lorsque j'étais en SSH sur le serveur. Certains de ces ports non publics sont 25, qui sont utilisés par master , et 8005, 8140, 8443 et 61613, qui sont utilisés par java . En regardant ps sortie et grep pour le PID de maître à partir de ce netstat sortie, maître est le suffixe expéditeur :

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

Ce (maître) s'exécute localement afin que le courrier puisse être envoyé à des adresses internes, mais n'écoute pas les e-mails entrants et n'envoie rien à un autre hôte.

Les autres ports mentionnés étaient pour java . Lorsque vous consultez le netstat sortie, deux java différents les processus sont responsables de ces ports :

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

Lorsque vous regardez ps sortie pour le PID 1135, il est utilisé par 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 ~]#

Quand je regarde dans le /usr/share/tomcat/conf/server.xml fichier, il a un contenu tel que :

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

Cela montre comment les ports qui seront utilisés sont définis dans le fichier de configuration.

Quand je regarde l'autre java processus que j'ai mentionné, PID 2101 pour le port 8140, je vois qu'il est utilisé par marionnette :

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

Basé sur netstat sortie, le port 8140 doit être visible au public, mais nmap de mon système local ne l'a pas signalé dans ses résultats. Ici encore, est le netstat sortie du serveur Satellite :

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

et le nmap depuis mon serveur local :

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

Cependant, je peux forcer nmap pour vérifier un port spécifique ou une plage de ports :

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

En forçant nmap pour vérifier ces ports, j'ai pu voir le port :8140 qui est un nmap de base scan n'a pas signalé. Cela montre qu'un nmap par défaut une analyse sans arguments supplémentaires peut être suffisante pour un premier aperçu du système, mais peut manquer des ports réellement ouverts.

Ces informations sont importantes dans les tests de sécurité afin que les administrateurs système puissent identifier les vulnérabilités potentielles. Depuis le nmap scan de sortie, exécuté localement sur mon système, vous avez vu les ports qui étaient ouverts publiquement. Les versions précédentes de Satellite avaient tomcat configuré de sorte que certains de ces ports étaient publics lorsque cela n'était pas nécessaire. Pour lire une partie de la discussion sur ce problème, vous pouvez lire le Bugzilla où cela a été résolu.

Vérifier les certificats

Un autre problème que nmap peut vous aider à vérifier les certificats utilisés sur ces différents ports. Utilisation de nmap , vous avez vu les ports ouverts. En utilisant ces ports, vous pouvez utiliser OpenSSL pour voir le certificat utilisé sur le port. Un certain nombre de ces ports utilisent des certificats auto-signés. Pour utiliser nmap et OpenSSL ensemble pour vérifier les ports sur un système distant, vous pouvez faire quelque chose comme :

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

Dans mon opendemo.certs.txt.20210127 fichier, il aurait un contenu comme :

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

Utilisez ce fichier de sortie pour vérifier que les certificats utilisés correspondent à la bonne version de TLS.

Si vous utilisez nc (ou ncat ), vous verrez peut-être plus d'informations que celles présentées dans l'interface utilisateur Web. Pour cet exemple, j'ai utilisé nc pour se connecter à un serveur 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>

À partir de cette sortie, je peux voir la version d'Apache qui a été installée. Avec ces informations, un attaquant pourrait savoir à quels exploits le serveur était vulnérable. Pour cette raison, un serveur Web doit limiter la quantité d'informations affichées :

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

Notez que dans cette sortie, il n'y a pas d'informations sur la version d'Apache.

Dans cet exemple suivant, j'utilise nc pour me connecter au port 21 sur mon système client, que je vois ouvert :

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

Cette version 3.0.3 est confirmée lorsque je me connecte en SSH au système et que j'utilise le rpm commande :

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

Encore une fois, tout comme pour l'apprentissage de la version d'Apache sur l'appareil, il est important de pouvoir effectuer une reconnaissance de votre environnement afin de savoir ce qu'un attaquant potentiel peut apprendre sur vos systèmes.

Numérisation depuis Kali

Dans la section suivante, je montre quelques résultats de l'analyse d'un système à partir d'un serveur Kali. Dans cet exemple, je sais que le serveur cible a distccd fonctionnant sur le port 3632, mais, comme précédemment, nmap ne détecte pas ce port par défaut, et j'ai donc dû le vérifier spécifiquement :

Maintenant que vous connaissez distccd est ouvert, vous pouvez utiliser les capacités intégrées de nmap pour déterminer où il pourrait potentiellement être exploité :

Si vous n'aviez utilisé qu'un simple nmap scan, vous auriez manqué cette vulnérabilité exploitable. Dans mon exemple, j'ai exécuté uname -a sur le système distant, mais j'aurais pu exécuter n'importe quelle commande.

Identifier les services

Une dernière façon d'utiliser nmap est avec le -sV option, qui sonde les ports ouverts et détermine les informations de service ou de version. Pour cet exemple, j'ai changé le port sur lequel Apache s'exécute de 80 à 90, puis j'ai redémarré le service. Ci-dessous, vous pouvez voir la différence entre un simple nmap scanner puis en utilisant le -sV option, qui a correctement déterminé le service comme httpd plutôt que 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

[ Vous voulez en savoir plus sur la sécurité ? Consultez la liste de vérification de la sécurité informatique et de la conformité. ] 

Récapitulez

Maintenant que vous avez pu obtenir un rapport détaillé sur ce qui s'exécute sur vos systèmes, que faites-vous ensuite ? La première chose à faire est de s'assurer qu'aucun port inattendu n'est ouvert. Pour cela, vérifiez auprès de l'équipe des applications, des équipes de sécurité et de vos collègues que cela peut être approprié. Ensuite, il faut s'assurer que les services exposés sont correctement sécurisés. Cela signifie prendre des mesures telles que s'assurer que tous les logiciels sont mis à jour, que les chiffrements mis à jour sont pris en charge, que les protocoles non sécurisés ne sont pas utilisés et que les mots de passe par défaut des services ont été modifiés.

Cet article est une introduction à l'examen de vos serveurs. Utilisez nc et nmap pour vérifier quels ports sont ouverts et utilisez le ps commande pour retracer les processus utilisant ces ports. J'ai également fourni un exemple de la façon dont vous pouvez utiliser nmap avec le --script argument pour tester vos systèmes. Pour continuer sur ce chemin d'apprentissage, une prochaine étape possible consiste à effectuer une recherche à l'aide de nmap comme moteur d'attaque en enquêtant sur les scripts par défaut dans /usr/share/nmap/scripts/ .


Linux
  1. Déboguer Linux avec ProcDump

  2. Utilisation d'AppImage pour la gestion des packages Linux

  3. Introduction à Nmap sur Kali Linux

  4. 50 didacticiels d'administration système UNIX / Linux

  5. Kali Linux sur Android avec Linux Deploy

Comment améliorer la sécurité des systèmes Linux à l'aide de Firejail

Comment exécuter Linux et d'autres systèmes d'exploitation dans votre navigateur à l'aide de JSLinux

Installer MongoDB à l'aide de Vagrant sous Linux

Comment identifier les démons réseau potentiellement vulnérables sur vos systèmes Linux

Utilisation de la commande Watch sous Linux

Utilisation de cut sur Linux Terminal