Issue‎ > ‎Issue 19‎ > ‎

009.txt

                                                  ______          _     _____ 
                                       ___   __ _(_)  __|___   __| |___|____ |
                                      / _ \ / _` | |\ \ / _ \ / _` |__ \ |_  |
                                      \__  | | | | |_\ \ (_) | | | |__) |__| |
                                      |___/|_| |_|_|____\___/|_| |_|___/_____|

                    
                                              [ echo|zine, volume 6 issue 19 ]            
                                 
 			   	    	         Scapy: obrak-abrik paket data
 					            Brought To You By : y3dips
				           email: y3dips/et/echo/dot/or/dot/id 
                     	             URL: http://y3dips/dot/echo/dot/or/dot/id
               
=======	Pendahuluan ---|

Scapy adalah suatu program yang dibuat menggunakan bahasa pemrograman python
dan sangat "powerfull" dalam berinteraksi untuk memanipulasi paket di jaringan.
Scapy mampu "membangun" dan memecah paket-paket dari berbagai jenis protokol
yang ada, men-transimi-kannya, menangkapnya, menerima permintaan dan
menjawabnya, dan banyak lagi. Scapy dapat digunakan untuk menangani berbagai
kegiatan yang berhubungan dengan jaringan, seperti kegiatan "scanning",
"tracerouting", "attack" atau "network discovery". Scapy bahkan dapat
mengajarkan kita semua proses-proses dari suatu protokol.

Scapy diciptakan oleh Philippe Biondi dan versi terakhirnya dapat di unduh di
http://hg.secdev.org/scapy/raw-file/tip/scapy.py

=======	Persiapan ---|

Baiklah, bagi yang telah mengunduh programnya dapat langsung menjalankannya
dengan terlebih dahulu menginstall python serta berbagai library dan aplikasi
lain (tcpdump, gnuplot, pyx, crypt, graphviz, imagemagick, visual) yang 
dibutuhkannya telah terinstall di komputer anda.

|---------------------------
| devil scapy # ./scapy.py  
| Welcome to Scapy (1.2.0.2)
| >>> 
|--------------------------

Atau untuk para pengguna gentoo dapat dengan melakukan installasi via
"port emerge"

|-------------------------
| devil ~ # emerge --search scapy 
| Searching...   
| [ Results for search key : scapy ]
| [ Applications found : 1 ]
| 
|  *  net-analyzer/scapy
|  Latest version available: 1.1.1-r1
|  Latest version installed: [ Not Installed ]
|  Size of files: 143 kB
|  Homepage:      http://www.secdev.org/projects/scapy/
|  Description:   A Python interactive packet manipulation program for mastering the network
|  License:       GPL-2
|--------------------------

kemudian dapat menginstallnya dengan melakukan "emerge scapy", dan untuk
menjalankannya cukup mengetikkan scapy dimanapun

|---------------------------
| devil ~ # scapy
| Welcome to Scapy (v1.1.1 / f88d99910220)
| >>> 
|--------------------------

=======	Lingkungan ---|

Hal pertama yang dapat kita lakukan adalah dengan mempelajari penggunaan scapy
tersebut baik dari berbagai dokumentasi di internet atau secara manual dengan
membaca help() yang ada.

Salah satu perintah/fungsi yang terpenting dari menggunakan scapy adalah ls(),
ls() akan menampilkan informasi protokol yang didukung oleh scapy.

|-------------------------
| >>> ls()
| ARP        : ARP
| ASN1_Packet : None
| BOOTP      : BOOTP
| CookedLinux : cooked linux
| DHCP       : DHCP options
| DNS        : DNS
| DNSQR      : DNS Question Record
| DNSRR      : DNS Resource Record
| Dot11      : 802.11
| Dot11ATIM  : 802.11 ATIM
| ............
|-------------------------

bahkan dengan menggunakan perintah ls(object) kita akan mendapatkan informasi
detil dari tiap protokol yang didukung oleh scapy.

|---------------------------
| >>> ls(ARP) 
| hwtype     : XShortField          = (1)
| ptype      : XShortEnumField      = (2048)
| hwlen      : ByteField            = (6)
| plen       : ByteField            = (4)
| op         : ShortEnumField       = (1)
| hwsrc      : ARPSourceMACField    = (None)
| psrc       : SourceIPField        = (None)
| hwdst      : MACField             = ('00:00:00:00:00:00')
| pdst       : IPField              = ('0.0.0.0')
|---------------------------

Sedangkan untuk melakukan list semua perintah/fungsi yang terdapat di Scapy
dapat menggunakan lsc()

|---------------------------
| lsc()
| >>> lsc()
| sr               : Send and receive packets at layer 3
| sr1              : Send packets at layer 3 and return only the first answer
| srp              : Send and receive packets at layer 2
| srp1             : Send and receive packets at layer 2 and return only the first answer
| srloop           : Send a packet at layer 3 in loop and print the answer each time
| srploop          : Send a packet at layer 2 in loop and print the answer each time
| sniff            : Sniff packets
| p0f              : Passive OS fingerprinting: which OS emitted this TCP SYN ?
| arpcachepoison   : Poison target's cache with (your MAC,victim's IP) couple
| send             : Send packets at layer 3
| sendp            : Send packets at layer 2
| traceroute       : Instant TCP traceroute
| arping           : Send ARP who-has requests to determine which hosts are up
| ls               : List  available layers, or infos on a given layer
| lsc              : List user commands
| queso            : Queso OS fingerprinting
| nmap_fp          : nmap fingerprinting
| report_ports     : portscan a target and output a LaTeX table
| dyndns_add       : Send a DNS add message to a nameserver for "name" to have a new "rdata"
| dyndns_del       : Send a DNS delete message to a nameserver for "name" 
| is_promisc       : Try to guess if target is in Promisc mode. The target is provided by its ip.
| promiscping      : Send ARP who-has requests to determine which hosts are in promiscuous mode
|-------------------------------

Untuk melihat detil tiap perintah/fungsi tersebut pun cukup mudah, dengan
mempergunakan lsv() juga

|-------------------------------
| >>> lsc(sr)
| Send and receive packets at layer 3
| nofilter: put 1 to avoid use of bpf filters
| retry:    if positive, how many times to resend unanswered packets
|           if negative, how many times to retry when no more packets are
|  	  answered
| timeout:  how much time to wait after the last packet has been sent
| verbose:  set verbosity level
| multi:    whether to accept multiple answers for the same stimulus
| filter:   provide a BPF filter
| iface:    listen answers only on the given interface
|
| >>> lsc(ls)
| List  available layers, or infos on a given layer
|-------------------------------


=======	Ujicoba ---|

Baiklah, mudah-mudahan setelah mengenal beberapa hal tentang scapy, maka
sekarang kita akan mencoba menggunakan scapy untuk menggantikan berbagai
peralatan "hacking" dan jaringan yang sering kita gunakan.

--------	Mengganti perintah/program Ping --- |

Sekarang kita akan mencoba menggantikan perintah/program Ping yang biasanya kita
lakukan menggunakan scapy, untuk itu kita akan memanfaatkan protokol ICMP()
dan IP() yang digunakan oleh program Ping

|---------------------------------
| >>> ls(ICMP)
| type       : ByteEnumField        = (8)
| code       : ByteField            = (0)
| chksum     : XShortField          = (None)
| id         : XShortField          = (0)
| seq        : XShortField          = (0)
| >>> ls(IP)
| version    : BitField             = (4)
| ihl        : BitField             = (None)
| tos        : XByteField           = (0)
| len        : ShortField           = (None)
| id         : ShortField           = (1)
| flags      : FlagsField           = (0)
| frag       : BitField             = (0)
| ttl        : ByteField            = (64)
| proto      : ByteEnumField        = (0)
| chksum     : XShortField          = (None)
| src        : Emph                 = (None)
| dst        : Emph                 = ('127.0.0.1')
| options    : IPoptionsField       = ('')
|--------------------------------

Setelah mengetahui detil mengenai tiap-tiap bagian dari protokol tersebut, maka
saatnya kita akan mencoba menggantikan perintah Ping tersebut menggunakan
Scapy.

|-------------------------
| devil scapy # ./scapy.py 
| Welcome to Scapy (1.2.0.2)
| >>> ip=IP()
| >>> icmp=ICMP()
| >>> ip.dst="192.168.1.133"
| >>> sr1(ip/icmp)
| Begin emission:
| .Finished to send 1 packets.
| *
| Received 2 packets, got 1 answers, remaining 0 packets
| <IP  version=4L ihl=5L tos=0x0 len=28 id=34 flags= frag=0L ttl=64 proto=icmp
| chksum=0xf684 src=192.168.1.133 dst=192.168.1.101 options='' |<ICMP
| type=echo-reply code=0 chksum=0xffff id=0x0 seq=0x0 |<Padding
| load='\xac\x9e\xc0\xa8\x01e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
| >>>
| >>> 
|-----------------------

Untuk memastikannya, kita dapat menjalankan tcpdump

|------------------------
| devil ~ # tcpdump -vv 'icmp[icmptype] = icmp-echo' 
| tcpdump: WARNING: eth0: no IPv4 address assigned
| tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
| 22:04:33.716319 IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto ICMP
| (1), length 28) 192.168.1.101 > 192.168.1.133: ICMP echo request, id 0, seq 0,
| length 8
|-----------------------

Dan jika anda tidak percaya bahwa kegiatan yang dilakukan adalah sama dengan
melakukan 1 kali ping, maka silahkan anda bandingkan hasilnya dengan hasil
program Ping,

|-------------------------
| devil ~ # ping 192.168.1.133
| PING 192.168.1.133 (192.168.1.133) 56(84) bytes of data.
| 64 bytes from 192.168.1.133: icmp_seq=1 ttl=64 time=2.30 ms
|
| devil ~ # tcpdump -vv 'icmp[icmptype] = icmp-echo' 
| tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
| 22:07:06.571457 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP
| (1), length 84) 192.168.1.101 > 192.168.1.133: ICMP echo request, id 9804, seq
| 1, length 64
|-------------------------

semuanya adalah sama, kecuali berapa settingan ICMP() yang kita biarkan default
sehingga berbeda, apakah mungkin kita bisa mengelabui p0f ? (dengan memainkan
settingan sequence, id, dsb)

Atau bisa saja dengan 1 baris perintah untuk menggantikan program Ping.

|-------------------------
| >>> sr1(IP(dst="192.168.1.133")/ICMP())
| Begin emission:
| .Finished to send 1 packets.
| *
| Received 2 packets, got 1 answers, remaining 0 packets
| <IP  version=4L ihl=5L tos=0x0 len=28 id=82 flags= frag=0L ttl=64 proto=icmp
| chksum=0xf654 src=192.168.1.133 dst=192.168.1.101 options='' |<ICMP
| type=echo-reply code=0 chksum=0xffff id=0x0 seq=0x0 |<Padding
| load='\xac\x9e\xc0\xa8\x01e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
| >>>
|------------------------

ya..ya..ya, cuma bermain dengan "style" :)

Sekarang, sebagai pelengkap kita bisa melihat detil variabel yang terlibat
dengan semua yang kita lakukan sebelumnya

|----------------------
| >>> ls(ip)
| version    : BitField             = 4               (4)
| ihl        : BitField             = None            (None)
| tos        : XByteField           = 0               (0)
| len        : ShortField           = None            (None)
| id         : ShortField           = 1               (1)
| flags      : FlagsField           = 0               (0)
| frag       : BitField             = 0               (0)
| ttl        : ByteField            = 64              (64)
| proto      : ByteEnumField        = 0               (0)
| chksum     : XShortField          = None            (None)
| src        : Emph                 = '192.168.1.101' (None)
| dst        : Emph                 = '192.168.1.133' ('127.0.0.1')
| options    : IPoptionsField       = ''              ('')
| >>> ls(icmp)
| type       : ByteEnumField        = 8               (8)
| code       : ByteField            = 0               (0)
| chksum     : XShortField          = None            (None)
| id         : XShortField          = 0               (0)
| seq        : XShortField          = 0               (0)
| >>> 
|-----------------------

Yupe, sekarang mudah-mudahan semua makin jelas.

=======	Menulis kode ---|

Ya, kita sekarang akan menulis kode yang tadi kita ketikkan kedalam sebuah
program berbasiskan python dan menggunakan scapy sebagai module dari program
kita.

----- scping.py -----------------------
#!/usr/bin/env python

import sys
from scapy import *

if len(sys.argv) != 2:
   print "Usage: ./scping.py <target>"
      sys.exit(1)

      target=sys.argv[1]
      p=IP(dst=target)/ICMP()
sr1(p)
----- scping.py ----------------------

Mari kita ujicobakan

|---------------------
| devil scapy # ./scping.py    
| Usage: ./scping.py <target>
| devil scapy # ./scping.py 192.168.1.133 
| Begin emission:
| .Finished to send 1 packets.
| *
| Received 2 packets, got 1 answers, remaining 0 packets
| devil scapy # ./scping.py 192.168.1.135 <--- gagal
| WARNING: Mac address to reach 192.168.1.135 not found
|----------------------

Karena kita belum mendefinisikan berbagai jenis error dan kondisi lainnya, maka
wajar jika hal ini terjadi, silahkan anda berkreasi dengan program buatan anda
:)

Silahkan anda bermain main dengan protokol lainnya TCP(), UDP(), atau DNS() :P

=======	Real life Exploit ---|

Tau tentang celah DNS baru-baru ini yang sangat menghebohkan dunia
per-internet-an?

Tebak saja, versi scapy-nya pun telah dirilis [3]

=======	Penutup ---|

Selain berbagai kelebihannya, scapy juga diakui memiliki beberapa kelemahan,
kemampuannya baru di klaim 85% bisa menyamai NMAP, selain itu juga scappy
relatif lebih lambat dalam bererapa hal, tetapi tidak untuk belajar, terutama
belajar membuat exsploit. Python memberikan kemudahan dalam membuat program,
dan  Scapy melengkapinya :), tulisan inipun sengaja hanya untuk memperkenalkan 
teman-teman semua kepada scapy, dengan harapan dapat bermain lebih kreatif
lagi dengan Scapy.

Semoga, petunjuk yang sedikit dari saya yang hanya memiliki sedikit ilmu ini
dapat bermanfaat, amin. *_^

=======	Referensi ---|

[1] Scapy help 
[2] https://www.secdev.org/projects/scapy/
[3] http://www.milw0rm.com/exploits/6123

=======	Shout ---|

[1] Ana, Keep Faith on us :)
[2] k-159, the_day, az001, lirva32, the_hydra, negative, and all echo|staff
[3] Indonesian security community (underground/upperground/clown)


                     *- $e19dot009dottxt - echo|zine - issue#19 - 080808 -*
Comments