tcpdump adalah utilitas baris perintah yang dapat Anda gunakan untuk capture dan melakukan inspeksi terhadap lalu lintas jaringan dari dan ke sistem Anda.

tcpdump adalah tools yang paling umum digunakan di antara security pentester atau administrator jaringan baik untuk mengatasi masalah jaringan dan pengujian keamanan.

Terlepas dari namanya, dengan tcpdump, Anda juga dapat menangkap lalu lintas non-TCP seperti UDP, ARP, atau ICMP. Paket yang diambil dapat ditulis ke file atau output standar.

Salah satu fitur paling kuat dari perintah tcpdump adalah kemampuannya untuk menggunakan filter dan hanya meng-capture data yang ingin Anda analisis.

Pada artikel ini, kita akan membahas dasar-dasar cara menggunakan perintah tcpdump di Linux.

Install tcpdump

tcpdump diinstal secara default pada sebagian besar distribusi Linux dan macOS. Untuk memeriksa apakah perintah tcpdump tersedia pada jenis sistem Anda:

tcpdump --version

Outputnya akan terlihat seperti ini:

tcpdump version 4.9.2
libpcap version 1.8.1
OpenSSL 1.1.1b  26 Feb 2019

Jika tcpdump tidak ada di sistem Anda, perintah di atas akan mencetak “tcpdump: command not found“. Anda dapat dengan mudah menginstal tcpdump menggunakan package manager distro Anda.

Instal tcpdump di Ubuntu dan Debian

sudo apt update && sudo apt install tcpdump

Instal tcpdump di CentOS dan Fedora

sudo yum install tcpdump

Instal tcpdump di Arch Linux

sudo pacman -S tcpdump

Cara Capture Packet dengan tcpdump

Sintaks umum untuk perintah tcpdump adalah sebagai berikut:

tcpdump [options] [expression]
  • Perintah options  memungkinkan Anda untuk mengontrol perilaku tcpdump saat mengambil data.
  • filter expression menentukan paket mana yang akan diambil.

Hanya root atau user dengan hak sudo yang dapat menjalankan tcpdump. Jika Anda mencoba menjalankan perintah sebagai user yang tidak memiliki hak akses sudo / sebagai root, Anda akan mendapatkan pesan error : “You don’t have permission to capture on that device“.

Kasus penggunaan yang paling sederhana adalah menjalankan tcpdump tanpa opsi dan filter apa pun:

sudo tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
15:47:24.248737 IP linuxid-host.ssh > desktop-machine.39196: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
15:47:24.248785 IP linuxid-host.ssh > desktop-machine.39196: Flags [P.], seq 108:144, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 36
15:47:24.248828 IP linuxid-host.ssh > desktop-machine.39196: Flags [P.], seq 144:252, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108

... Long output suppressed

23116 packets captured
23300 packets received by filter
184 packets dropped by kernel

tcpdump akan terus menangkap paket dan menulis ke output standar sampai menerima sinyal interupsi. Gunakan kombinasi tombol Ctrl + C untuk mengirim sinyal interupsi dan menghentikan perintah.

Untuk output verbose yang lebih banyak, berikan opsi -v, atau -vv untuk keluaran verbose yang lebih banyak lagi:

sudo tcpdump -vv

Anda dapat menentukan jumlah packet yang akan ditangkap menggunakan opsi -c. Misalnya, untuk menangkap hanya sepuluh paket, maka perintah yang Anda ketikkan:

sudo tcpdump -c 10

Setelah menangkap paket, tcpdump akan berhenti secara otomatis.

Ketika tidak ada interface yang ditentukan, tcpdump menggunakan interface pertama yang ditemukannya dan membuang semua paket melalui interface tersebut.

Gunakan opsi -D untuk mencetak daftar semua interface jaringan yang tersedia yang bisa diambil oleh tcpdump :

sudo tcpdump -D

Untuk setiap interface, perintah akan mencetak nama dari interface, deskripsi singkat, dan indeks terkait (angka):

1.ens3 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]

Output di atas menunjukkan bahwa ens3 adalah interface pertama yang ditemukan oleh tcpdump dan digunakan ketika tidak ada interface yang disediakan untuk perintah. Interface kedua any, adalah perangkat khusus yang memungkinkan Anda untuk menangkap semua interface yang aktif.

Untuk menentukan interface tempat Anda ingin menangkap lalu lintas, aktifkan perintah dengan opsi -i diikuti oleh nama interface atau indeks yang terkait. Misalnya, untuk mengambil semua paket dari semua interface, Maka interface yang Anda pilih untuk menangkap data adalah interface any :

sudo tcpdump -i any

Secara default, tcpdump melakukan reverse DNS resolution pada alamat IP dan nomor port di terjemahkan menjadi hostname. Gunakan opsi -n untuk menonaktifkan fitur translation:

sudo tcpdump -n

Dengan skip DNS lookup, maka tcpdump tidak akan generate data DNS traffic dan membuat output lebih mudah dibaca. Disarankan untuk menggunakan opsi ini setiap kali Anda menjalankan tcpdump.

Alih-alih menampilkan output di layar, Anda dapat mengarahkan ulang ke file menggunakan operator redirection > dan >>:

sudo tcpdump -n -i any > file.out

Anda juga dapat melihat data secara real-time sambil menyimpan ke file menggunakan perintah tee:

sudo tcpdump -n -l | tee file.out

Opsi -l pada perintah di atas memberi tahu tcpdump untuk membuat garis output buffered. Ketika opsi ini tidak digunakan, output tidak akan ditampilkan di layar ketika baris baru dihasilkan.

Memahami Output Perintah tcpdump

tcpdump menampilkan informasi untuk setiap paket yang diambil pada baris baru. Setiap baris menyertakan timestamp dan informasi tentang paket tersebut, tergantung pada protokolnya.

Format umum dari baris protokol TCP adalah sebagai berikut:

[Timestamp] [Protocol] [Src IP].[Src Port] > [Dst IP].[Dst Port]: [Flags], [Seq], [Ack], [Win Size], [Options], [Data Length]

Mari kita telaah bidang demi bidang dan menjelaskan baris berikut:

15:47:24.248737 IP 192.168.1.185.22 > 192.168.1.150.37445: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
  • 15:47:24.248737 – Timestamp dari paket yang diambil adalah dalam waktu lokal dan menggunakan format berikut: jam:menit:detik.frac, di mana frac adalah pecahan dari detik sejak tengah malam.
  • IP – Protokol paket. Dalam hal ini, IP berarti protokol Internet versi 4 (IPv4).
  • 192.168.1.185.22 – Alamat IP dan port sumber (local) yang dipisahkan oleh titik (.).
  • 192.168.1.150.37445 – Alamat IP dan port tujuan yang dipisahkan oleh titik (.).
  • Flags [P.] – bidang Flags TCP. Dalam contoh ini, [P.] berarti packet Push Acknowledgement, yang digunakan untuk mengakui paket sebelumnya dan mengirim data. Nilai Flags lainnya adalah sebagai berikut:
    • [.] – ACK (Acknowledgment)
    • [S] – SYN (Start Connection)
    • [P] – PSH (Push Data)
    • [F] – FIN (Finish Connection)
    • [R] – RST (Reset Connection)
    • [S.] – SYN-ACK (SynAcK Packet)
  • seq 201747193:201747301 – Ini menunjukkan jumlah data yang terkandung dalam paket. Kecuali untuk paket pertama dalam aliran data di mana angka-angka ini mutlak, semua paket selanjutnya digunakan sebagai posisi byte relatif. Dalam contoh ini, jumlahnya adalah 201747193:201747301, artinya paket ini berisi byte 201747193 hingga 201747301 dari aliran data. Gunakan opsi -S untuk mencetak angka urutan absolut.
  • ack 1226568763 – Nomor acknowledgment adalah nomor urut data berikutnya yang diharapkan oleh ujung lain dari koneksi ini.
  • win 402 – Window number adalah jumlah byte yang tersedia di buffer penerima.
  • options [nop,nop,TS val 1051794587 ecr 2679218230] – Opsi TCP. nop, atau “no operation” adalah padding yang digunakan untuk membuat TCP header lebih dari 4 byte. TS val adalah TCP timestamp, dan ecr adalah singkatan untuk echo reply. Kunjungi IANA documentation untuk informasi lebih lanjut tentang opsi TCP.
  • length 108 – Panjang data payload

Filter tcpdump

Ketika tcpdump dijalankan tanpa filter, ia menangkap semua lalu lintas dan menghasilkan sejumlah besar output yang membuatnya sangat sulit untuk menemukan dan menganalisis packet yang diminati.

Filter adalah salah satu fitur paling kuat dari perintah tcpdump. Fungsi filter memungkinkan Anda untuk menangkap hanya paket-paket yang cocok dengan expression yang Anda kehendaki. Misalnya, saat memecahkan masalah yang terkait dengan webserver,  Anda dapat menggunakan filter untuk mendapatkan hanya lalu lintas HTTP.

tcpdump menggunakan sintaksis Berkeley Packet Filter (BPF) untuk memfilter paket yang ditangkap menggunakan berbagai parameter pemesinan seperti protokol, sumber dan tujuan alamat IP dan port, dll.

Di artikel ini, kita akan melihat beberapa filter yang paling umum. Untuk daftar semua filter yang tersedia, periksa halaman manual pcap-filter.

Filter tcpdump berdasar Protokol

Untuk membatasi penangkapan ke protokol tertentu, tentukan protokol sebagai filter. Misalnya, untuk menangkap hanya lalu lintas UDP, maka perintah yang akan Anda gunakan :

sudo tcpdump -n udp

Cara lain untuk mendefinisikan protokol adalah dengan menggunakan kualifikasi proto, diikuti oleh nomor protokol. Perintah berikut akan memfilter nomor protokol 17 dan menghasilkan hasil yang sama seperti yang di atas:

sudo tcpdump -n proto 17

Untuk informasi lebih lanjut tentang angka-angka ini, periksa daftar nomor protokol IP di Wikipedia.

Filter tcpdump berdasar Host

Untuk menangkap hanya paket yang terkait dengan host tertentu, gunakan kualifikasi host:

sudo tcpdump -n host 192.168.1.185

Host dapat berupa alamat IP atau nama.

Anda juga dapat memfilter output ke rentang IP yang diberikan menggunakan kualifikasi net. Misalnya, untuk membuang paket yang terkait dengan 10.10.0.0/16, Maka perintah yang akan Anda gunakan:

sudo tcpdump -n net 10.10

Filter tcpdump berdasar Port

Untuk membatasi penangkapan hanya untuk paket dari atau ke port tertentu, gunakan kualifikasi port. Perintah di bawah ini menangkap paket yang terkait dengan layanan SSH (port 22) dengan menggunakan perintah berikut :

sudo tcpdump -n port 23

Kualifikasi portrange memungkinkan Anda untuk menangkap lalu lintas di berbagai port:

sudo tcpdump -n portrange 110-150

Memfilter berdasarkan Sumber dan Tujuan

Anda juga dapat memfilter paket berdasarkan sumber atau port tujuan atau host menggunakan kualifikasi srcdstsrc dan dst, dan src atau dst

Perintah berikut menangkap paket yang datang dari host dengan IP 192.168.1.185:

sudo tcpdump -n src host 192.168.1.185

Untuk menemukan lalu lintas yang datang dari sumber apa pun ke port 80, Anda dapat menggunakan perintah :

sudo tcpdump -n dst port 80

Filter Kompleks

Filter dapat digabungkan menggunakan operator  and (&&), or (||), dan not (!).

Misalnya, untuk menangkap semua lalu lintas HTTP yang berasal dari alamat IP sumber 192.168.1.185 Anda akan menggunakan perintah ini:

sudo tcpdump -n src 192.168.1.185 and tcp port 80

Anda juga dapat menggunakan tanda kurung untuk mengelompokkan dan membuat filter yang lebih kompleks:

sudo tcpdump -n 'host 192.168.1.185 and (tcp port 80 or tcp port 443)'

Untuk menghindari kesalahan penguraian saat menggunakan karakter khusus, sertakan filter di dalam tanda kutip tunggal (').

Berikut adalah contoh perintah lain untuk menangkap semua lalu lintas kecuali SSH dari alamat IP sumber 192.168.1.185:

sudo tcpdump -n src 192.168.1.185 and not dst port 22

Inspeksi Paket

Secara default tcpdump, hanya menangkap header paket. Namun, kadang-kadang Anda mungkin perlu memeriksa konten paket.

tcpdump memungkinkan Anda untuk mencetak konten paket dalam bentuk ASCII dan HEX.

Opsi -A memberitahu tcpdump untuk mencetak setiap paket dalam ASCII dan -x dalam HEX:

sudo tcpdump -n -A

Untuk menampilkan konten paket di HEX dan ASCII gunakan opsi -X:

sudo tcpdump -n -X

Membaca dan Menulis hasil Capture ke File

Fitur lain yang berguna dari tcpdump adalah menulis paket ke file. Ini berguna ketika Anda menangkap sejumlah besar paket atau ketika Anda ingin mengambil paket untuk analisis nanti.

Untuk mulai menulis ke file, gunakan opsi -w diikuti oleh file capture output:

sudo tcpdump -n -w data.pcap

Perintah di atas akan menyimpan hasil capture ke file bernama data.pcap. Anda dapat memberi nama file seperti yang Anda inginkan, tetapi disarankan untuk menggunakan ekstensi .pcap (packet capture).

Ketika opsi -w digunakan, output tidak ditampilkan di layar. tcpdump menulis paket mentah dan membuat file binary yang tidak dapat dibaca dengan teks editor biasa.

Untuk memeriksa isi file, aktifkan tcpdump dengan opsi -r:

sudo tcpdump -r data.pcap

Jika Anda ingin menjalankan tcpdump di background, tambahkan simbol ampersand (&) di akhir perintah.

File hasil capture juga dapat diperiksa dengan alat penganalisa paket lain seperti Wireshark.

Saat mengambil paket dalam jangka waktu yang lama, Anda dapat mengaktifkan rotasi file. tcpdump memungkinkan Anda membuat file baru atau memutar file dump pada interval waktu tertentu atau ukuran tetap.

Perintah berikut akan membuat hingga sepuluh file 200MB, bernama file.pcap0, file.pcap1, dan sebagainya: sebelum menimpa file yang lebih lama.

sudo tcpdump -n -W 10 -C 200 -w /tmp/file.pcap

Setelah sepuluh file dihasilkan, file yang lebih lama akan ditimpa.

Harap dicatat bahwa Anda harus menjalankan tcpdump hanya selama masalah pemecahan masalah.

Jika Anda ingin memulai tcpdump pada waktu tertentu, Anda dapat menggunakan cronjob. tcpdump tidak memiliki opsi untuk exit setelah waktu tertentu. Anda dapat menggunakan perintah timeout  untuk menghentikan tcpdump setelah beberapa waktu. Misalnya, untuk keluar setelah 5 menit Anda akan menggunakan:

sudo timeout 300 tcpdump -n -w data.pcap

Kesimpulan

tcpdump adalah alat baris perintah untuk menganalisis dan mengatasi masalah terkait jaringan.

Artikel ini memperkenalkan Anda pada dasar-dasar penggunaan dan sintaks tcpdump. Untuk dokumentasi yang lebih mendalam, kunjungi situs web tcpdump.