Table of Content

Introduction

We can use ScaPy to build and transmit network packets. To build a network packet, we can ScaPy’s division operator /. ScaPy defines the division operator as the operator to binds packet headers and pay load together with respect to the layered protocol architecture.

Packet Building Examples

To build an IP packet, we do this in ScaPy,

>>> packet=IP()
>>> hexdump(packet)
0000  450000140001000040007CE77F000001 E.......@.|.....
0010  7F000001                         ....
>>>

where we first build a “default” IP packet with no payload.

Since a payload of an IP packet comes an application or an upper layer protocol, we can use the / operator to fill the IP packet with a payload,

>>> packet = packet / 'Hello, World!'
>>> hexdump(packet)
0000  450000210001000040007CDA7F000001 E..!....@.|.....
0010  7F00000148656C6C6F2C20576F726C64 ....Hello, World
0020  21                               !
>>>

where the syntax of expression packet / 'Hello, World!' is that the lower layer on the left and the upper layer is on the right

Perhaps, this convention is more apparent when we build a TCP packet, for instance as follows,

>>> packet = IP()/TCP()/'Hello, World'
>>> hexdump (packet)
0000  450000340001000040067CC17F000001 E..4....@.|.....
0010  7F000001001400500000000000000000 .......P........
0020  500220007144000048656C6C6F2C2057 P. .qD..Hello, W
0030  6F726C64                         orld
>>> packet.pdfdump(layer_shift=1)

What if we wish to build a UDP datagram that we intend to send it to another host via an Ethernet interface,

>>> packet=Ether(dst='FF:FF:FF:FF:FF:FF')/IP(dst='127.0.0.1')/UDP(dport=50001)/Raw(load='Hello, World!')

Sending Packets

Use send function to send a packet

>>> send(packet)

Exercise 1. Sending UDP Datagram in ScaPy

Let’s consider the following task.

  1. Can you construct a UDP datagram carrying a short message and send it to an end point on another host?
  2. Can you use ScaPy to receive (or sniff) the datagram?
  3. Can you write a Socket receiver program to receive the packet on the other host?

Remark: Getting Help from ScaPy

First, start ScaPy, like,

$ sudo scapy3

Try these commands in ScaPy, one at a time. What do you observe? Is it helpful?

ls()
ls(TCP)
ls(UDP)
ls(IP)
ls(IPv6)
ls(ICMP)
ls(Ether)
ls(Dot11)
lsc()
help(send)
help(sendp)