scapy構建icmp/ip報文並攻擊
同絕大多數的網路協議類庫一樣,scapy中依舊採取分層的檢視來對資料進行管理。
本次的任務,由於是偽裝MAC,所以需要呼叫最底層的Ethernet層,這個層次,上一篇日誌已經獲取了本機的MAC、路由器的MAC。
只需要偽裝的MAC地址,這個由引數傳遞。
>>> ls(Ether())
WARNING: Mac address to reach destination not found. Using broadcast.
dst : DestMACField ='ff:ff:ff:ff:ff:ff' (None)
src : SourceMACField='00:00:00:00:00:00' (None)
type : XShortEnumField = 0 (0)
ICMP包在協議中的位置是處於一個比較難分的,一直當做是IP擴充套件層來理解-^-
因此想要傳送一個偽裝的ICMP,就需要先構築“下一層”的IP資料報了。
還是來看一下scapy中IP層的內容:
>>> ls(IP())
version : BitField =4 (4)
ihl : BitField = None (None)
tos : XByteField= 0 (0)
len : ShortField = None (None)
id : ShortField =1 (1)
flags : FlagsField = 0 (0)
frag : BitField = 0 (0)
ttl : ByteField =64 (64)
proto : ByteEnumField= 0 (0)
chksum : XShortField = None (None)
src : Emph ='127.0.0.1' (None)
dst : Emph ='127.0.0.1' ('127.0.0.1')
options : PacketListField = [] ([])
也正是IP首部的內容-20個位元組的內容並不需要我們一一填充——尤其是chksum,當初花了不少時間來弄chksum,後來才發現原來checksum在scapy中是如此簡單(程式碼中會展示出來)
回到IP層,我們現在填充IP
src自然要使用一個偽裝的IP了,這個是從引數獲取。
dst就是我們要欺騙的目的IP,也是從引數中獲取。
type就是1,也就是表明資料報是一個ICMP包。
在ICMP包中,我們也只需要填充type型別——是請求(1)還是回顯(8)
完成了ICMP包,我們加入資料—RAW層,直接使用RAW(‘填充內容')來初始化一個raw包。
1 #! /env/lib python 2 import sys
3 import os
4 from scapy.all import* 5 from usual import* 6 conf.vert =1 7 8 if__name__=="__main__":
9 #get hwaddress\ip\gateway and init10 t_hw = GetMac()
11 t_ip = GetIp()
12 gatemac = GetGateWay(t_ip,t_hw,False)
13 target ='192.168.3.25'14 fakeip = t_ip
15 fakemac = t_hw
16 17 #parse the input18 for i in range(1,len(sys.argv)):
19 l = sys.argv[i].split('=')
20 if l[0] =='-t':
21 target = l[1]
22 elif l[0] =='-ip':
23 fakeip = l[1]
24 elif l[0] =='-mac':
25 fakemac = l[1]
26 27 pack_ip = IP(dst = target,src = fakeip,proto =1)
28 pack_icmp = ICMP(type =8)
29 pack_ether = Ether(src = fakemac,dst = gatemac,type =0x0800)
30 #add info31 info = Raw('ip:'+t_ip+' mac:'+ t_hw +'')
32 t = str(pack_ether/pack_ip/pack_icmp/info)
33 s = Ether(t)
34 # s.pdfdump("/home/jack13/trade.pdf")35 sendp(s)
10-15行,呼叫上一篇日誌中的函式獲取相應的資訊、初始化部分變數
17-25行,解析輸入變數
27-31行,單獨生成各層物件
32-33行,整合各層物件,同時生成傳送包s。(這兩行就可以完成checksum的工作)
35行, 傳送偽裝資料
執行:
sudo python send7.py -t=192.168.3.62 -ip=192.168.0.1 -mac=00:11:22:33:44:55
包是無法返回的,但是通過wireshark的抓包,我們可以看到一個正確的包被髮送。