Ads

Ads Here

Senin, 10 Agustus 2009

PORT KNOCKING

Portknocking adalah merupakan salah satu metode dalam network security
yang digunakan untuk membuka sebuah port yang tertutup atau membuka akses firewall
dan mengizinkan knocker masuk kedalam port yang dituju melalui pengirimkan
packet-packet tertentu ke server/firewall tujuan.

[ Cara Kerja PortKnocking ]

[SERVER] [FIREWALL] [CLIENT]
| | |
| | |
| | |
| | |
- | <-----------[SYN:22] |
[22] | |
- | [DENY] ----------------> |
| | |
| | |

[CONNECTION BLOCK PORT 22]

[PORTKNOCKING IN ACTION]

[SERVER] [FIREWALL] [CLIENT]
| | |
| | <-----------[SYN:100] [1] |
| | <-----------[SYN:200] [2] |
| | <-----------[SYN:300] [3] |
- | |
[22] <-----------[SYN:22] [4] |
- | |
| | |
| | |

NOTE :

-- Pada Ilustrasi pertama Firewall memblock packet dengan tujuan SSH[22] kedalam Server
-- Sedangkan ilustrasi kedua Client mengirimkan Packet Knocking ke
Firewall dengan tujuan Port 100,200,300 secara bergantiani,Karena
Pada Firewall sudah di setting Parameter untuk knocking server,
maka firewall akan membukaan akses dari client menuju Server
dengan tujuan port SSH[22].

[ Konfigurasi Portknocking ]

Sebenarnya ada banyak tools untuk mengimplemtasikan portknocking ini
dari yang mudah menggunakan, sampai yang sulit.Kebanyakan dari tools tersebut
menggunakan metode Single Packet Authorization [SPA]. SPA ini adalah teknik
mengirimkan packet tertentu kedalam portknocking server,biasanya packet yang
di kirimkan telah di Encrypt.Untuk SPA ini menggunakan metode Client-Server
dimana tools untuk Knocking berada di sisi Client dan Server.

Karena Pada tulisan ini berjudul Simple Portknocking maka saya akan
menggunakan cara paling sederhana untuk membuat Portknocking server dan
cara untuk memasukinya.

Contoh :

Misal :

- Port SSH[22] pada Server terbuka
- Firewall Memblock semua traffic menuju Port SSH[22]

Q : Bagaimana cara nya agar kita dapat masuk kedalam Port SSH[22] pada Server
dengan Rules Firewall yang di Block semua dan Membuat Firewall mengizinkan
kita untuk mengakses Port SSH[22] Server ???
A : Jawaban nya menggunakan Metode Portknocking dimana hanya kita yang
mengetahui bagaimana cara firewall membukakan pintu agar kita bisa
masuk kedalam Port SSH[22] Server.

Skenario I

Pada skenario ini kita akan menggunakan iptables untuk membuat rules
portknocking dan Port Knocking yang akan di gunakan untuk knock adalah port 1,2,3,4

+--- Scripts ----
|
| HOST_IP="[ip server]"
| /sbin/iptables -A INPUT -s 0/0 -d 0/0 -j DROP
| /sbin/iptables -N PHASE2
| /sbin/iptables -A PHASE2 -m recent --name PHASE1 --remove
| /sbin/iptables -A PHASE2 -m recent --name PHASE2 --set
| /sbin/iptables -A PHASE2 -j LOG --log-prefix "INTO PHASE2: "
| /sbin/iptables -N PHASE3
| /sbin/iptables -A PHASE3 -m recent --name PHASE2 --remove
| /sbin/iptables -A PHASE3 -m recent --name PHASE3 --set
| /sbin/iptables -A PHASE3 -j LOG --log-prefix "INTO PHASE3: "
| /sbin/iptables -N PHASE4
| /sbin/iptables -A PHASE4 -m recent --name PHASE3 --remove
| /sbin/iptables -A PHASE4 -m recent --name PHASE4 --set
| /sbin/iptables -A PHASE4 -j LOG --log-prefix "INTO PHASE4: "
| /sbin/iptables -A INPUT -m recent --update --name PHASE1
| /sbin/iptables -A INPUT -p tcp --dport 1 -m recent --set --name PHASE1
| /sbin/iptables -A INPUT -p tcp --dport 2 -m recent --rcheck --name PHASE1 -j PHASE2
| /sbin/iptables -A INPUT -p tcp --dport 3 -m recent --rcheck --name PHASE2 -j PHASE3
| /sbin/iptables -A INPUT -p tcp --dport 4 -m recent --rcheck --name PHASE3 -j PHASE4
| /sbin/iptables -A INPUT -p tcp -s 0/0 -d $HOST_IP --dport 22 -m recent --rcheck --seconds 5 --name PHASE4 -j ACCEPT
| /sbin/iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j REJECT
|
+--- Scripts ----

Setelah menjalankan rules iptables pada firewall selanjut nya
melakukan ujicoba dengan melakukan telnet menuju port 1,2,3 dan 4 lalu
melakukan ssh kedalam server.

+--- Code ----
|
| #!/bin/bash
| echo Please, enter your Ip Server :
| read ipserver
| alias k='telnet $ipserver'
| for i in `seq 1 4`;
| do
| k $i
| done
| ssh $ipserver
|
+--- Code ----

Saya mempunyai beberapa ide salah satunya adalah portknocking dengan
menggunakan salah satu IP header yaitu TOS [Type Of Service] sebagai kunci
untuk menjalankan SSH Service pada Server.

Berikut contoh code nya :

+------------------- code -------------------------------
|
| #!/usr/bin/perl -w
|
| use strict;
| use NetPacket::IP qw(:flags);
| use Net::PcapUtils;
| use NetPacket::Ethernet qw(:strip);
| sub process_pkt {
| my ($arg, $hdr, $pkt) = @_;
| my $ip_obj = NetPacket::IP->decode(eth_strip($pkt));
| if ($ip_obj->{tos} == 10) {
| system("/etc/init.d/ssh start");
| }
| }
|
| Net::PcapUtils::loop(\&process_pkt, FILTER => 'ip');
|
|
+------------------- code --------------------------------

Cara kerja script di atas adalah dengan mengcapture packet-packet yang
masuk kedalam server lalu mengambil IP Header berupa TOS. Jika TOS nya adalah 10
maka script akan menjalankan service SSH. Secara Default Semua Packet IP
mempunyai nilai TOS 0.

Q : Bagaimana cara untuk merubah TOS sebuah packet ??
A : Untuk merubah TOS sebuah packet yang mudah adalah menggunakan
command ping pada LINUX

Dengan ping kita bisa berubah TOS Quality nya.
+----
| command : ping [target] -Q [tos]
| contoh : ping 172.100.100.12 -Q 10
+----

Dengan Menggunakan tcpdump untuk melihat TOS sebuah packet

+--- Result ----
|
| #tcpdump -nXvs 1514 icmp
| 00:00:43.984614 IP (tos 0xa,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto: ICMP (1), length: 84) 10.100.17.127 > 10100.17.143: ICMP echo request, id 12641, seq 1, length 64
| 0x0000: 450a 0054 0000 4000 4001 1382 0a08 097f E..T..@.@.......
| 0x0010: 0a08 098f 0800 3509 3161 0001 8874 8e46 ......5.1a...t.F
| 0x0020: 8ad6 0500 0809 0a0b 0c0d 0e0f 1011 1213 ................
| 0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 .............!"#
| 0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123
| 0x0050: 3435 3637 4567
| 00:00:44.017532 IP (tos 0xa,ECT(0), ttl 64, id 51381, offset 0, flags [none], proto: ICMP (1), length: 84) 10.100.17.143 > 10.100.17.127: ICMP echo reply, id 12641, seq 1, length 64
| 0x0000: 450a 0054 c8b5 0000 4001 8acc 0a08 098f E..T....@.......
| 0x0010: 0a08 097f 0000 3d09 3161 0001 8874 8e46 ......=.1a...t.F
| 0x0020: 8ad6 0500 0809 0a0b 0c0d 0e0f 1011 1213 ................
| 0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 .............!"#
| 0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123
| 0x0050: 3435 3637 4567
|
+--- Result ----

[ Catatan ]

- tos 0xa = tos 10
- Cara di atas merupakan cara sederhana dari sebuah portknocking,
sehingga semua packet data masih dapat di capture dan dibaca secara jelas.
- SIlakan melakukan experimen sendiri sesuai dengan kebutuhan anda.

[ Penutup ]

Selamat mencoba menggunakan metode portknocking ini, semoga artikel
ini dapat berguna bagi kita semua.

[ Referensi ]

- Port Knocking and Other Uses of 'Recent Match' : http://www.shorewall.net/PortKnocking.html
- Portknocking : http://portknocking.org
- Assemble and disassemble IP (Internet Protocol) packets : http://search.cpan.org/~atrak/NetPacket-0.04/

Tidak ada komentar:

Posting Komentar