Skip to content

Introduction to Scapy

untuk membat sebuah network scanner, insyaAllah kita akan menggunakan pustaka jaringan dari python, yaitu scapy. Pustaka tersebut didesain untuk send, sniff, dissect, dan meng-edit network packets. Scapy adalah alat yang sangat powerfull yang dapa memanipulasi packet jaringan.

Understanding how Scapy works

Pada bagian catatan ini, insyaAllah kita akan membuat sebuah request PING sederhata ke sebuah website. Ping request biasanay digunakan untuk menguji apakah device tertentu tersedia atau tidak. Request tersebut menggunakan ICMP application layer protocol. untuk menggunakan package tersebut maka kita harus mengimport dari pustaka scapy seperti snipshet dibawah ini.

Code

import scapy
from scapy.all import * #(1)!
  1. *, disini saya mengimport semua method dari pustaka scapy, namun baiknya hanya mengimport method yang digunakan saja.

reate IP Layer Packet

Untuk mengirim ping request, pertama kitaharus membuat sebuah IP layer packet, yang mana pada layer tersebut kita akan memasang source dan destination IP address. Sebelum itu, kita harus meng-import method IP dari pustaka scapy.

Code

import method IP
from scapy.all import IP

Ingat, IP layer yang kita buat diatas masih berupa layer packet saja, namun belum dikirim. Untuk mengirim dan menerima packet kita harus menggunakan method sr1.

Code

import sr1
from scapy.all import sr1

Selanjutnya, insyaAllah kita akan mendefinisikan IP address tujuan. Kita ingin membuat ping reqeust ke www.vensys.co.id. Kita dapat secara manual menuliskan IP address, namun bisa juga langsung menuliskan Fully qualified domain name (FLQD) karena scapy akan secara otomatis merubahnya ke dalam IP address.

Baik, sekarang kita akan membuat IP layer packet dan menampilkan nya untuk melihat isi dari packet tersebut

Code

create ip layer pakcet, and display the packet
dst_src = {"dst":"www.vensys.co.id", "src":"192.168.1.80"}

ip_layer = IP(**dst_src)

print(ip_layer.show())
Output
Output packet
###[ IP ]### 
version   = 4
ihl       = None
tos       = 0x0
len       = None
id        = 1
flags     = 
frag      = 0
ttl       = 64
proto     = hopopt
chksum    = None
src       = 192.168.1.80
dst       = Net("www.vensys.co.id/32")
\options   \

Kode diatas kita membat sebuah IP layer packet dan menampilkan konten dari paket tersebut.

Note: paket tersebut belum dikirim.

Lihatlah src dan dst. Pada destination (dst) adalah instance dari Net(), yang mana, scapy akan menangain translasi dari FQDN ke IP addressnya. Coba perhatikan hasil ouput IP layer tersebut, maka akan mirip dengan struktur IP layer pada ip header.

Send ICMP (Internet Control Message Protocol) request

Selanjutnya, untuk mengirim ICMP request, kita dapat menggunakan class untuk membuat sebuah instance seperti dibawah ini:

Code

Membuat instance ICMP
icmp_req = ICMP(id=100)

id=100 membantu protocol untuk melacak packets. Untuk melihat field-field yang ada pada request ICMP menggunakan method show().

Code

Melihat field request ICMP
print(icmp_req.show())
Output
field2 request ICMP
icmp_req = ICMP(id=100)
icmp_req.show()
###[ ICMP ]### 
type      = echo-request
code      = 0
chksum    = None
id        = 0x64
seq       = 0x0
unused    = ''

Dari output diatas, kita dapat melihat tipe packet adalah echo-request, yang mana digunakan untuk menguji ketersedian konektivitas.

Combine IP layer and ICMP request

Dari diskusi sebelumnya, kitatelah ketahui, application layer duduk diatas dari IP layer 1, dan alhamdulillah kita telah membuat dua layer. Sekarang kita akan menjadikan dua layer tersebut (IP layer, ICMP request layer) menjadi satu packet yang nantinya akan kita kirim melalui network.

Untuk menggabungkan layer-layer menjadi satu buah packet tunggal gunakan operator slash, / yang diawali dengan layer yang palin bawah terlebih dahulu. IP layer lebih rendah dari pada Application layer (ICMP request)

Code

Combine to layer into one packet
packet = ip_layer / icmp_req
print(packet.show())

Fungsi show() akan menampilkan daftar field dari packet hasil kombinasi IP layer dan ICMP request layer.

Output
Field pada gabungan packet
###[ IP ]### 
version   = 4
ihl       = None
tos       = 0x0
len       = None
id        = 1
flags     = 
frag      = 0
ttl       = 64
proto     = icmp
chksum    = None
src       = 192.168.1.80
dst       = Net("www.google.com/32")
\options   \
###[ ICMP ]### 
    type      = echo-request
    code      = 0
    chksum    = None
    id        = 0x64
    seq       = 0x0
    unused    = ''

Sekarang kita bisa mengirim packet tersebut. Untuk mengirimnya, kita dapat menggunakan method sr1

Code

sent packet
response = sr1(packet, iface = 'eth0')

if response:
    print (response.show())

Respone nya akan seperti dibawah ini;

Output
Respone ICML requst
Begin emission:
Finished sending 1 packets.
.*
Received 2 packets, got 1 answers, remaining 0 packets
###[ IP ]### 
version   = 4
ihl       = 5
tos       = 0x0
len       = 28
id        = 29076
flags     = 
frag      = 0
ttl       = 56
proto     = icmp
chksum    = 0xf24c
src       = 202.52.146.211
dst       = 192.168.1.80
\options   \
###[ ICMP ]### 
    type      = echo-reply
    code      = 0
    chksum    = 0x0
    id        = 0x0
    seq       = 0x0
    unused    = ''

Dapat anda lihat pada sesi ICMP Respone diatas, tipe dari respone tersebut adalah echo-reply dan pada sesi IP field src dan dst adalah kebalikan dari scr dan dst dari request packet yang baru saja kita kirim.

Info

Yang menjadikan Scapy sangat powerill adalah, scapy mampu membuat raw_packets, yang mana artinya kita dapat membuat sebuah packet dengan informasi yang salah dan tidak ada mekaniska pengujian pada protokol yang digunakan. Kita dapat mengganti src dan memasukan packet lain, dan pada kasus tertentuk, komputer tujuan tidak mengetahio komputer mana yang membuat packet ini (idle scan). Karena inilah kita dapat spoof packet.


  1. Lihat pada OSI layer di networking model dan pada bagian data encapsulation