Kali ini saya ingin berbagi tips untuk meningkatkan keamanan server dengan menggunakan teknik port knocking. Port knocking adalah sebuah cara untuk membuka port tertentu dengan cara mengirimkan paket ke sedetetan port-port tertentu yang telah ditentukan sebelumnya.
Q : Tujuannya untuk apa?
A : Tujuannya untuk menghindari serangan dari pentester yang melakukan scanning port untuk mendapatkan service-service yang mungkin bisa diexploitasi oleh mereka. Karena jika pentester yang melakukan scanning tersebut tidak mengetuk port yang telah ditentukan sebelumnya secara berurutan, maka port yang ingin kita lindungi tersebut tidak akan terbuka.
Q : Bisa lebih detail?
A : Misalnya kita punya service SSH yang listen di port 22
, sedangkan pentester punya 0day remote root exploit untuk aplikasi OpenSSH tersebut misalnya. Maka server akan terancam keamanannya karena port 22
tersebut terbuka. Dengan menggunakan teknik port knocking, hanya mereka yang mengetahui port mana yang harus di “hit” terlebih dahulu yang dapat membuka dan mengakses port 22
tersebut.
Supaya lebih jelas, saya ambil contoh dari thread saya sebelumnya tentang celeng Lawang Sewu CTF (http://devilzc0de.org/forum/thread-20071.html
). Challange yang ke-2 adalah mengenai port knocking.
Port knocking ini bisa kita konfigurasi dengan iptables
firewall (yang biasanya sudah dimiliki kernel Linux pada kebanyakan distro linux).
Pada kesempatan kali ini saya share bagaimana cara konfigurasi port knocking menggunakan iptables
.
Disclaimer: Dengan mengikuti tutorial ini, author tidak bertanggung jawab jika ada kesalahan dan kehilangan remote akses ke server.
VIDEO TUTORIAL : http://youtu.be/0zFQocf7C_0.
Yang dibutuhkan pada tutorial kali ini :
- Server & Client dengan OS Linux (pada tutorial kali ini ane menggunakan CentOS)
iptables
(server firewall)nmap
(untuk scan dan knocking port dari client)- Pengetahuan dasar mengenai iptables.
Studi Kasus:
Saya punya sebuah server (IP : 192.168.0.100
), saya menggunakan SSH untuk melakukan manajemen server tersebut. SSH port untuk remote aksesnya adalah default (Port 22
). Saya ingin menutup port 22
dan hanya terbuka pada saat dibutuhkan.
Disinilah kita gunakan teknik port knocking, dimana saya sudah menge-set konfigurasi supaya user harus mengirimkan paket TCP ke port (misalnya) 1111
lalu 2222
, lalu 3333
, dan terakhir 4444
baru kembudian port 22
(SSH) tersebut terbuka.
- IP Server :
192.168.0.100
. - OS : CentOS.
- SSH Port :
22
. - Skema Port Knocking : Paket
TCP
Port1111
=>2222
=>3333
=>4444
=> Port22
terbuka.
Untuk bawaan server CentOS, konfigurasi firewall sudah membuka port 22
untuk SSH.
Maka kita perlu mengkonfigurasi ulang iptables
firewallnya. Kita dapat menggunakan perintah iptables-save > iptables.rules
untuk melakukan dump / backup rules firewall.
Coba lihat pada hasil konfigurasi firewall yang baru saja kita dump, kurang lebih seperti berikut (untuk CentOS):
1-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
2-A INPUT -p icmp -j ACCEPT
3-A INPUT -i lo -j ACCEPT
4-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
5-A INPUT -j REJECT --reject-with icmp-host-prohibited
6-A FORWARD -j REJECT --reject-with icmp-host-prohibited
Perhatikan pada rules berikut :
1-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
terlihat bahwa iptables memperbolehkan akses melalui port 22.
Mari kita buat iptables
rules sesuai keinginan kita di studi kasus ini, yaitu kita ingin menutup port 22
tersebut, dan hanya terbuka pada saat port 1111
,2222
,3333
,4444
mendapatkan paket TCP
secara berurutan.
Copy iptables.rules
yang sebelumnya sudah kita dapatkan ke iptables-new.rules
, kemudian edit.
1cp iptables.rules iptables-new.rules
2vi iptables-new.rules
dan edit seperti pada gambar dibawah :
Dengan kata lain, saya membuka port 80
, kemudian menambahkan firewall rules baru yang secara dinamis dapat membuka port 22
selama 15 detik jika port 1111
, 2222
, 3333
, 4444
mendapatkan kiriman paket TCP
secara berurutan dalam jangka waktu 5 detik.
Setelah dirasa udah oke, kita restore konfigurasi firewall yang baru dengan menggunakan iptables-restore
, lalu restart iptables servicenya.
1iptables-restore < iptables-new.rules
2service iptables save
3service iptables restart
kemudian untuk memastikan rules yang baru sudah berjalan gunakan perintah :
1iptables -L -n
Nah kalau udah, mari kita coba cek scan port 22
pada server dari komputer kita menggunakan nmap
, maka akan terlihat port tersebut tertutup oleh firewall.
1nmap -Pn 192.168.0.100 -p22
Setelah itu kita buat script bash sederhana untuk melakukan knocking port.
1#!/bin/bash
2HOST=$1
3shift
4for ARG in "$@"
5do
6 nmap -PN --host_timeout 201 --max-retries 0 -p $ARG $HOST
7done
Simpan dengan nama knock.sh
lalu chmod +x
agar script tersebut dapat dieksekusi.
cara penggunaan:
1# ./knock.sh [ip server] [list port]
2# misalnya:
3./knock.sh 192.168.0.100 1111 2222 3333 4444
Dengan mengetuk port 1111
, 2222
, 3333
, 4444
secara berurutan maka port 22
yang telah kita tentukan dari rules firewall akan terbuka. Dengan begitu kita dapat melakukan koneksi SSH ke server.
Sekian tutorial mengenai port knocking.
Silahkan dikembangkan sendiri dengan kreatifitas masing2, protocol dan paket yang dikirimkan tidak hanya terbatas pada TCP saja, kita juga bisa memanfaatkan kombinasi protokol TCP, UDP atau bahkan ICMP.
Referensi: