1. 程式人生 > >scapy構建icmp/ip報文並攻擊

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的抓包,我們可以看到一個正確的包被髮送。