關於Scapy


Scapy 是由 Python 寫出的一款強大、著名的網路封包分析函式,但它不僅僅只是函式而已,它同時也是一個基於 Python 交互式(interactive)的工具程式。目前比較有名跟它類似的工具像是Wireshark,不過因為它可以配合 Python 寫出俱有特殊目的的封包分析方式,所以擁有更多的彈性。

Linux上安裝Scapy


  • Debian/Ubuntu 平台上

    1
    $ sudo apt-get install python-scapy python-pyx python-gnuplot
  • 其他作業系統請看這裡: Download and Installation

執行交互式的Scapy


install
1
$ sudo scapy

Scapy shell 會顯示如下:

Scapy Shell
1
2
3
WARNING: No route found for IPv6 destination :: (no default route?)
Welcome to Scapy (2.2.0)
>>>

基本用法


製作封包

Scapy可以製作封包,指定封包的目的地IP、來源地IP、TTL,等等資訊。

進入交互式的Scapy後,可以直接輸入

Quick Demo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
>>> packet = IP() #創建一個封包
>>> packet.show() #顯示封包資訊
###[ IP ]###
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= ip
chksum= None
src= 127.0.0.1
dst= 127.0.0.1
\options\

>>> packet.src #輸出封包來源地
'127.0.0.1'

>>> packet.ttl #輸出封包的TTL (預設64)
64

>>>packet.dst = '192.168.2.1' #指派封包的目的地
>>>packet.ttl = 10 #指派封包的TTL

>>>packet
<IP ttl=10 dst=192.168.2.1 |>

跨層堆疊

根據 OSI(Open System Interconnection Model) 七層協定,對應到目前實際上常用的 TCP/IP如下圖所示:

OSI.png

圖片摘自

方才介紹 製作封包 的方法其實就是在 TCP/IP 上的第二層 Internet Layer ,我們可以透過 / 操作子來堆疊第一、三、四層,也就是 Network Access Layer, Transport Layer, Application Layer

Stacking layers
1
2
3
4
5
6
7
8
>>>IP()/TCP() #Layer 2/Layer 3
<IP frag=0 proto=tcp |<TCP |>>

>>>Ether()/IP()/UDP() #Layer 1/Layer 2/Layer 3
<Ether type=0x800 |<IP frag=0 proto=udp |<UDP |>>>

>>>IP()/TCP()/"GET / HTTP/1.0\r\n\r\n" #Layer 2/Layer 3/Layer 4
<IP frag=0 proto=tcp |<TCP |<Raw load='GET / HTTP/1.0\r\n\r\n' |>>>

小結


使用 Scapy 除了可以偽裝別人的 MAC address 或 IP address來發送封包之外,也可以利用內建的 Sniffer 來截取別人的封包,窺探封包裡面的資料,例如某網站沒有用HTTPS加密當使用者輸入完密碼,送出後利用 Sniffer 就可以拿到該密碼。
改天會來寫一篇如何利用 Sniffer 截取未加密網站的資料。