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 port2 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 open ssh tersebut. 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. Challange yang ke-2 adalah mengenai port knocking.

Port knocking ini bisa kita konfigurasi dengan iptables firewall (yang biasanya sudah terinstall 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 (firewall)
  • nmap (untuk scan dan knocking port)
  • Pengetahuan dasar mengenai protocol, iptables, dan networking (UDP, TCP, ICMP).

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 sengaja untuk menutup port 22 dan hanya terbuka pada saat yang dibutuhkan. Disinilah kita gunakan teknik port knocking, dimana saya sudah menge-set konfigurasi supaya user harus mengirimkan paket TCP ke port 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 Port 1111 => 2222 => 3333 => 4444 => Port 22 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 OS CentOS )

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p icmp -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited 
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

Perhatikan pada rules berikut :

-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

terlihat bahwa iptables memperbolehkan akses melalui port 22.

Karena pada kasus ini kita ingin menutup port 22 tersebut, dan hanya terbuka pada saat port Port 1111,2222,3333,4444 mendapatkan paket TCP.

Note : sebelum edit copy dulu konfigurasi firewallnya.

# cp iptables.rules iptables-new.rules

Kaku kita edit konfigurasi firewall tersebut menjadi :

# vi 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

# iptables-restore < iptables-new.rules
# service iptables save
# service iptables restart

kemudian untuk memastikan rules yang baru sudah berjalan gunakan perintah :

# iptables -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.

# nmap -Pn 192.168.0.100 -p22

Setelah itu kita buat script bash sederhana untuk melakukan knocking port.

#!/bin/bash
HOST=$1
shift
for ARG in "[email protected]"
do
    nmap -PN --host_timeout 201 --max-retries 0 -p $ARG $HOST
done

Simpan dengan nama knock.sh lalu chmod +x agar script tersebut dapat dieksekusi.

cara penggunaan :

# ./knock.sh [ip server] [list port]
# misalnya:
./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:

Tambahan dari om od3yz: