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.