GNU/Linux >> Belajar Linux >  >> Linux

Cara Melakukan Packet Sniffing Menggunakan Libpcap dengan Kode Contoh C

Alat jaringan seperti wireshark, tcpdump, dll, cukup populer untuk mengendus paket. Artikel ini memberikan ikhtisar dasar pustaka libpcap yang menjadi dasar packet sniffing untuk banyak alat pemantauan jaringan termasuk wireshark, tcpdump, snort, dll.

Apa itu Packet Sniffing dan Bagaimana Cara Kerjanya?

Packet sniffing adalah teknik di mana data jaringan ke dan dari komputer Anda dapat dipantau dengan mudah. Data perjalanan di jaringan dalam bentuk paket dan alat packet sniffing dapat dengan mudah menangkap paket-paket ini. Sebagian besar packet sniffer digunakan oleh administrator jaringan dan pengembang yang bekerja pada alat jaringan. Namun, keseluruhan paket sniffer berguna untuk men-debug masalah terkait jaringan dan dapat digunakan oleh siapa saja yang memiliki hak istimewa yang diperlukan.

Sniffer paket bekerja dengan mengendus pada perangkat antarmuka seperti eth0 dll. Daftar antarmuka dapat diperoleh dengan perintah ifconfig. Setelah antarmuka dipilih, mungkin ada beberapa opsi yang dapat digunakan untuk menyaring paket berdasarkan protokol, port sumber, port tujuan, dll. Memilih opsi filter tidak diperlukan. Kemudian pengambilan paket dimulai.

Untuk memahami penangkap paket dan filter tampilan, lihat tutorial kami tentang wireshark. Untuk alat baris perintah, lihat tcpdump, yang juga melakukan packet sniffing tetapi menghasilkan output pada baris perintah.

Perpustakaan libpcap

Libpcap adalah pustaka dasar yang digunakan untuk mengendus paket oleh banyak alat pemantauan jaringan populer. Untuk memahami penggunaan library ini, diperlukan pemahaman dasar tentang bahasa pemrograman C.

Inilah cara kerja libpcap :

  • Pilih perangkat antarmuka jaringan yang akan digunakan untuk mengendus paket. Misalnya 'eth0' , 'wlan0'  dll di Linux.
  • Setelah perangkat dipilih, inisialisasi pustaka pcap dengan perangkat ini.
  • Selanjutnya, kita dapat menerapkan opsi filter untuk kasus seperti jika kita hanya ingin mengendus paket TCP/IP atau jika kita ingin menentukan paket sniff hanya dari sumber atau port tujuan tertentu dll. Filter ini dikompilasi dan kemudian diterapkan menggunakan satu set fungsi perpustakaan libpcap.
  • Selanjutnya pcap library masuk ke loop capture paket di mana ia menangkap jumlah paket yang diatur oleh program.
  • Setelah sebuah paket ditangkap, fungsi panggilan balik dipanggil di mana seluruh paket tersedia untuk mencetak detailnya atau menggunakannya dengan cara lain

Empat langkah yang disebutkan di atas adalah langkah dasar untuk memulai pengambilan paket melalui libpcap.

Contoh

Kode di bawah ini menggunakan fungsi libpcap untuk mencapai penangkapan paket dasar. Setelah menangkap paket, di dalam fungsi panggilan balik, panjang setiap paket dicetak di stdout.

#include <pcap.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/if_ether.h>
#include <netinet/tcp.h>
#include <netinet/ip.h>
#include <string.h>

void callback(u_char *useless,const struct pcap_pkthdr* pkthdr,const u_char*
        packet)
{
  static int count = 1;

  printf("\nPacket number [%d], length of this packet is: %d\n", count++, pkthdr->len);
}

int main(int argc,char **argv)
{
    char *dev;
    char errbuf[PCAP_ERRBUF_SIZE];
    pcap_t* descr;
    struct bpf_program fp;        /* to hold compiled program */
    bpf_u_int32 pMask;            /* subnet mask */
    bpf_u_int32 pNet;             /* ip address*/
    pcap_if_t *alldevs, *d;
    char dev_buff[64] = {0};
    int i =0;

    // Check if sufficient arguments were supplied
    if(argc != 3)
    {
        printf("\nUsage: %s [protocol][number-of-packets]\n",argv[0]);
        return 0;
    }

    // Prepare a list of all the devices
    if (pcap_findalldevs(&alldevs, errbuf) == -1)
    {
        fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
        exit(1);
    }

    // Print the list to user
    // so that a choice can be
    // made
    printf("\nHere is a list of available devices on your system:\n\n");
    for(d=alldevs; d; d=d->next)
    {
        printf("%d. %s", ++i, d->name);
        if (d->description)
            printf(" (%s)\n", d->description);
        else
            printf(" (Sorry, No description available for this device)\n");
    }

    // Ask user to provide the interface name
    printf("\nEnter the interface name on which you want to run the packet sniffer : ");
    fgets(dev_buff, sizeof(dev_buff)-1, stdin);

    // Clear off the trailing newline that
    // fgets sets
    dev_buff[strlen(dev_buff)-1] = '';

    // Check if something was provided
    // by user
    if(strlen(dev_buff))
    {
        dev = dev_buff;
        printf("\n ---You opted for device [%s] to capture [%d] packets---\n\n Starting capture...",dev, (atoi)(argv[2]));
    }     

    // If something was not provided
    // return error.
    if(dev == NULL)
    {
        printf("\n[%s]\n", errbuf);
        return -1;
    }

    // fetch the network address and network mask
    pcap_lookupnet(dev, &pNet, &pMask, errbuf);

    // Now, open device for sniffing
    descr = pcap_open_live(dev, BUFSIZ, 0,-1, errbuf);
    if(descr == NULL)
    {
        printf("pcap_open_live() failed due to [%s]\n", errbuf);
        return -1;
    }

    // Compile the filter expression
    if(pcap_compile(descr, &fp, argv[1], 0, pNet) == -1)
    {
        printf("\npcap_compile() failed\n");
        return -1;
    }

    // Set the filter compiled above
    if(pcap_setfilter(descr, &fp) == -1)
    {
        printf("\npcap_setfilter() failed\n");
        exit(1);
    }

    // For every packet received, call the callback function
    // For now, maximum limit on number of packets is specified
    // by user.
    pcap_loop(descr,atoi(argv[2]), callback, NULL);

    printf("\nDone with packet sniffing!\n");
    return 0;
}

Pada kode di atas :

  • Fungsi pcap_findalldevs() digunakan untuk mengambil daftar semua perangkat antarmuka yang tersedia. Daftar ini dapat ditampilkan kepada pengguna sehingga antarmuka yang dimaksud dapat dipilih untuk mengendus paket. Harap dicatat bahwa ini ada fungsi pcap_lookupdev() yang juga mengembalikan perangkat antarmuka tetapi masalah dengan fungsi ini adalah ia mengembalikan perangkat non loop-back pertama yang tersedia. Jadi jika saya menggunakan koneksi jaringan nirkabel dan perangkat antarmuka untuk koneksi saya adalah 'wlan0' tetapi fungsi pcap_lookupdev() masih akan mengembalikan 'eth0' saat bertemu antarmuka ini terlebih dahulu. Jadi menggunakan pcap_findalldevs() adalah opsi yang lebih baik karena menghasilkan daftar perangkat antarmuka yang dapat dipilih.
  • Daftar yang dikembalikan oleh fungsi pcap_findalldevs() diberikan kepada pengguna dan input pengguna diambil dari stdin.
  • Kemudian fungsi pcap_lookupnet() digunakan untuk mengambil alamat ip dan network mask.
  • Melalui fungsi pcap_open_live(), pustaka pcap diinisialisasi dengan perangkat antarmuka yang dipilih.
  • Melalui fungsi pcap_compile() , kita dapat mengkompilasi filter apapun pada protokol dll yang ditetapkan oleh pengguna.
  • Melalui pcap_setfilter(), filter ini diterapkan.
  • Akhirnya melalui fungsi pcap_loop() perpustakaan memulai pengambilan paket pada perangkat yang dipilih dengan filter yang diterapkan dan dengan setiap paket yang relevan ditangkap, fungsi panggilan balik dipanggil.

Berikut adalah output dari program di atas :

$ sudo ./pcap tcp 10
[sudo] password for himanshu:

Here is a list of available devices on your system:

1. eth0 (Sorry, No description available for this device)
2. wlan0 (Sorry, No description available for this device)
3. usbmon1 (USB bus number 1)
4. usbmon2 (USB bus number 2)
5. usbmon3 (USB bus number 3)
6. usbmon4 (USB bus number 4)
7. usbmon5 (USB bus number 5)
8. usbmon6 (USB bus number 6)
9. usbmon7 (USB bus number 7)
10. any (Pseudo-device that captures on all interfaces)
11. lo (Sorry, No description available for this device)

Enter the interface name on which you want to run the packet sniffer : wlan0

 ---You opted for device [wlan0] to capture [10] packets---

 Starting capture...
Packet number [1], length of this packet is: 496

Packet number [2], length of this packet is: 66

Packet number [3], length of this packet is: 357

Packet number [4], length of this packet is: 66

Packet number [5], length of this packet is: 238

Packet number [6], length of this packet is: 66

Packet number [7], length of this packet is: 403

Packet number [8], length of this packet is: 66

Packet number [9], length of this packet is: 121

Packet number [10], length of this packet is: 66

Done with packet sniffing!

Jika Anda tidak menjalankan program di atas sebagai root, Anda harus menggunakan sudo untuk menjalankan program karena tindakan yang dilakukan oleh pustaka libpcap memerlukan hak pengguna super.


Linux
  1. CentOS / RHEL :Cara memasang sistem file menggunakan UUID

  2. Bagaimana cara mendapatkan jumlah CPU di Linux menggunakan C?

  3. Cara menggunakan memori bersama dengan Linux di C

  1. Bagaimana cara memuat modul kernel Linux dari kode C?

  2. Bagaimana cara mengisi file dengan FF menggunakan dd?

  3. Cara memasang partisi dengan spasi di jalur

  1. Menggunakan Ansible untuk berinteraksi dengan titik akhir web

  2. Cara Instal phpMyAdmin di Linux menggunakan Source Code

  3. Bagaimana cara mengubah file di tempat menggunakan awk? (seperti halnya sed -i)