【科软课程-信息安全】Lab13 Packet Sniffing and Spoofing

1.0 概述

数据包嗅探和欺骗是网络安全中的两个重要概念;它们是网络通信中的两大威胁。能够理解这两种威胁对于理解网络中的安全措施至关重要。有很多包嗅探和欺骗工具,如Wireshark、Tcpdump、Netwox、Scapy等。其中一些工具被安全专家和攻击者广泛使用。能够使用这些工具对学生来说很重要,但是在网络安全课程中,对学生来说更重要的是理解这些工具是如何工作的,即,。数据包嗅探和欺骗是如何在软件中实现的。

本实验的目标是双重的:学习使用工具和理解这些工具背后的技术。对于第二个对象,学生将编写简单的嗅探器和欺骗程序,并深入了解这些程序的技术方面。本实验涵盖以下主题:

  • 嗅探和欺骗是如何工作的
  • 使用pcap库和Scapy进行数据包嗅探
  • 使用原始套接字和Scapy的数据包欺骗
  • 使用Scapy操作数据包

2.0 实验任务Set 1:使用工具嗅探和欺骗数据包

许多工具可以用来进行嗅探和欺骗,但是大多数工具只提供固定的功能。Scapy不同:它不仅可以用作工具,还可以作为构建其他嗅探和欺骗工具的构建块,即,。我们可以将Scapy功能集成到我们自己的程序中。在这组任务中,我们将对每个任务使用Scapy。当前版本的SEED虚拟机可能没有为Python3安装Scapy.我们可以使用以下命令为Pyhon3安装Scapy

$sudo pip3 install scapy

要使用Scapy,我们可以编写一个Python程序,然后使用Python执行这个程序。请参见以下示例。我们应该使用root权限运行Python,因为欺骗数据包需要该权限。在程序的开始(第à行),我们应该导入所有Scapy的模块。 

我们也可以进入Python的交互模式,然后在Python提示符下一次运行一行我们的程序。如果我们需要在实验中频繁更改代码,这将更加方便。

实验步骤: 

切换 到root权限,按照scapy

安装完毕:

使用Python交互:

2.1 task 1.1 嗅探数据包

Wireshark是最流行的嗅探工具,而且很容易使用。我们将在整个实验使用它。然而,很难使用Wireshark作为构建块来构建其他工具。为此,我们将使用Scapy。这项任务的目标是学习如何在Python程序中使用Scapy进行数据包嗅探。下面提供了一个示例代码:

#!/usr/bin/python3
from scapy.all import *
def print_pkt(pkt):
pkt.show()
pkt = sniff(filter=’icmp’,prn=print_pkt)

任务1.1A  上面的程序嗅探数据包。对于每个捕获的数据包,将调用回调函数print PKT();这个函数将打印出一些关于数据包的信息。以root权限运行该程序,并演示您确实可以捕获数据包。之后,再次运行程序,但不使用root权限;描述并解释你的观察结果。

// Make the program executable
$ chmod a+x sniffer.py
// Run the program with the root privilege
$ sudo ./sniffer.py
// Run the program without the root privilege
$ sniffer.py

实验步骤: 

创建sniffer.py文件:

 提升权限,嗅探数据包:

打开另一个终端,查看ip,ping自己的地址:

嗅探数据包:

普通用户进行嗅探:报错、提示无权限

任务1.1B 通常,当我们嗅探数据包时,我们只对特定类型的数据包感兴趣。我们可以通过在嗅探中设置过滤器来做到这一点。scapy的过滤器使用BPF(柏克莱包过滤)语法;你可以在网上找到BPF手册。请设置以下过滤器,并再次演示您的嗅探器程序(每个过滤器应单独设置):

  • 仅捕获ICMP数据包
  • 捕获来自特定IP且目的端口号为23的任何TCP数据包。
  • 捕获来自或去往特定子网的数据包。您可以选择任何子网,如128 . 230 . 0 . 0/16;您不应该选择虚拟机所连接的子网。

实验步骤:

①仅捕获ICMP包

修改sniffer.py的代码:仅返回ICMP包

 

②捕获来自特定IP且目的端口号为23的任何TCP数据包

本机ip地址:10.0.2.15

设定一个ip地址:10.0.2.2

创建发送数据包的代码:datapak.py、并指定tcp端口是23

修改sniffer.py文件:

 捕获两个数据包:

捕获来自或去往特定子网的数据包。您可以选择任何子网,如128 . 230 . 0 . 0/16;您不应该选择虚拟机所连接的子网

修改嗅探的过滤条件:

修改datapak.py文件:

嗅探结果如下:

2.2 task 1.2  欺骗ICMP数据包

作为数据包欺骗工具,Scapy允许我们将IP数据包的字段设置为任意值。此任务的目标是利用任意源IP地址欺骗IP数据包。我们将欺骗ICMP回应请求数据包,并将它们发送到同一网络上的另一个虚拟机。我们将使用Wireshark观察我们的请求是否会被接收者接受。如果它被接受,一个回应应答包将被发送到欺骗的IP地址。下面的代码显示了一个如何欺骗ICMP数据包的示例。

在上面的代码中,行①从IP类创建了一个IP对象;为每个IP报头字段定义了一个类属性。我们可以使用ls(a)或ls(IP)来查看所有的属性名称/值。我们也可以使用a.show()和IP.show()来做同样的事情。行②显示了如何设置目的IP地址字段。如果未设置字段,将使用默认值。 

行③创建一个ICMP对象。默认类型是回应请求。在行④中,我们将ab堆叠在一起,形成一个新对象。运算符被IP类重载,因此不再代表除法;相反,这意味着添加b作为a的有效载荷字段,并相应地修改a的字段。结果,我们得到了一个表示ICMP数据包的新对象。现在,我们可以使用⑤中的send()发送此数据包。请对示例代码进行任何必要的更改,然后演示如何使用任意源IP地址欺骗ICMP回应请求数据包。

实验步骤:

安装wireshark:

sudo apt-get update
sudo apt-get install wireshark

此任务的伪造ip地址回应ICMP包,本机ip地址为10.0.2.15,我们伪造成10.0.2.2

创建发包程序sendFakePak.py:

启动wireshark:

sudo wireshark:(root权限下、报错忽略)

准备抓包:

 运行发包程序:

抓包结果:

2.3 task 1.3 追踪路线

此任务的目标是使用Scapy来估计您的虚拟机和选定目的地之间的距离(根据路由器数量)。这基本上是traceroute工具实现的。在这个任务中,我们将编写自己的工具。这个想法很简单:只需向目的地发送一个数据包(任何类型),其生存时间(TTL)字段首先设置为1。该数据包将被第一台路由器丢弃,它将向我们发送一条ICMP错误消息,告诉我们生存时间已经超过。这就是我们获取第一台路由器的IP地址的方法。然后,我们将TTL字段增加到2,发送另一个数据包,并获得第二个路由器的IP地址。我们将重复这个过程,直到我们的数据包最终到达目的地。需要注意的是,这个实验只得到一个估计的结果,因为理论上,并不是所有的这些数据包都采用相同的路由(但实际上,它们可能在短时间内)。下面的代码显示了过程中的一轮。

如果你是一个有经验的Python程序员,你可以编写你的工具来自动执行整个过程。如果您是Python编程新手,可以通过手动更改每一轮的TTL字段来完成,并根据您在Wireshark上的观察记录IP地址。任何一种方式都是可以接受的,只要你得到结果。

实验步骤:

模拟一个traceroute,循环每次TTL+1,中间节点都发回ICMP TTL字段过期的错误信息,目的节点发回ICMP reply就结束:

创建一个trace.py文件:

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])

2.4 task 1.4 嗅探和欺骗

在本任务中,您将结合嗅探和欺骗技术来实现以下嗅探和欺骗程序。同一局域网上需要两台虚拟机。从虚拟机A,您ping一个IP X。这将生成一个ICMP回应请求数据包。如果X还活着,ping程序会收到一个回应,并打印出响应。你的嗅探然后欺骗程序运行在虚拟机B上,它通过数据包嗅探来监控局域网。每当它看到一个ICMP回应请求时,不管目标IP地址是什么,您的程序都应该立即使用数据包欺骗技术发送一个回应回复。因此,不管机器X是否还活着,ping程序总会收到一个回复,表示X还活着。您需要使用Scapy来完成此任务。在你的报告中,你需要提供证据来证明你的技术是有效的。

实验步骤:

创建sniffer2.py

 

3.0 实验任务Set 2 :编写嗅探和欺骗数据包的程序

3.1  task2.1 编写数据包嗅探程序

使用pcap库可以很容易地编写嗅探器程序。有了pcap,嗅探器的任务就变成了调用pcap库中一系列简单的过程。在序列的末尾,数据包一旦被捕获,就会被放入缓冲区进行进一步处理。数据包捕获的所有细节都由pcap库处理。

SEED书籍《计算机安全:实践方法》在第12章提供了一个示例代码,展示了如何使用pcap编写一个简单的嗅探器程序。我们将示例代码包含在以下内容中(有关详细解释,请参见本书)

#include <pcap.h>
#include <stdio.h>
/* This function will be invoked by pcap for each captured packet.
We can process each packet inside the function.
*/
void got_packet(u_char *args, const struct pcap_pkthdr *header,
const u_char *packet)
{
printf("Got a packet\n");
}
int main()
{
pcap_t *handle;
char errbuf[PCAP_ERRBUF_SIZE];
struct bpf_program fp;
char filter_exp[] = "ip proto icmp";
bpf_u_int32 net;
// Step 1: Open live pcap session on NIC with name eth3
// Students needs to change "eth3" to the name
// found on their own machines (using ifconfig).
handle = pcap_open_live("eth3", BUFSIZ, 1, 1000, errbuf);
// Step 2: Compile filter_exp into BPF psuedo-code
pcap_compile(handle, &fp, filter_exp, 0, net);
pcap_setfilter(handle, &fp);
// Step 3: Capture packets
pcap_loop(handle, -1, got_packet, NULL);
pcap_close(handle); //Close the handle
return 0;
}
// Note: don’t forget to add "-lpcap" to the compilation command.
// For example: gcc -o sniff sniff.c -lpcap

Tim Carstens还写了一篇教程,介绍如何使用pcap库编写嗅探器程序。该教程可在http://www.tcpdump.org/pcap.htm.获得。

任务2.1A:了解嗅探器如何工作在这个任务中,学生需要编写一个嗅探器程序来打印出每个捕获数据包的源和目的IP地址。学生可以输入上述代码或从SEED图书的网站(https://www.handsonsecurity)下载示例代码。net/figurecode.html)。学生应提供截图作为证据,以表明他们的嗅探器程序可以成功运行并产生预期的结果。此外,请回答以下问题:

  • 问题1。请用你自己的话来描述对嗅探器程序至关重要的库调用的顺序。这是一个总结,而不是像教程或书中那样的详细解释。
  • 问题2。为什么运行嗅探器程序需要root权限?如果在没有根权限的情况下执行程序,程序会在哪里失败?
  • 问题3。请在你的嗅探器程序中打开和关闭混杂模式。你能演示一下这个模式开和关的区别吗?请描述你如何证明这一点。

任务2.1B:编写过滤器。请为您的嗅探器程序编写过滤器表达式,以捕获以下各项。您可以找到pcap过滤器的在线手册。在您的实验报告中,您需要包括截图,以显示应用这些过滤器后的结果。

  • 捕获两台特定主机之间的ICMP数据包。
  • 捕获目标端口号在10到100范围内的TCP数据包。

任务2.1C:嗅探密码。请说明当有人在您监控的网络上使用telnet时,您如何使用嗅探器程序来捕获密码。您可能需要修改您的嗅探器代码来打印出捕获的TCP数据包的数据部分(telnet使用TCP)。如果您打印出整个数据部分,然后手动标记密码(或部分密码)的位置,这是可以接受的。

3.2 task2.2 欺骗

当普通用户发送数据包时,操作系统通常不允许用户设置协议头中的所有字段(如TCP、UDP和IP头)。操作系统将设置大部分字段,而只允许用户设置几个字段,如目的IP地址、目的端口号等。但是,如果用户拥有root权限,他们可以在数据包报头中设置任意字段。这被称为数据包欺骗,可以通过原始套接字实现。

原始套接字赋予程序员对数据包构造的绝对控制权,允许程序员构造任意数据包,包括设置报头字段和有效载荷。使用原始套接字非常简单;它包括四个步骤:(1)创建一个原始套接字,(2)设置套接字选项,(3)构造数据包,以及(4)通过原始套接字发送数据包。有很多在线教程可以教你如何在C编程中使用原始套接字。我们已经将一些教程链接到了实验室的网页上。请阅读它们,并学习如何编写数据包欺骗程序。我们展示了这样一个程序的简单框架。

int sd;
struct sockaddr_in sin;
char buffer[1024]; // You can change the buffer size
/* Create a raw socket with IP protocol. The IPPROTO_RAW parameter
* tells the sytem that the IP header is already included;
* this prevents the OS from adding another IP header. */
sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
if(sd < 0) {
perror("socket() error"); exit(-1);
}
/* This data structure is needed when sending the packets
* using sockets. Normally, we need to fill out several
* fields, but for raw sockets, we only need to fill out
* this one field */
sin.sin_family = AF_INET;
// Here you can construct the IP packet using buffer[]
// - construct the IP header ...
// - construct the TCP/UDP/ICMP header ...
// - fill in the data part if needed ...
// Note: you should pay attention to the network/host byte order.
/* Send out the IP packet.
* ip_len is the actual size of the packet. */
if(sendto(sd, buffer, ip_len, 0, (struct sockaddr *)&sin,
sizeof(sin)) < 0) {
perror("sendto() error"); exit(-1);
}

任务2.2A:编写一个欺骗程序。请用c语言编写自己的数据包欺骗程序。你需要提供证据(例如,。Wireshark数据包跟踪)来显示您的程序成功发送了假冒的IP数据包。

任务2.2B:欺骗ICMP回应请求。代表另一台机器欺骗ICMP回应请求数据包(即,。使用另一台机器的IP地址作为其源IP地址)。该数据包应该发送到互联网上的远程机器(该机器必须是活动的)。您应该打开您的Wireshark,这样如果您的欺骗成功了,您就可以看到从远程机器返回的回声回复。

问题。请回答以下问题。

  • 问题4。无论实际数据包有多大,您都可以将IP数据包长度字段设置为任意值吗?
  • 问题5。使用原始套接字编程,您必须计算IP报头的校验和吗?
  • 问题6。为什么需要root权限来运行使用原始套接字的程序?如果在没有根权限的情况下执行,程序会在哪里失败?

3.3 task2.3 嗅探然后欺骗

在本任务中,您将结合嗅探和欺骗技术来实现以下嗅探和欺骗程序。同一局域网上需要两台虚拟机。从虚拟机A,您ping一个IP X。这将生成一个ICMP回应请求数据包。如果X还活着,ping程序会收到一个回应,并打印出响应。你的嗅探然后欺骗程序运行在虚拟机B上,它通过数据包嗅探来监控局域网。每当它看到一个ICMP回应请求时,不管目标IP地址是什么,您的程序都应该立即使用数据包欺骗技术发送一个回应回复。因此,不管机器X是否还活着,ping程序总会收到一个回复,表示X还活着。你需要用C语言编写这样一个程序,并在你的报告中包含截图,以表明你的程序是有效的。也请在您的报告中附上代码(带有足够数量的注释)。

猜你喜欢

转载自blog.csdn.net/weixin_41950078/article/details/118568934