GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verwenden von Nmap-Ergebnissen zum Härten von Linux-Systemen

Systemsicherheit ist keine einmalige Aufgabe. Vielmehr umfasst der Sicherheitsansatz einer Organisation zahlreiche Ebenen. Einige dieser Ebenen sind physische Sicherheit für die Rechenzentren, regelmäßiges Patchen und Warten der Infrastruktur, kontinuierliche Schulung des Benutzerbewusstseins und Scannen von Systemen auf Probleme. Dieser Artikel beschreibt die Verwendung von nmap und nc Befehle, um ein System zu scannen, damit Sie die geeigneten nächsten Schritte bestimmen können. In meinen Beispielen verwende ich hier einige Systeme. Das System, das den Scan durchführt, ist mein lokaler Red Hat Enterprise Linux (RHEL) 8.3-Computer, opendemo.usersys.redhat.com ist das Red Hat Satellite 6.8-System, das verwendet wird, weil es mehrere offene Ports hat und ich verschiedene Zielsysteme habe.

[Das könnte Ihnen auch gefallen: Sysadmin-Sicherheit:8 Linux-Sperrsteuerungen]

Einfache Scans

Um die auf meinem Satellitenserver verwendeten Ports anzuzeigen, stelle ich eine SSH-Verbindung zum Server her und verwende dann 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 ~]#

Einige davon sind jedoch auf den Localhost 127.0.0.1 beschränkt. Um zu sehen, welche Ports öffentlich sichtbar sind, verwende ich zunächst eine standardmäßige nmap von meinem lokalen System scannen:

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

Diese Ausgabe zeigt, dass mein lokales System weniger öffentliche Ports sehen kann als ich sehen konnte, als ich per SSH auf den Server zugreifen konnte. Einige dieser nicht öffentlichen Ports sind 25, die von master verwendet werden , und 8005, 8140, 8443 und 61613, die von Java verwendet werden . Betrachten wir ps Ausgabe und Suche nach der PID von master von diesem netstat Ausgabe, Master ist das Postfix mailer:

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

Dieser (Master) wird lokal ausgeführt, sodass E-Mails an interne Adressen gesendet werden können, aber er lauscht nicht auf eingehende E-Mails und sendet auch nichts an andere Hosts.

Die anderen erwähnten Ports waren für Java . Wenn Sie sich die netstat ansehen Ausgabe, zwei verschiedene Java Prozesse sind für diese Ports verantwortlich:

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

Wenn Sie sich ps ansehen Ausgabe für PID 1135, wird von Tomcat verwendet :

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

Wenn ich in die /usr/share/tomcat/conf/server.xml schaue Datei hat Inhalt wie:

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

Dies zeigt wie die zu verwendenden Ports in der Konfigurationsdatei definiert sind.

Wenn ich mir die andere Java ansehe Prozess, den ich erwähnt habe, PID 2101 für Port 8140, wie ich sehe, wird dies von puppet verwendet :

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

Basierend auf netstat Ausgabe sollte Port 8140 für die Öffentlichkeit sichtbar sein, aber nmap von meinem lokalen System hat es nicht in seinen Ergebnissen gemeldet. Auch hier ist die netstat Ausgabe vom Satellitenserver:

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

und die nmap von meinem lokalen Server:

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

Ich kann jedoch nmap erzwingen So überprüfen Sie einen bestimmten Port oder Portbereich:

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

Durch Erzwingen von nmap Um diese Ports zu überprüfen, konnte ich den :8140-Port sehen, der eine einfache nmap ist Scan hat nicht gemeldet. Dies zeigt, dass ein standardmäßiges nmap Scan ohne zusätzliche Argumente könnte gut genug sein, um einen ersten Blick auf das System zu werfen, könnte aber Ports übersehen, die tatsächlich offen sind.

Diese Informationen sind bei Sicherheitstests wichtig, damit Systemadministratoren potenzielle Schwachstellen identifizieren können. Aus dem nmap Ausgabescan, lokal auf meinem System ausführen, Sie haben die Ports gesehen, die öffentlich geöffnet waren. Frühere Versionen von Satellite hatten Tomcat so konfiguriert, dass einige dieser Ports öffentlich waren, obwohl dies nicht erforderlich war. Um einen Teil der Diskussion zu diesem Problem nachzulesen, können Sie den Bugzilla lesen, in dem dies behoben wurde.

Zertifikate überprüfen

Ein weiteres Problem, das nmap helfen kann, ist die Überprüfung der Zertifikate, die an diesen verschiedenen Ports verwendet werden. Mit nmap , Sie haben die offenen Ports gesehen. Mithilfe dieser Ports können Sie OpenSSL verwenden, um das für den Port verwendete Zertifikat anzuzeigen. Einige dieser Ports verwenden selbstsignierte Zertifikate. Um nmap zu verwenden und OpenSSL zusammen, um die Ports auf einem entfernten System zu überprüfen, könnten Sie so etwas tun:

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

In meiner opendemo.certs.txt.20210127 Datei, hätte sie einen Inhalt wie:

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

Verwenden Sie diese Ausgabedatei, um zu überprüfen, ob die verwendeten Zertifikate die richtige TLS-Version sind.

Wenn Sie nc verwenden (oder ncat ), sehen Sie möglicherweise mehr Informationen als in der Webbenutzeroberfläche angezeigt. Für dieses Beispiel habe ich nc verwendet um sich mit einem Webserver zu verbinden:

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

Aus dieser Ausgabe kann ich die Version von Apache sehen, die installiert wurde. Mit diesen Informationen könnte ein Angreifer erfahren, für welche Exploits der Server anfällig ist. Aus diesem Grund sollte ein Webserver die Menge der angezeigten Informationen begrenzen:

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

Beachten Sie, dass es in dieser Ausgabe keine Versionsinformationen für Apache gibt.

In diesem nächsten Beispiel verwende ich nc um eine Verbindung zu Port 21 auf meinem Client-System herzustellen, von dem ich sehen kann, dass es offen ist:

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

Diese 3.0.3-Version wird bestätigt, wenn ich eine SSH-Verbindung zum System herstelle und den rpm verwende Befehl:

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

Auch hier ist es wichtig, genau wie beim Erlernen der Apache-Version auf dem Gerät, in der Lage zu sein, Ihre Umgebung zu erkunden, damit Sie wissen, was ein potenzieller Angreifer über Ihre Systeme erfahren kann.

Scannen von Kali

Im nächsten Abschnitt zeige ich einige Ergebnisse des Scannens eines Systems von einem Kali-Server. In diesem Beispiel weiß ich, dass der Zielserver distccd hat läuft auf Port 3632, aber, wie zuvor, nmap erkennt diesen Port standardmäßig nicht, also musste ich speziell danach suchen:

Jetzt kennen Sie distccd offen ist, können Sie die eingebauten Fähigkeiten von nmap verwenden, um festzustellen, wo es potenziell ausgenutzt werden könnte:

Wenn Sie nur ein einfaches nmap verwendet hätten scannen, hätten Sie diese ausnutzbare Schwachstelle übersehen. In meinem Beispiel habe ich uname -a ausgeführt auf dem entfernten System, aber ich hätte jeden Befehl ausführen können.

Dienste identifizieren

Eine letzte Möglichkeit, nmap zu verwenden ist mit dem -sV -Option, die die offenen Ports prüft und die Dienst- oder Versionsinformationen ermittelt. Für dieses Beispiel habe ich den Port, auf dem Apache läuft, von 80 auf 90 geändert und dann den Dienst neu gestartet. Unten sehen Sie den Unterschied zwischen einer einfachen nmap scannen und dann mit dem -sV Option, die den Dienst korrekt als httpd bestimmt hat statt 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

[ Möchten Sie mehr über Sicherheit erfahren? Sehen Sie sich die Checkliste für IT-Sicherheit und Compliance an. ] 

Abschluss

Nachdem Sie nun einen detaillierten Bericht darüber erhalten haben, was auf Ihren Systemen ausgeführt wird, was tun Sie als Nächstes? Als Erstes müssen Sie sicherstellen, dass keine unerwarteten Ports geöffnet sind. Wenden Sie sich hierfür an das Anwendungsteam, die Sicherheitsteams und Ihre Kollegen, die möglicherweise angemessen sind. Als Nächstes muss sichergestellt werden, dass die exponierten Dienste ordnungsgemäß gesichert sind. Dazu müssen Maßnahmen ergriffen werden, z. B. sicherzustellen, dass die gesamte Software aktualisiert wird, aktualisierte Chiffren unterstützt werden, keine unsicheren Protokolle verwendet werden und die Standardpasswörter für die Dienste geändert wurden.

Dieser Artikel ist eine Einführung in die Untersuchung Ihrer Server. Verwenden Sie nc und nmap um zu prüfen, welche Ports geöffnet sind, und verwenden Sie den ps Befehl, um die Prozesse zurückzuverfolgen, die diese Ports verwenden. Ich habe auch ein Beispiel dafür bereitgestellt, wie Sie nmap verwenden können mit dem --script Argument, um Ihre Systeme zu testen. Um diesen Lernpfad fortzusetzen, besteht ein möglicher nächster Schritt darin, mit nmap zu recherchieren als Angriffsmaschine, indem Sie die Standardskripte in /usr/share/nmap/scripts/ untersuchen .


Linux
  1. Verwenden von AppImage für die Linux-Paketverwaltung

  2. Einführung in Nmap unter Kali Linux

  3. 13 Linux-Sicherheits-Tutorials

  4. Verwenden des Befehls ripgrep (rg) unter Linux

  5. Dienste in Linux aktivieren

So verbessern Sie die Sicherheit von Linux-Systemen mit Firejail

So führen Sie Linux und andere Betriebssysteme in Ihrem Browser mit JSLinux aus

Installieren Sie MongoDB mit Vagrant unter Linux

So identifizieren Sie potenziell anfällige Netzwerk-Daemons auf Ihren Linux-Systemen

Verwenden des Watch-Befehls unter Linux

Cut auf Linux Terminal verwenden