本实验均使用 python3 scapy 完成
本文可能使用到的同时发包和收包的程序如下:
1. import subprocess
2. from time import *
3. from sys import *
4.
5. sniffer=subprocess.Popen(['python3','tcp_sniffer.py'])
6. sleep(0.5)
7. sender=subprocess.run(args=['python3','tcp_sender.py'],stdout=subprocess.PIPE)
8. sleep(0.5)
9. sniffer.kill()
10.
11. print('\n\n'+str(sender.stdout,encoding='utf-8'))
12. exit()
Task1.1A
通过设置filter规则为’icmp’,可以过滤掉其他的数据包;通过指定prn的参数为显示数据包的函数在终端打印数据包。在执行sniffer.py脚本的同时,使用ping发出icmp数据包。
当使用sudo执行脚本时可以正常捕获icmp包,如下图:
当不使用sudo执行脚本时,显示操作不被允许,根据报错可以看到这是因为__init__socket.socket.init(self,family,type,proto,fileno)函数的执行需要更高的权限。
Task1.1B
(1)
捕获icmp的操作与task1.1A相同。
(2)
主机ip为10.222.182.210。
Seedlab主机ip:
编写嗅探脚本tcp_sniffer.py:
1. from scapy.all import *
2.
3. def print_pkt(pkt):
4. pkt.show()
5.
6. pkt=sniff(filter='tcp and src host 10.0.2.15 and dst port 23',prn=print_pkt)
编写发包脚本tcp_sender.py:
1. from scapy.all import *
2.
3. ip=IP()
4. ip.src='10.0.2.15'
5. ip.dst='10.222.182.210'
6. tcp=TCP()
7. tcp.dport=23
8. send(ip/tcp)
收到数据包结果:
(3)
发包脚本subnet_sender.py:
1. from scapy.all import *
2.
3. def print_pkt(pkt):
4. pkt.show()
5.
6. pkt=sniff(filter='tcp and src host 10.0.2.15 and dst port 23',prn=print_pkt)
编写发包脚本tcp_sender.py:
1. from scapy.all import *
2.
3. ip=IP()
4. ip.src='10.0.2.15'
5. ip.dst='10.222.182.210'
6. tcp=TCP()
7. tcp.dport=23
8. send(ip/tcp)
收到数据包结果:
(3)
发包脚本subnet_sender.py:
1. from scapy.all import *
2.
3. send(IP(dst='128.230.0.0/16'))
嗅探脚本subnet_sniffer.py:
1. from scapy.all import *
2.
3. def print_pkt(pkt):
4. pkt.show()
5.
6. pkt=sniff(filter='dst net 128.230.0.0/16',prn=print_pkt)
利用script.py执行抓到数据包结果如下:
Task1.2
使用icmp_spoofing.py发包:
1. from scapy.all import *
2.
3. send(IP(dst='10.222.182.210')/ICMP())
用wireshark看到来回的数据包:
Task1.3
使用下面的tarcerout.py脚本发送syn包并接收返回包:
1. from scapy.all import *
2.
3. ans,unans=sr(IP(dst='www.baidu.com', ttl=(4,25))/TCP(flags=0x2))
4. for snd,rcv in ans:
5. print(snd.ttl, rcv.src, isinstance(rcv.payload, TCP))
实验结果如下:
Task1.4
用sniff_spoof.py截获本网段的数据包并发出回应包:
1. from scapy.all import *
2.
3. def print_pkt(pkt):
4. send(IP(src=pkt[IP].dst,dst=pkt[IP].src)/ICMP(type='echo-reply',code=0,id=pkt[ICMP].id,seq=pkt[ICMP].seq))
5.
6. pkt=sniff(filter='icmp[icmptype]==icmp-echo',prn=print_pkt)
被劫持的ping应答:
可以看到上面的应答包明显比下面正常情况下的应答包速度快很多:
task2.1A
使用下面icmp_sniffer.py截获数据包
1. from scapy.all import *
2.
3. def print_pkt(pkt):
4. pkt.show()
5.
6. pkt=sniff(filter='icmp',prn=print_pkt)
结果截图:
qestion1:这个程序首先在包到达后通过filter指定的参数判断是否是符合条件的包,如果是就调用prn指向的函数执行,并且将数据包返回给等号左边的变量
qestion2:因为scapy涉及到数据包的监听和修改,这些操作如果不根据用户权限进行限制将会造成安全问题
qestion3:使用混杂模式后可以截获本网段下另一个机器的ping包,不使用则不行
task2.1b
使用下面脚本捕获icmp和ip为10.0.2.15和192.168.43.16之间的icmp:
1. from scapy.all import *
2. def print_pkt(pkt):
3. pkt.show()
4.
5. pkt=sniff(filter='icmp && host 10.0.2.15 && host 10.219.160.70',prn=print_pkt)
实验结果:
用下面的代码捕获tcp和指定端口的数据包:
1. from scapy.all import *
2. def print_pkt(pkt):
3. pkt.show()
4.
5. pkt=sniff(filter='tcp && dst portrange 10-100',prn=print_pkt)
ssh的端口号为22,可以用作测试。
截获的ssh协议包:
task2.1c
将端口设为25监听telnet的报文:
1. from scapy.all import *
2. def print_pkt(pkt):
3. pkt.show()
4.
5. pkt=sniff(filter='tcp port 25',prn=print_pkt)
密码截图省略。
task2.2A
发包脚本:
1. from scapy.all import *
2.
3. send(IP(src='10.0.2.15',dst='10.219.160.70'))
用wireshark截获的数据包
task2.2b
向www.baidu.com发送请求icmp包:
1. from scapy.all import *
2.
3. send(IP(dst='www.baidu.com',src='10.0.2.15')/ICMP(type=8,code=0))
收到来自百度的应答报文:
question4:将数据包长度改为200依然能成功发出数据包
question5:用python不需要自己计算校验和
question6:函数内部的调用需要root权限,如果没有权限会停在下面的函数
task2.3
使用python和task1.4的操作相同。