Packet Engineering with ScaPy
Table of Content
- Introduction
- Packet Building Examples
- Sending Packets
- Exercise 1. Sending UDP Datagram in ScaPy
- Remark: Getting Help from ScaPy
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.
- Can you construct a UDP datagram carrying a short message and send it to an end point on another host?
- Can you use ScaPy to receive (or sniff) the datagram?
- 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)