The Very Unofficial Dummies Guide To Scapy

Transcription

The Very Unofficial DummiesGuide To ScapyAuthor: Adam Maxwell (@catalyst256)Find me at http://itgeekchronicles.co.uk

Table of ContentsChapter 1 - Introduction . 1Chapter 2 - Installing Scapy . 2Chapter 3 - Creating a packet . 4Chapter 4 – Sending & Receiving Packets . 6Chapter 5 – Getting more out of your packets . 13Chapter 6 – Reading & Writing Packets to pcap . 20Chapter 7 – Layering Packets . 26Chapter 8 – Even more uses for Scapy . 30Chapter 9 – And now the end is near and so I face the final chapter . 32Appendix A – Common Scapy Commands . 34Appendix B – ICMP Types . 42Appendix C – TCP Header Information . 44Appendix D – DNS Record Types . 45Appendix E – BPF (Berkeley Packet Filter) . 47Disclaimer: This is by no means an expert’s guide to Scapy in fact until recentlyI had never used Scapy before. The aim of this guide is to provide people whohave no experience/knowledge of Scapy with some guidance to creating packetsand giving them the confidence to go further. Some of the details in here mightbe wrong, but I will do my best to ensure that information is correct and whereexamples are provided that they have been tested.Chapter 1 - IntroductionHello and welcome to this very unofficial dummies guide to Scapy, and when I use the term“dummies” I mean no offence, as I am referring more to myself than you (honest). I started gettingmore into InfoSec in January 2012 after spending 15 years working in IT (mostly infrastructure typeroles), as part of my on-going development I started to look into this tool called Scapy.What is Scapy?“Scapy is a powerful interactive packet manipulation program. It is able to forge or decode packets of a widenumber of protocols, send them on the wire, capture them, match requests and replies, and much more. It caneasily handle most classical tasks like scanning, tracerouting, probing, unit tests, attacks or network discovery(it can replace hping, 85% of nmap, arpspoof, arp-sk, arping, tcpdump, tethereal, p0f, etc.). It also performsvery well at a lot of other specific tasks that most other tools can't handle, like sending invalid frames, injectingyour own 802.11 frames, combining techniques (VLAN hopping ARP cache poisoning, VOIP decoding on WEPencrypted channel .), etc.” (Sourced from https://www.secdev.org/projects/Scapy/).Sound interesting? well it did to me but then at the same time it kind of scared me, the information Icould find on the internet was “involved” and I couldn’t find any kind of guides that made it easy fora beginner (like me) to get comfortable using Scapy. So I decided to write one, both as a learningtool for myself but maybe for other people who are interested in learning more about this seriouslycool tool.Now bear in mind this is my first guide so it might be a bit disjointed but it’s a work in progress so itshould get better over time.So I guess you want to know what you might be able to find in this guide? Here is an overview ofsome of the topics we are going to cover through the course of the guide; Installing Scapy (the pre-reqs and any other helpful software)By Adam Maxwell (@catalyst256)1http://itgeekchronicles.co.uk

Creating a packetSend/Receiving packetsBasic Scapy commandsCapturing packets (and reading packet capture files into Scapy)Layering packetsMore ExamplesThroughout this guide I will provide examples (that I’ve tried and tested) as well as output fromWireshark so you can “see” what the packets look like. At the end of the guide I’m going to include asection of appendixes that you might found useful, ranging from DNS record types to Scapycommands.Throughout this guide anything that is in italics is a command to type or run. I’ve also used somefunky icons in order to provide some pleasing visuals. Below is a table showing the icons and theirmeanings.Wonder what this could mean? If you spot this icon it’s a warning, either that I’m not 100%sure what I’m writing about or I’ve encountered an issue with something along the way.Information only people, I’ve used this to denote pieces of information you might finduseful.So you ready to start creating some packets? Let’s get Scapy installed and see what all the fuss isabout.Chapter 2 - Installing ScapyI am only going to cover installing Scapy on Ubuntu (I’ve followed this same process of Ubuntu 10.xthrough to 12.x). If you want to know how to install it on other version of nix or windows you can findthe instructions at ion.htmlIf you experience issues installing Scapy, you can boot a vanilla Backtrack 5 R2 install that comes withScapy 2.0.1 pre-installed.You might also want to install Wireshark on the same machine as Scapy, this will allow you to capturepackets as you create them so you can actually see the results as you go (this guide won’t cover howto use Wireshark).The main prerequisite to run Scapy is Python 2.5, one of the cool things about Scapy is that once youget the hang of creating packets within the application you can then use it in python scripts/codeand have even more fun with it. So this is what you need to get started with Scapy;1.2.3.4.Install Python 2.5 Download and install Scapy(Optional): Install additional software for special features.Run Scapy with root privileges.1. Install Python 2.5 - The official documentation for Scapy states Python 2.5 to run Scapy 2.x, I’mcurrently running Python 2.7 and never had a problem with it. If you are unsure what version ofPython you are using then from a terminal type:max@dumbass: python -VPython 2.7.3If you haven’t got Python 2.5 already installed then from Ubuntu you can simply type:By Adam Maxwell (@catalyst256)2http://itgeekchronicles.co.uk

max@dumbass: sudo apt-get install python2. Download and install Scapy - Once you have python installed you need to get scapy. now thereare a few ways you can do this so I will go through the ones I’ve used:max@dumbass: sudo apt-get install python-scapymax@dumbass: cd /tmp wget scapy.net unzip scapy-latest.zip cd scapy-2.* sudo python setup.py install3. (Optional): Install additional software for special features - Now by this point you shouldhave Scapy installed, you can test this by simply typing this in a terminal:max@dumbass: sudo scapyWARNING: No route found for IPv6 destination :: (no default route?)Welcome to Scapy (2.2.0)To exit out of Scapy, just type:Welcome to Scapy (2.2.0) exit()Version 2.2.0 seems to be latest stable build and for the remainder of this guide that’s the versionwe will use. Now when you just ran Scapy you might have noticed some errors about componentsmissing, Scapy can do a lot of extra things such as providing 3D maps, graphs, charts etc but youneed some extra packages. Here’s the command to get all those extra goodies:max@dumbass: sudo apt-get install tcpdump graphviz imagemagick python-gnuplot pythoncrypto python-pyx (this is all one line)4. Run Scapy with root privileges - Now this is the easy one, and if fact if you’ve already done thisbut nevertheless the command is this:max@dumbass: sudo scapyAnd this time you should hopefully see this:WARNING: No route found for IPv6 destination :: (no default route?)Welcome to Scapy (2.2.0) So that covers the install of Scapy, hopefully it was painless and you are all set to get started, if youhave had some “issues” let me know and I will try and help, or you could use the oracle that isGOOGLE.By Adam Maxwell (@catalyst256)3http://itgeekchronicles.co.uk

Chapter 3 - Creating a packetAppendix A towards the back of the guide will provide a list of “common” Scapy functions andprotocols.The examples throughout this guide should work (and they have been tested) against Scapy version2.x.That’s right it’s time to play. so to start with we are going to jump straight in and write your very firstpacket. Now you might be thinking “Don’t I need to understand more about Scapy?” well maybeyou do but I learn best by doing and this is my guide. For each packet we create I will provide abreakdown of what and why we use the commands listed. Hopefully as we work through the guideyou will slowly build your knowledge and start experimenting yourself (with Scapy that is).So packet number 1 is going to be. a simple (yet useful) ICMP packet. To start with we are goingto create a single ICMP packet with the well-known message “HelloWorld” contained as the payload.The IP addresses used in this guide are only relevant to my home network, you need to change themto the appropriate local addresses you use. Please also make sure you only send packets to devicesyou own or allowed to poke at.Welcome to Scapy (2.2.0) send(IP(dst "10.1.99.2")/ICMP()/"HelloWorld").Sent 1 packets. So let’s break this down shall we;send - this tells Scapy that you want to send a packet (just a single packet)IP - the type of packet you want to create, in this case an IP packet(dst ”10.1.99.2”) - the destination to send the packet to (in this case my router)/ICMP() - you want to create an ICMP packet with the default values provided by Scapy/”HelloWorld”) - the payload to include in the ICMP packet (you don’t have to provide this in orderfor it to work.Now I’ve explained that a bit quick, so let’s put it into some context by seeing what Wireshark saw:No. Time Source Destination Protocol Length Info5 2012-05-16 21:25:34.306827 10.1.99.22 10.1.99.2 ICMP 52 Echo (ping) request id 0x0000, seq 0/0, ttl 64Frame 5: 52 bytes on wire (416 bits), 52 bytes captured (416 bits)Arrival Time: May 16, 2012 21:25:34.306827000 BSTEpoch Time: 1337199934.306827000 seconds[Time delta from previous captured frame: 50.948599000 seconds][Time delta from previous displayed frame: 50.948599000 seconds][Time since reference or first frame: 77.326326000 seconds]Frame Number: 5Frame Length: 52 bytes (416 bits)Capture Length: 52 bytes (416 bits)[Frame is marked: False][Frame is ignored: False][Protocols in frame: eth:ip:icmp:data][Coloring Rule Name: ICMP][Coloring Rule String: icmp icmpv6]Ethernet II, Src: Dell e7:90:ae (00:22:19:e7:90:ae), Dst: Netgear 83:ab:70 (30:46:9a:83:ab:70)Destination: Netgear 83:ab:70 (30:46:9a:83:ab:70)Address: Netgear 83:ab:70 (30:46:9a:83:ab:70). .0 . . . . IG bit: Individual address (unicast). .0. . . . . LG bit: Globally unique address (factory default)Source: Dell e7:90:ae (00:22:19:e7:90:ae)Address: Dell e7:90:ae (00:22:19:e7:90:ae). .0 . . . . IG bit: Individual address (unicast)By Adam Maxwell (@catalyst256)4http://itgeekchronicles.co.uk

. .0. . . . . LG bit: Globally unique address (factory default)Type: IP (0x0800)Internet Protocol Version 4, Src: 10.1.99.22 (10.1.99.22), Dst: 10.1.99.2 (10.1.99.2)Version: 4Header length: 20 bytesDifferentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))0000 00. Differentiated Services Codepoint: Default (0x00). .00 Explicit Congestion Notification: Not-ECT (Not ECN-Capable Transport) (0x00)Total Length: 38Identification: 0x0001 (1)Flags: 0x000. . Reserved bit: Not set.0. . Don't fragment: Not set.0. . More fragments: Not setFragment offset: 0Time to live: 64Protocol: ICMP (1)Header checksum: 0xa0bc [correct][Good: True][Bad: False]Source: 10.1.99.22 (10.1.99.22)Destination: 10.1.99.2 (10.1.99.2)Internet Control Message ProtocolType: 8 (Echo (ping) request)Code: 0Checksum: 0xf7ff [correct]Identifier (BE): 0 (0x0000)Identifier (LE): 0 (0x0000)Sequence number (BE): 0 (0x0000)Sequence number (LE): 0 (0x0000)[Response In: 6]Data (10 bytes)Data: 48656c6c6f576f726c64[Length: 10]0000 30 46 9a 83 ab 70 00 22 19 e7 90 ae 08 00 45 00 0F.p.".E.0010 00 26 00 01 00 00 40 01 a0 bc 0a 01 63 16 0a 01 .&.@.c.0020 63 02 08 00 f7 ff 00 00 00 00 48 65 6c 6c 6f 57 c.HelloW0030 6f 72 6c 64orldFor this first packet I’ve included everything from Wireshark, in future I won’t (the guide would behuge), but what I have done is bold some parts of the Wireshark dump that relate to the packet wejust created.Let’s see the original packet we just wrote again, matched against the bold sections above:send(IP(dst "10.1.99.2")/ICMP()/"HelloWorld")Internet Protocol Version 4, Src: 10.1.99.22 (10.1.99.22), Dst: 10.1.99.2 (10.1.99.2)Protocol: ICMPData: 48656c6c6f576f726c64 or “HelloWorld”Do you notice how the packet we created appears as you would expect with any normal ICMPpacket when using something like Wireshark? Can we take this further? Let’s look at another ICMPpacket but with an extra option:send(IP(src "10.1.99.100", dst "10.1.99.2")/ICMP()/"HelloWorld")Notice the difference? Yes that’s right we “spoofed” the source address, if we look at Wireshark nowwe see this:Internet Protocol Version 4, Src: 10.1.99.100 (10.1.99.100), Dst: 10.1.99.2 (10.1.99.2)Protocol: ICMPHelloWorldWhat you didn’t see (and I didn’t show you) is that in the first packet we got a corresponding PingReply packet for our original Ping Request, in this second example we didn’t (because we spoofedthe IP source address).By Adam Maxwell (@catalyst256)5http://itgeekchronicles.co.uk

Having fun yet?So what else can we add into this simple packet without making it too complicated? How aboutchanging the TTL (Time to Live) for the ICMP packet? In the original Wireshark dump I highlightedTime to live: 64 which is the default TTL, but what if we wanted to change that? Is that possible? Wellwith Scapy yes, yes it is and here how:send(IP(src "10.1.99.100", dst "10.1.99.2", ttl 128)/ICMP()/"HelloWorld")Can this be any easier? and what does that look like to wireshark?Internet Protocol Version 4, Src: 10.1.99.100 (10.1.99.100), Dst: 10.1.99.2 (10.1.99.2)Time to live: 128Anyway back to these ICMP packets, so before we call it quits on these bad boys, let’s just exploreone last option (I promise it will get more exciting soon).OK so what do you think this ICMP packet does?send(IP(src "10.1.99.100", dst "10.1.99.2", ttl 128)/ICMP(type 0)/"HelloWorld")Well if you are thinking that it’s just sent a Ping Reply (ICMP Type 0) to 10.1.99.2 then you arecorrect, here are the Wireshark highlights.Internet Protocol Version 4, Src: 10.1.99.100 (10.1.99.100), Dst: 10.1.99.2 (10.1.99.2)Internet Control Message ProtocolType: 0 (Echo (ping) reply)For reference I've included a list of the other ICMP types in Appendix B (which you can find at theback of the book).Hopefully by now you are realising how powerful Scapy is, the method I’ve shown you here is notthe only way you can create packets, because Scapy is based on Python what you can do with Scapyis only limited by your imagination (and some limitations of the application).In chapter 7 I will provide you with another way to write Scapy packets in a different way but for thetime being we will continue using the same format as we have done with the ICMP packets.SummaryIn this chapter we have looked at creating a simple ICMP packet, then modifying some of the packetheaders. Out of the box Scapy (thanks to the developers) will use default values based on the packettype if you don't supply them thus enabling you to focus on the parts you want to change ratherthan having to include all the options yourself.In the next chapter we will look at Sending & Receiving Scapy packets.Chapter 4 – Sending & Receiving PacketsSo you all set to move onto the next level of Scapy? Well here we go then, in this chapter we aregoing to look at sending and receiving packets via Scapy. The “send”n”receive” functions are theheart of Scapy (after all you won't get far just sending packets), and they work as a “couple” andreturn two lists. The first element is a list of couples (packet sent, answer), and the second elementis the list of unanswered packets. Both of these two elements are lists, but Scapy wraps them up inan object to present them better, and to provide them with some methods that do the mostfrequently needed actions.There are 3 main functions to s&r (sending and receiving) these are:By Adam Maxwell (@catalyst256)6http://itgeekchronicles.co.uk

sr()- The sr() function is for sending packets and receiving answers. The function returnsa couple of packet and answers, and the unanswered packets. sr1() - This function is a variant that only returns one packet that answered the sentpacket (or the packet set) sent.When using sr() or sr1() the packets must be layer 3 packets (IP, ARP, etc.) srp()- The function srp() does the same for layer 2 packets (Ethernet, 802.3, etc).Throughout this chapter we are going to use both the sr() function and the sr1() function and wewill again be using the ICMP packet for the exercises.So this is how you write a simple ICMP packet in Scapy using the sr() function.h sr1(IP(dst "10.1.99.2")/ICMP())So most of this should familiar to you from the previous chapter, let’s look at the differences;h – This is the name of my packet, if you are familiar with Python this is how you declare a name(name )sr1– This is the Scapy function that we discussed at the start of the chapter. h sr1(IP(dst "10.1.99.2")/ICMP())Begin emission:.Finished to send 1 packets.*Received 2 packets, got 1 answers, remaining 0 packetsNow that we have sent a packet (yes, yes I know ICMP isn't very “sexy”), let’s start to look at what thesr1() function allows us to do.To see the “answered” packet (remember the sr functions can show the answered and unansweredpackets, but sr1() is only interested in the first answered packet), simply type: h (remember h is the name we gave our packet)You should see something like this: h IP version 4L ihl 5L tos 0x0 len 28 id 7394 flags frag 0L ttl 64 proto icmp chksum 0x83e2src 10.1.99.2 dst 10.1.99.25 options [] ICMP type echo-reply code 0 chksum 0xffff id 0x0seq 0x0 Padding load x00\x00e@\x07-' Now if you remember back to the previous chapter this is the same information that Wiresharkshowed us, if you want a slightly better formatted version you can type: h.show()This will return you something similar to this: h.show()###[ IP ]###version 4LBy Adam Maxwell (@catalyst256)7http://itgeekchronicles.co.uk

ihl 5Ltos 0x0len 28id 7394flags frag 0Lttl 64proto icmpchksum 0x83e2src 10.1.99.2dst 10.1.99.25\options\###[ ICMP ]###type echo-replycode 0chksum 0xffffid 0x0seq 0x0###[ Padding ]###load x00\x00e@\x07-' If we were to run the same Scapy command again, but this time add our own payload using thiscommand: h sr1(IP(dst "10.1.99.2")/ICMP()/"HelloWorld")We would see this in h.show(): h.show()###[ IP ]###version 4Lihl 5Ltos 0x0len 38id 7395flags frag 0Lttl 64proto icmpchksum 0x83d7src 10.1.99.2dst 10.1.99.25\options\###[ ICMP ]###type echo-replycode 0chksum 0x0id 0x0seq 0x0###[ Raw ]###load 'HelloWorld'###[ Padding ]###load '\x00\x00\x00\x00\xe7\x03N\x99' See isn't this nice and easy, and fun.By Adam Maxwell (@catalyst256)8http://itgeekchronicles.co.uk

Let's move onto another example, this time using the sr() function so that we can see the“unanswered” packets as well.In Scapy type this command; notice that we have moved away from ICMP packets. p sr(IP(dst "10.1.99.2")/TCP(dport 23))Now things are getting more interesting. Let’s break this down again so we can see the changes:p – This time I've called my packet p (no real reason, just fancied a change)sr – We changed to the sr() function so we can see the unanswered packets as well/TCP – Yes that's right we moved onto TCP packets instead of ICMPdport 23 - A TCP packet needs a destination, so you can use dport to specify one and I've chosenport 23 (Telnet) as my example.The commands for showing a packet using sr() are different because we have the opportunity tolook at both the answered and unanswered packets. If you type: pYou will notice that you get a different output. shall we have a look? p sr(IP(dst "10.1.99.2")/TCP(dport 23))Begin emission:.Finished to send 1 packets.*Received 2 packets, got 1 answers, remaining 0 packets p( Results: TCP:1 UDP:0 ICMP:0 Other:0 , Unanswered: TCP:0 UDP:0 ICMP:0 Other:0 ) If you try and use p.show() you now get an error message: p.show()Traceback (most recent call last):File " console ", line 1, in module AttributeError: 'tuple' object has no attribute 'show' Don't worry you haven't broken it, we just need to get at the information in a different way with thesr() function. In order to see the returned packets you need to do this with Scapy: ans,unans In Python (underscore) is the latest result. ans.summary()You get the following back from Scapy: ans.summary()IP / TCP 10.1.99.25:ftp data 10.1.99.2:telnet S IP / TCP 10.1.99.2:telnet 10.1.99.25:ftp dataRA / PaddingBy Adam Maxwell (@catalyst256)9http://itgeekchronicles.co.uk

One thing to note and this only applies to when you starting using packets other than ICMP is thatthe default source port for Scapy is port 22 (or ftp data) as shown above. You can of course changethis and we cover that a bit later.You can also specify ranges of destination ports in your packet creation (I know starting to sound abit like a port scanner.) again this is easy to do, and if you look at this example you can see what Imean. p sr(IP(dst "10.1.99.2")/TCP(dport [23,80,53]))Begin emission:.**Finished to send 3 packets.*Received 4 packets, got 3 answers, remaining 0 packets The ports are encased around [ ] and separated by commas. If you then type p again, you will see aslightly different output based on the number of packets (1 packet per port). p( Results: TCP:3 UDP:0 ICMP:0 Other:0 , Unanswered: TCP:0 UDP:0 ICMP:0 Other:0 ) ans,unans ans.summary()IP / TCP 10.1.99.25:ftp data 10.1.99.2:telnet S IP / TCP 10.1.99.2:telnet 10.1.99.25:ftp dataRA / PaddingIP / TCP 10.1.99.25:ftp data 10.1.99.2:http S IP / TCP 10.1.99.2:http 10.1.99.25:ftp data SA /PaddingIP / TCP 10.1.99.25:ftp data 10.1.99.2:domain S IP / TCP 10.1.99.2:domain 10.1.99.25:ftp data SA / Padding Each sent packet has the corresponding received packet listed, it's not as much detail as using sr1()shows but from the output above, you can actually tell which ports on my router are “open”. What'sthat you say, did we just perform a port scan with Scapy, yes yes we did. (cool or what).Before we go into a bit more detail on that, let me just recap (and sorry if you already know this)about the TCP 3 way handshake or the TCP Handshake as it's sometimes called. TCP is a connectionbased protocol (as opposed to UDP which is connectionless), this allows for error checking andretransmissions of TCP packets.In order for this to happen the TCP handshake needs to occur. The process for the handshake isquite simple and goes something like this:Now how does this relate to the 3 packets we sent? Let’s look at the port 80 (http) packet first:By Adam Maxwell (@catalyst256)10http://itgeekchronicles.co.uk

IP / TCP 10.1.99.25:ftp data 10.1.99.2:http S IP / TCP 10.1.99.2:http 10.1.99.25:ftp data SA /PaddingNotice the two different sets of bold characters? That's the SYN (S) from my laptop and the routerreplies with a SYN-ACK (SA). This means that a connection is half established, it's not fullyestablished because we only sent 1 packet to the router on port 80.Now let’s look at the packet we sent to port 23 (telnet):IP / TCP 10.1.99.25:ftp data 10.1.99.2:telnet S IP / TCP 10.1.99.2:telnet 10.1.99.25:ftp dataRA / PaddingNotice the difference? The packet from my laptop is the SYN (S) but my router responds with a RSTACK (RA) which is a RESet & ACKnowledge flag within the TCP packet. A RST is used to tell the sourcecomputer to reset a connection, in this case my router doesn't support port 23 (telnet) and as suchthe TCP handshake can't be established.Hopefully that makes sense? Appendix C will some more information on the different kind of flagsthat can appear in TCP packets.There is a useful nmap port scanning guide, which will explain the different port scan techniques andhow nmap scans. Hopefully it might make some of this a bit clearer. tmlDoes this mean that Scapy can be used as a port scanner? The short answer is yes, but rememberyou need to understand what you are looking for, Scapy is designed to send/receive packets and theinterpretation of the data is down to you. Applications like NMAP are designed to provide you with auser friendly output, but sometimes you might want “more” information.So let’s turn our example above into a port scanner, because Scapy is flexible in what it does you canset the flags on the TCP packets as you want. One of the most common and popular port scans isthe SYN scan, so let’s get Scapy to do one of those for us.The command for a SYN scan is again one line of code and here it is: p sr(IP(dst "10.1.99.2")/TCP(sport 666,dport [22,80,21,443], flags "S"))Now I've added a couple more options in this example, the first is sport ”666”, remember I saidthat Scapy defaults to port 22 (ftp data) by default, well for the purpose of this exercise I decided tochange it (yes 666 was just the first number I came up, and no I don't worship the devil), the secondoption was flags ”S” which tells Scapy just to send SYN packets. Shall we see the results? p sr(IP(dst "10.1.99.2")/TCP(sport 666,dport [22,80,21,443], flags "S"))Begin emission:***Finished to send 4 packets.*Received 4 packets, got 4 answers, remaining 0 packets p( Results: TCP:4 UDP:0 ICMP:0 Other:0 , Unanswered: TCP:0 UDP:0 ICMP:0 Other:0 ) ans,unans ans.summary()IP / TCP 10.1.99.25:666 10.1.99.2:ssh S IP / TCP 10.1.99.2:ssh 10.1.99.25:666 SA / PaddingIP / TCP 10.1.99.25:666 10.1.99.2:http S IP / TCP 10.1.99.2:http 10.1.99.25:666 SA / PaddingIP / TCP 10.1.99.25:666 10.1.99.2:ftp S IP / TCP 10.1.99.2:ftp 10.1.99.25:666 RA / PaddingIP / TCP 10.1.99.25:666 10.1.99.2:https S IP / TCP 10.1.99.2:https 10.1.99.25:666 RA /Padding By Adam Maxwell (@catalyst256)11http://itgeekchronicles.co.uk

So 4 ports means 4 packets, all with the source port of 666 and from the results above you canprobably (if you were paying attention) tell which ports are open on my router. Now the purpose ofthis guide is to show you want Scapy can do, sending SYN packets is fine but a TCP handshakealways starts with one, so let’s try changing that to an ACK packet. Here's what that would look like: p sr(IP(dst "10.1.99.2")/TCP(sport 888,dport [21,22,80,443], flags "A"))Begin emission:.***Finished to send 4 packets.*Received 5 packets, got 4 answers, remaining 0 packets p( Results: TCP:4 UDP:0 ICMP:0 Other:0 , Unanswered: TCP:0 UDP:0 ICMP:0 Other:0 ) ans,unans ans.summary()IP / TCP 10.1.99.25:888 10.1.99.2:ftp A IP / TCP 10.1.99.2:ftp 10.1.99.25:888 R / PaddingIP / TCP 10.1.99.25:888 10.1.99.2:ssh A IP / TCP 10.1.99.2:ssh 10.1.99.25:888 R / PaddingIP / TCP 10.1.99.25:888 10.1.99.2:http A IP / TCP 10.1.99.2:http 10.1.99.25:888 R / PaddingIP / TCP 10.1.99.25:888 10.1.99.2:https A IP / TCP 10.1.99.2:https 10.1.99.25:888 R / Padding Other than the source port which I've changed just for the sake of it, you notice the A (ACK) flag onthe sent packet, with a R (RST) flag on the response? That's because I've sent a packet to my routerthat it's only supposed to receive after a SYN-ACK packet and so it's reset it.Changing your TCP flags on packets is a useful ability, some devices (such as firewalls) responddifferently when you port scan them, understanding the responses you get back (or should get back)can help you find your way around them (so to speak).What other “quick” changes to our TCP packets can we make with Scapy?, well if we follow the samevein as performing port scans, what if we wanted to randomize the source port? and maybe put atimeout on the responses? or add an interval between each scan? Well let’s have a look what thatwould look like. p sr(IP(src "10.1.99.100", dst "10.1.99.2")/TCP(sport RandShort(),dport [20,21,80,3389]),inter 0.5,retry 2,timeout 1)Begin emission:.Finished to send 4 packets.Begin emission:.Finished to send 4 packets.Begin emission:.Finished to send 4 packets.Received 18 packets, got 0 answers, remaining 4 packets Unfortunately the code for this packet spanned two lines, so I will go through the changes. Similar tothe work we did in the previous chapter, once again I’ve spoofed the source IP (src ”10.1.99.100”),and I’ve also randomised the source port (sport RandShort(). The last 3 options inter,retry andtimeout I will explain in a bit more detail

Appendix A towards the back of the guide will provide a list of “common” Scapy functions and protocols. The examples throughout this guide should work (and they have been tested) against Scapy version 2.x. That’s right it’s time to play. so to start with we are go