Perlindungan Server terhadap teknik Brute Force dan Dictionary Matching
Pendahuluan
Teknik brute atau pencocokan kamus adalah jenis serangan yang paling lazim digunakan pada sebuah server.
Tutorial kali ini, saya ingin menjelaskan mengenai bagaimana melindungi server dari serangan brute force maupun dictionary matching pada layanan ssh menggunakan fail2ban.
Teknik serangan
Software yang digunakan untuk menyerang adalah THC-Hydra (http://www.thc.org/thc-hydra/).
Jangan selalu berkonotasi negatif setiap mendengar atau memperoleh software hacking karena semuanya kembali pada masing-masing individu.
White Hacker dapat memanfaatkan software ini untuk menguji password dari user-user yang mereka kelola. Seandainya ada user yang menggunakan weak password, administrator dapat memberikan user tersebut sebuah peringatan untuk mengganti password mereka dengan password yang lebih kuat.
Hydra adalah sebuah perangkat lunak untuk melakukan proses login secara looping dengan memasukkan kombinasi username dan password dari sebuah file yang telah berisi daftar. Software ini sebenarnya hanya memudahkan hacker "mencoba-coba" login dari sebuah layanan.
Layanan yang dapat di handle oleh software hydra ini cukup banyak: cisco cisco-enable cvs firebird ftp[s] http[s]-{head|get} http[s]-{get|post}-form http-proxy http-proxy-urlenum icq imap irc ldap2 ldap3[-{cram|digest}md5] mssql mysql ncp nntp oracle-listener oracle-sid pcanywhere pcnfs pop3 postgres rdp rexec rlogin rsh sip smb smtp smtp-enum snmp socks5 ssh svn teamspeak telnet vmauthd vnc xmpp
Tutorial ini hanya membahas mengenai SSH saja.
Prerequisites
Instalasi hydra cukup mudah. Karena saya menggunakan sistem operasi ubuntu, perintah-perintah berikut mohon disesuaikan sendiri.
# sudo apt-get install hydra hydra-gtk
Oke setelah kita menginstall software hydra, kita perlu mempunyai daftar kata sandi atau password yang nanti akan kita "coba-coba"-kan untuk seorang user. Daftar kata sandi dapat diperoleh di: http://www.winedt.org/Dict/.
Untuk tutorial kali ini, saya ingin membuat dictionary saya sendiri. Biar lebih ringkas dan lebih cepat karena hanya sebagai contoh.
# nano pass.txt
football
flower
123
1234
12345
123456
654321
54321
4321
321
Oke. Sekarang kita telah memiliki software hydra dan file pass.txt. Berikutnya kita tentukan target serangan kita. Ingat! Jangan pernah menentukan target serangan tanpa alasan yang jelas! Tutorial ini hanya akan menyerang localhost.
Untuk menyerang sebuah host menggunakan hydra, kita gunakan perintah dan parameter berikut:
# hydra -l andi -P pass.txt localhost ssh
Keterangan:
-l : Menunjukkan bahwa kita sudah tahu bahwa username dari host yang akan kita serang adalah andi.
Jika kita belum tahu username dan akan kita coba-coba dari file user.txt (file yang berisi daftar username) yang telah kita miliki maka perintahnya:
# hydra -L user.txt -P pass.txt localhost ssh
Begitu juga kalau kita sudah tahu password yang digunakan tapi tidak tahu username pemilik password tersebut.
# hydra -L user.txt -p pass123 localhost ssh
Nah sudah tahu fungsi -l, -L, -p dan -P kan?
Output:
# hydra -l andi -P pass.txt localhost ssh
Hydra v7.1 (c)2011 by van Hauser/THC & David Maciejak - for legal purposes only
Hydra (http://www.thc.org/thc-hydra) starting at 2013-06-24 13:36:55
[DATA] 12 tasks, 1 server, 12 login tries (l:1/p:12), ~1 try per task
[DATA] attacking service ssh on port 22
[22][ssh] host: 127.0.0.1 login: andi password: 54321
[STATUS] attack finished for localhost (waiting for children to finish)
1 of 1 target successfuly completed, 1 valid password found
Hydra (http://www.thc.org/thc-hydra) finished at 2013-06-24 13:37:01
Bagian yang tercetak tebal adalah apa yang kita cari.
Cukup mudah bukan?
Bagaimana server mengetahui bahwa dia sedang diserang?
Sebenarnya server tahu dan mencatat (logging) apa yang terjadi di server. Tapi that's it. Hanya itu. Tidak ada aksi apa-apa yang dilakukan oleh server. Inilah tujuan dari tutorial kalo ini. Kita akan membuat aksi atas apa yang telah dicatat dalam berkas log.
Perhatikan berkas auth.log berikut:
Dari berkas log tersebut, terlihat ada banyak sekali kesalahan login untuk user "andi". Bukan itu sebenarnya yang kita kuatirkan. Tapi perhatikan pada 8 baris paling akhir:
Artinya. Password "andi" berhasil ditemukan!
Pencegahan:
Jika server sebenarnya "mencatat" kejadian abnormal yaitu login berulang tapi salah terus, terus So What? Useless jika tidak ada aksi apa-apa terhadap aktifitas tersebut. Tidak bijak juga "menunggu" administrator memperbaiki hal ini. Alangkah baiknya server "segera" melakukan tindakan untuk:
- Menutup akses ssh untuk host penyerang via firewall
- Mengganti password si andi secara sepihak menggunakan password generator
- Mengganti secara sementara shell andi supaya jika hacker berusaha masuk lewat pintu tersebut, dia akan "terpenjara" pada shell yang tidak bisa apa-apa.
- Mengaktifkan port knocking untuk melindungi port ssh.
- Atau tindakan apapun yang dapat menyelamatkan user andi secara khusus atau system secara keseluruhan
Tutorial kali ini saya ingin mencoba cara pertama yaitu menutup akses ssh untuk host penyerang via firewall.
Sebelum saya masuk pada bagaimana cara melindungi service ssh terhadap serangan brute force, saya ajak anda terlebih dulu untuk "membedakan" mana yang berusaha masuk lewat cara yang benar dan mana yang berusaha masuk melalui hydra. User normal (bukan robot) idealnya hanya akan melakukan kesalahan login satu kali login kedua seharusnya sudah bisa masuk. Beberapa system memberi toleransi kesalahan hingga 2x. Artinya jika user salah hingga ke 3x-nya, system akan HALT, LOCK Down, dsb.
Untuk tutorial kali ini, saya lebih toleran lagi yaitu 5x. :)
Oke ini yang perlu kita siapkan.
1. Bersihkan auth.log
Kita bersihkan dulu berkas auth.log yang tadi sudah ternodai (terkotori) dengan hydra. Mengapa? Hanya untuk memudahkan menjelaskan konsep fail2ban.
Sebelum saya masuk pada bagaimana cara melindungi service ssh terhadap serangan brute force, saya ajak anda terlebih dulu untuk "membedakan" mana yang berusaha masuk lewat cara yang benar dan mana yang berusaha masuk melalui hydra. User normal (bukan robot) idealnya hanya akan melakukan kesalahan login satu kali login kedua seharusnya sudah bisa masuk. Beberapa system memberi toleransi kesalahan hingga 2x. Artinya jika user salah hingga ke 3x-nya, system akan HALT, LOCK Down, dsb.
Untuk tutorial kali ini, saya lebih toleran lagi yaitu 5x. :)
Oke ini yang perlu kita siapkan.
1. Bersihkan auth.log
Kita bersihkan dulu berkas auth.log yang tadi sudah ternodai (terkotori) dengan hydra. Mengapa? Hanya untuk memudahkan menjelaskan konsep fail2ban.
# cat /dev/null > /var/log/auth.log
2. Install fail2ban
# sudo apt-get install fail2ban
3. Bersihkan dulu segala aturan firewall hanya untuk memudahkan penjelasan fail2ban.
# sudo iptables -F
# sudo iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
4. Atur konfigurasi jail.conf
# sudo nano /etc/fail2ban/jail.conf
Perhatikan pada bagian:
ignoreip = 127.0.0.1/8
// IP yang tidak akan diproses. Karena kita akan menyerang localhost, rubah menjadi (hapus IP 127.0.0.1) :
ignoreip =
Kemudian:
bantime = 600
maxretry = 3
// Bagian ini menentukan berapa toleransi error yang anda "ijinkan". Karena saya akan mengijinkan kesalahan hingga 5x maka
bantime = 600
maxretry = 5
Simpan konfigurasi ini.
5. Jalankan layanan fail2ban
# sudo /etc/init.d/fail2ban start
6. Perhatikan aturan firewall anda sekarang:
# sudo iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-ssh tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain fail2ban-ssh (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Pada bagian yang tercetak tebal, adalah aturan tambahan dari fail2ban.
7. Coba serang kembali localhost anda menggunakan hydra
# hydra -l andi -P pass.txt localhost ssh
Hydra v7.1 (c)2011 by van Hauser/THC & David Maciejak - for legal purposes only
Hydra (http://www.thc.org/thc-hydra) starting at 2013-06-24 19:24:47
[DATA] 12 tasks, 1 server, 12 login tries (l:1/p:12), ~1 try per task
[DATA] attacking service ssh on port 22
[22][ssh] host: 127.0.0.1 login: andi password: 54321
[STATUS] attack finished for localhost (waiting for children to finish)
1 of 1 target successfuly completed, 1 valid password found
Hydra (http://www.thc.org/thc-hydra) finished at 2013-06-24 19:24:52
8. Aturan firewall yang baru
Lihat firewall anda sekarang
# sudo iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-ssh tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain fail2ban-ssh (1 references)
target prot opt source destination
DROP all -- 127.0.0.1 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Terdapat aturan banned pada chain fail2ban-ssh (tercetak tebal) yang menandakan bahwa IP 127.0.0.1 tidak bisa melakukan "INPUT" ke server.
9. Pengujian
Ujilah untuk login ke server menggunakan user andi via ssh dari localhost
# ssh andi@localhost
ssh: connect to host localhost port 22: Connection timed out
Permasalahan:
Jika anda perhatikan IP yang ter-banned adalah host yang diindikasi melakukan serangan brute force atau dict matching ke sebuah server. Akan tetapi hacker:
1. Tetap mendapatkan password yang digunakan oleh user andi
2. Hacker bisa saja berpindah IP (yang tidak di banned) untuk mencoba login dengan user andi dan password 54321
Ada solusi?
2. Install fail2ban
# sudo apt-get install fail2ban
3. Bersihkan dulu segala aturan firewall hanya untuk memudahkan penjelasan fail2ban.
# sudo iptables -F
# sudo iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
4. Atur konfigurasi jail.conf
# sudo nano /etc/fail2ban/jail.conf
Perhatikan pada bagian:
ignoreip = 127.0.0.1/8
// IP yang tidak akan diproses. Karena kita akan menyerang localhost, rubah menjadi (hapus IP 127.0.0.1) :
ignoreip =
Kemudian:
bantime = 600
maxretry = 3
// Bagian ini menentukan berapa toleransi error yang anda "ijinkan". Karena saya akan mengijinkan kesalahan hingga 5x maka
bantime = 600
maxretry = 5
Simpan konfigurasi ini.
5. Jalankan layanan fail2ban
# sudo /etc/init.d/fail2ban start
6. Perhatikan aturan firewall anda sekarang:
# sudo iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-ssh tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain fail2ban-ssh (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Pada bagian yang tercetak tebal, adalah aturan tambahan dari fail2ban.
7. Coba serang kembali localhost anda menggunakan hydra
# hydra -l andi -P pass.txt localhost ssh
Hydra v7.1 (c)2011 by van Hauser/THC & David Maciejak - for legal purposes only
Hydra (http://www.thc.org/thc-hydra) starting at 2013-06-24 19:24:47
[DATA] 12 tasks, 1 server, 12 login tries (l:1/p:12), ~1 try per task
[DATA] attacking service ssh on port 22
[22][ssh] host: 127.0.0.1 login: andi password: 54321
[STATUS] attack finished for localhost (waiting for children to finish)
1 of 1 target successfuly completed, 1 valid password found
Hydra (http://www.thc.org/thc-hydra) finished at 2013-06-24 19:24:52
8. Aturan firewall yang baru
Lihat firewall anda sekarang
# sudo iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-ssh tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain fail2ban-ssh (1 references)
target prot opt source destination
DROP all -- 127.0.0.1 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Terdapat aturan banned pada chain fail2ban-ssh (tercetak tebal) yang menandakan bahwa IP 127.0.0.1 tidak bisa melakukan "INPUT" ke server.
9. Pengujian
Ujilah untuk login ke server menggunakan user andi via ssh dari localhost
# ssh andi@localhost
ssh: connect to host localhost port 22: Connection timed out
Permasalahan:
Jika anda perhatikan IP yang ter-banned adalah host yang diindikasi melakukan serangan brute force atau dict matching ke sebuah server. Akan tetapi hacker:
1. Tetap mendapatkan password yang digunakan oleh user andi
2. Hacker bisa saja berpindah IP (yang tidak di banned) untuk mencoba login dengan user andi dan password 54321
Ada solusi?
bagaimana jika respon dari server ketika ada serangan dia bisa mendeteksi Mac Address dari komputer tersebut ,, dan mac address tersebut akan di lock ketika hacker mengakses halaman login tersebut... dan jika bisa kluarkan printah warning untuk hacker ..
inti nya : locking mac address
Sayangnya fail2ban ini memanfaatkan berkas auth.log yang hanya menyimpan alamat IP sumber (bukan MacAddressnya) sehingga sulit untuk mengunci host menggunakan Alamat Mac-nya