Sniffing Menggunakan Python

Sniffing merupakan proses untuk melakukan monitoring dan meng"capture" semua paket data yang melewati jaringan menggunakan software/aplikasi maupun perangkat keras (hardware). Umumnya sniffing dilakukan oleh seorang network administrator untuk mengamati penggunaan jaringan, namun kenyataannya saat ini begitu banyak aplikasi yang mudah diperoleh, maka banyak juga pengguna yang melakukan iseng terhadap penggunaan jaringan.

Metode dalam melakukan sniffing terdiri dari dua macam, yaitu:

  • Aktif Sniffing

Aktif sniffing merupakan tindakan yang dilakukan pada jaringan berbasis switch. Switch tentunya lebih pintar daripada hub, secara fungsinya. Serangan ini dilakukan dengan cara mengirimkan packet ke komputer target setelah memeriksa table mac address. Teknik aktif sniffing umumnya menggunakan cara ARP Spoofing.

  • Pasif Sniffing

Pasif sniffing merupakan tindakan sniffing yang dilakukan dengan melakukan monitoring paket dari jaringan yang berbasis hub. Dengan menempatkan software packet sniffer pada jaringan menggunakan metode promiscuous, seorang attacker dapat melakukan capture paket data dalam subnet jaringan tersebut.

Implementasi Network Sniffer Menggunakan Python

Pada python, untuk melakukan network sniffing dapat menggunakan modul struct. Beberapa method yang terdapat pada modul struct diantaranya :

  • struct.pack(fmt, v1, v2, ...) : Method ini akan mengembalikan string yang mengandung nilai v1, v2 dan lain-lain, sedangkan paket yang diterima akan mengacu pada format yang diberikan.
  • struct.unpack(fmt, string) : Method ini akan membongkar isi string sesuai dengan format yang diberikan.

Contoh penggunaan kode programnya :

Nama file : struct1.py

import struct

arsip = struct.pack('hhl', 1, 2, 3)
print (arsip)
k = struct.unpack('hhl', arsip)
print k

Output program tersebut :

Gambar 7.1 Contoh Penggunaan Modul Struct

Kode program tersebut menggunakan method pack dan unpack, sehingga kalau diimplementasikan pada konsep pemrograman socket, hasilnya adalah sebagai berikut:

Nama file : structt.py sebagai server

import socket
import struct

host = "0.0.0.0"
port = 12347
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(1)
conn, addr = s.accept()
print "Menerima koneksi dari ip :", addr
arsip = struct.pack('hhl', 1, 2, 3)
conn.send(arsip)
conn.close()

Nama file : unstructt.py sebagai client

import socket
import struct

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "0.0.0.0"
port = 12347
s.connect((host, port))
msg = s.recv(1024)
print msg
print struct.unpack('hhl', msg)
s.close()

Output kode program apabila kedua file tersebut dijalankan:

Gambar 7.2 Implementasi Struct pada method pack dan unpack

Network Sniffer Pada Python

Untuk mengimplementasikan sniffing pada python, pertama-tama masuklah ke mode promiscuous pada interface card yang akan digunakan. Pada contoh kali ini, saya menggunakan sistem operasi kali linux untuk melakukan sniffing menggunakan python.

Untuk melakukan setting interface card agar menjadi mode promiscuous mode adalah sebagai berikut :

Gambar 7.3 Mode Promiscuous Pada Sistem Operasi Kali Linux

Perintahnya adalah :

root@kali:~# ifconfig 
eth0      Link encap:Ethernet  HWaddr 08:00:27:bf:ed:99  
          inet6 addr: fe80::a00:27ff:febf:ed99/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:34 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:6358 (6.2 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:20 errors:0 dropped:0 overruns:0 frame:0
          TX packets:20 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1200 (1.1 KiB)  TX bytes:1200 (1.1 KiB)

root@kali:~# ifconfig eth0 promisc
root@kali:~# ifconfig 
eth0      Link encap:Ethernet  HWaddr 08:00:27:bf:ed:99  
          inet6 addr: fe80::a00:27ff:febf:ed99/64 Scope:Link
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:34 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:6358 (6.2 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:20 errors:0 dropped:0 overruns:0 frame:0
          TX packets:20 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1200 (1.1 KiB)  TX bytes:1200 (1.1 KiB)

root@kali:~#

Setelah muncul tulisan UP BROADCAST RUNNING PROMISC MULTICAST maka eth0 siap digunakan untuk melakukan sniffing terhadap komputer.

Berikut ini terdapat kode program sederhana untuk melakukan sniffing :

Nama File : sniff.py

import socket
import struct
import binascii

#pake socket.PF_PACKET apabila menggunakan linux
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.ntohs(0x0800))

while True:
    pkt = s.recvfrom(2048)
    ethhead = pkt[0][0:14]
    eth = struct.unpack("!6s6s2s", ethhead)

    print "--------Ethernet Frame--------"
    print "desination mac", binascii.hexlify(eth[0])
    print "Source mac", binascii.hexlify(eth[1])

    binascii.hexlify(eth[2])
    ipheader = pkt[0][14:34]
    ip_hdr = struct.unpack("!12s4s4s", ipheader)

    print "-----------IP------------------"
    print "Source IP", socket.inet_ntoa(ip_hdr[1])
    print "Destination IP", socket.inet_ntoa(ip_hdr[2])
    print "---------TCP----------"

    tcpheader = pkt[0][34:54]
    tcp_hdr = struct.unpack("!HH9ss6s", tcpheader)

    print "Source Port ", tcp_hdr[0]
    print "Destination port ", tcp_hdr[1]
    print "Flag ", binascii.hexlify(tcp_hdr[3])

Output program tersebut ketika dijalankan menggunakan kali linux :

Gambar 7.4 Output sniff.py

Pada gambar 4.7, terlihat bahwa percobaan dalam melakukan sniffing masih gagal karena alamat mac address baik sumber dan tujuan belum dapat terbaca menggunakan beberapa modul di python. Ini murni karena programmer belum mahir menguasai konsep networking di python.

Tugas Praktikum

Berdasarkan kode program yang sudah dituliskan, silakan berikan keterangan dan penjelasan, maksud dari kode program tersebut. Berikan tampilan output! Tampilan harus berbeda dengan milik teman-temannya.