信息安全 SEED Lab10 Packet Sniffing and Spoofing Lab

这个实验是关于数据包的嗅探与伪造

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的语法,这部分我们需要实现几个过滤的方法。

  1. 只捕捉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数据包
在这里插入图片描述

  1. 只捕捉来自特定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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值