GNU/Linux >> Znalost Linux >  >> Linux

Použití výsledků Nmap k posílení linuxových systémů

Zabezpečení systému není jedno a hotovo. Spíše existuje mnoho vrstev v přístupu organizace k bezpečnosti. Některé z těchto vrstev jsou fyzické zabezpečení datových center, pravidelné opravy a údržba infrastruktury, průběžné vzdělávání uživatelů a skenování problémů v systémech. Tento článek popisuje, jak používat nmap a nc příkazy pro skenování systému, abyste mohli určit vhodné další kroky. Ve svých příkladech zde používám několik systémů. Systém, který skenuje, je můj místní počítač Red Hat Enterprise Linux (RHEL) 8.3, opendemo.usersys.redhat.com je používaný systém Red Hat Satellite 6.8, protože má několik otevřených portů a já mám různé cílové systémy.

[ Také by se vám mohlo líbit: Zabezpečení Sysadmin:8 ovládacích prvků uzamčení Linuxu ]

Základní skenování

Chcete-li zobrazit porty používané na mém satelitním serveru, I SSH na server a poté použijte 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 ~]#

Některé z nich jsou však omezeny na localhost, 127.0.0.1. Abych zjistil, které porty jsou veřejně viditelné, začnu tím, že použiji výchozí nmap skenování z mého místního systému:

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

Tento výstup ukazuje, že můj místní systém vidí méně veřejných portů, než kolik jsem viděl, když jsem byl na server připojen pomocí SSH. Některé z těchto neveřejných portů jsou 25, které používá master a 8005, 8140, 8443 a 61613, které používá java . Při pohledu na ps výstup a grepping pro PID master z tohoto netstat výstup, hlavní je postfix poštovní zásilka:

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

To (master) běží lokálně, takže pošta může být odesílána na interní adresy, ale neposlouchá příchozí e-maily ani nic neposílá žádnému jinému hostiteli.

Ostatní zmíněné porty byly pro javu . Když se podíváte na netstat výstup, dvě různé java procesy jsou zodpovědné za tyto porty:

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

Když se podíváte na ps výstup pro PID 1135, používá jej 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 ~]#

Když se podívám do /usr/share/tomcat/conf/server.xml má obsah jako:

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

To ukazuje, jak jsou porty, které budou použity, definovány v konfiguračním souboru.

Když se podívám na další javu proces, který jsem zmínil, PID 2101 pro port 8140, vidím, že to používá loutka :

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

Na základě netstat výstup, port 8140 by měl být viditelný pro veřejnost, ale nmap z mého místního systému to nehlásilo ve svých výsledcích. Zde je opět netstat výstup ze satelitního serveru:

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

a nmap z mého místního serveru:

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

Mohu však vynutit nmap pro kontrolu konkrétního portu nebo rozsahu portů:

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

Vynucením nmap pro kontrolu těchto portů jsem viděl port :8140, což je základní nmap scan nenahlásil. To ukazuje, že výchozí nmap skenování bez dalších argumentů může být dost dobré pro první pohled na systém, ale může minout porty, které jsou skutečně otevřené.

Tyto informace jsou důležité při testování zabezpečení, aby správci systému mohli identifikovat potenciální zranitelnosti. Z nmap výstupní skenování, spusťte lokálně v mém systému, viděli jste porty, které byly veřejně otevřené. Předchozí verze Satellite měly kocoura nakonfigurován tak, aby některé z těchto portů byly veřejné, když to nebylo nutné. Chcete-li si přečíst některé diskuse k tomuto problému, můžete si přečíst Bugzilla, kde se to vyřešilo.

Ověřte certifikáty

Další problém, který nmap může pomoci s ověřením certifikátů používaných na těchto různých portech. Pomocí nmap , viděli jste otevřené porty. Pomocí těchto portů můžete použít OpenSSL k zobrazení certifikátu použitého na portu. Řada z těchto portů používá certifikáty s vlastním podpisem. Chcete-li použít nmap a OpenSSL společně pro kontrolu portů na vzdáleném systému, můžete udělat něco jako:

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

V mém opendemo.certs.txt.20210127 soubor, bude mít obsah jako:

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

Použijte tento výstupní soubor k ověření, že používané certifikáty jsou správnou verzí TLS.

Pokud používáte nc (nebo ncat ), můžete vidět více informací, než je uvedeno ve webovém uživatelském rozhraní. Pro tento příklad jsem použil nc pro připojení k webovému serveru:

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

Z tohoto výstupu vidím verzi Apache, která byla nainstalována. Díky těmto informacím by se útočník mohl dozvědět, vůči jakým zneužitím byl server zranitelný. Z tohoto důvodu by měl webový server omezit množství zobrazovaných informací:

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

Všimněte si, že v tomto výstupu nejsou žádné informace o verzi pro Apache.

V tomto dalším příkladu používám nc pro připojení k portu 21 na mém klientském systému, který vidím, že je otevřený:

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

Verze 3.0.3 je potvrzena, když do systému připojím SSH a použiji rpm příkaz:

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

Opět, stejně jako u učení verze Apache na zařízení, je důležité umět provádět průzkum ve vašem prostředí, abyste věděli, co se potenciální útočník může dozvědět o vašich systémech.

Skenování z Kali

V další části ukážu některé výsledky skenování systému ze serveru Kali. V tomto příkladu vím, že cílový server má distccd běží na portu 3632, ale stejně jako dříve nmap nedetekuje tento port ve výchozím nastavení, a tak jsem jej musel konkrétně zkontrolovat:

Nyní, když znáte distccd je otevřený, můžete použít vestavěné schopnosti nmap k určení, kde by mohl být potenciálně zneužit:

Pokud byste použili pouze obyčejný nmap scan, přehlédli byste tuto zneužitelnou chybu zabezpečení. V mém příkladu jsem spustil uname -a na vzdáleném systému, ale mohl jsem spustit jakýkoli příkaz.

Identifikace služeb

Jeden poslední způsob použití nmap je s -sV možnost, která zjišťuje otevřené porty a určuje informace o službě nebo verzi. V tomto příkladu jsem změnil port, na kterém Apache běží, z 80 na 90 a poté restartoval službu. Níže vidíte rozdíl mezi obyčejným nmap naskenujte a poté pomocí -sV volba, která správně určila službu jako httpd spíše než 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

[ Chcete se dozvědět více o zabezpečení? Podívejte se na kontrolní seznam zabezpečení IT a dodržování předpisů. ] 

Sbalit

Nyní, když jste mohli získat podrobnou zprávu o tom, co běží na vašich systémech, co budete dělat dál? První věcí je ujistit se, že nejsou otevřené žádné neočekávané porty. Za tímto účelem se ověřte u aplikačního týmu, bezpečnostních týmů a vašich spolupracovníků. Dále je třeba zajistit, aby exponované služby byly řádně zabezpečeny. To znamená podniknout kroky, jako je zajistit, aby byl veškerý software aktualizován, aktualizované šifry jsou podporovány, nepoužívaly se nezabezpečené protokoly a byla změněna výchozí hesla pro služby.

Tento článek je úvodem do zkoumání vašich serverů. Použijte nc a nmap ověřte, které porty jsou otevřené, a použijte ps příkaz ke zpětnému sledování procesů používajících tyto porty. Také jsem uvedl příklad, jak můžete použít nmap pomocí --script argument pro testování vašich systémů. Chcete-li pokračovat v této vzdělávací cestě, jedním z možných dalších kroků je výzkum pomocí nmap jako útočný stroj prozkoumáním výchozích skriptů v /usr/share/nmap/scripts/ .


Linux
  1. Ladění Linuxu pomocí ProcDump

  2. 13 kurzů zabezpečení Linuxu

  3. Použití příkazu ripgrep (rg) v Linuxu

  1. Použití AppImage pro správu balíčků Linuxu

  2. Úvod do Nmap na Kali Linuxu

  3. Povolit služby v Linuxu

  1. 50 Výukové programy Sysadmin pro UNIX / Linux

  2. Kali Linux na Androidu pomocí Linux Deploy

  3. Příklady použití příkazu dmsetup v Linuxu