Python Scapy(2.3.1)文

http://blog.csdn.net/dj1174232716/article/details/44784081

Python的Scapy模組能夠讓用戶發送,嗅探,解析並偽造網路數據包。這些能力能用來構建探測,掃描或者攻擊網路的工具。

換句話說,Scapy是一個強大的互動式數據包處理程式。它能夠偽造或者解碼大量的數據包協議,發送,捕獲數據包並匹配請求和回復。Scapy能輕鬆的處理像掃描,追蹤,探測,單元測試,攻擊或者網路發現能大多數常見的任務。它能夠替代像hping, arpspoof, arp-sk, arping, p0f甚至是Nmap, tcpdump, and tshark這樣的工具。

Scapy在執行很多工具不能處理的特定問題上也完成的很好。像是發送無效的數據幀,注入我們自己的802.11幀,在WEP上解碼加密通道結合其他技術(VLAN hopping攻擊+APR快取中毒,VOIP解碼等)等等。

看起來很不錯。Scapy只做了兩件主要的事:發送數據包並接受響應。你定義了一些數據包,然後發送他們,接受響應,匹配符合要求的響應,然後返回數據元組(請求,響應)和一些沒有被匹配的數據包。這對於那些像Nmap和hping的工具來說有巨大的優勢,他們不會減少數據包而是完整的數據包。

這些能建立更高水平的功能,比如路由追蹤,只需要開始請求的TTL和響應的原始的IP地址便可返回結果。Ping這個網路並返回主機的響應,埠掃描並返回LaTeX格式的報告。

是什麼讓Scapy如此的特別?

首先,大多數網路工具你不能做作者沒有設定的事情。那些工具被建立起來是為了特定的目標,不能偏離目標。比如說,ARP快取中毒工具不會讓你使用雙802.1q封裝。或者試圖發現一個程式能發送,表達一個用ICMP的數據包。事實上,每當你有新的需求你必須構建新的工具。

第二,他們通常把解碼和解釋弄混淆。機器很擅長解碼並幫助人們開始,解釋是給人類看的。一些程式試圖模仿這些行為。例如,他們說「這個埠是開放的」而不是「我收到了一個SYN-ACK」,有些時候他們是對的,有時候並不是。這對初學者很容易,但是當你知道你正在做什麼的時候,你要試圖解碼從程式的解釋中到底發生了什麼,這是很困難的,因為你丟掉了大量的資訊。並且你經常使用tcpdump -xX來解碼,並解釋,工具丟失了大量的資訊。

第三,甚至程式只解碼並不給他們收到的所有的資訊。他們給你的網路情況是作者認為已經足夠了的。但是並不完整,你對此會有一些偏見。比如說,你知道一個工具介紹乙太網填充嗎?

Scapy試圖克服上面這些問題,他能夠讓你建立精確的你想要的數據包。儘管我認為堆一個802.1q協議上層的TCP沒有任何意義。他可能工作在其他人的產品里我們不知道。Scapy有一個靈活的模組試圖避免這種任意的限制。你能添加任何值和任何欄位在協議棧中,歷你是所有的作者。

事實上,在建立一個新的程式時,你不必寫一百行的C程式碼,而秩序2行的Scapy。

在探測(追蹤,掃描等)之後,Scapy總是給你所有的探測解碼包,在解釋之前。這就意味著你只需探測一次便可解釋很多次。請求一個數據查看裡面的填充的數據。

快速分組設計

其他工具堅持 program-that-you-run-from-a-shell的範式。結果是糟糕的語法來描述數據包。對於這樣的工具,解決方法是採用跟高級的但是不怎麼強大的描述,在這種情況下全憑住作者的設計。不如說,只有IP地址必須傳給埠掃瞄器來觸發埠掃描方案。即時情況改變了一點,你還是要進行埠掃描。

Scapy的範式提出了領域特定語言(DSL)可以強大並快速的描述不同類型的數據包。使用Python語法和Python解釋器作為DSL的語法和解釋器有很多有優點:不必編寫獨立的解釋器,用戶不需要在學其他的語言,他們將受益與一個完整,簡介,強大的語言。

Scapy能允許用戶描述數據包或者設置數據包在協議棧的層面上。每一個協議的欄位都有默認的值並且能重載。Scapy不會強迫用戶使用特定的方法或模板。這減輕了編寫一個工具的要求,在C語言中,平均需要60行程式碼來描述一個數據包。用Scapy,發送的數據包可能只需要一行來描述其他的行來列印結果。90%的網路探測工具只需要兩行Scapy程式碼便可編寫。

一次探測,多次解釋

網路測試是一個黑盒測試。當探測一個網路時,很多探測的數據包被發送,只有一小部分有響應。如果選擇了正確的探測數據,想要的資訊就可能通過響應獲得或者是響應不足。不想許多工具,Scapy提供所有的資訊,即所有發送的探測數據包和所有收到的數據包。檢查數據能提供給用戶想要的資訊。當數據集很小的時候,用戶只能從中挖掘資訊。其他情況下,數據的解釋依賴於觀測點的採取,大多數工具選擇觀測點並丟棄所有與觀測點不相關的數據。因為Scapy提供完整的原始數據,數據可能會被使用很多次允許觀測點的演化,在分析中。比如說,TCP埠掃描能被探測到,掃描的結果數據很直觀,這些數據也能直觀的反應響應數據包的TTL。只需要調整數據的觀測點一個新的探測就不必被啟動了。

Scapy只解碼,它不解釋

網路探測工具的共同的問題就是他們試圖解釋收到的響應而不是解碼並給出事實。報告一些事情像是Received a TCP Reset on port 80是不會解釋出錯的,報告Port 80 is closed是一個解釋,可能正確在大多數情況下,但是在作者沒想到的特殊情況下也可能錯誤。例如,一些掃瞄器傾向於報告一個過濾的TCP埠當他們收到一個ICMP目標地址不可達的數據包時。這可能是正確的,但是在一些情況下坑兩個數據包並沒有被防火牆過濾而是沒有主機轉發這個數據包。

解釋的結果能幫助用戶理解掃描道德結果,但是也可能帶來更多的壞處,當他偏向於某個結果時。當發生什麼事情時他們能自己做出解釋,知識豐富的用戶將試圖逆向工程工具的解釋來獲取應發解釋的事實。不幸的是大多數資訊在操作時已經被拋棄了。

快速的例子

首先,我們玩一個位元組,一次創建四個IP數據包。讓我們看看他是怎麼工作的。我們首先實例化一個IP類,然後我們再次實例化它並提供四個有意義的目標IP地址(/30是子網掩碼)。使用Python的列表,我們發展了一個隱式的數據包在一個顯示的數據報上。然後我們停止解釋器,這為我們提供了一個會話文件,我們的變數在工作時就保存了,以便我們重新載入:

# ./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")  >>> a  <IP dst=172.16.1.40 |>  >>> a.dst  '172.16.1.40'  >>> a.ttl  64

我們看到,我們想廣播MAC地址,並且IP的有效載荷是從 ketchup.com and到mayo.com。TTL的值是從1到9.UDP的有效載荷是:

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

我們用一行定義了18個數據包(一個隱式的數據包)。

敏感的默認值

Scapy試圖對所有的數據包使用敏感的默認值,如果不重寫的話:

1.IP源地址的選擇是根據目標地址和路由表。

2.校驗和是計算過的。

3.源MAC地址的選擇是根據輸出的介面

4.乙太網的類型和IP協議是根據上層協議確定的

其他欄位的默認值選擇最有用的一個:

1.TCP的源埠是20,目的埠是80

2.UDP源埠和目的埠都是53

3.ICMP的類型是響應請求

學習Python

Scapy選擇Python解釋器作為命令解釋器。這就意味著你可以直接使用Python(分配變數,使用循環,定義函數等等)。

如果你沒有學過Python,請查看其他教程先學習Python。