Membuat Program Pemantau Jaringan (Sniffer)
MEMBUAT PROGRAM PEMANTAU JARINGAN (SNIFFER)
Oleh :
Dadang Pandhu Dewantoro
Universitas MH Thamrin Jakarta Dadang.pandudewantoro@umht.ac.id
Ringkasan Sniffer adalah program dan/atau peralatan yang memonitor data yang berada di jaringan.
Sniffer dapat digunakan baik untuk manajemen jaringan maupun untuk mencuri informarsi dari jaringan.Untuk menulis program sniffer mengguanakan bahasa pemrograman Java, diperlukan Jpcap dan bila menggunakan bahasa C atau C++, diperlukan pcap. Bila penulisan dilakukan di lingkungan Windows, dibutuhkan library bernama WinPcap atau kalau menggunakan Unix, dibutuhkan library bernama libpcap.Supaya dapat menerima paket yang tidak ditujukan kepadanya, seseorang harus mengeset network adapter di promiscuous mode. Di mode ini, netork adapter akan menerima semua paiet tidak perduli alamat tujuannya. Keuntunngan dari promiscuous mode ini adalah mode ini memungkinkan kita untuk menrima lebih banyak paket yang dibutuhkan saat sniffing. Tapi ada juga kerugiannya yaitu mode ini dapat dideteksi, mode ini hanya bekerja pada peralatan non switch (non switch equipment) seperti hub.
Ada tiga langkah utama dalam membuat sniiffer yaity mengeset device, membuka device dan menyaring data.
Katakunci: packet capturing, sniffer, socket programming
Pendahuluan
Sniffer adalah program dan/atau peralatan yang memonitor data yang berada di jaringan. Sniffer dapan digunakan baik untuk manajemen jaringan maupun untuk mencuri informasi dari jaringan. Di jaringan TCP/IP, bila seseorang mencuri (sniff) paket, dia disebut dengan sniffer (http://isp.webopedia.com/TERM/S/sniffer.html ).
Sniffing di jaringan bukanlah barang yang baru. Hal ini biasanya dilakukan oleh network administrator untuk memonitor lalulintas jaringan. Ada banyak software sniffer yang tersedia baik yang gratis maupun yang komersial. Contohnya adalah WinSniff, Ethereal, Nmap, Snort, ntop, PacAnal, NetSpy, dan Sniffex. Software-software ini ditulis dalam berbagai bahasa seperti Java, C, C++ atau C# dan dijalankan bekerja di platform yang berbeda seperti Windows, Unix, atau Linux.
Artikel ini akan menjelaskan langkah-langkah dalam menulis program sniffer menggunakan pcap (dalam bahasa C) dan menggunakan Jpcap ( dalam bahasa Java). Ada tiga langkah dalam menulis sniffer yaitu mengeset device, membuka device dan menyaring data.
Artikel ini pada awalnya ditulis sebagai bagian dari laporan tugas kuliah Advanced Networking. Bersama laporan tersebut ada sebuah program sniffer yang ditulis dalam bahasa Java. Program itu sendiri tidak disertakan dalam tulisan ini karena keterbatasan tempat.
Kebutuhan
Untuk membuat sebuah sniffer yang dibutuhkan adalah pengetahuan dasar pemrograman disamping pengetahuan dasar jaringan. Jika seseorang akan membuat sniffer yang ditulis dengan Java, dia membutuhkan Jpcap atau pcap jika yang digunakan adalah bahasa lain seperti C atau C++.
Membuat Program Pemantau Jaringan (Sniffer)
ditangkap sebagai raw pakets yang berisi seluruh data dari paket tersebut. Ini memungkinkan aplikasi Java untuk menganalisa tipe-tipe paket yang tidak didukung Jpcap. (http://netresearch.ics.uci.edu/kfujii/jpcap/doc/i ndex.html).
Baik pada Windows maupun Unix, seseorang harus mempunyai library dari third party yaitu
WinPcap atau libpcap
( http://techrepublic.com.com/5100-3513_11-5815384.html).
WinPcap adalah alat standar industri untuk mengakses jaringan melalui link layer pada lingkungan Windows. WinPcap memungkinkan aplikasi untuk menangkap dan mengirimkan paket tanpa melalui protocol stack
dan mempunyai fitur tambahan yaitu menyaring paket pada kernel level, dan mampu menangkap paket dari jarak jauh (remote packet capture). WinPcap terdiri dari sebuah driver yang membantu sistem operasi untuk menyediakan akses jaringan pada level bawah, dan sebuah library yang digunakan untuk mengakses layer jaringan pada level bawah. Library ini juga berisi libpcap Unix API versi Windows. WinPcap adalah mesin (engine) untuk menangkap dan menyaring paket dari banyak alat (tool) baik open source maupun komersial termasuk diantaranya adalah penganalisa protocol (protocol analyzer), pengawasan jaringan (network monitor), sistem pendeteksi penyusupan jaringan (network intrusion detection system), sniffers, traffic generators
dan network testers. Beberapa dari tool itu adalah Ethereal, Nmap, Snort, ntop yang sudah
banyak digunakan orang
(http://www.winpcap.org/).
Seperti WinPcap, libpcap juga merupakan
interface untuk menangkap paket pada level pengguna. libpcap menyediakan portable framework untuk monitor jaringan pada level bawah. Aplikasi yang dapat dibuat mengguanakan libpcap antara lain pengumpulan data statistic jaringan (network statistics collection), pengawasan keamanan (security monitoring), network debugging, dsb. libpcap bekerja pada lingkungan Unix atau Linux (http://sourceforge.net/projects/libpcap/).
Cara Kerja
Ketika sebuah komputer terhubung ke jaringan, paket dari manapun akan sampai pada komputer tersebut. Secara default (yaitu ketika network adapter pada mode normal), paket-paket ini akan ditolak oleh network adapter karena
paket-paket ini dikirimkan ke komputer (host) lain. Tapi orang dapat menerima paket-paket ini dengan mengubah network adapter ke mode
promiscuous. Pada mode ini, sebuah komputer akan menerima semua paket tidak peduli paket itu ditujukan untuk siapa (Nagareshwar, 2006).
Keuntungan dari mode promiscuous ini adalah mode ini bisa mendatangkan lebih banyak paket untuk sniffing. Tapi ada juga kelemahannya. Pertama, sniffing dengan mode promiscuous
dapat dideteksi. Sebuah komputer (host) dapat mengetes untuk menentukan apakah host lain sedang melakukan promiscuous sniffing. Kedua, promiscuous sniffing hanya bekerja pada lingkungan non-switch seperti hub. Ini dikarenakan hub menggunakan teknik
broadcasting untuk mengirimkan paket ke semua host yang berhubungan dengannya. Ketiga, pada jaringan dengan lalulintas yang padat, host tersebut akan membutuhkan banyak
system resource.
Ada tiga langkah utama dalam menulis program
sniffer yaitu : mengeset device, membuka device
untuk mendengarkan, dan menyaring data.
Mengeset device
Ketika pcap digunakan, ada dua teknik untuk mengeset device yang akan di sniff. Yang pertama adalah pengguna menentukan nama
device. Potongan program berikut dapat digunakan :
#include <stdio.h> #include <pcap.h>
int main(int argc, char *argv[]) {
char *dev = argv[1];
printf("Device: %s\n", dev); return(0); }
Pengguna menentukan device dengan menuliskan nama device sebagai argumen
pertama pada program diatas. String “dev”
berisi nama interface yang akan di sniff dalam format yang dikenal oleh pcap.
Teknik lainnya adalah sebagai berikut :
#include <stdio.h> #include <pcap.h>
Membuat Program Pemantau Jaringan (Sniffer)
char *dev, errbuf[PCAP_ERRBUF_SIZE];
dev = pcap_lookupdev(errbuf); if (dev == NULL) { fprintf(stderr, "Couldn't find default
device: %s\n", errbuf);
return(2); }
printf("Device: %s\n", dev); return(0); }
Ketika Jpcap digunakan, yang pertama harus dilakukan adalah membuat kelas yang mengimplementasikan interface jpcap JpcapHandler.
public class JpcapTip implements JpcapHandler {
public void handlePacket(Packet packet){
System.out.println(packet); }
}
Kemudian, untuk dapat menangkap paket, kita harus memberitahu Jpcap, network device mana yang akan didengarkan. API menyediakan metoda jpcap.Jpcap.getDeviceList() untuk hal ini. Metoda ini mengembalikan array string dan cara mengguanakannya adalah sebagai berikut :
String[] devices = Jpcap.getDeviceList();
Setelah kita mendapat daftar nama device, kita harus memilih salah satunya untuk didengarkan :
String deviceName = devices[0];
Membuka device untuk didengarkan
Pada pcap, untuk membuat sesi sniffing
sangatlah mudah. Untuk hal ini, pcap_open_live() dapat digunakan. Prototipe dari fungsi ini adalah sebagai berikut :
pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf)
Argumen pertama adalah device yang sudah ditentukan pada langkah sebelumnya. snaplen adalah integer yang menentukan jumlah byte maksimum yang akan ditangkap oleh pcap. promisc, ketika di set true, akan mengeset
interface ke mode promiscuous. to_ms adalah
read time out dalam milidetik (nilai 0 berarti tidak ada time out; tapi pada sebagian platform, nilai 0 bisa berarti orang boleh menunggu hingga jumlah paket yang ditangkap sudah mencukupi sebelum melihat paket-paket tersebut. Jadi time out seharusnya tidak 0). Terakhir, ebuf adalah string yang dapat menyimpan pesan kesalahan. Fungsi ini mengembalikan session handler.
Sebagai contoh, potongan program berikut ini dapat digunakan :
#include <pcap.h> ...
pcap_t *handle;
handle = pcap_open_live(somedev, BUFSIZ, 1, 1000, errbuf);
if (handle == NULL) {
fprintf(stderr, "Couldn't open device %s: %s\n",
somedev, errbuf); return(2); }
Potongan program ini membuka device yang
disimpan pada string “somedev” dan membaca
sejumlah byte tertentu seperti yang sudah ditentukan dalam BUFSIZ (yang didefinisikan dalam pcap.h). Program ini juga mengeset
device pada mode promiscuous dan melakukan
sniffing hingga terjadi error, dan error ini akan disimpan pada string errbuf. Program ini menggunakan errbuf untuk mencetak error message.
Pada Jpcap, setelah memilih sebuah device,
device tersebut dapat dibuka untuk didengarkan dengan menggunakan metoda Jpcap.openDevice(). Metoda openDevice membutuhkan empat argument yaitu : nama
device yang akan dibuka, jumlah byte maksimum yang akan dibaca dari sebuah device
pada suatu saat, nilai Boolean yang menyatakan apakah device akan di set ke mode promiscuous, dan nilai timeout yang akan digunakan jika metoda processPacket() dipanggil.
Jpcap jpcap =
Jpcap.openDevice(deviceName, 1028, false, 10000);
Membuat Program Pemantau Jaringan (Sniffer)
processPacket ataupun loopPacket(). Kedua metoda tersebut membutuhkan dua argument : jumlah paket maksimum yang akan ditangkap (nilai -1 menandakan tidak ada batasan) dan
instance dari sebuah kelas yang
mengimplementasikan JpcapHandler.
Jika processPacket() yang dipanggil, maka Jpcap akan menangkap paket hingga timeout
yang tercantum pada openDevice terlampaui atau jumlah paket maksimum telah tercapai. Sedang loopPacket() akan menangkap paket hingga jumlah paket maksimum tercapai atau menangkap terus jika tidak ada batas maksimum. Cara memanggilnya seperti berikut ini :
jpcap.loopPacket(-1, new JpcapTip());
Menyaring data
Seringkali seseorang hanya tertarik pada data tertentu saja. Misalnya, orang ingin melakukna sniffing hanya pada port 23 (telnet) karena ingin mencari password. Atau mungkin orang ingin membajak sebuah file yang sedang dikirimkan melalui port 21 (FTP). Atau bahkan mungkin hanya lalulintas DNS (port 53 UDP) yang diinginkan. Apapun yang terjadi, sangat jarang orang melakukan sniffing semua data di semua lalulintas jaringan. Untuk hal ini, jika kita menggunakan pcap, pcap_compile() dan pcap_setfilter() dapat digunakan.
Processnya sangat mudah. Setelah memanggil pcap_open_live() dan mempunyai sesi sniffing
yang sudah bekerja, sebuah filter dapat diaplikasikan. Namun sebelum diaplikasikan, filter ini harus di kompliasi terlebih dulu. Untuk mengkompilasi, program pcap_compile() harus dipanggil. Prototipenya didefinisikan sebagai berikut :
int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str,
int optimize, bpf_u_int32 netmask)
Argumen pertama adalah sesi handle (pcap_t *handle pada contoh sebelumnya). Argumen berikutnya adalah referensi ke sebuah tempat untuk menyimpan filter yang sudah dikompilasi. Setelah itu adalah ekpresi itu sendiri dalam format string. Selanjutnya adalah integer yang menentukan apakah ekspresi harus
di”optimalkan” atau tidak (0 berarti false, 1
berarti true). Terakhir, adalah menentukan net mask dari jaringan yang akan difilter. Fungsi ini mengembalikan -1 kalau gagal; dan
sembarang nilai lainnya kalau berhasil. Setelah ekspresi ini dikompilasi, saatnya untuk mengaplikasikannya. Kita dapat menggunakan pcap_setfilter(). Prototipe dari pcap_setfilter adalah sebagai berikut :
int pcap_setfilter(pcap_t *p, struct bpf_program *fp)
Argumen pertama adalah session handler, kedua adalah referensi ke ekspresi yang sudah dikompilasi.
Apabila kita menggunakan Jpcap, penyaringan dapat dilakukan dengan menggunakan setFilter. Protipe dari setFilter adalah sebagai berikut :
public void
setFilter(java.lang.String filterExpression, boolean optimize)
Argumen pertama, filterExpression, adalah ekspresi penyaringan (filter expression).
Misalnya, ekspresi “host techno” akan
menyaring hanya paket yang dikirim atau diterima pada host bernama techno. Argumen kedua, optimize, menentukan apakah kode bpf yang dihasilkan akan dioptimalkan oleh libpcap secara internal atau tidak. Anda harus membuat, mengkompilasi dan mengaktivasi sebuah filter dari sebuah expresi penyaringan (filter expression). Berikut adalah contoh sebuah program sniffer sederhana menggunakan Jpcap :
import jpcap.JpcapHandler; import jpcap.Jpcap; import jpcap.Packet;
public class JpcapTip implements JpcapHandler {
Membuat Program Pemantau Jaringan (Sniffer)
Jpcap jpcap =
Jpcap.openDevice(deviceName, 1028, false, 1);
jpcap.loopPacket(-1, new JpcapTip());
} }
Untuk menjalankan program diatas, kita harus yakin bahwa virtual machine dapat menemukan library asli (native library) Jpcap. Di Windows, jika jpcap.dll ada di direktori lib, perintah di Java akan tampak seperti berikut ini :
java -Djava.library.path=lib -cp lib\jpcap.jar;. JpcapTip
Sekarang saatnya bagi anda untuk membuah program sniffer.
Kesimpulan
Untuk membuat program sniffer, kita membutuhkan Jpcap atau pcap. Selain itu kita juga membutuhkan library WinPcap (pada lingkungan Windows) atau libpcap (pada lingkungan Unix). Supaya dapt menerima paket yang tidak ditujukan ke kita, kita adapt melakukannya dengan mengeset network adapter ke mode promiscuous. Pada mode ini, kita akan menerima paket apapun. Keuntungan dari mode promiscuous ini adalah mode ini menyediakan banyak paket untuk di sniff. Tapi ada tiga kekurangan dari mode ini. Pertama,
sniffing dengan mode promiscuous dapat dideteksi. Sebuah komputer (host) dapat mengetes untuk menentukan apakah host lain sedang melakukan promiscuous sniffing. Kedua, promiscuous sniffing hanya bekerja pada lingkungan non-switch seperti hub. Ini dikarenakan hub menggunakan teknik
broadcasting untuk mengirimkan paket ke semua host yang berhubungan dengannya. Ketiga, pada jaringan dengan lalulintas yang padat, host tersebut akan membutuhkan banyak
system resource.
Referensi
Carsten, Tim. 2006. Programming with pcap.
Error! Bookmark not defined.. Akses terakhir, 17 January 2006.
Nagareshwar. 2006. WinSniff, Packet Capturing Application for Windows.
"http://www.codeproject.com/internet/Win Sniff.asp". Akses terakhir 17 January 2006.
TechRepublic. 2006. How Jpcap Works.