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