Lab1 Packet Sniffing and Spoofing Lab

@[TOC]Packet Sniffing and Spoofing Lab
实验网站连接link

1.准备工作

1.先在虚拟机上导入 SEED VM并完成相应的配置。配置可以参考:link

2.使用准备好的docker-compose.yml去配置虚拟机环境

2.1先把docker-compose.yml放到虚拟机的某个文件夹下。
在这里插入图片描述

2.2 然后再文件所在的目录下输入命令运行 docker-compose up -d就能直接配置并在后台运行。

在这里插入图片描述

2 Lab Task Set 1: Using Scapy to Sniff and Spoof Packets

2.1 Task 1.1: Sniffing Packets

Task 1.1A

1.编写python代码进行嗅探数据包。
在这里插入图片描述
2.找到自己的interface。
在这里插入图片描述
3.给sniffer文件赋予权限,并以管理员身份运行文件。在运行时要再启动一个终端进行ping10.9.0.5,来获取10.9.0.5发来的icmp报文。
在这里插入图片描述
4.使用seed用户去运行sniffer
在这里插入图片描述
说明普通用户没有权限去运行sniffer。

Task 1.1B

1.只捕获ICMP包。
在这里插入图片描述

在这里插入图片描述
2.只捕捉来自特定IP,且目标端口号为23的TCP数据包
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
3.捕捉来自或发送到特定子网的数据包,这里我们使用的子网为128.230.0.0/16。
在这里插入图片描述

Task 1.2 欺骗ICMP数据包

作为数据包欺骗工具,Scapy允许我们将IP数据包的字段设置为任意值。此任务的目标是利用任意源IP地址欺骗IP数据包。我们将欺骗ICMP回应请求数据包,并将它们发送到同一网络上的另一个虚拟机。我们将使用Wireshark观察我们的请求是否会被接收者接受。如果它被接受,一个回应应答包将被发送到欺骗的IP地址。
1.启动wireshark
在这里插入图片描述
2.创建抓包程序,并用wireshark进行查看。
在这里插入图片描述

Task1.3追踪路线

1.此任务的目的是使用Scapy来估计虚拟机和选定目的地之间的路由器数量方面的距离。这基本上是由跟踪工具实现的。在这个任务中,我们将编写我们自己的工具。这个想法非常简单:只需发送一个数据包(任何类型)到目的地,首先将其实时时间(TTL)字段设置为1。这个数据包将被第一个路由器丢弃,该路由器将向我们发送一个ICMP错误消息,告诉我们它的运行时间已经超过。这就是我们如何得到第一个路由器的IP地址。然后,我们将TTL字段增加到2,发送另一个数据包,并获得第二个路由器的IP地址。我们将重复此过程,直到我们的数据包最终到达目的地。需要注意的是,这个实验只得到一个估计结果,因为理论上,不是所有这些包采取相同的路径(但在实际中,它们可能在短时间内)。
2.编写追踪文件。
在这里插入图片描述
3.打印结果。
在这里插入图片描述

Task1.4 嗅探和欺骗

在此任务中,您将结合嗅探和欺骗技术来实现以下嗅探和欺骗程序。您需要在同一局域网上的两台机器:虚拟机和用户容器 。从用户容器中,您可以生成一个IPX。这将生成一个ICMP回波请求包。如果X被激活,ping程序将收到一个回波响应,并打印出响应。您的嗅探和欺骗程序运行在VM上,它通过数据包嗅探来监视局域网。每当它看到ICMP回波请求时,无论目标IP地址是什么,您的程序都应该立即使用数据包欺骗技术发送回波回复。因此,无论机器X是否活动,ping程序将始终收到回复,表明X激活。您需要使用Scapy来完成此任务。在您的报告中,您需要提供证据来证明您的技术有效的。在您的实验中,您应该从用户容器中获取以下三个IP地址。报告你的观察结果,并解释这些结果。
在这里插入图片描述

1.首先需要启动用户容器,需要使用到Docker exec 命令。
在这里插入图片描述
在这里插入图片描述
2.编写代码。
在这里插入图片描述
3.测试结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3 Lab Task Set 2: Writing Programs to Sniff and Spoof Packets

3.1 Task 2.1: Writing Packet Sniffing Program

Task 2.1A: Understanding How a Sniffer Works

这部分主要是写一个打印捕获的包的源IP和目的IP地址。
1.编写代码。

#include <pcap.h>
#include <stdio.h>
#include <arpa/inet.h>

/* IP Header */
struct ipheader {
  unsigned char      iph_ihl:4, //IP header length
                     iph_ver:4; //IP version
  unsigned char      iph_tos; //Type of service
  unsigned short int iph_len; //IP Packet length (data + header)
  unsigned short int iph_ident; //Identification
  unsigned short int iph_flag:3, //Fragmentation flags
                     iph_offset:13; //Flags offset
  unsigned char      iph_ttl; //Time to Live
  unsigned char      iph_protocol; //Protocol type
  unsigned short int iph_chksum; //IP datagram checksum
  struct  in_addr    iph_sourceip; //Source IP address 
  struct  in_addr    iph_destip;   //Destination IP address 
};
struct ethheader {
  u_char  ether_dhost[6]; /* destination host address */
  u_char  ether_shost[6]; /* source host address */
  u_short ether_type;                  /* IP? ARP? RARP? etc */
};

void got_packet(u_char *args, const struct pcap_pkthdr *header, 
                              const u_char *packet)
{
  struct ethheader *eth = (struct ethheader *)packet;

  if (ntohs(eth->ether_type) == 0x0800) { // 0x0800 is IP type
    struct ipheader * ip = (struct ipheader *)
                           (packet + sizeof(struct ethheader)); 

    printf("       From: %s\n", inet_ntoa(ip->iph_sourceip));  
    printf("         To: %s\n", inet_ntoa(ip->iph_destip));   

    /* determine protocol */
    switch(ip->iph_protocol) {                               
        case IPPROTO_TCP:
            printf("   Protocol: TCP\n");
            return;
        case IPPROTO_UDP:
            printf("   Protocol: UDP\n");
            return;
        case IPPROTO_ICMP:
            printf("   Protocol: ICMP\n");
            return;
        default:
            printf("   Protocol: others\n");
            return;
    }
  }
}
int main()
{
pcap_t *handle;
char errbuf[PCAP_ERRBUF_SIZE];
struct bpf_program fp;
char filter_exp[] = "icmp";
bpf_u_int32 net;
handle = pcap_open_live("enp0s3", BUFSIZ, 1, 1000, errbuf);
// Step 2: Compile filter_exp into BPF psuedo-code
pcap_compile(handle, &fp, filter_exp, 0, net);
if (pcap_setfilter(handle, &fp) !=0) {
pcap_perror(handle, "Error:");

}
// Step 3: Capture packets
pcap_loop(handle, -1, got_packet, NULL);
pcap_close(handle); //Close the handle
return 0;
}

2.测试运行结果。
运行c程序的命令要注意一下(在这里插入图片描述

在这里插入图片描述
Question1:描述在sniff程序中的调用序列。
主要就是第一步,启动pcap监听网卡,第二步就是编译BPF过滤器并设置过滤器,第三步就是设置嗅探的处理函数,最后关闭嗅探即可。
Quesion2: 嗅探过程为什么需要root权限?没有root的话哪里出错?
嗅探数据包是一个高权限的操作,因为涉及到隐私,安全相关问题。如果普通用户也能嗅探数据包,那么他就能窃取别人的隐私,甚至盗取账号密码等等。
Question3: 打开嗅探程序的混杂模式,打开和关闭这个模式的区别是什么?
使用混杂模式可以监听所在网段下其他机器的数据包,关闭则不能。

Task 2.1B: Writing Filters

这部分主要是写一些过滤器。这部分还是复用 task 2.1A的代码,只是修改其中的过滤器而已
1.只捕捉两个特定主机之间的ICMP包
使用的过滤器为 icmp and src host 10.9.0.6 and dst host 10.9.0.1, 只捕捉从 10.9.0.6 发送到 10.9.0.1的ICMP包。结果如下,可以看到全是从 10.9.0.6 发送到 10.9.0.1的ICMP包,没有其他类型的包。
使用 attacker 和 host B两个容器(10.9.0.1 和 10.9.0.6)。
在这里插入图片描述

在这里插入图片描述
2.捕捉目的端口在10到100之间的TCP包
过滤器条件改为:tcp and dst portrange 10-100。
在这里插入图片描述
在这里插入图片描述

Task 2.1C: Sniffing Passwords.

这部分是用嗅探去捕捉telent协议中的密码。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们最后可以得到密码为dees。同时用这种方法也可以得到用户名。

Task 2.2A: Write a spoofing program.

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值