Keamanan sistem bukanlah tugas satu-dan-selesai. Sebaliknya, ada banyak lapisan dalam pendekatan keamanan organisasi. Beberapa dari lapisan tersebut adalah keamanan fisik ke pusat data, penambalan dan pemeliharaan infrastruktur secara teratur, pendidikan kesadaran pengguna yang berkelanjutan, dan sistem pemindaian untuk masalah. Artikel ini membahas cara menggunakan nmap
dan nc
perintah untuk memindai sistem sehingga Anda dapat menentukan langkah selanjutnya yang sesuai. Saya menggunakan beberapa sistem dalam contoh saya di sini. Sistem yang melakukan pemindaian adalah komputer lokal saya Red Hat Enterprise Linux (RHEL) 8.3, opendemo.usersys.redhat.com
adalah sistem Red Hat Satellite 6.8 yang digunakan karena memiliki beberapa port terbuka, dan saya memiliki berbagai sistem target.
[ Anda mungkin juga menyukai: Keamanan sysadmin:8 kontrol penguncian Linux ]
Pemindaian dasar
Untuk melihat port yang digunakan di server Satelit saya, saya SSH ke server lalu gunakan 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 ~]#
Namun, beberapa di antaranya terbatas pada localhost, 127.0.0.1. Untuk melihat port mana yang terlihat secara publik, saya mulai dengan menggunakan nmap
default default pindai dari sistem lokal saya:
[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 ~]$
Keluaran ini menunjukkan bahwa sistem lokal saya dapat melihat lebih sedikit port publik daripada yang dapat saya lihat saat menggunakan SSH ke server. Beberapa dari port non-publik tersebut adalah 25, yang digunakan oleh master , dan 8005, 8140, 8443, dan 61613, yang digunakan oleh java . Melihat ps
output dan mengambil PID dari master dari netstat
itu keluaran, master adalah postfix surat:
[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 ~]#
Itu (master) berjalan secara lokal sehingga email dapat dikirim ke alamat internal tetapi tidak mendengarkan email yang masuk, juga tidak mengirim apa pun ke host lain.
Port lain yang disebutkan adalah untuk java . Saat Anda melihat netstat
keluaran, dua java different yang berbeda proses bertanggung jawab atas port tersebut:
[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 ~]#
Saat Anda melihat ps
keluaran untuk PID 1135, digunakan oleh 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 ~]#
Ketika saya melihat di /usr/share/tomcat/conf/server.xml
file, memiliki konten seperti:
<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"
....
Ini menunjukkan cara definisi port yang akan digunakan dalam file konfigurasi.
Saat saya melihat java lainnya proses yang saya sebutkan, PID 2101 untuk port 8140, saya melihat ini digunakan oleh boneka :
[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 ~]#
Berdasarkan netstat
output, port 8140 harus terlihat oleh publik, tetapi nmap
dari sistem lokal saya tidak melaporkannya dalam hasilnya. Di sini sekali lagi, adalah netstat
keluaran dari server Satelit:
[root@opendemo ~]# netstat -tunap| grep 8140
tcp6 0 0 :::8140 :::* LISTEN 2101/java
[root@opendemo ~]#
dan nmap
dari server lokal saya:
[pgervase@pgervase ~]$ nmap opendemo.usersys.redhat.com | grep 8140
[pgervase@pgervase ~]$
Namun, saya dapat memaksa nmap
untuk memeriksa port atau rentang port tertentu:
[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 ~]$
Dengan memaksa nmap
untuk memeriksa port tersebut, saya dapat melihat port :8140 yang merupakan nmap
basic dasar pemindaian tidak melaporkan. Ini menunjukkan bahwa nmap
default default memindai tanpa argumen tambahan mungkin cukup baik untuk melihat sistem pertama kali, tetapi mungkin melewatkan port yang sebenarnya terbuka.
Informasi ini penting dalam pengujian keamanan sehingga sysadmin dapat mengidentifikasi potensi kerentanan. Dari nmap
pemindaian keluaran, jalankan secara lokal di sistem saya, Anda melihat port yang terbuka untuk umum. Versi Satelit sebelumnya memiliki Tomcat dikonfigurasi sehingga beberapa port tersebut bersifat publik saat tidak diperlukan. Untuk membaca beberapa diskusi untuk masalah itu, Anda dapat membaca Bugzilla di mana ini telah diselesaikan.
Verifikasi sertifikat
Masalah lain yang nmap
dapat membantu adalah memverifikasi sertifikat yang digunakan pada berbagai port tersebut. Menggunakan nmap
, Anda melihat port yang terbuka. Dengan menggunakan port tersebut, Anda dapat menggunakan OpenSSL untuk melihat sertifikat yang digunakan pada port tersebut. Sejumlah port tersebut menggunakan sertifikat yang ditandatangani sendiri. Untuk menggunakan nmap
dan OpenSSL bersama-sama untuk memeriksa port pada sistem jarak jauh, Anda dapat melakukan sesuatu seperti:
$ 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`
Di opendemo.certs.txt.20210127
saya file, itu akan memiliki konten seperti:
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
Gunakan file keluaran tersebut untuk memverifikasi bahwa sertifikat yang digunakan adalah versi TLS yang benar.
Jika Anda menggunakan nc
(atau ncat
), Anda mungkin melihat lebih banyak informasi daripada yang disajikan di UI web. Untuk contoh ini, saya menggunakan nc
untuk terhubung ke 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>
Dari output itu, saya bisa melihat versi Apache yang diinstal. Dengan informasi itu, penyerang dapat mempelajari eksploitasi apa yang rentan terhadap server. Karena itu, server web harus membatasi jumlah informasi yang ditampilkan:
[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 ~]$
Perhatikan bahwa dalam keluaran ini, tidak ada informasi versi untuk Apache.
Dalam contoh berikut ini, saya menggunakan nc
untuk terhubung ke port 21 di sistem klien saya, yang saya lihat terbuka:
[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)
Versi 3.0.3 itu dikonfirmasi ketika saya SSH ke sistem dan menggunakan rpm
perintah:
[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>
Sekali lagi, seperti halnya mempelajari versi Apache di perangkat, kemampuan untuk melakukan pengintaian di lingkungan Anda sehingga Anda tahu apa yang dapat dipelajari oleh penyerang potensial tentang sistem Anda adalah penting.
Memindai dari Kali
Di bagian berikutnya, saya menampilkan beberapa hasil dari pemindaian sistem dari server Kali. Dalam contoh ini, saya tahu bahwa server target memiliki distccd
berjalan pada port 3632, tetapi, seperti sebelumnya, nmap
tidak mendeteksi port itu secara default, jadi saya harus memeriksanya secara khusus:

Sekarang Anda tahu distccd
terbuka, Anda dapat menggunakan kemampuan bawaan nmap untuk menentukan di mana ia berpotensi dieksploitasi:

Jika Anda hanya menggunakan nmap
biasa scan, Anda akan melewatkan kerentanan yang dapat dieksploitasi. Dalam contoh saya, saya menjalankan uname -a
pada sistem jarak jauh, tetapi saya dapat menjalankan perintah apa pun.
Mengidentifikasi layanan
Satu cara terakhir untuk menggunakan nmap
adalah dengan -sV
opsi, yang menyelidiki port yang terbuka dan menentukan informasi layanan atau versi. Untuk contoh ini, saya mengubah port yang dijalankan Apache dari 80 menjadi 90 dan kemudian memulai kembali layanan. Di bawah ini Anda dapat melihat perbedaan antara nmap
biasa pindai lalu gunakan -sV
opsi, yang dengan benar menentukan layanan sebagai httpd
daripada 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
[ Ingin mempelajari lebih lanjut tentang keamanan? Lihat daftar periksa keamanan dan kepatuhan TI. ]
Menutup
Sekarang setelah Anda bisa mendapatkan laporan mendetail tentang apa yang berjalan di sistem Anda, apa yang Anda lakukan selanjutnya? Hal pertama adalah memastikan bahwa tidak ada port tak terduga yang terbuka. Untuk ini, verifikasi dengan tim aplikasi, tim keamanan, dan rekan kerja Anda mungkin sesuai. Berikutnya adalah memastikan bahwa layanan yang terpapar diamankan dengan benar. Ini berarti mengambil langkah-langkah seperti memastikan bahwa semua software diperbarui, sandi yang diperbarui didukung, protokol tidak aman tidak digunakan, dan sandi default untuk layanan telah diubah.
Artikel ini adalah pengantar untuk menyelidiki server Anda. Gunakan nc
dan nmap
untuk memverifikasi port mana yang terbuka dan gunakan ps
perintah untuk melacak kembali proses menggunakan port tersebut. Saya juga memberikan contoh bagaimana Anda dapat menggunakan nmap
dengan --script
argumen untuk menguji sistem Anda. Untuk melanjutkan jalur pembelajaran ini, satu langkah berikutnya yang mungkin adalah meneliti menggunakan nmap
sebagai mesin penyerang dengan menyelidiki skrip default di /usr/share/nmap/scripts/
.