Ⅰ python Scapy 發包失敗 提示Global name Gen not defined
將同目錄下的__init__.py中包括的「from __future__ import with_statement 。。。。。WINDOWS = True」放入compatibility.py中,問題解決,但我不清楚問題發生的原因,大家有誰知道還請幫忙解答,多謝!
Ⅱ Python網路編程8-實現SYN Flood攻擊與圖形化展示
最基本的DoS攻擊就是攻擊者利用大量合理的服務請求來佔用攻擊目標過多的服務資源,從而使合法用戶無法得到服務的響應。DoS攻擊一般是採用一對一方式的,當攻擊目標各項性能指標不高時(例如CPU速度低、內存小或者網路帶寬小等等),它的效果是明顯的。
泛洪攻擊(Flood)
指攻擊者通過僵屍網路、代理或直接向攻擊目標發送大量的偽裝的請求服務報文,最終耗盡攻擊目標的資源。發送的大量報文可以是TCP的SYN和ACK報文、UDP報文、ICMP報文、DNS報文HTTP/HTTPS報文等。
以下Python腳本可實現簡易的SYN Flood攻擊
運行結果如下
使用Wirshark觀察如下,產生大量TCP syn包;由於使用單IP單埠發送時,scapy使用了相同TCP序列號和數據,Wirshark認為是TCP重傳,使用多IP多埠是則正常。
以下Python腳本可對捕獲的SYN Flood包進行分析,並展示出數量大於5的連接。
運行結果如下
首先會列印出數量大於5的連接與其對應的數量。
同時會生成對應圖表,可以直觀的看到攻擊目標主機和埠的源IP排名。
Ⅲ Python中scapy和socket性能優化的問題
我想不出還有什麼更好解決辦法了。期待高手解答。
Ⅳ python程序分析pcap文件的丟包率問題,
使用scapy、scapy_http就可以方便的對pcap包中的http數據包進行解析
#!/usr/bin/env python
try:
import scapy.all as scapy
except ImportError:
import scapy
try:
# This import works from the project directory
import scapy_http.http
except ImportError:
# If you installed this package via pip, you just need to execute this
from scapy.layers import http
packets = scapy.rdpcap('f:\\abc123.pcap')
for p in packets:
print '=' * 78
[python] view plain
#print p.show()
for f in p.payload.fields_desc:
if f.name == 'src' or f.name == 'dst':
ct = scapy.conf.color_theme
vcol = ct.field_value
fvalue = p.payload.getfieldval(f.name)
reprval = f.i2repr(p.payload,fvalue)
print "%s : %s" % (f.name, reprval)
for f in p.payload.payload.fields_desc:
if f.name == 'load':
ct = scapy.conf.color_theme
vcol = ct.field_value
fvalue = p.payload.getfieldval(f.name)
reprval = f.i2repr(p.payload,fvalue)
print "%s : %s" % (f.name, reprval)
其中,p為數據包,scapy_http將其分為:
Ethernet->TCP->RAW三個層次,
使用p.show()函數可以列印出如下結果:
###[ Ethernet ]###
dst = 02:00:00:00:00:39
src = 00:00:00:01:02:09
type = 0x800
###[ IP ]###
version = 4L
ihl = 5L
tos = 0x0
len = 1014
id = 7180
flags =
frag = 0L
ttl = 45
proto = tcp
chksum = 0xbbf9
src = 126.209.59.13
dst = 121.113.176.25
\options \
###[ Raw ]###
load = '.....'
第一層是網路層,包含源、目的mac、ip協議號,第二層是tcp層,第三層包含埠號、http報文
其中每一層均為上一層的payload成員
Ⅳ 為什麼在python中import scapy報錯
問題原因:import scapy後執行腳本調用scapy模塊中(默認自動加了.py後綴)優先找了當前目錄的man.py,因為兩文件不一樣(一個是我們引入別人寫好的庫文件,一個是我們自己創建的文件),所以就報錯了。
一、如果一個錯誤出現後沒有被捕獲(捕獲是什麼先不管,現在就理解為出現了一個錯誤),它就一直被往上拋,最終將被Python解釋器捕獲。然後就在本該輸出結果的地方列印一大串錯誤信息,然後程序退出。示例代碼如下:
Ⅵ Scapy 中文文檔:三、使用方法
Scapy的交互shell是運行在一個終端會話當中。因為需要root許可權才能發送數據包,所以我們在這里使用 sudo
在Windows當中,請打開命令提示符( cmd.exe ),並確保您擁有管理員許可權:
如果您沒有安裝所有的可選包,Scapy將會告訴你有些功能不可用:
雖然沒有安裝,但發送和接收數據包的基本功能仍能有效。
本節將會告訴您一些Scapy的功能。讓我們按上文所述打開Scapy,親自嘗試些例子吧。
讓我們來建立一個數據包試一試
/ 操作符在兩層之間起到一個組合的作用。當使用該操作符時,下層可以根據其上層,使它的一個或多個默認欄位被重載。(您仍可以賦予您想要的值)一個字元串也可以被用作原料層( raw layer )。
每一個數據包都可以被建立或分解(注意:在Python中 _ (下劃線)是上一條語句執行的結果):
我們看到一個分解的數據包將其所有的欄位填充。那是因為我認為,附加有原始字元串的欄位都有它自身的價值。如果這太冗長, hide_defaults() 方法將會刪除具有默認值的欄位:
你可以從PCAP文件中讀取數據包,並將其寫入到一個PCAP文件中。
如果您已經安裝PyX,您可以做一個數據包的圖形PostScript/ PDF轉儲(見下面醜陋的PNG圖像,PostScript/PDF則具有更好的質量...)
目前我們只是生成一個數據包。讓我們看看如何輕易地定製一組數據包。整個數據包的每一個欄位(甚至是網路層次)都可以是一組。在這里隱含地定義了一組數據包的概念,意即是使用所有區域之間的笛卡爾乘積來生成的一組數據包。
某些操作(如修改一個數據包中的字元串)無法對於一組數據包使用。在這些情況下,如果您忘記展開您的數據包集合,只有您忘記生成的列表中的第一個元素會被用於組裝數據包。
現在我們知道了如何處理數據包。讓我們來看看如何發送它們。 send() 函數將會在第3層發送數據包。也就是說它會為你處理路由和第2層的數據。 sendp() 函數將會工作在第2層。選擇合適的介面和正確的鏈路層協議都取決於你。
fuzz() 函數可以通過一個具有隨機值、數據類型合適的對象,來改變任何默認值,但該值不能是被計算的(像校驗和那樣)。這使得可以快速建立循環模糊化測試模板。在下面的例子中,IP層是正常的,UDP層和NTP層被fuzz。UDP的校驗和是正確的,UDP的目的埠被NTP重載為123,而且NTP的版本被更變為4.其他所有的埠將被隨機分組:
現在讓我們做一些有趣的事情。 sr() 函數是用來發送數據包和接收應答。該函數返回一對數據包及其應答,還有無應答的數據包。 sr1() 函數是一種變體,用來返回一個應答數據包。發送的數據包必須是第3層報文(IP,ARP等)。 srp() 則是使用第2層報文(乙太網,802.3等)。
DNS查詢( rd = recursion desired)。主機192.168.5.1是我的DNS伺服器。注意從我Linksys來的非空填充具有Etherleak缺陷:
發送和接收函數族是scapy中的核心部分。它們返回一對兩個列表。第一個就是發送的數據包及其應答組成的列表,第二個是無應答數據包組成的列表。為了更好地呈現它們,它們被封裝成一個對象,並且提供了一些便於操作的方法:
如果對於應答數據包有速度限制,你可以通過 inter 參數來設置兩個數據包之間等待的時間間隔。如果有些數據包丟失了,或者設置時間間隔不足以滿足要求,你可以重新發送所有無應答數據包。你可以簡單地對無應答數據包列表再調用一遍函數,或者去設置 retry 參數。如果retry設置為3,scapy會對無應答的數據包重復發送三次。如果retry設為-3,scapy則會一直發送無應答的數據包,直到。 timeout 參數設置在最後一個數據包發出去之後的等待時間:
在Scapy提示符中執行一下命令,可以對經典的SYN Scan初始化:
以上向Google的80埠發送了一個SYN數據包,會在接收到一個應答後退出:
從以上的輸出中可以看出,Google返回了一個SA(SYN-ACK)標志位,表示80埠是open的。
使用其他標志位掃描一下系統的440到443埠:
或者
可以對收集的數據包進行摘要(summary),來快速地瀏覽響應:
以上顯示了我們在掃描過程中的請求應答對。我們也可以用一個循環只顯示我們感興趣的信息:
可以使用 make_table() 函數建立一個表格,更好地顯示多個目標信息:
在以上的例子中,如果接收到作為響應的ICMP數據包而不是預期的TCP數據包,就會列印出ICMP差錯類型(error type)。
對於更大型的掃描,我們可能對某個響應感興趣,下面的例子就只顯示設置了"SA"標志位的數據包:
如果我們想對響應進行專業分析,我們可以使用使用以下的命令顯示哪些埠是open的:
對於更大型的掃描,我們可以建立一個埠開放表:
如果以上的方法還不夠,Scapy還包含一個 report_ports() 函數,該函數不僅可以自動化SYN scan,而且還會對收集的結果以LaTeX形式輸出:
TCP路由追蹤:
注意:TCP路由跟蹤和其他高級函數早已被構造好了:
發送和接收數據包的過程是相當復雜的。
我們可以簡單地捕獲數據包,或者是克隆tcpmp或tethereal的功能。如果沒有指定interface,則會 在所有的interface上進行嗅探:
對於控制輸出信息,我們可以使用 sprintf() 函數:
我們可以嗅探並進行被動操作系統指紋識別:
猜測操作系統版本前的數字為猜測的精確度。
演示一下bpf過濾器和sprintf()方法:
這兒有一個例子來實現類似(h)ping的功能:你一直發送同樣的數據包集合來觀察是否發生變化:
通常可以將數據包保存為pcap文件以備後用,或者是供其他的應用程序使用:
還原之前保存的pcap文件:
或者
Scapy允許你以不同的十六進制格式輸出編碼的數據包。
使用 hexmp() 函數會以經典的hexmp格式輸出數據包:
使用 import_hexcap() 函數可以將以上的hexmp重新導入到Scapy中:
使用 str() 函數可以將整個數據包轉換成十六進制字元串:
通過選擇合適的起始層(例如 Ether() ),我們可以重新導入十六進制字元串。
使用 export_object() 函數,Scapy可以數據包轉換成base64編碼的Python數據結構:
使用 import_object() 函數,可以將以上輸出重新導入到Scapy中:
最後可以使用 save_session() 函數來保存所有的session變數:
使用 load_session() 函數,在下一次你啟動Scapy的時候你就能載入保存的session:
現在我們來演示一下 make_table() 函數的功能。該函數的需要一個列表和另一個函數(返回包含三個元素的元組)作為參數。第一個元素是表格x軸上的一個值,第二個元素是y軸上的值,第三個原始則是坐標(x,y)對應的值,其返回結果為一個表格。這個函數有兩個變種, make_lined_table() 和 make_tex_table() 來復制/粘貼到你的LaTeX報告中。這些函數都可以作為一個結果對象的方法:
在這里,我們可以看到一個多機並行的traceroute(Scapy的已經有一個多TCP路由跟蹤功能,待會兒可以看到):
這里有個更復雜的例子:從他們的IPID欄位中識別主機。我們可以看到172.20.80.200隻有22埠做出了應答,而172.20.80.201則對所有的埠都有應答,而且172.20.80.197對25埠沒有應答,但對其他埠都有應答。
你在使用TTL和顯示接收到的TTL等情況下,它可以很輕松地幫你識別網路拓撲結構。
現在Scapy有自己的路由表了,所以將你的數據包以不同於操作系統的方式路由:
我們可以很容易地將收集起來的數據繪製成Gnuplot。(清確保你已經安裝了Gnuplot-py和Gnuplot)例如,我們可以通過觀察圖案知道負載平衡器用了多少個不同的IP堆棧:
Scapy也有強大的TCP traceroute功能。並不像其他traceroute程序那樣,需要等待每個節點的回應才去下一個節點,scapy會在同一時間發送所有的數據包。其缺點就是不知道什麼時候停止(所以就有maxttl參數),其巨大的優點就是,只用了不到3秒,就可以得到多目標的traceroute結果:
最後一行實際上是該函數的返回結果:traceroute返回一個對象和無應答數據包列表。traceroute返回的是一個經典返回對象更加特殊的版本(實際上是一個子類)。我們可以將其保存以備後用,或者是進行一些例如檢查填充的更深層次的觀察:
和其他返回對象一樣,traceroute對象也可以相加:
Traceroute返回對象有一個非常實用的功能:他們會將得到的所有路線做成一個有向圖,並用AS組織路線。你需要安裝graphviz。在默認情況下會使用ImageMagick顯示圖形。
如果你安裝了VPython,你就可以用3D來表示traceroute。右邊的按鈕是旋轉圖案,中間的按鈕是放大縮小,左邊的按鈕是移動圖案。如果你單擊一個球,它的IP地址就會出現/消失。如果你按住Ctrl單擊一個球,就會掃描21,22,23,25,80和443埠,並顯示結果:
frame injection的前提是你的無線網卡和驅動得正確配置好。