- Scapy模塊的應用
- 1.輸入ifconfig查找IP地址
- 2.輸入scapy
- 192.168.2.0/24表示的IP范圍(共256個數據包)
- 3.查看類的屬性
- 4.發送數據包,記得開啟管理員權限
- 5.尋找mac地址(Ether())
- 6.構造內容為隨機的數據包
- 7.三個發送和接收數據的函數
- 8.保存數據包列表(src()函數返回兩個列表包)
- 9.查看數據包
- 10.sr1()發法
- 11.sniff()監聽流經物理網卡的流量包
- 12.專一性監聽設置
- 13.限量監聽
- 14.特殊包種監聽
- 15.summary()(操作對象是單個數據包)和nsummary()(操作對象是多個數據包)
- 16.ACK類型的掃描(觀察端口(dport)是否被屏蔽,屏蔽不是關閉)
- 17.命名ans包的集合中單個包的先后的兩個鏈接為s,r,若把s作為鏈接以TCP為協議的目的端口等於把r作為鏈接以TCP為協議的源端口則對該端口進行輸出
- 19.查看被過濾的端口
- 20.小撒花
- 21.將抓到的數據包保存
- 22.查看抓取到的數據包
- 23.格式化輸出
- 24.過濾抓包
- 25.sniff的參數
- 26.第二次撒花
- 學習資源(強推)
Scapy模塊的應用
1.輸入ifconfig查找IP地址
2.輸入scapy
- 在scapy中,每一個協議都是一個類,而建立一個變量=協議(),相當於建立這個協議的數據包。
- 協議
-
IP(),TCP(),UDP():用的是ipv4的地址
-
Ether()用的是mac地址(Ether(dst=ff:ff:ff:ff:ff:ff))
6個ff是廣播地址
廣播地址(Broadcast Address)是專門用於同時向網絡中所有工作站進行發送的一個地址
ip=IP()
ip
#IP有兩個重要的屬性——源地址(src)和目的地址(dst)
-
dst也可以是一個IP范圍:
192.168.2.0/24表示的IP范圍(共256個數據包)
192.168.2.0換成32位二進制,四組,每組8位
/24 表示前24位不變,后8位由全0變化到全1的過程,也就是由“00000000”變化到“11111111”
又因為全0是子網網絡地址,全1是子網廣播地址,這兩個地址是不分配給主機使用的。
所以有效的可分配的范圍是前24位不變,后8位由“00000001”變化為“11111110”的范圍
再轉換回十進制就是192.168.2.1~192.168.2.254 -
查看單一數據包 [x for x in 網段名]
-
構造多層協議數據包
Ether()/IP()/TCP() #tcp包
IP()/TCP()/"GET/HTTP/1.0\r\n\r\n"#使其分行,易於后面的解析
自底向上
3.查看類的屬性
ls(協議名())
4.發送數據包,記得開啟管理員權限
構造一個目的地址為:192.168.154.254的ICMP數據包,並發送
send(IP(dst="192.168.154.254")/ICMP())
5.尋找mac地址(Ether())
win+r+arp -a
sendp(Ether(dst="00-50-56-ee-ac-a2"))
ifconfig
inet 192.168.109.132 #本地IP
6.構造內容為隨機的數據包
這是一個發往192.168.109.132,內容為隨機填充的TCP包
IP(dst="192.168.109.132")/fuzz(TCP())
7.三個發送和接收數據的函數
- sr()第三層,IP,ARP
- sr1())第三層,IP,ARP
- srp()第二層
sr(IP(dst="192.168.109.132")/ICMP())
8.保存數據包列表(src()函數返回兩個列表包)
一個是有應答的列表包,另一個是無應答的列表包
ans,unans=sr(IP(dst="192.168.154.1")/ICMP())
9.查看數據包
ans.summary()
10.sr1()發法
p=sr1(IP(dst="192.168.154.1")/ICMP())
- 可以用sr1()方法來檢測目標的某個端口是否開放,采用半開掃描發(SYN)的方法
不完成TCP握手流程。只向目標端口發送一個SYN報文,然后等待響應
p=sr1(IP(dst="192.168.154.1")/TCP(dport=80,flags="S"))
11.sniff()監聽流經物理網卡的流量包
用windowsping一下linux的地址,並按ctrol+c,會看出物理網卡
>>> sniff()
^c<Sniffed: TCP:9 UDP:14 ICMP:0 Other:0>
12.專一性監聽設置
>>> sniff(filter="host 192.168.109.132") #只對IP地址192.168.109.132進行監聽
ping 192.168.109.132
13.限量監聽
sniff(count=3)
14.特殊包種監聽
sniff(filter="host 192.168.109.132 and icmp",count=3,iface="ens33(在kali種是eth0)")
>>> sniff(filter="host 192.168.109.132 and icmp",count=3,iface="ens33")
<Sniffed: TCP:0 UDP:0 ICMP:3 Other:0>
15.summary()(操作對象是單個數據包)和nsummary()(操作對象是多個數據包)
>>> k= IP(dst="www.baidu.com")
>>> k.summary()
"192.168.109.132 > Net('www.baidu.com') hopopt"
>>> p=sniff(filter="host 192.168.109.132 and icmp",count=3,iface="ens33")
>>> p.nsummary()
0000 Ether / IP / ICMP 192.168.109.1 > 192.168.109.132 echo-request 0 / Raw
0001 Ether / IP / ICMP 192.168.109.132 > 192.168.109.1 echo-reply 0 / Raw
0002 Ether / IP / ICMP 192.168.109.1 > 192.168.109.132 echo-request 0 / Raw
16.ACK類型的掃描(觀察端口(dport)是否被屏蔽,屏蔽不是關閉)
ans,unans=sr(IP(dst="192.168.154.1")/TCP(dport=[21,23,135,443,445],flags='A'))
ACK掃描:
掃描主機向目標主機發送ACK數據包。根據返回的RST數據包有兩種方法可以得到端口的信息。方法一是: 若返回的RST數據包的TTL值小於或等於64,則端口開放,反之端口關閉,如圖所示。
17.命名ans包的集合中單個包的先后的兩個鏈接為s,r,若把s作為鏈接以TCP為協議的目的端口等於把r作為鏈接以TCP為協議的源端口則對該端口進行輸出
for s,r in ans:
#pint(s)
#pint(r)
WARNING: Calling str(pkt) on Python 3 makes no sense!
b'E\x00\x00(\x00\x01\x00\x00@\x06\xf1\xf8\xc0\xa8m\x84\xc0\xa8\x9a\x01\x00\x14\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00P\x10 \x00\x06\xd5\x00\x00'
WARNING: Calling str(pkt) on Python 3 makes no sense!
b'E\x00\x00(\x01}\x00\x00\x80\x06\xb0|\xc0\xa8\x9a\x01\xc0\xa8m\x84\x00\x15\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00P\x04\x7f\xff\xa6\xe1\x00\x00\x00\x00\x00\x00\x00\x00'
WARNING: more Calling str(pkt) on Python 3 makes no sense!
b'E\x00\x00(\x00\x01\x00\x00@\x06\xf1\xf8\xc0\xa8m\x84\xc0\xa8\x9a\x01\x00\x14\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00P\x10 \x00\x06\xd3\x00\x00'
b'E\x00\x00(\x01~\x00\x00\x80\x06\xb0{\xc0\xa8\x9a\x01\xc0\xa8m\x84\x00\x17\x00\x14\x00\x00
````
if s[TCP].dport==r[TCP].sport:
print("The port"+str(s[TCP].dport)+" is unfiltered")
for s,r in ans: ...: print(type(s[TCP].dport)) ...: <class 'int'> <class 'int'> <class 'int'> <class 'int'> <class 'int'> for s,r in ans: ...: print(type(str(s[TCP].dport))) ...: ...: <class 'str'> <class 'str'> <class 'str'> <class 'str'> <class 'str'>
19.查看被過濾的端口
for s in unans:
print(str(s[tcp0.dport])+" is filtered")
20.小撒花
from scapy.all import *
ans,unans=sr(IP(dst=“192.168.109.132”)/fuzz(TCP(dport=80,flags='S')))
for s,r in ans:
if r[TCP].flags = 18:#18開
print("This port is open")
if r[TCP].flags = 20:#20關
print("This port is close")
```
[數據包的保存,查看,格式化輸出,過濾]
21.將抓到的數據包保存
from scapy.all import *
package=sniff(iface='ens33',count=10) #掃描eth0網卡的數據包,總數為10個
#control c
wrpcap("test.pcap",package) #將抓取到的包保存為test.pcap文件
22.查看抓取到的數據包
package[0]是查看第一個數據包的數據,package[0].show()是查看第一個數據包的詳細信息
我們還可以通過協議來查看指定的包:package[ UDP][0].show() ,我們也可以直接只獲取指定層的數據,如: pcap[UDP][1][Ether].dst 這個包里面是等於ff:ff:ff:ff:ff:ff
從上面可以看到,我們抓取到了十個UDP的數據包,然后我們可以查看第一個數據包:package[0]是查看第一個數據包的數據,package[0].show()是查看第一個數據包的詳細信息,scapy是按照按照 TCP/IP 四層參考模型顯示詳細包信息的,即:鏈路層 [Ethernet]、網絡層[IP]、傳輸層[TCP/UDP]、應用層[RAW] 。我們還可以通過協議來查看指定的包:
package[UDP][0].show() ,因為我們這里只有UDP的數據包,所以就沒有這樣使用。,而我們也可以直接只獲取指定層的數據,如: pcap[UDP][1][Ether].dst 這個包里面是等於ff:ff:ff:ff:ff:ff
>>> from scapy.all import *
>>> package=sniff(iface='ens33',count=10) #掃描ens33網卡的數據包,總數為10個
^C>>> wrpcap("test.pcap",package) #將抓取到的包保存為test.pcap文件
>>> print(package) #查看package里面的包的種類和對應的數量
<Sniffed: TCP:0 UDP:4 ICMP:0 Other:0>
>>> print(package[0])
b'\x01\x00^\x00\x00\xfb\x00PV\xc0\x00\x08\x08\x00E\x00\x00XU\xb4\x00\x00\x01\x11U<\xc0\xa8m\x01\xe0\x00\x00\xfb\x14\xe9\x14\xe9\x00DdI\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00$422e09c9-ca57-4d90-97db-9b7dd68fe9e7\x05local\x00\x00\x01\x00\x01'
>>> print(package[0].show()) ¥#展示第一個包的具體信息
###[ Ethernet ]###
dst = 01:00:5e:00:00:fb
src = 00:50:56:c0:00:08
type = IPv4
###[ IP ]###
version = 4
ihl = 5
tos = 0x0
len = 88
id = 21940
flags =
frag = 0
ttl = 1
proto = udp
chksum = 0x553c
src = 192.168.109.1
dst = 224.0.0.251
\options \
###[ UDP ]###
sport = mdns
dport = mdns
len = 68
chksum = 0x6449
###[ DNS ]###
id = 0
qr = 0
opcode = QUERY
aa = 0
tc = 0
rd = 0
ra = 0
z = 0
ad = 0
cd = 0
rcode = ok
qdcount = 1
ancount = 0
nscount = 0
arcount = 0
\qd \
|###[ DNS Question Record ]###
| qname = '422e09c9-ca57-4d90-97db-9b7dd68fe9e7.local.'
| qtype = A
| qclass = IN
an = None
ns = None
ar = None
None
23.格式化輸出
如果我們要對抓取到的數據包進行格式化輸出,我們可以使用 packet.
sprintf()
函數進行格式化輸出sprintf()讀數據格式:IP:%IP.src% 代表讀取的是IP字段的源地址
比如要讀取IP包的源地址和目的地址: IP:%IP.src% -> %IP.dst%
要讀取UDP中的源端口和目的端口: UDP:%UDP.sport% -> %UDP.sport%
package=sniff(dst="220.181.38.148",count=3,prn=lambda x:x.sprintf("{ IP:%IP.src% -> %IP.dst%\n}"))
package=sniff(count=10,prn=lambda x:x.sprintf("{UDP:%UDP.sport% -> %UDP.sport%\n}"))
prn參數
向一個函數傳入另一個或另幾個函數的指針,從而實現這個函數在內部對其他幾個函數的調用,並接收它們返回的信息。
24.過濾抓包
>>> from scapy.all import *
>>> sniff(filter="icmp",count=5,prn=lambda x : x.sprintf("{IP:%IP.src%-> %IP.dst
...: %}"))
192.168.109.132-> 220.181.38.148
220.181.38.148-> 192.168.109.132
192.168.109.132-> 220.181.38.148
220.181.38.148-> 192.168.109.132
192.168.109.132-> 220.181.38.148
<Sniffed: TCP:0 UDP:0 ICMP:5 Other:0>
- 百度地址:220.181.38.148
- lambda是一個簡易函數模型
格式:lambda 參數:函數
25.sniff的參數
26.第二次撒花
from scapy.all import *
package=sniff(filter="icmp or ip",count=20,prn=lambda x : x.sprintf("{IP:%IP.src%-> %IP.dst%}")) #掃描eth0網卡的數據包,總數為10個
wrpcap("test.pcap",package) #將抓取到的包保存為test.pcap文件
#如果我們以后想查看這個包的話,可以這樣使用
package = sniff(offline='test.pcap') 或 package= rdpcap('test.pcap')
#offline:從pcap文件中讀取數據包,而不進行嗅探,默認為None(獲取網絡上流經的數據包)
學習資源(強推)
scapy模塊的利用
為什么強推呢?因為我得機子好像對博客過敏,在試了n個博客失敗后,遇到了了它,終於能跑動了
在ubuntu抓着抓着就莫名奇妙跑到windows直接抓