介紹
譯者:pdcxs007
來(lái)源:Scapy介紹官方文檔翻譯
原文:Introduction
協(xié)議:CC BY-NC-SA 2.5
- 關(guān)于Scapy
- Scapy為何如此特別
- 快速的報(bào)文設(shè)計(jì)
- 一次探測(cè)多次解釋
- Scapy解碼而不解釋
- 快速展示Quick demo
- 合理的默認(rèn)值
- 學(xué)習(xí)Python
本人英文水平有限,翻譯不當(dāng)之處姨谷,請(qǐng)參考官方網(wǎng)站透敌。
關(guān)于Scapy
Scapy
是一個(gè)可以讓用戶發(fā)送、偵聽和解析并偽裝網(wǎng)絡(luò)報(bào)文的Python程序筋帖。這些功能可以用于制作偵測(cè)、掃描和攻擊網(wǎng)絡(luò)的工具冤馏。
換言之日麸,Scapy
是一個(gè)強(qiáng)大的操縱報(bào)文的交互程序。它可以偽造或者解析多種協(xié)議的報(bào)文逮光,還具有發(fā)送代箭、捕獲、匹配請(qǐng)求和響應(yīng)這些報(bào)文以及更多的功能睦霎。Scapy
可以輕松地做到像掃描(scanning)梢卸、路由跟蹤(tracerouting)、探測(cè)(probing)副女、單元測(cè)試(unit tests)蛤高、攻擊(attacks)和發(fā)現(xiàn)網(wǎng)絡(luò)(network discorvery)這樣的傳統(tǒng)任務(wù)。它可以代替hping
,arpspoof
,arp-sk
,arping
,p0f
甚至是部分的Namp
,tcpdump
和tshark
的功能碑幅。
Scapy
在大多數(shù)其它工具無(wú)法完成的特定任務(wù)中也表現(xiàn)優(yōu)異戴陡,比如發(fā)送無(wú)效幀、添加自定義的802.11的偵沟涨、多技術(shù)的結(jié)合(跳躍攻擊(VLAN hopping)+ARP緩存中毒(ARP cache poisoning)恤批、在WEP加密信道(WEP encrypted channel)上的VOIP解碼(VOIP decoding))等等等等。
理念非常簡(jiǎn)單裹赴。Scapy
主要做兩件事:發(fā)送報(bào)文和接收回應(yīng)喜庞。您定義一系列的報(bào)文,它發(fā)送這些報(bào)文棋返,收到回應(yīng)延都,將收到的回應(yīng)和請(qǐng)求匹配,返回一個(gè)存放著(request, answer)即(請(qǐng)求, 回應(yīng))的報(bào)文對(duì)(packet couples)的列表(list)和一個(gè)沒(méi)有匹配的報(bào)文的列表(list)睛竣。這樣對(duì)于像Nmap
和hping
這樣的工具有一個(gè)巨大的優(yōu)勢(shì):回應(yīng)沒(méi)有被減少 (open/closed/filtered)而是完整的報(bào)文晰房。
在這之上可以建立更多的高級(jí)功能,比如您可以跟蹤路由(traceroutes)并得到一個(gè)只有請(qǐng)求的起始TTL和回應(yīng)的源IP的結(jié)果射沟,您也可以ping整個(gè)網(wǎng)絡(luò)并得到匹配的回復(fù)的列表殊者,您還可以掃描商品并得到一個(gè)<nobr>LATEX
</nobr> 報(bào)表。
Scapy
為何如此特別
第一验夯,對(duì)于其它的大多數(shù)網(wǎng)絡(luò)工具來(lái)說(shuō)猖吴,您無(wú)法制作一些作者無(wú)法想到的東西。這些工具已經(jīng)被一個(gè)特定的目標(biāo)所局限和固定挥转,因此無(wú)法和這個(gè)目標(biāo)有大的偏離距误。比如簸搞,一個(gè)ARP緩存中毒程序不會(huì)讓您使用double 802.1q
包裹內(nèi)容,同樣無(wú)法找到一個(gè)程序可以發(fā)送填充(padding)的ICMP報(bào)文(是填充(padding)准潭,不是負(fù)載(payload))趁俊。事實(shí)上,每次有新需求時(shí)刑然,您必需重新建立一個(gè)新的工具寺擂。
第二,這些工具經(jīng)称寐樱混淆解碼(decoding)和解釋(interpreting)怔软。機(jī)器擅長(zhǎng)解碼并能幫助人類完成這個(gè)工作。解釋應(yīng)該留給人類择镇。一些程序試圖模擬這個(gè)行為挡逼。比如它們說(shuō)“這個(gè)端口是打開的”而不是說(shuō)“我收到一個(gè)SYN-ACK
“.有時(shí)它們是對(duì)的,但有時(shí)不是腻豌。這樣做對(duì)于初學(xué)者來(lái)說(shuō)更容易家坎,但是當(dāng)您知道您正在做什么,您將繼續(xù)試圖推從程序的解釋中測(cè)實(shí)際上發(fā)生了什么來(lái)制作自己的工具吝梅,但是這相當(dāng)困難虱疏,因?yàn)榇罅康男畔⒁呀?jīng)丟失。因此最終常常是您使用tcpdump -xX
來(lái)解碼和解釋這些工具丟掉的內(nèi)容苏携。
第三做瞪,即使是那些只管解碼的程序也沒(méi)有把它們收到的所有的信息交給您。它們給您展示的網(wǎng)絡(luò)信息只是其作者認(rèn)為足夠的信息右冻。但是這些并不完整装蓬,對(duì)您來(lái)說(shuō)是偏頗的。比如纱扭,您知道有什么工具可以得到以太幀填充的報(bào)文嗎(reports the Ethernet padding)矛物?
事實(shí)上,每次運(yùn)行本程序跪但,更像是建造一個(gè)新的工具,不是處理上百行的C程序代碼峦萎,您使用Scapy
只需寫幾行代碼屡久。
在探測(cè)(probe)(或者掃描(scan)、路由跟蹤(traceroute)等等)之后爱榔,Scapy
總是在任何的解釋之前把探測(cè)到的所有的包解碼后給您被环。這意味著您可以探測(cè)一次而解釋很多次,也可以使用路由跟蹤并查看報(bào)文填充內(nèi)容详幽。
快速的報(bào)文設(shè)計(jì)
其它的工具堅(jiān)持命令行運(yùn)行的模式筛欢,這導(dǎo)致描述一個(gè)報(bào)文需要糟糕的語(yǔ)法浸锨。對(duì)于這些工具,解決的方法是在其作者想像的情景下版姑,采用一種更高層但是功能更弱的描述方法柱搜。舉例來(lái)說(shuō),在端口掃描的情景中剥险,端口掃描器必須的參數(shù)只有IP地址聪蘸。即使情景有所改變,情況依然如此(Even if the scenario is tweaked a bit, you still are stuck to a port scan)表制。
Scapy
的原則是推薦使用一種特定領(lǐng)域語(yǔ)言(Domain Specific Language (DSL))以達(dá)到對(duì)于任何種類報(bào)文的功能強(qiáng)大并快速的描述健爬。使用Python
語(yǔ)法和Python
解釋器作為特定領(lǐng)域語(yǔ)言(DSL)的語(yǔ)法和解釋器有許多優(yōu)勢(shì):沒(méi)有必要寫一個(gè)單獨(dú)的解釋器,用戶不需要再學(xué)一種新語(yǔ)言并可以從這個(gè)完整么介、簡(jiǎn)約且非常強(qiáng)大的語(yǔ)言中受益娜遵。
Scapy
允許用戶將一個(gè)或一系列報(bào)文描述成為一個(gè)個(gè)堆起來(lái)的層(layer)。每層的數(shù)據(jù)域有有用的且可重載的默認(rèn)值壤短。Scapy
不強(qiáng)制用戶使用預(yù)先定義的方法和模板设拟。這樣每次碰到不同的情景時(shí)寫新工具的需要得到了減少。在C語(yǔ)言中鸽扁,描述一個(gè)報(bào)文可能平均要用60行代碼蒜绽。使用Scapy
,發(fā)送的報(bào)文可能僅需一行代碼描述再加一行打印結(jié)果的代碼桶现。90%的網(wǎng)絡(luò)探測(cè)工具可以使用Scapy
使用2行代碼重新實(shí)現(xiàn)躲雅。
一次探測(cè),多次解釋
網(wǎng)絡(luò)的發(fā)現(xiàn)是一個(gè)黑盒測(cè)試骡和。當(dāng)探測(cè)一個(gè)網(wǎng)絡(luò)時(shí)相赁,許多偵測(cè)報(bào)文(stimuli)發(fā)送然而它們當(dāng)中只有少數(shù)能夠被回應(yīng)。如果選擇了正確的偵測(cè)報(bào)文慰于,希望得到的信息可以通過(guò)回應(yīng)的報(bào)文或者是沒(méi)有回應(yīng)的情況來(lái)獲得钮科。不像很多其它的工具,Scapy
得到所有的信息婆赠,也就是說(shuō)绵脯,所有的發(fā)送的偵測(cè)報(bào)文和所有收到的回應(yīng)。通過(guò)檢查這些數(shù)據(jù)用戶可以得到想要的信息休里。當(dāng)數(shù)據(jù)量較小時(shí)蛆挫,用戶可以直接查看數(shù)據(jù)。在其它情況下妙黍,對(duì)于數(shù)據(jù)的解釋將依賴于關(guān)注點(diǎn)的不同悴侵。多數(shù)工具選擇展示關(guān)注點(diǎn)內(nèi)容而忽略和關(guān)注點(diǎn)無(wú)關(guān)的內(nèi)容。由于Scapy
給出完整的原始數(shù)據(jù)拭嫁,因此這些數(shù)據(jù)可以多次使用從而允許關(guān)注點(diǎn)在分析過(guò)程中發(fā)生變化可免。比如抓于,可能探測(cè)一個(gè)TCP端口掃描而關(guān)注(展示)端口掃描的結(jié)果。同時(shí)也可以查看回應(yīng)報(bào)文的TTL方面的內(nèi)容浇借。一個(gè)新的探測(cè)并不需要再來(lái)一次捉撮,而只是在已有的數(shù)據(jù)中改一下關(guān)注點(diǎn)即可。
Scapy
解碼而不解釋
網(wǎng)絡(luò)探測(cè)工具所共有的一個(gè)問(wèn)題是它們都試圖解釋收到的回應(yīng)而非僅僅解碼并給出結(jié)果逮刨。報(bào)告一些類似于在80端口收到一個(gè)TCP Reset報(bào)文這樣的消息不屬于解釋錯(cuò)誤呕缭。報(bào)告80端口關(guān)閉在多數(shù)情況下是正確的,但是在某些特定的工具的作者沒(méi)有想到的上下文中是錯(cuò)誤的修己。比如恢总,一些掃描器在收到一個(gè)目的地址不可達(dá)的ICMP報(bào)文后傾向于報(bào)告一個(gè)過(guò)濾TCP端口。這可能是正確的睬愤,但是在某些情況下片仿,這表明報(bào)文被防火墻過(guò)濾掉而找不到報(bào)文的非目的主機(jī)。
解釋結(jié)果可以幫助那些不知道什么是端口掃描的用戶尤辱,但是弊大于利砂豌,因?yàn)檫@對(duì)于結(jié)果是一種主觀的解釋」舛剑可能的結(jié)果就是它們可以自己解釋阳距,知識(shí)豐富的用戶將試圖反向還原這個(gè)工具的解釋以得到引起這個(gè)解釋的真正原因。不幸的是结借,在這個(gè)過(guò)程中有大量的信息丟失筐摘。
快速展示(Quick demo)
首先我們稍微試一下,一次創(chuàng)建4個(gè)IP報(bào)文來(lái)看看這個(gè)工具是如何工作的船老。我們首先初始化IP類咖熟。然后,我們重新將其實(shí)例化并給出4個(gè)IP報(bào)文的目的地址(/30給出掩碼)柳畔。使用Python
語(yǔ)法馍管,我們?cè)谝幌盗忻鞔_的報(bào)文中定義這個(gè)報(bào)文(we develop this implicit packet in a set of explicit packets)。然后薪韩,我們退出解釋器确沸。作為我們提供的會(huì)話文件(session file),這些我們正在使用變量已經(jīng)保存俘陷,然后重新加載:
# ./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 |>
現(xiàn)在罗捎,我們來(lái)操縱一些報(bào)文:
>>> IP()
<IP |>
>>> a=IP(dst="172.16.1.40")
<IP dst=172.16.1.40 |>
>>> a.dst
'172.16.1.40'
>>> a.ttl
64
讓我們來(lái)說(shuō)我想要一個(gè)廣播的MAC地址,并且負(fù)載的IP報(bào)文要到達(dá)ketchup.com和mayo.com岭洲,TTL值從1到9,并負(fù)載UDP報(bào)文:
>>> Ether(dst="ff:ff:ff:ff:ff:ff")
/IP(dst=["ketchup.com", "mayo.com"], ttl=(1,9))
/UDP()
現(xiàn)在我們?cè)谝恍?一個(gè)確定報(bào)文(implicit packet))中定義了18個(gè)報(bào)文坎匿。
合理的默認(rèn)值
Scapy
試圖在所有種類的報(bào)文數(shù)據(jù)域中使用合理的默認(rèn)值盾剩,如果沒(méi)有被重載的話雷激,
- IP源地址根據(jù)目的地址和路由表選擇
- 校驗(yàn)和自動(dòng)計(jì)算
- 源MAC地址根據(jù)輸出接口(output interface)選擇
- 以太網(wǎng)類型和IP協(xié)議由高層決定
其它數(shù)據(jù)域選擇最有用的值:
- TCP源端口為20,目的端口為80
- UDP源端口和目的端口均為53
- ICMP類型為echo request
學(xué)習(xí)Python
Scapy
使用Python
解釋器作為命令面板。這意味著你可以直接使用Python
語(yǔ)言(創(chuàng)建變量告私,使用循環(huán)屎暇,定義函數(shù)等等)。
如果你剛開始使用Python
并且因此你不理解這些詞語(yǔ)驻粟,或者如果你想學(xué)習(xí)這個(gè)語(yǔ)言根悼,花一個(gè)小時(shí)來(lái)閱讀一個(gè)Guido Van Rossum寫的非常棒的Python教程。在此之后蜀撑,你將知道Python
:)(真的挤巡!)。對(duì)于更加深入的學(xué)習(xí)酷麦,Dive Into Python也是一個(gè)很好的開始矿卑。
作為一個(gè)快速的開始,下面是Python
數(shù)據(jù)類型的概覽:
-
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
中沒(méi)有塊分割符沃饶,而是同縮進(jìn)決定:
if cond:
instr
instr
elif cond2:
instr
else:
instr