GNU/Linux >> Belajar Linux >  >> Linux

Menggunakan hasil Nmap untuk membantu memperkuat sistem Linux

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


Linux
  1. Debug Linux menggunakan ProcDump

  2. Menggunakan AppImage untuk manajemen paket Linux

  3. 13 tutorial keamanan Linux

  1. Pengenalan Nmap di Kali Linux

  2. Menggunakan Perintah ripgrep (rg) di Linux

  3. 50 Tutorial Sysadmin UNIX / Linux

  1. Aktifkan layanan di Linux

  2. Kali Linux di Android menggunakan Linux Deploy

  3. Contoh penggunaan perintah dmsetup di Linux