Pada artikel pertama Mengenal dpkt (Bagian 1): Membaca Berkas pcap telah dijelaskan bagaimana cara membaca berkas pcap. Artikel kedua kali ini akan menjelaskan bagaimana membuat sebuah berkas pcap. Istilah membuat berkas pcap mungkin kurang pas karena berkas pcap pada dasarnya bukan dibuat tapi merupakan kumpulan paket data yang berhasil ditangkap untuk kemudian menjadi sebuah berkas dengan format tersendiri. Mari disimak bagaimana cara menangkap paket data.
1. Pendahuluan
Untuk menangkap paket data menjadi sebuah berkas pcap kita dapat memanfaatkan aplikasi yang bernama tcpdump. Akan lebih mudah sebenarnya jika kita menggunakan aplikasi ini di sistem operasi yang berbasis UNIX-like seperti GNU/Linux Lubuntu atau FreeBSD. Alternatif lain jika kita tidak menggunakan GNU/Linux Lubuntu atau FreeBSD, kita bisa memanfaatkan Wireshark yang dapat berjalan di sistem operasi Windows. Wireshark juga dapat berjalan di selain Windows. Artikel kedua kali ini saya akan coba membahas dengan yang paling sederhana menggunakan tcpdump. Paket yang berhasil ditangkap kemudian disimpan pada sebuah berkas untuk kemudian kita lanjutkan dengan membacanya dengan pustaka dpkt.
2. Lingkungan Sistem Operasi
Lingkungan sistem operasi yang saya gunakan untuk percobaan adalah FreeBSD 10.2-RELEASE dengan RAM 1GB.
[freebsd@cloudfall ~]$ uname -a
FreeBSD cloudfall 10.2-RELEASE FreeBSD 10.2-RELEASE #0 r286666: Wed Aug 12 15:26:37 UTC 2015 root@releng1.nyi.freebsd.org:/usr/obj/usr/src/sys/GENERIC amd64
Cek terlebih dahulu apakah kita memiliki tcpdump ?.
[freebsd@cloudfall ~]$ which tcpdump
/usr/sbin/tcpdump
Apabila tidak menghasilkan apapun maka kita harus menginstalnya terlebih dahulu. Instalasi bisa dilakukan melalui manajemen paket pkg ataupun menggunakan FreeBSD ports. Jika masih ada yang bingung apa itu ports bisa cek artikel saya di Mengenal Ports Pada FreeBSD. Perbedaan instalasi antara pkg dan ports hanya terletak dalam permasalahan kompilasi atau tidak kompilasi itu secara mudahnya walaupun tidak semata-mata demikian. Ports akan instalasi paket aplikasi dari kode sumber sementara pkg langsung instalasi ke dalam sistem operasi kita atau biasa disebut pre-built binaries. Saya tidak akan membahas instalasinya disini.
Pada dasarnya tcpdump, wireshark atau aplikasi yang berhubungan dengan analisa jaringan lainnya biasanya menggunakan sebuah pustaka yang bernama libpcap (kalau di sistem operasi windows bernama WinPcap). Nah jika kita menginstall aplikasi tcpdump dengan menggunakan aplikasi manajemen program seperti yum untuk yang berbasis Red Hat, apt untuk yang berbasis GNU/Linux Debian, portage untuk yang berbasis GNU/Linux Gentoo, libpcap biasanya otomatis akan ikut terinstal. Lain halnya dengan sistem operasi Windows. Jika kita menginstal Wireshark, pustaka WinPcap tidak otomatis langsung terinstal. WinPcap diinstal secara terpisah.
Berikut adalah berkas Ports yang ada di FreeBSD untuk pustaka libpcap.
[freebsd@cloudfall /usr/ports]$ make search name=”libpcap”
Port: libpcap-1.8.1
Path: /usr/ports/net/libpcap
Info: Ubiquitous network traffic capture library
Maint: garga@FreeBSD.org
B-deps: bison-2.7.1,1 flex-2.6.1 gettext-runtime-0.19.8.1 gmake-4.2.1_1 indexinfo-0.2.6 m4-1.4.17_1,1
R-deps:
WWW:Port: libpcapnav-0.8_1
Path: /usr/ports/net/libpcapnav
Info: libpcap wrapper library
Maint: ports@FreeBSD.org
B-deps:
R-deps:
WWW: http://netdude.sourceforge.net/
3. Menjalankan aplikasi tcpdump
Aplikasi tcpdump harus dijalankan sebagai pengguna dengan kelas root. Kenapa ?. Karena tcpdump memanfaatkan lapisan network interface untuk menangkap paket yang keluar masuk melalui di jaringan. Lapisan ini hanya dapat diakses oleh pengguna dengan kelas root dan bukan pengguna biasa. Untuk mengaktifkan pengguna dengan kelas root bisa memanfaatkan sudo atau langsung sebagai root. Perhatikan contoh berikut.
[freebsd@cloudfall ~]$ sudo tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vtnet0, link-type EN10MB (Ethernet), capture size 65535 bytes
10:50:45.078858 IP 5.144.26.117.broad.nd.fj.dynamic.163data.com.cn.41363 > xxx.xxx.xxx.xxx.http: Flags [.], ack 3058361995, win 521, length 0
10:50:45.078986 IP 5.144.26.117.broad.nd.fj.dynamic.163data.com.cn.41363 > xxx.xxx.xxx.xxx.http: Flags [F.], seq 0, ack 2, win 521, length 0
10:50:45.079029 IP xxx.xxx.xxx.xxx.http > 5.144.26.117.broad.nd.fj.dynamic.163data.com.cn.41363: Flags [.], ack 1, win 1026, length 0
Apa yang diatas adalah potongan hasil dari penangkapan dari tcpdump. Saya akan jelaskan sedikit arti yang muncul dari hasil eksekusi tcpdump.
10:50:45.078858 IP 5.144.26.117.broad.nd.fj.dynamic.163data.com.cn.41363 > xxx.xxx.xxx.xxx.http: Flags [.], ack 3058361995, win 521, length 0
10:50:45.078858 : ini adalah jam dengan format UTC. Ini berarti jam 10, menit 50 dan detik ke 45.078858
xxx.xxx.xxx.xxx : alamat IP yang sengaja saya ganti dengan x. Disini merupakan komunikasi antara alamat IP ‘x’ dengan komputer lain dengan alamat 5.144.26.117.broad.nd.fj.dynamic.163data.com.cn. Dapat dipastikan ini alamat host milik komputer yang berada di Cina. Host ini berkomunikasi dengan alamat IP komputer ‘x’ dengan menggunakan protokol HTTP yang berarti akses web server. Host di Cina dengan port 41363 menghubungi komputer ‘x’. Default port untuk protokol HTTP adalah 80.
> : sesuai dengan simbolnya berarti komunikasi dari host mana ke host mana.
Flags : Saya agak kesulitan mencari padanan kata dalam bahasa Indonesia untuk mewakili flags. Tapi flags ini bisa juga disebut sebagai status koneksi yang terjadi antara satu host dengan host lainnya. Ada enam jenis status dalam TCP flags (URG, ACK, PSH, RST, SYN, FIN). Penjelasan lebih lanjut bisa membaca beberapa literatur lain yang ada di internet.
ack 3058361995 : angka ini adalah nomor sekuensial yang diterima. Angka ini dikirim oleh host asal dan secara sekuensial jika mengirim paket lain akan menambah nilainya menjadi +1.
win 521 : adalah TCP window dari host sumber.
length 0 : panjang paket TCP dalam bytes.
Jika pusing dalam penjelasan ini bisa sambil mencoba langsung menjalankan tcpdump dan membacanya perlahan dan perhatikan dengan seksama hasil yang ditangkap,
Kita akan coba lebih lanjut bagaimana menggunakan tcpdump untuk kemudian disimpan dalam sebuah berkas yang bernama contohpaket.pcap. Nama ekstensi bebas hanya saja untuk memudahkan bahwa ini adalah berkas format pcap maka saya beri nama .pcap.
Ketikkan perintah berikut : sudo tcpdump -i vtnet0 -w contohpaket.pcap host andrey.web.id
[freebsd@cloudfall ~/dataset/cloudia]$ sudo tcpdump -i vtnet0 -w contohpaket.pcap host andrey.web.id
tcpdump: listening on vtnet0, link-type EN10MB (Ethernet), capture size 65535 bytes
^C6 packets captured
46 packets received by filter
0 packets dropped by kernel
Perhatikan setelah kita mengetikkan perintah maka akan muncul pesan
tcpdump: listening on vtnet0, link-type EN10MB (Ethernet), capture size 65535 bytes.
Ini adalah posisi dimana tcpdump sudah mulai aktif. Program tcpdump hanya menangkap paket yang dari dan menuju ke host andrey.web.id. Setelah itu ketikkan Ctrl+c untuk menyelesaikan proses menangkap paket data. Saya jelaskan sedikit maksud perintah yang ada. Parameter -i adalah interface. Pada interface apa program tcpdump ini digunakan untuk menangkap paket data ?. Pada GNU/Linux biasanya interface ini adalah eth0 tapi sekali lagi itu tergantung interface yang akan kita gunakan. Untuk mengetahui ada berapa interface yang kita miliki cukup ketikkan ifconfig. Selanjutnya adalah parameter -w yang memiliki maksud nama berkas yang akan ditulis.
Setelah selesai selanjutnya kita bisa cek hasil penangkapan dengan menggunakan tcpdump.
[freebsd@cloudfall ~/dataset/cloudia]$ tcpdump -r contohpaket.pcap
reading from file contohpaket.pcap, link-type EN10MB (Ethernet)
13:10:57.849074 IP cloudfall > andrey.web.id: ICMP echo request, id 39755, seq 0, length 64
13:10:57.849638 IP andrey.web.id > cloudfall: ICMP echo reply, id 39755, seq 0, length 64
13:10:58.850968 IP cloudfall > andrey.web.id: ICMP echo request, id 39755, seq 1, length 64
13:10:58.855365 IP andrey.web.id > cloudfall: ICMP echo reply, id 39755, seq 1, length 64
13:10:59.874022 IP cloudfall > andrey.web.id: ICMP echo request, id 39755, seq 2, length 64
13:10:59.875353 IP andrey.web.id > cloudfall: ICMP echo reply, id 39755, seq 2, length 64
Selanjutnya bagaimana jika membacanya melalui pustaka dpkt ?. Cara yang sama persis pada artikel pertama di Mengenal dpkt (Bagian 1): Membaca Berkas pcap. Berikut adalah contoh yang bisa dilakukan.
[freebsd@cloudfall ~/dataset/cloudia]$ python
Python 2.7.9 (default, Aug 27 2015, 01:28:02)
[GCC 4.2.1 Compatible FreeBSD Clang 3.4.1 (tags/RELEASE_34/dot1-final 208032)] on freebsd10
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import dpkt
>>> f = open(‘contohpaket.pcap’,’rb’)
>>> pcap = dpkt.pcap.Reader(f)
>>> eth = []
>>> for ts, buf in pcap:
… eth.append(dpkt.ethernet.Ethernet(buf))
…
>>> print eth
Selamat mencoba.