Scapy介紹官方文檔翻譯

本人英文水平有限,翻譯不當之處,請參考官方網站

關於Scapy

Scapy是一個可以讓用戶發送、偵聽和解析並僞裝網絡報文的Python程序。這些功能可以用於製作偵測、掃描和攻擊網絡的工具。

換言之,Scapy 是一個強大的操縱報文的交互程序。它可以僞造或者解析多種協議的報文,還具有發送、捕獲、匹配請求和響應這些報文以及更多的功能。Scapy 可以輕鬆地做到像掃描(scanning)、路由跟蹤(tracerouting)、探測(probing)、單元測試(unit tests)、攻擊(attacks)和發現網絡(network discorvery)這樣的傳統任務。它可以代替hping,arpspoof,arp-sk,arping,p0f 甚至是部分的Namp,tcpdumptshark 的功能。

testing-taxonomy.png

Scapy 在大多數其它工具無法完成的特定任務中也表現優異,比如發送無效幀、添加自定義的802.11的偵、多技術的結合(跳躍攻擊(VLAN hopping)+ARP緩存中毒(ARP cache poisoning)、在WEP加密信道(WEP encrypted channel)上的VOIP解碼(VOIP decoding))等等等等。

理念非常簡單。Scapy 主要做兩件事:發送報文和接收回應。您定義一系列的報文,它發送這些報文,收到迴應,將收到的迴應和請求匹配,返回一個存放着(request, answer)即(請求, 迴應)的報文對(packet couples)的列表(list)和一個沒有匹配的報文的列表(list)。這樣對於像Nmaphping 這樣的工具有一個巨大的優勢:迴應沒有被減少 (open/closed/filtered)而是完整的報文。

在這之上可以建立更多的高級功能,比如您可以跟蹤路由(traceroutes)並得到一個只有請求的起始TTL和迴應的源IP的結果,您也可以ping整個網絡並得到匹配的回覆的列表,您還可以掃描商品並得到一個LATEX 報表。

Scapy爲何如此特別

第一,對於其它的大多數網絡工具來說,您無法制作一些作者無法想到的東西。這些工具已經被一個特定的目標所侷限和固定,因此無法和這個目標有大的偏離。比如,一個ARP緩存中毒程序不會讓您使用double 802.1q 包裹內容,同樣無法找到一個程序可以發送填充(padding)的ICMP報文(是填充(padding),不是負載(payload))。事實上,每次有新需求時,您必需重新建立一個新的工具。

第二,這些工具經常混淆解碼(decoding)和解釋(interpreting)。機器擅長解碼並能幫助人類完成這個工作。解釋應該留給人類。一些程序試圖模擬這個行爲。比如它們說“這個端口是打開的”而不是說“我收到一個SYN-ACK“.有時它們是對的,但有時不是。這樣做對於初學者來說更容易,但是當您知道您正在做什麼,您將繼續試圖推從程序的解釋中測實際上發生了什麼來製作自己的工具,但是這相當困難,因爲大量的信息已經丟失。因此最終常常是您使用tcpdump -xX來解碼和解釋這些工具丟掉的內容。

第三,即使是那些只管解碼的程序也沒有把它們收到的所有的信息交給您。它們給您展示的網絡信息只是其作者認爲足夠的信息。但是這些並不完整,對您來說是偏頗的。比如,您知道有什麼工具可以得到以太幀填充的報文嗎(reports the Ethernet padding)?

事實上,每次運行本程序,更像是建造一個新的工具,不是處理上百行的C程序代碼,您使用Scapy只需寫幾行代碼。

在探測(probe)(或者掃描(scan)、路由跟蹤(traceroute)等等)之後,Scapy總是在任何的解釋之前把探測到的所有的包解碼後給您。這意味着您可以探測一次而解釋很多次,也可以使用路由跟蹤並查看報文填充內容。

快速的報文設計

其它的工具堅持命令行運行的模式,這導致描述一個報文需要糟糕的語法。對於這些工具,解決的方法是在其作者想像的情景下,採用一種更高層但是功能更弱的描述方法。舉例來說,在端口掃描的情景中,端口掃描器必須的參數只有IP地址。即使情景有所改變,情況依然如此(Even if the scenario is tweaked a bit, you still are stuck to a port scan)。

Scapy的原則是推薦使用一種特定領域語言(Domain Specific Language (DSL))以達到對於任何種類報文的功能強大並快速的描述。使用Python語法和Python解釋器作爲特定領域語言(DSL)的語法和解釋器有許多優勢:沒有必要寫一個單獨的解釋器,用戶不需要再學一種新語言並可以從這個完整、簡約且非常強大的語言中受益。

Scapy允許用戶將一個或一系列報文描述成爲一個個堆起來的層(layer)。每層的數據域有有用的且可重載的默認值。Scapy不強制用戶使用預先定義的方法和模板。這樣每次碰到不同的情景時寫新工具的需要得到了減少。在C語言中,描述一個報文可能平均要用60行代碼。使用Scapy,發送的報文可能僅需一行代碼描述再加一行打印結果的代碼。90%的網絡探測工具可以使用Scapy使用2行代碼重新實現。

一次探測,多次解釋

網絡的發現是一個黑盒測試。當探測一個網絡時,許多偵測報文(stimuli)發送然而它們當中只有少數能夠被迴應。如果選擇了正確的偵測報文,希望得到的信息可以通過迴應的報文或者是沒有迴應的情況來獲得。不像很多其它的工具,Scapy得到所有的信息,也就是說,所有的發送的偵測報文和所有收到的迴應。通過檢查這些數據用戶可以得到想要的信息。當數據量較小時,用戶可以直接查看數據。在其它情況下,對於數據的解釋將依賴於關注點的不同。多數工具選擇展示關注點內容而忽略和關注點無關的內容。由於Scapy給出完整的原始數據,因此這些數據可以多次使用從而允許關注點在分析過程中發生變化。比如,可能探測一個TCP端口掃描而關注(展示)端口掃描的結果。同時也可以查看回應報文的TTL方面的內容。一個新的探測並不需要再來一次,而只是在已有的數據中改一下關注點即可。

scapy concept

Scapy解碼而不解釋

網絡探測工具所共有的一個問題是它們都試圖解釋收到的迴應而非僅僅解碼並給出結果。報告一些類似於在80端口收到一個TCP Reset報文這樣的消息不屬於解釋錯誤。報告80端口關閉在多數情況下是正確的,但是在某些特定的工具的作者沒有想到的上下文中是錯誤的。比如,一些掃描器在收到一個目的地址不可達的ICMP報文後傾向於報告一個過濾TCP端口。這可能是正確的,但是在某些情況下,這表明報文被防火牆過濾掉而找不到報文的非目的主機。

解釋結果可以幫助那些不知道什麼是端口掃描的用戶,但是弊大於利,因爲這對於結果是一種主觀的解釋。可能的結果就是它們可以自己解釋,知識豐富的用戶將試圖反向還原這個工具的解釋以得到引起這個解釋的真正原因。不幸的是,在這個過程中有大量的信息丟失。

快速展示(Quick demo)

首先我們稍微試一下,一次創建4個IP報文來看看這個工具是如何工作的。我們首先初始化IP類。然後,我們重新將其實例化並給出4個IP報文的目的地址(/30給出掩碼)。使用Python語法,我們在一系列明確的報文中定義這個報文(we develop this implicit packet in a set of explicit packets)。然後,我們退出解釋器。作爲我們提供的會話文件(session file),這些我們正在使用變量已經保存,然後重新加載:

# ./scapy.py -s mysession
New session [mysession]
Welcome to Scapy (0.9.17.108beta)
>>> IP()
<IP |>
>>> target="www.target.com"
>>> target="www.target.com/30"
>>> ip=IP(dst=target)
>>> ip
<IP dst=<Net www.target.com/30> |>
>>> [p for p in ip]
[<IP dst=207.171.175.28 |>, <IP dst=207.171.175.29 |>
 <IP dst=207.171.175.30 |>, <IP dst=207.171.175.31 |>]
>>> ^D
# scapy -s mysession
Using session [mysession]
Welcome to Scapy (0.9.17.108beta)
>>> ip
<IP dst=<Net www.target.com/30 |>

現在,我們來操縱一些報文:

>>> IP()
<IP |>
>>> a=IP(dst="172.16.1.40")
<IP dst=172.16.1.40 |>
>>> a.dst
'172.16.1.40'
>>> a.ttl
64

讓我們來說我想要一個廣播的MAC地址,並且負載的IP報文要到達ketchup.com和mayo.com,TTL值從1到9,並負載UDP報文:

>>> Ether(dst="ff:ff:ff:ff:ff:ff")
     /IP(dst=["ketchup.com", "mayo.com"], ttl=(1,9))
     /UDP()

現在我們在一行(一個確定報文(implicit packet))中定義了18個報文。

合理的默認值

Scapy試圖在所有種類的報文數據域中使用合理的默認值,如果沒有被重載的話,

  • IP源地址根據目的地址和路由表選擇
  • 校驗和自動計算
  • 源MAC地址根據輸出接口(output interface)選擇
  • 以太網類型和IP協議由高層決定

default values ip

其它數據域選擇最有用的值:

  • TCP源端口爲20,目的端口爲80
  • UDP源端口和目的端口均爲53
  • ICMP類型爲echo request

學習Python

Scapy使用Python解釋器作爲命令面板。這意味着你可以直接使用Python語言(創建變量,使用循環,定義函數等等)。

如果你剛開始使用Python並且因此你不理解這些詞語,或者如果你想學習這個語言,花一個小時來閱讀一個Guido Van Rossum寫的非常棒的Python教程。在此之後,你將知道Python :)(真的!)。對於更加深入的學習,Dive Into Python也是一個很好的開始。

作爲一個快速的開始,下面是Python數據類型的概覽:

  • int(signed, 32bits) : 42
  • long(signed, infinite) : 42L
  • str : "bell\x07\n" or 'bell\x07\n'
  • tuple (immutable): (1,4,"42")
  • list (mutable): [4,2,"1"]
  • dict (mutable): {"one":1, "two":2}

Python中沒有塊分割符,而是同縮進決定:

if cond:
    instr
    instr
elif cond2:
    instr
else:
    instr
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章