这个实验是关于数据包的嗅探与伪造
1. Task Set 1
这部分主要是利用工具来嗅探数据包,这里用的是 scapy。 可以用下面的命令进行安装。
sudo pip3 install scapy
简单测试一下,构造了一个IP数据包并打印其的一些信息
[07/02/21]seed@VM:~/.../Lab10$ sudo python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from scapy.all import *
>>> a = IP()
>>> a.show()
###[ IP ]###
version = 4
ihl = None
tos = 0x0
len = None
id = 1
flags =
frag = 0
ttl = 64
proto = hopopt
chksum = None
src = 127.0.0.1
dst = 127.0.0.1
\options \
Task 1.1 嗅探数据包
下面是使用 scapy来嗅探数据包的一个例子
#!/usr/bin/python3
from scapy.all import *
def print_pkt(pkt):
pkt.show()
pkt = sniff(filter="icmp",prn=print_pkt)
Task 1.1A
先使用 chmod a+x sniffer.py 添加执行权限
先使用root权限运行上面的程序 sudo ./sniffer.py, 结果如下,可以看到其成功嗅探到了不同协议的数据包,图中只包括ICMP包。

然后使用普通权限运行该程序 ./sniffer.py。结果如下,可以看到报错了,提示无权限。

这说明嗅探包是一件拥有高权限才能做的事情,没有高权限,系统是不让你嗅探数据包的。
Task 1.1B
一般在嗅探包时我们只对特定类型的数据包感兴趣,所以我们需要对数据包进行一些过滤。scapy的过滤机制使用BPF的语法,这部分我们需要实现几个过滤的方法。
-
只捕捉ICMP数据包
上面的代码就是只捕捉icmp的数据包,略修改如下:
#!/usr/bin/python3
from scapy.all import *
def print_pkt(pkt):
return pkt.summary()
pkt = sniff(filter="icmp",prn=print_pkt)
print(pkt)
运行结果如下,可以看到捕获到了7个ICMP数据包

- 只捕捉来自特定IP,且目标端口号为23的TCP数据包
查看自己的IP地址如下:

这里随意拿个IP来测试, 我们使用10.0.2.11, 嗅探代码如下:
#!/usr/bin/python3
from scapy.all import *
def print_pkt(pkt):
return pkt.summary()
pkt = sniff(filter="tcp and src host 10.0.2.11 and dst port 23",prn=print_pkt)
print(pkt)
发送数据包的代码如下:
#!/usr/bin/python3
from scapy.all import *
ip = IP()
ip.src = "10.0.2.11"
ip.dst = "10.0.2.1"
tcp = TCP()
tcp.dport = 23
send(ip/tcp)
运行嗅探的程序,再运行发送数据包的程序(可以多试几次), 结果如下:

3. 捕捉来自或发送到特定子网的数据包
这里我们使用的子网为128.230.0.0/16.嗅探代码如下:
#!/usr/bin/python3
from scapy.all import *
def print_pkt(pkt):
return pkt.summary()
pkt = sniff(filter="net 128.230.0.0/16",prn=print_pkt)
print(pkt)
发送包的代码如下:
#!/usr/bin/python3
from scapy.all import *
ip = IP()
ip.src = "10.0.2.11"
ip.dst = "128.230.0.1"
tcp = TCP()
tcp.dport = 23
send(ip/tcp)
ip.src = "128.230.0.1"
ip.dst = "10.0.2.11"
send(ip/tcp)
嗅探结果如下,可以看到嗅探到了发送给子网128.230.0.0/16 和 该子网发送过来的数据包

Task 1.2
这部分主要是伪造任意的IP地址发IP包,这里我们用的是ICMP协议,使用的IP地址为 10.0.2.3 , 注意 在task 1.1B2中,我们查看了自己的IP地址为10.0.2.4,也就是这里我们伪造成ip地址为 10.0.2.3 进行发包。
先启动wireshark,选择网卡,再运行发包的程序
发送的代码如下:
#!/usr/bin/python3
from scapy.all import *
ip = IP()
ip.src = "10.0.2.3"
ip.dst = "128.230.0.1"
icmp = ICMP()
send(ip/icmp)
在wireshark中可看到记录,伪造的包有了回复。

Task 1.3
这部分主要是实现traceroute来估计本机到指定IP之间的路由器的个数。
代码如下:
#!/usr/bin/python3
from scapy.all import *
import sys
def traceroute(target, minttl=1, maxttl=30, dport=80):
print("target: %s(port=%s)" % (target, dport))
ans, unans = sr(IP(dst=target, ttl=(minttl,maxttl),id=RandShort())/TCP(flags=0x2, dport=dport), timeout=10)
for snd,rcv in ans:
print(snd.ttl, rcv.src)
if __name__ == '__main__':
if len(sys.argv) <= 1:
traceroute("baidu.com")
else:
traceroute(sys.argv[1])
运行效果如下, 可以看到打印除了不同TTL对应的IP

注意如果出现,没有回复包,或者回复包过少,可能与环境优点关系,可以尝试VPS运行
Task 1.4
这部分主要是准备两个在同一个局域网的虚拟机,一个机器ping任意IP x,另一个机器伪造ICMP回复请求,使得其有回复,而IP x所对应的机器可能根本不存在。
我们准备的A机器 IP 地址为10.0.2.4,B机器IP地址为10.0.2.5. 我们用A机器去发送请求,B机器伪造响应。
代码如下:
#!/usr/bin/python3
from scapy.all import *
def print_pkt(pkt):
send(IP(src=pkt[IP].dst, dst=pkt[IP].src)/ICMP(type


4074

被折叠的 条评论
为什么被折叠?



